add builder
This commit is contained in:
parent
d558d1c5e1
commit
b045739b45
4 changed files with 93 additions and 15 deletions
|
@ -1,4 +1,6 @@
|
|||
from zona.models import Item, Metadata
|
||||
from zona.models import Item, Metadata, ItemType
|
||||
from zona import markdown as zmd
|
||||
from zona import util
|
||||
from pathlib import Path
|
||||
import frontmatter
|
||||
from dacite import from_dict
|
||||
|
@ -29,20 +31,35 @@ def discover(root: Path, out_dir: Path) -> list[Item]:
|
|||
for path in base.rglob("*"):
|
||||
if path.is_file():
|
||||
print(f"{subdir}: {path.relative_to(root)}")
|
||||
if path.name.endswith(".md") and not path.is_relative_to(
|
||||
root / "content" / "static"
|
||||
):
|
||||
meta, content = split_metadata(path)
|
||||
else:
|
||||
meta = None
|
||||
content = path.read_bytes()
|
||||
# we only parse markdown files not in static/
|
||||
destination = out_dir / path.relative_to(base)
|
||||
item = Item(
|
||||
source=path,
|
||||
destination=destination,
|
||||
url=str(destination.relative_to(out_dir)),
|
||||
metadata=meta,
|
||||
content=content,
|
||||
)
|
||||
if path.name.endswith(".md") and not path.is_relative_to(
|
||||
root / "content" / "static"
|
||||
):
|
||||
item.metadata, item.content = split_metadata(path)
|
||||
item.type = ItemType.MARKDOWN
|
||||
item.copy = False
|
||||
item.destination = destination.with_suffix(".html")
|
||||
items.append(item)
|
||||
return items
|
||||
|
||||
|
||||
def build(items: list[Item]):
|
||||
for item in items:
|
||||
dst = item.destination
|
||||
# create parent dirs if needed
|
||||
if item.type == ItemType.MARKDOWN:
|
||||
assert item.content is not None
|
||||
# parse markdown and render as html
|
||||
raw_html = zmd.md_to_html(item.content)
|
||||
# TODO: apply to template here
|
||||
util.ensure_parents(dst)
|
||||
dst.write_text(raw_html, encoding="utf-8")
|
||||
else:
|
||||
if item.copy:
|
||||
util.copy_static_file(item.source, dst)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
from pathlib import Path
|
||||
from enum import Enum
|
||||
from datetime import date
|
||||
from dataclasses import dataclass
|
||||
from typing import Literal
|
||||
|
||||
|
||||
@dataclass
|
||||
|
@ -11,10 +13,18 @@ class Metadata:
|
|||
# add more options later...
|
||||
|
||||
|
||||
class ItemType(Enum):
|
||||
MARKDOWN = "markdown"
|
||||
HTML = "html"
|
||||
IMAGE = "image"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Item:
|
||||
source: Path
|
||||
destination: Path
|
||||
url: str # relative to site root
|
||||
metadata: Metadata | None # frontmatter
|
||||
content: str | bytes
|
||||
metadata: Metadata | None = None # frontmatter
|
||||
content: str | None = None
|
||||
type: ItemType | None = None
|
||||
copy: bool = True
|
||||
|
|
13
src/zona/util.py
Normal file
13
src/zona/util.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from pathlib import Path
|
||||
from shutil import copy2
|
||||
|
||||
|
||||
def ensure_parents(target: Path):
|
||||
"""Ensure the target's parent directories exist."""
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
def copy_static_file(src: Path, dst: Path):
|
||||
"""Copy a static file from one location to another."""
|
||||
ensure_parents(dst)
|
||||
copy2(src, dst)
|
Loading…
Add table
Add a link
Reference in a new issue