bazzite/docs/hooks/cmdrun.py

182 lines
6.1 KiB
Python
Raw Normal View History

feat(docs): Replace mdbook with mkdocs workflow (#1548) * feat: add mdbook docs * chore: add several articles to docs * docs: add documentation at surface level Using Discourse urls as fallback for missing content for now docs: add missing image files * docs: Add missing chapter emojis docs: Add missing warning in Advanced docs in summary docs: add missing waydroid guide docs: rename files to avoid spaces docs: fix badly set docs build params docs: remove unnecesary placeholders * docs: Realocate 'Gaming' section under 'General' * docs: Add 'Introduction' section This section contains a table of contents of the documentation * docs: Add unstable documentation warning * docs: Add missing github url docs: add missing symlink to resources * docs: Add discourse scrapper utility * docs: minor discourse scrapper docs changes * docs: Add youtube embeding preprocessor * minor reformat for youtube-embed * docs: Add mdbook preprocessor template * docs: add format-author preprocessor * docs: add git lib to mdbook toolset * docs: Always fetch the highest quality image by fetch_discourse_md * docs: fix youtube-embed ignoring new line requirement * docs: Add documentation transcription guide * docs: Missing url in transcription guide * docs: Remove YAML header from doc guide * docs: Minor tweaks to transcription guide * docs: Add utilities preprocessor module docs: Move debug preprocessor util to utils * docs: tweak debug function * docs: Add 'replace-urls' preprocessor * chore: Move mappings parameter in replace-urls preprocessor * docs: add ignore field to replace-urls * docs: add Mdbook python types * docs: Add ignore field to replace-urls Now we can exclude files from being processed with blob patterns * chore(ci): add deploy_docs * chore(ci): Add dynamic edit url template to deploy_docs * chore(ci): Add html.site-url to deploy_docs * chore(readme): Use relative paths for repo_content * chore(ci): Add README to included paths for deploy_docs * chore(ci): Disable deploy_docs * chore(ci): Use main in deploy_docs.on.push.branches * docs: Rephrase unstable docs warning * chore(ci): Exclude docs from triggering build workflow * chore(ci): Enable deploy_docs * fix(docs): Remove unnecessary imports in preprocessors * docs: Move unstable docs warning to index.hbs * docs: Add page metadata inclusion with fetch_discourse_md.py * docs: Move fetch_discourse_md.py to docs/utils * docs: Add 'fetched_at' metadata field in fetch_discourse_md.py * docs: Update fetch_discourse_md.py to format metadata in json * Revert "chore(readme): Use relative paths for repo_content" This reverts commit 6a781c659607e0c83c19248241684c5785c7e93b. * docs: Replace include with an url to repo README * ci(docs): Add multilanguage doc build support * docs: add Justfile utility * docs: update Justfile utility * ci(docs): Add stricter workflow trigger to deploy_docs * docs: add 'preview_translation' to Justfile * docs: add documentation translation guide * ci(docs): Add mdbook cache * ci(docs): Add i18n-report * ci(docs): tweak deploy_docs workflow triggers * ci(docs): remove unnecessary slash at build.yml * ci(docs): remove unnecessary slash at deploy_docs.yml * ci(docs): add docs/book.toml to deploy_docs trigger * ci(docs): Add schedule trigger * ci(docs): add github-pages cleaning * ci(docs): Exclude docs from generate_changelog * docs: Add dependencies installation script * ci(docs): Add mdbook pdf build * docs: Tweak Justfile to support pdf generation * Revert "docs: Always fetch the highest quality image by fetch_discourse_md" This reverts commit 74130ee1fe9264dc7a4c4c49fb416ef3dc12e322. * ci(docs): Exclude deploy_docs.yml from cache-mdbook keys * docs: Add 'mdbook_build' to Justfile * docs: Add 'mdbook_serve' to Justfile * docs: Add debug flag to fetch_discourse_md * docs: Automate discourse documentation scrapping * docs: Add flock to fetch_discourse_md * docs: Add translation file generation with Justfile * docs: Prefix url replacements with site-url in replace-urls.py preprocessor * docs: Add installation guides docs: Replace print button * Revert "docs: Prefix url replacements with site-url in replace-urls.py preprocessor" This reverts commit a685de4dce54debc900607d743069b79202a26ac. * Reapply "docs: Prefix url replacements with site-url in replace-urls.py preprocessor" This reverts commit 777d8055eac7543001200834939c960fb490e666. * docs: fix replace-urls.py * docs: fix fetch_discourse_md.py hitting discourse ip_10_secs_limit * ci(docs): Remove duplicate '/' in build translation step * ci(docs): Update actions/cache * ci(docs): Reduce deploy_docs schedule timespan between triggers * docs: update install-deps.sh * docs: Update Advanced docs * docs: Add favicon * docs: Reword unstable documentation warning * docs: Change default theme to 'navy' * ci(docs): Move permisions to job scope * docs: refactor fetch_discourse_md.py Now it will export the function 'fetch', which other python scripts can use * docs: Add mkdocs skeleton * docs: Add cmdrun hook * ci(docs): Migrade deploy_docs to use mkdocs * chore: remove mdbook leftover files * docs: add support for markdown emojies * docs: add support for i18n translations to mkdocs * docs: add resource prefetching * docs: enable navigation indexes in toc * docs: add unstable documentation warning * docs: normalize toc docs: Add markdown magiclinks * docs: remove unnecesary extensions * ci(docs): Separate docs build into its own action * ci(docs): fix build docs action * ci(docs): Add default parameters to build_mkdocs action * ci(docs): Clean up leftover mdbook files * docs: remove leftover mkdocs-print-site-plugin * chore: add mkdocs offline documentation * docs: fix list indentation * ci(docs): Add github links to mkdocs * ci(docs): Add github authors to mkdocs * docs: Update documentation guide and scripts to mkdocs * docs: Add cache capabilities to cmdrun hook * docs: Enable instant loading docs: Enable toc in sidebar * docs: Update summary and add more posts * docs: Add mkdocs-material social plugin * docs: Disable instant loading * docs: Fix section url * docs: Fix fetch_discourse not fetching images properly * docs: Disable warning for using absolute links * docs: Add url replacement hook * docs: Restore 'General' section * docs: Remove aditional languages for now * docs: Add missing page titles * docs: move and rename index.md to docs/src/Handheld_and_HTPC_edition/Steam_Gaming_Mode.md * docs: remove leftover Bazzite_resources.md * docs: Add time fallback to git-revision-date * docs: Add navigation tabs * docs: Clear cmdrun cache with Justfile * docs: Add missing dual-boot guide url * docs: Change to a shorter section name for handheld and HTPC * docs: Add embed_youtube hook * docs: Remove leftover resources entry in index docs: Fix outdated 'Steam Gaming Overview' link in index * docs: Limit vertical image size * docs: add more url replacements * docs: Enable search features
2024-08-29 00:48:19 +02:00
import hashlib
import os
from pathlib import Path
import sys
from mkdocs.config.defaults import MkDocsConfig
from mkdocs import plugins
from mkdocs.structure.pages import Page
from mkdocs.structure.files import Files
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from copy import copy
import re
from fetch_discourse_md import fetch as fetch_md_discourse
########################### ONLY MODIFY THIS ###########################
URL_MAPPINGS = [
# region GENERAL
( # src/index.md
"https://universal-blue.discourse.group/docs?topic=561",
"/",
),
( # src/General/reporting_bugs.md
"https://universal-blue.discourse.group/docs?topic=3402",
"/General/reporting_bugs",
),
# region INSTALLATION GUIDE
( # src/General/Installation_Guide/Installing_Bazzite_for_HTPC_Setups.md
"https://universal-blue.discourse.group/docs?topic=1145",
"/General/Installation_Guide/Installing_Bazzite_for_HTPC_Setups/",
),
( # src/General/Installation_Guide/index.md
"https://universal-blue.discourse.group/docs?topic=35",
"/Installing_and_Managing_Software/",
),
( # src/General/Installation_Guide/dual_boot_setup_guide.md
"https://universal-blue.discourse.group/docs?topic=2743",
"/General/Installation_Guide/dual_boot_setup_guide/",
),
( # src/General/Installation_Guide/secure_boot.md
"https://universal-blue.discourse.group/docs?topic=2742",
"/General/Installation_Guide/secure_boot",
),
( # src/General/Installation_Guide/troubleshoot_guide.md
"https://universal-blue.discourse.group/docs?topic=2495",
"/General/Installation_Guide/troubleshoot_guide/",
),
# endregion INSTALLATION GUIDE
# endregion GENERAL
# region SOFTWARE
( # src/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/index.md
"https://universal-blue.discourse.group/docs?topic=36",
"/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/",
),
( # src/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/updating_guide.md
"https://universal-blue.discourse.group/docs?topic=2637",
"/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/updating_guide/",
),
( # src/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/rolling_back_system_updates.md
"https://universal-blue.discourse.group/docs?topic=2644",
"/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/rolling_back_system_updates/",
),
( # src/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/rebase_guide.md
"https://universal-blue.discourse.group/docs?topic=2646",
"/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/rebase_guide/",
),
( # src/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/bazzite_rollback_helper.md
"https://universal-blue.discourse.group/docs?topic=2647",
"/Installing_and_Managing_Software/Updates_Rollbacks_&_Rebasing/bazzite_rollback_helper/",
),
# endregion SOFTWARE
( # src/Gaming/index.md
"https://universal-blue.discourse.group/docs?topic=31",
"/Gaming/",
),
# region HTPC
( # src/Handheld_and_HTPC_edition/Handheld_Wiki/index.md
"https://universal-blue.discourse.group/docs?topic=1038",
"/Handheld_and_HTPC_edition/Handheld_Wiki/",
),
( # src/Handheld_and_HTPC_edition/Handheld_Wiki/Steam_Deck.md
"https://universal-blue.discourse.group/docs?topic=1849",
"/Handheld_and_HTPC_edition/Handheld_Wiki/Steam_Deck/",
),
( # src/Handheld_and_HTPC_edition/Steam_Gaming_Mode.md
"https://universal-blue.discourse.group/docs?topic=37",
"/Handheld_and_HTPC_edition/Steam_Gaming_Mode/",
),
# endregion HTPC
# region ADVANCED
(
# src/Advanced/Auto-Mounting_Secondary_Drives.md
"https://universal-blue.discourse.group/docs?topic=970",
"/Advanced/Auto-Mounting_Secondary_Drives/",
),
# endregion ADVANCED
]
########################################################################
CMDRUN_PATTERN = r"<!--\s?cmdrun\s+fetch_discourse_md\.py\s+\"(.*)\"\s*-->"
PLUGIN_NAME = os.path.basename(__file__).rstrip(".py")
plugin_cache_dir: str
def _cache_filename_generator(text: str) -> str:
"""Generate a sha265 encoded cache file path of a piece of text inside the plugin cache dir"""
cache_file = os.path.join(
plugin_cache_dir, hashlib.sha256(text.encode()).hexdigest()
)
return cache_file
def _fetch_callback(url: str):
cache_file = _cache_filename_generator(url)
if os.path.exists(cache_file):
return Path(cache_file).read_text().strip()
elif content := fetch_md_discourse(url):
with open(cache_file, "w+t") as c_file:
c_file.write(content)
return content
else:
return ""
def _cmdrun_sub_handler(match: re.Match) -> str:
print(match.group(1))
url = match.group(1)
result = _fetch_callback(url)
return result or ""
def on_config(config: MkDocsConfig):
"""Initialize cache dir"""
global plugin_cache_dir
plugin_cache_dir = os.path.join(
os.path.dirname(config.config_file_path), ".cache", PLUGIN_NAME
)
try:
os.makedirs(plugin_cache_dir, exist_ok=True)
except FileExistsError:
pass
@plugins.event_priority(100)
def _on_page_markdown_fetch_discourse(markdown: str, **kargs):
markdown_orig = markdown
result = copy(markdown_orig)
try:
result = re.sub(CMDRUN_PATTERN, _cmdrun_sub_handler, markdown_orig)
except Exception as err:
print("ERROR", err)
return result
@plugins.event_priority(99)
def _on_page_markdown_replace_urls(
markdown: str,
page: Page,
config: MkDocsConfig,
files: Files,
**kargs,
):
"""Replace discourse urls"""
res = markdown
for src, dst in URL_MAPPINGS:
if config.site_url:
dst = f"{config.site_url.rstrip("/")}/{dst.lstrip("/")}"
res = res.replace(src, dst)
return res
on_page_markdown = plugins.CombinedEvent(
_on_page_markdown_fetch_discourse,
_on_page_markdown_replace_urls,
)