root link resolution
This commit is contained in:
parent
3b9a653e34
commit
d584116fd6
3 changed files with 20 additions and 7 deletions
|
@ -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)
|
||||
|
|
|
@ -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>'
|
||||
|
||||
|
|
|
@ -35,4 +35,5 @@ class Item:
|
|||
@dataclass
|
||||
class BuildCtx:
|
||||
root: Path
|
||||
base: Path
|
||||
item_map: dict[Path, Item] = field(default_factory=dict)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue