diff --git a/src/zona/builder.py b/src/zona/builder.py index 78300f9..de41e15 100644 --- a/src/zona/builder.py +++ b/src/zona/builder.py @@ -82,7 +82,7 @@ def discover(root: Path, out_dir: Path) -> list[Item]: def build(root: Path, items: list[Item]): - ctx = BuildCtx(root=root) + ctx = BuildCtx(root=root, base=root / "content") templater = Templater(root / "templates") ctx.item_map = {item.source.resolve(): item for item in items} # print(item_map) diff --git a/src/zona/markdown.py b/src/zona/markdown.py index 580c33f..8990be9 100644 --- a/src/zona/markdown.py +++ b/src/zona/markdown.py @@ -5,7 +5,7 @@ from marko.inline import Link, Image from marko.html_renderer import HTMLRenderer from marko.parser import Parser -from zona.models import BuildCtx, Item +from zona.models import BuildCtx from zona import util @@ -16,7 +16,6 @@ class ZonaRenderer(HTMLRenderer): source: Path | None = None, ctx: BuildCtx | None = None, ): - # print("Zona renderer initializing...") super().__init__() self.resolve: bool = resolve if self.resolve: @@ -26,7 +25,6 @@ class ZonaRenderer(HTMLRenderer): self.source: Path = source.resolve() self.ctx: BuildCtx = ctx - # TODO: resolve relative links and replace with url? @override def render_link(self, element: Link): href = element.dest @@ -35,10 +33,24 @@ class ZonaRenderer(HTMLRenderer): if self.resolve: cur = Path(href) _href = href - resolved = (self.source.parent / cur).resolve() + if href.startswith("/"): + # resolve relative to content root + resolved = (self.ctx.base / cur.relative_to("/")).resolve() + else: + # treat as relative link and try to resolve + resolved = (self.source.parent / cur).resolve() + # only substitute if link points to an actual file if resolved.exists(): - href = util.normalize_url(self.ctx.item_map[resolved].url) - print(f"Link in file {self.source}: {_href} resolved to {href}") + item = self.ctx.item_map.get(resolved) + if item: + href = util.normalize_url(item.url) + print( + f"Link in file {self.source}: {_href} resolved to {href}" + ) + else: + print( + f"Warning: resolved path {resolved} not found in item map" + ) body: Any = self.render_children(element) return f'{body}' diff --git a/src/zona/models.py b/src/zona/models.py index aff3530..ee1fdff 100644 --- a/src/zona/models.py +++ b/src/zona/models.py @@ -35,4 +35,5 @@ class Item: @dataclass class BuildCtx: root: Path + base: Path item_map: dict[Path, Item] = field(default_factory=dict)