joplin-mdbooks-website/move_html_to_dir
2021-11-20 17:54:59 +02:00

53 lines
1.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Rename files like `foo/bar.html` to `foo/bar/index.html` for prettier URLs.
"""
import re
import sys
from pathlib import Path
from typing import Dict
def replace_links(path: Path, replacements: Dict[str, str]):
for filename in path.glob("**/*.html"):
with filename.open("r+") as f:
contents = f.read()
f.truncate(0)
f.seek(0)
for source, target in replacements.items():
contents = contents.replace(source, target)
# Convert absolute links to relative.
contents = re.sub(
r'((?:href|src|root)\s*=\s*")((?:\.\./)+)([^\.])', r"\1/\3", contents
)
f.write(contents)
def main(path: Path):
replacements = {}
for p in path.glob("**/*.html"):
if str(p.parent) == ".":
# Don't convert top-level files.
continue
if p.name == "index.html":
# Don't convert top-level files.
continue
print(f"Converting {p}...")
dir_path = p.parent / p.stem
dir_path.mkdir(parents=True, exist_ok=True)
new_path = dir_path / "index.html"
p.rename(new_path)
replacements[str(p.relative_to(path))] = f"{new_path.parent.relative_to(path)}/"
replace_links(path, replacements)
if __name__ == "__main__":
main(Path(sys.argv[1]))