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]):
|
def build(root: Path, items: list[Item]):
|
||||||
ctx = BuildCtx(root=root)
|
ctx = BuildCtx(root=root, base=root / "content")
|
||||||
templater = Templater(root / "templates")
|
templater = Templater(root / "templates")
|
||||||
ctx.item_map = {item.source.resolve(): item for item in items}
|
ctx.item_map = {item.source.resolve(): item for item in items}
|
||||||
# print(item_map)
|
# print(item_map)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from marko.inline import Link, Image
|
||||||
from marko.html_renderer import HTMLRenderer
|
from marko.html_renderer import HTMLRenderer
|
||||||
from marko.parser import Parser
|
from marko.parser import Parser
|
||||||
|
|
||||||
from zona.models import BuildCtx, Item
|
from zona.models import BuildCtx
|
||||||
from zona import util
|
from zona import util
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ class ZonaRenderer(HTMLRenderer):
|
||||||
source: Path | None = None,
|
source: Path | None = None,
|
||||||
ctx: BuildCtx | None = None,
|
ctx: BuildCtx | None = None,
|
||||||
):
|
):
|
||||||
# print("Zona renderer initializing...")
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.resolve: bool = resolve
|
self.resolve: bool = resolve
|
||||||
if self.resolve:
|
if self.resolve:
|
||||||
|
@ -26,7 +25,6 @@ class ZonaRenderer(HTMLRenderer):
|
||||||
self.source: Path = source.resolve()
|
self.source: Path = source.resolve()
|
||||||
self.ctx: BuildCtx = ctx
|
self.ctx: BuildCtx = ctx
|
||||||
|
|
||||||
# TODO: resolve relative links and replace with url?
|
|
||||||
@override
|
@override
|
||||||
def render_link(self, element: Link):
|
def render_link(self, element: Link):
|
||||||
href = element.dest
|
href = element.dest
|
||||||
|
@ -35,10 +33,24 @@ class ZonaRenderer(HTMLRenderer):
|
||||||
if self.resolve:
|
if self.resolve:
|
||||||
cur = Path(href)
|
cur = Path(href)
|
||||||
_href = href
|
_href = href
|
||||||
|
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()
|
resolved = (self.source.parent / cur).resolve()
|
||||||
|
# only substitute if link points to an actual file
|
||||||
if resolved.exists():
|
if resolved.exists():
|
||||||
href = util.normalize_url(self.ctx.item_map[resolved].url)
|
item = self.ctx.item_map.get(resolved)
|
||||||
print(f"Link in file {self.source}: {_href} resolved to {href}")
|
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)
|
body: Any = self.render_children(element)
|
||||||
return f'<a href="{href}" target="_blank">{body}</a>'
|
return f'<a href="{href}" target="_blank">{body}</a>'
|
||||||
|
|
||||||
|
|
|
@ -35,4 +35,5 @@ class Item:
|
||||||
@dataclass
|
@dataclass
|
||||||
class BuildCtx:
|
class BuildCtx:
|
||||||
root: Path
|
root: Path
|
||||||
|
base: Path
|
||||||
item_map: dict[Path, Item] = field(default_factory=dict)
|
item_map: dict[Path, Item] = field(default_factory=dict)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue