Add base structure for generation script.
This commit is contained in:
commit
d6ae48ed25
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
_gen
|
109
_scripts/generate.py
Normal file
109
_scripts/generate.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import uuid
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from org_rw import OrgTime
|
||||||
|
from org_rw import dump as dump_org
|
||||||
|
from org_rw import dumps as dumps_org
|
||||||
|
from org_rw import load as load_org
|
||||||
|
|
||||||
|
EXTENSIONS = [
|
||||||
|
".org",
|
||||||
|
".org.txt",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def load_all(top_dir_relative):
|
||||||
|
top = os.path.abspath(top_dir_relative)
|
||||||
|
|
||||||
|
docs = []
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(top):
|
||||||
|
for name in files:
|
||||||
|
if ".org" not in name:
|
||||||
|
continue
|
||||||
|
|
||||||
|
path = os.path.join(root, name)
|
||||||
|
|
||||||
|
try:
|
||||||
|
doc = load_org(open(path), extra_cautious=True)
|
||||||
|
docs.append(doc)
|
||||||
|
except Exception as err:
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
traceback.print_exc()
|
||||||
|
print(f"== On {path}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info("Collected {} files".format(len(docs)))
|
||||||
|
return docs
|
||||||
|
|
||||||
|
|
||||||
|
def main(src_top, dest_top):
|
||||||
|
docs = load_all(src_top)
|
||||||
|
|
||||||
|
os.makedirs(dest_top, exist_ok=True)
|
||||||
|
for doc in docs:
|
||||||
|
relpath = os.path.relpath(doc.path, src_top)
|
||||||
|
changed = False
|
||||||
|
headlines = list(doc.getTopHeadlines())
|
||||||
|
related = None
|
||||||
|
|
||||||
|
i = len(headlines)
|
||||||
|
while i > 0:
|
||||||
|
i -= 1
|
||||||
|
headline = headlines[i]
|
||||||
|
if headline.title.strip().lower() == "related":
|
||||||
|
assert related is None
|
||||||
|
related = headline
|
||||||
|
headlines.pop(i)
|
||||||
|
|
||||||
|
for headline in headlines:
|
||||||
|
if headline.id is None:
|
||||||
|
headline.id = str(uuid.uuid4())
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
print("Updated", relpath)
|
||||||
|
save_changes(doc)
|
||||||
|
|
||||||
|
if not relpath.startswith("public/"):
|
||||||
|
# print("Skip:", relpath)
|
||||||
|
continue
|
||||||
|
pubpath = relpath.split("/", 1)[1]
|
||||||
|
endpath = pubpath + ".html"
|
||||||
|
for extension in EXTENSIONS:
|
||||||
|
if pubpath.endswith(extension):
|
||||||
|
endpath = pubpath[: -len(extension)] + ".html"
|
||||||
|
break
|
||||||
|
print("PUBLIC", pubpath, "→", endpath)
|
||||||
|
|
||||||
|
endpath = os.path.join(dest_top, endpath)
|
||||||
|
dirname = os.path.dirname(endpath)
|
||||||
|
if len(dirname) > 0:
|
||||||
|
os.makedirs(dirname, exist_ok=True)
|
||||||
|
with open(endpath, "wt") as f:
|
||||||
|
f.write(render(doc))
|
||||||
|
|
||||||
|
|
||||||
|
def render(doc):
|
||||||
|
return dumps_org(doc)
|
||||||
|
|
||||||
|
|
||||||
|
def save_changes(doc):
|
||||||
|
assert doc.path is not None
|
||||||
|
with open(doc.path, "wt") as f:
|
||||||
|
dumps_org(doc, f)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Usage: {} SOURCE_TOP DEST_TOP".format(sys.argv[0]))
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(message)s")
|
||||||
|
main(sys.argv[1], sys.argv[2])
|
Loading…
Reference in New Issue
Block a user