root link resolution

This commit is contained in:
Daniel Fichtinger 2025-06-22 14:20:38 -04:00
parent 3b9a653e34
commit d584116fd6
3 changed files with 20 additions and 7 deletions

View file

@ -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)

View file

@ -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'<a href="{href}" target="_blank">{body}</a>'

View file

@ -35,4 +35,5 @@ class Item:
@dataclass
class BuildCtx:
root: Path
base: Path
item_map: dict[Path, Item] = field(default_factory=dict)