1
0
mirror of https://codeberg.org/fediverse/fep.git synced 2026-08-05 03:35:52 +00:00
Files
fep/scripts/fep_tools/site_fep_page.py
T
Helge e4683fbcda Create a FEP static site (#673)
### Preview version

https://helge.codeberg.page/fep/

click there to judge

### Tasks done

- [x] Add a proper index.md instead of final.md .... needs me to filter the readme.md
- [x] search is broken  --> will resolve itself when all feps are part of it
- [x] Update https://codeberg.org/fediverse/fep/src/branch/main/fep/7d8c/fep-7d8c.md
- [x] The admonition format (according to copilot I can blame this format on Microsoft https://learn.microsoft.com/en-us/contribute/content/markdown-reference#alerts-note-important-tip-warning-caution)

    ```
    >[!NOTE]
    >ActivityPub [requires][ActivityPub-Collections] ordered collections to be presented in reverse chronological order. However, an [erratum][ActivityPub-Errata] was proposed to relax this requirement.
    ```
    is not the one supported by python, see https://python-markdown.github.io/extensions/admonition/ . One can probably resolve this by adapting the code https://github.com/Python-Markdown/markdown/blob/f39cf84a24124526c1a0efbe52219fa9950774f6/markdown/extensions/admonition.py

- [x] FEPs miss meta information ....
- [x] Meta information for tracking issue and discussion to link should be formatted
- [x] copy script has problems with contained directories
- [x] add codeberg link to meta, e.g. https://helge.codeberg.page/fep/fep/1b12/
- [x] include implementation counts -> https://codeberg.org/fediverse/fep/issues/686

Co-authored-by: silverpill <silverpill@firemail.cc>
Reviewed-on: https://codeberg.org/fediverse/fep/pulls/673
Reviewed-by: silverpill <silverpill@noreply.codeberg.org>
Co-authored-by: Helge <helge.krueger@gmail.com>
Co-committed-by: Helge <helge.krueger@gmail.com>
2025-11-01 08:40:20 +01:00

125 lines
3.1 KiB
Python

import re
import shutil
from pathlib import Path
try:
import nh3
from markdown import markdown
except Exception:
...
from .fep_file import FepFile
from .table import TableLineBuilder
def transform_key(x: str) -> str:
if x in ["dateReceived", "dateWithdrawn", "trackingIssue"]:
return re.sub(r"(?<!^)(?=[A-Z])", "_", x).lower()
if x == "dateFinalized":
return "date_final"
if x == "discussionsTo":
return "discussions"
return x
possible_matter_keys = [
"authors",
"status",
"type",
"date_received",
"date_final",
"date_withdrawn",
"tracking_issue",
"discussions",
"repository",
]
def format_metatable(fep: FepFile) -> str:
"""Creates a markdown table containing FEP metadata"""
matter_keys = [transform_key(x) for x in fep.parsed_frontmatter.keys()]
matter_keys = [x for x in possible_matter_keys if x in matter_keys] + ["repository"]
line_builder = TableLineBuilder(fep=fep, columns=list(matter_keys))
keys = " | ".join(x.replace("_", " ").capitalize() for x in matter_keys)
values = line_builder.line
divider = " | ".join(["---"] * len(matter_keys))
return f"""
| {keys} |
| {divider} |
{values}
"""
def clean_markdown(text: str) -> str:
"""Transforms markdown to a plain text string. To be used in the frontmatter"""
transformed = nh3.clean(markdown(text), tags=set())
transformed = re.sub(r"\[(.+?)\]\[(.+?)\]", r"\1", transformed)
transformed = transformed.replace(
":", " "
) # See https://codeberg.org/fediverse/fep/pulls/673/files#issuecomment-7514311
return transformed.replace("\n", " ")
def frontmatter_for_fep(fep: FepFile) -> str:
summary = fep.summary
if summary is None:
return """---
hide:
- navigation
---
"""
description = clean_markdown(summary)
return f"""---
hide:
- navigation
description: {description}
---
"""
def transform_content(content: str) -> str:
"""Transforms links to other FEPs. These need to be adjusted due to
the renaming of `fep-slug.md` to `index.md`."""
content = re.sub(
r"\[(.+?)\]\((\.\./.+)/fep-(.+).md\)", r"[\1](\2/index.md)", content
)
content = re.sub(r"\[(.+?)\]: (\.\./.+)/fep-(.+).md", r"[\1]: \2/index.md", content)
return content
def fep_to_site_mkdocs(fep: FepFile) -> str:
"""Transforms the FEP to markdown suitable for publishing as a static website"""
title, content = fep.content_and_title()
file_content = (
frontmatter_for_fep(fep)
+ title
+ "\n\n"
+ format_metatable(fep)
+ "\n\n"
+ transform_content(content)
)
return file_content
def make_page_for_fep(fep: FepFile):
"""Copies relevant files for the FEP and adjusts index.md"""
slug = fep.fep
base_path = f"scripts/docs/fep/{slug}/"
Path(base_path).mkdir(exist_ok=True, parents=True)
shutil.rmtree(base_path)
shutil.copytree(f"fep/{slug}/", base_path)
shutil.move(f"{base_path}/fep-{slug}.md", f"{base_path}/index.md")
with open(f"{base_path}/index.md", "w") as fp:
fp.write(fep_to_site_mkdocs(fep))