110 lines
2.7 KiB
Python
110 lines
2.7 KiB
Python
#!/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])
|