4bbfdcceff
audio-surface.el / image-surface.el: own-core additive-synthesis WAV and
raster-PNG renderers (integer-only DSP, since EL has no floats), rendered
from learned engram signatures via a pluggable surface-profile
abstraction (surface-profile.el). audio-demo.el / image-demo.el are
drivers. NOTE: demo files hardcode absolute paths to this worktree's own
directory — will need a path fixup before landing.
elp/projector/ is a Python package the author's own README marks as
"STAGING/PROOF-OF-SHAPE — not the deliverable", superseded by the native
.el surface-profile work above; kept as a validated architecture proof.
Generated output (elp/faculty/{out,sig}, elp/projector/out,
__pycache__) intentionally excluded.
46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
"""markdown.py — the Markdown surface projector (text facet).
|
|
|
|
The most tractable surface, and the reference implementation: reads the IR's
|
|
realized sentences and lays them out as Markdown. Introduces no content — it is
|
|
pure typography over the faithful text the realizer produced.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
from document_ir import DocumentIR # noqa: E402
|
|
from projectors.base import register # noqa: E402
|
|
|
|
|
|
class MarkdownProjector:
|
|
surface = "markdown"
|
|
media_type = "text/markdown"
|
|
ext = "md"
|
|
modality = "text"
|
|
|
|
def render_str(self, doc: DocumentIR) -> str:
|
|
lines: list[str] = [f"# {doc.title}"]
|
|
if doc.subtitle:
|
|
lines.append(f"\n*{doc.subtitle}*")
|
|
abstract = doc.meta.get("abstract")
|
|
if abstract is not None and abstract.sentences:
|
|
lines.append("")
|
|
lines.append(abstract.text())
|
|
for sec in doc.sections:
|
|
lines.append("")
|
|
lines.append(f"{'#' * max(2, sec.level)} {sec.heading}")
|
|
for block in sec.blocks:
|
|
body = block.text()
|
|
if body:
|
|
lines.append("")
|
|
lines.append(body)
|
|
return "\n".join(lines) + "\n"
|
|
|
|
def project(self, doc: DocumentIR) -> bytes:
|
|
return self.render_str(doc).encode("utf-8")
|
|
|
|
|
|
register(MarkdownProjector())
|