Compare commits
2 commits
6dcba34120
...
320f74b84e
Author | SHA1 | Date | |
---|---|---|---|
320f74b84e | |||
4f8979ae9b |
3 changed files with 31 additions and 13 deletions
|
@ -1,5 +1,5 @@
|
|||
import shutil
|
||||
from datetime import date, datetime
|
||||
from datetime import date
|
||||
from pathlib import Path
|
||||
|
||||
from feedgen.feed import FeedGenerator
|
||||
|
@ -101,9 +101,11 @@ class ZonaBuilder:
|
|||
items.append(item)
|
||||
self.items = items
|
||||
|
||||
def generate_feed(self) -> str:
|
||||
def generate_feed(self) -> bytes:
|
||||
post_list = self._get_post_list()
|
||||
config = self.config.feed
|
||||
if config.link.endswith("/"):
|
||||
config.link = config.link[:-2]
|
||||
fg = FeedGenerator()
|
||||
fg.id(config.link)
|
||||
fg.title(config.title)
|
||||
|
@ -112,7 +114,11 @@ class ZonaBuilder:
|
|||
"email": config.author.email,
|
||||
}
|
||||
fg.author(author)
|
||||
fg.link(href=config.link, rel="self")
|
||||
fg.link(
|
||||
href=f"{config.link}/{config.path}",
|
||||
rel="self",
|
||||
type="application/rss+xml",
|
||||
)
|
||||
fg.language(config.language)
|
||||
fg.description(config.description)
|
||||
|
||||
|
@ -120,14 +126,18 @@ class ZonaBuilder:
|
|||
assert post.metadata
|
||||
fe = fg.add_entry() # pyright: ignore[reportUnknownVariableType]
|
||||
fe.id(f"{config.link}{util.normalize_url(post.url)}") # pyright: ignore[reportUnknownMemberType]
|
||||
fe.link( # pyright: ignore[reportUnknownMemberType]
|
||||
href=f"{config.link}{util.normalize_url(post.url)}"
|
||||
)
|
||||
fe.title(post.metadata.title) # pyright: ignore[reportUnknownMemberType]
|
||||
fe.author(author) # pyright: ignore[reportUnknownMemberType]
|
||||
fe.description(post.metadata.description) # pyright: ignore[reportUnknownMemberType]
|
||||
desc = post.metadata.description
|
||||
fe.description(desc) # pyright: ignore[reportUnknownMemberType]
|
||||
date = post.metadata.date
|
||||
# ISSUE: lack of timezone causes an error, need to add TZ config option
|
||||
dt = datetime.combine(date, datetime.min.time())
|
||||
fe.pubDate(dt) # pyright: ignore[reportUnknownMemberType]
|
||||
return fg.rss_str(pretty=True) # pyright: ignore[reportUnknownVariableType]
|
||||
fe.pubDate(date) # pyright: ignore[reportUnknownMemberType]
|
||||
out: bytes = fg.rss_str(pretty=True) # pyright: ignore[reportUnknownVariableType]
|
||||
assert isinstance(out, bytes)
|
||||
return out
|
||||
|
||||
def _get_post_list(self) -> list[Item]:
|
||||
assert self.items
|
||||
|
@ -218,4 +228,4 @@ class ZonaBuilder:
|
|||
logger.debug("Building...")
|
||||
self._build()
|
||||
self.fresh = False
|
||||
# print(self.generate_feed())
|
||||
print(self.generate_feed().decode())
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import tzinfo
|
||||
from datetime import datetime, tzinfo
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from zoneinfo import ZoneInfo
|
||||
|
@ -10,7 +10,6 @@ import yaml
|
|||
from dacite import Config as DaciteConfig
|
||||
from dacite import from_dict
|
||||
|
||||
from zona import util
|
||||
from zona.log import get_logger
|
||||
|
||||
logger = get_logger()
|
||||
|
@ -32,9 +31,17 @@ def find_config(start: Path | None = None) -> Path | None:
|
|||
SitemapConfig = dict[str, str]
|
||||
|
||||
|
||||
@dataclass
|
||||
class PostDefaultsConfig:
|
||||
description: str = "A blog post"
|
||||
|
||||
|
||||
@dataclass
|
||||
class BlogConfig:
|
||||
dir: str = "blog"
|
||||
defaults: PostDefaultsConfig = field(
|
||||
default_factory=PostDefaultsConfig
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
|
@ -86,7 +93,7 @@ class AuthorConfig:
|
|||
class FeedConfig:
|
||||
enabled: bool = True
|
||||
timezone: tzinfo = field(default_factory=lambda: ZoneInfo("UTC"))
|
||||
path: str = "feed.xml"
|
||||
path: str = "rss.xml"
|
||||
link: str = "https://example.com"
|
||||
title: str = "Zona Website"
|
||||
description: str = "My zona website."
|
||||
|
|
|
@ -17,7 +17,7 @@ from zona.config import ZonaConfig
|
|||
class Metadata:
|
||||
title: str
|
||||
date: datetime
|
||||
description: str | None
|
||||
description: str
|
||||
show_title: bool = True
|
||||
show_date: bool = True
|
||||
show_nav: bool = True
|
||||
|
@ -70,6 +70,7 @@ def parse_metadata(
|
|||
defaults = {
|
||||
"title": zona.util.filename_to_title(path),
|
||||
"date": datetime.fromtimestamp(path.stat().st_ctime),
|
||||
"description": config.blog.defaults.description,
|
||||
}
|
||||
meta = {**defaults, **raw_meta}
|
||||
meta["date"] = parse_date(meta.get("date"), config.feed.timezone)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue