Loading...
No commits yet
Not committed History
Blame
__init__.py • 3.2 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Timestamp: 2026-01-27
# File: src/scitex_writer/guidelines/__init__.py

"""IMRAD writing guidelines for scientific manuscripts.

Guidelines are templates/tips for writing manuscript sections.
Prompts can be built from guidelines + user content.

Usage::

    from scitex_writer.guidelines import get, build, list_sections

    # Get raw guidelines
    tips = get("abstract")

    # Build prompt with draft
    prompt = build("abstract", draft="My draft text...")

Custom guidelines via environment variables:
    SCITEX_WRITER_GUIDELINE_ABSTRACT=/path/to/custom.md
    SCITEX_WRITER_GUIDELINE_DIR=/path/to/guidelines/
"""

import os as _os
from pathlib import Path as _Path

# Available sections (internal)
_SECTIONS = ["abstract", "introduction", "methods", "discussion", "proofread"]

# Default data directory
_DEFAULT_DIR = _Path(__file__).parent

__all__ = ["get", "build", "list_sections"]


def _get_path(section: str) -> _Path:
    """Get path to guideline file, checking env overrides first."""
    env_key = f"SCITEX_WRITER_GUIDELINE_{section.upper()}"
    if env_path := _os.environ.get(env_key):
        return _Path(env_path)

    if guideline_dir := _os.environ.get("SCITEX_WRITER_GUIDELINE_DIR"):
        custom_path = _Path(guideline_dir) / f"{section}.md"
        if custom_path.exists():
            return custom_path

    return _DEFAULT_DIR / f"{section}_.md"


def get(section: str) -> str:
    """Get writing guidelines for a manuscript section.

    Args:
        section: One of: abstract, introduction, methods, discussion, proofread

    Returns:
        Guidelines markdown content with PLACEHOLDER marker.

    Raises:
        ValueError: If section is not recognized.
        FileNotFoundError: If guidelines file not found.
    """
    section = section.lower().strip()

    if section not in _SECTIONS:
        raise ValueError(
            f"Unknown section: '{section}'. Available: {', '.join(_SECTIONS)}"
        )

    path = _get_path(section)

    if not path.exists():
        raise FileNotFoundError(f"Guidelines not found: {path}")

    return path.read_text(encoding="utf-8")


def build(section: str, draft: str, placeholder: str = "PLACEHOLDER") -> str:
    """Build a prompt from guidelines and user draft.

    Args:
        section: Section name.
        draft: User's draft text.
        placeholder: Placeholder to replace (default: PLACEHOLDER).

    Returns:
        Complete prompt with draft inserted.
    """
    template = get(section)
    return template.replace(placeholder, draft)


def list_sections() -> list[str]:
    """List available sections."""
    return _SECTIONS.copy()


def _get_source(section: str) -> dict[str, str]:
    """Get info about where guidelines are loaded from."""
    section = section.lower().strip()

    env_key = f"SCITEX_WRITER_GUIDELINE_{section.upper()}"
    if env_path := _os.environ.get(env_key):
        return {"path": env_path, "source": "env"}

    if guideline_dir := _os.environ.get("SCITEX_WRITER_GUIDELINE_DIR"):
        custom_path = _Path(guideline_dir) / f"{section}.md"
        if custom_path.exists():
            return {"path": str(custom_path), "source": "custom_dir"}

    return {"path": str(_DEFAULT_DIR / f"{section}_.md"), "source": "default"}


# EOF