go-import-paths/generate.py
2024-06-18 19:42:57 +01:00

96 lines
2.4 KiB
Python

import yaml
import dominate
from dominate.tags import *
import os
import copy
from pathlib import Path
def load_yaml(data: str) -> any:
return yaml.load(data, Loader=yaml.CFullLoader)
def main():
with open("vanity.yml") as f:
conf = load_yaml(f.read())
assert "host" in conf
assert "paths" in conf
conf["paths"] = {
sanitise_path(p): preprocess_path_object(conf["paths"][p])
for p in conf["paths"]
}
print(conf["paths"])
output_path = Path("_dist")
if not os.path.exists(output_path):
os.makedirs(output_path)
with open(output_path / "index.html", "w") as f:
f.write(generate_index(conf))
for path in conf["paths"]:
fs_path = output_path / path.removeprefix("/")
os.makedirs(fs_path)
with open(fs_path / "index.html", "w") as f:
f.write(generate_page(conf, path, conf["paths"][path]))
def generate_index(conf):
doc = dominate.document(title=conf["host"])
with doc.head:
style(open("styles.css").read())
with doc.add(div(cls="projects")):
for path in conf.get("paths", {}):
path_details = conf["paths"][path]
with div(cls="project", id=path):
h2(
span(conf["host"], cls="secondary"), path
) # path always leads with a /
if "byline" in path_details:
p(path_details["byline"])
a("Docs", cls="button", href=f"https://pkg.go.dev/{conf['host']}{path}")
a("Source", cls="button", href=path_details["repo"])
return str(doc)
def generate_page(conf, path, obj):
doc = dominate.document(title=conf["host"] + path)
# https://pkg.go.dev/cmd/go#hdr-Remote_import_paths
# https://github.com/golang/gddo/wiki/Source-Code-Links
with doc.head:
meta(
name="go-import", content=f"{conf['host']}{path} {obj['vcs']} {obj['repo']}"
)
if "display" in obj:
meta(name="go-source", content=obj["display"])
meta(http_equiv="refresh", content=f"0;url=//{conf['host']}#{path}")
return str(doc)
def sanitise_path(path):
if not path.startswith("/"):
path = "/" + path
return path
def preprocess_path_object(obj):
obj = copy.copy(obj)
assert "repo" in obj
if "vcs" not in obj:
obj["vcs"] = "git"
return obj
if __name__ == "__main__":
main()