"""Generate the Hacker Laws website from the Hacker Laws README""" import argparse import os import shutil from jinja2 import Environment, FileSystemLoader import markdown from bs4 import BeautifulSoup def bisect_text(content: str, bisect_line: str) -> tuple[str, str]: lines = content.splitlines() head = [] tail = [] found = False for line in lines: if found is False and line == bisect_line: found = True continue if found: tail.append(line) else: head.append(line) return ("\n".join(head), "\n".join(tail)) def load_template(): """Load Jinja2 template from the specified directory.""" env = Environment(loader=FileSystemLoader(TEMPLATE_DIR)) return env.get_template(TEMPLATE_FILE) def prepare_markdown(path: str) -> str: """ Pre-process the README markdown by removing content we will not show in the final website. """ # Load the markdown content. with open(path, "r", encoding="utf-8") as f: content = f.read() return content def parse_markdown(markdown_content: str): (_, remains) = bisect_text(markdown_content, "") (_, content) = bisect_text(remains, "") md = markdown.Markdown(extensions=['toc']) md.convert(content) toc = md.toc markdown_sections = content.split("\n#") # Split by Markdown headings sections = [] laws = [] for markdown_section in markdown_sections: if markdown_section.strip(): lines = markdown_section.split("\n", 1) title = lines[0].strip("# ").strip() content = md.convert(lines[1] if len(lines) > 1 else "") full_content = md.convert(markdown_section) id = title.lower().replace(" ", "-") laws.append({"title": title, "content": content, "id": id}) sections.append({ "title": title, "content": content, "id": id, "full_content": full_content }) return (sections, toc) def extract_static_files(html_content, output_dir): """ Extract linked CSS, JS, and image files and copy them to the output directory. """ soup = BeautifulSoup(html_content, "html.parser") files_to_copy = [] # Extract stylesheets for link in soup.find_all("link", href=True): href = link["href"] if not href.startswith(("http", "//")): # Ignore external links files_to_copy.append(href) # Extract