97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
#! python3 # noqa: E265
|
|
|
|
# ############################################################################
|
|
# ########## Libraries #############
|
|
# ##################################
|
|
|
|
# for class autoref typing
|
|
from __future__ import annotations
|
|
|
|
# standard
|
|
from dataclasses import dataclass, field
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
# package modules
|
|
from mkdocs_rss_plugin.__about__ import __title__, __version__
|
|
|
|
if TYPE_CHECKING:
|
|
from collections.abc import MutableMapping
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from mkdocs.structure.pages import Page
|
|
|
|
# ############################################################################
|
|
# ########## Classes ###############
|
|
# ##################################
|
|
|
|
|
|
@dataclass
|
|
class MkdocsPageSubset:
|
|
"""Minimal subset of a Mkdocs Page with only necessary attributes for plugin needs."""
|
|
|
|
abs_src_path: str
|
|
dest_uri: str
|
|
src_uri: str
|
|
title: str | None = None
|
|
meta: MutableMapping[str, Any] | None = None
|
|
|
|
@classmethod
|
|
def from_page(cls, page: Page) -> MkdocsPageSubset:
|
|
"""Create a PageSubset from a Mkdocs page.
|
|
|
|
Args:
|
|
page: MkDocs Page object
|
|
"""
|
|
return cls(
|
|
abs_src_path=page.file.abs_src_path,
|
|
meta=page.meta,
|
|
title=page.title,
|
|
src_uri=page.file.src_uri,
|
|
dest_uri=page.file.dest_uri,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class PageInformation:
|
|
"""Object describing a page information gathered from Mkdocs and used as feed's item."""
|
|
|
|
abs_path: Path | None = None
|
|
categories: list | None = None
|
|
authors: tuple | None = None
|
|
comments_url: str | None = None
|
|
created: datetime | None = None
|
|
description: str | None = None
|
|
guid: str | None = None
|
|
image: tuple[str, str, int] | None = None
|
|
link: str | None = None
|
|
pub_date: str | None = None
|
|
title: str | None = None
|
|
updated: datetime | None = None
|
|
# private
|
|
_mkdocs_page_ref: MkdocsPageSubset | None = field(
|
|
default=None, repr=False, compare=False
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class RssFeedBase:
|
|
"""Object describing a feed."""
|
|
|
|
author: str | None = None
|
|
buildDate: str | None = None
|
|
copyright: str | None = None
|
|
description: str | None = None
|
|
entries: list[PageInformation] = field(default_factory=list)
|
|
generator: str = f"{__title__} - v{__version__}"
|
|
html_url: str | None = None
|
|
json_url: str | None = None
|
|
language: str | None = None
|
|
logo_url: str | None = None
|
|
pubDate: str | None = None
|
|
repo_url: str | None = None
|
|
rss_url: str | None = None
|
|
stylesheet: str | None = None
|
|
title: str | None = None
|
|
ttl: int | None = None
|