herolib_python/lib/web/doctools/processor.py
2025-08-05 15:15:36 +02:00

95 lines
3.2 KiB
Python

import os
import re
from typing import Callable
from herotools.logger import logger
from herotools.md5 import file_md5
from herotools.texttools import name_fix
def _example_set_file(site_name: str, path: str, md5: str) -> None:
# Placeholder for actual implementation
logger.debug(f"set_file : site_name={site_name[:20]:<20} {path}")
def _example_set_img(site_name: str, path: str, md5: str) -> None:
# Placeholder for actual implementation
logger.debug(f"set_img : site_name={site_name[:20]:<20} {path}")
def _example_set_markdown(
site_name: str, path: str, md5: str, content: str
) -> None:
# Placeholder for actual implementation
logger.debug(f"set_markdown : site_name={site_name[:20]:<20} {path}")
def _example_set_site(site_name: str, path: str) -> None:
# Placeholder for actual implementation
logger.info(f"set_site : site_name={site_name[:20]:<20} {path}")
def _site_process_action(
site_name: str,
site_path: str,
set_file: Callable[[str, str, str], None],
set_img: Callable[[str, str, str], None],
set_markdown: Callable[[str, str, str, str], None],
) -> None:
logger.debug(f"site process: {site_path[:60]:<60} -> {site_name}")
for root, _, files in os.walk(site_path):
for file in files:
file_path = os.path.join(root, file)
file_path_rel = os.path.relpath(file_path, site_path)
file_name = os.path.basename(file)
# print(file_name)
mymd5 = file_md5(file_path)
if file.lower().endswith(".md"):
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
set_markdown(site_name, file_path_rel, mymd5, content)
elif file_name in [".collection", ".site", ".done"]:
continue
elif re.search(
r"\.(jpg|jpeg|png|gif|bmp|tiff|webp)$", file, re.IGNORECASE
):
set_img(site_name, file_path_rel, mymd5)
else:
set_file(site_name, file_path_rel, mymd5)
def process(
path: str,
set_site: Callable[[str, str], None],
set_file: Callable[[str, str, str], None],
set_img: Callable[[str, str, str], None],
set_markdown: Callable[[str, str, str, str], None],
) -> None:
"""
walk over directory and apply set_file(), set_img() and set_markdown()
"""
path = os.path.abspath(os.path.expanduser(path))
logger.info(f"sites process: {path}")
for root, dirs, files in os.walk(path):
if ".site" in files or ".collection" in files:
site_name = name_fix(os.path.basename(root))
set_site(site_name, root)
_site_process_action(
site_name, root, set_file, set_img, set_markdown
)
# Prevent the os.walk from going deeper into subdirectories
dirs[:] = []
if __name__ == "__main__":
mypath = "~/code/git.threefold.info/projectmycelium/info_projectmycelium/collections"
# logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
process(
mypath,
_example_set_site,
_example_set_file,
_example_set_img,
_example_set_markdown,
)