\n']
for key, label in SECTION_LABELS:
group = [b for b in books if b["section"] == key]
if not group:
continue
out.append('
\n' % key)
out.append(" %s
\n \n" % esc(label))
for book in group:
out.append(' - %s '
'%d
\n'
% (book["code"], esc(book["name"]), len(book["chapters"])))
out.append("
\n \n")
out.append('
\n'
% (esc(translation["name"]), esc(translation["license"])))
out.append("
\n")
path = os.path.join(out_dir, "index.html")
with open(path, "w", encoding="utf-8") as fh:
fh.write("".join(out))
return path
VERSES_FILE = "verses.json"
def chapter_verses(chapter):
labels = []
def walk(nodes):
for node in nodes:
if node["t"] == "verse":
labels.append(node["label"])
elif "c" in node:
walk(node["c"])
for block in chapter["blocks"]:
walk(block.get("content", []))
return labels
def render_verses(books, out_dir):
out = {}
total = 0
for book in books:
numbers = [c["number"] for c in book["chapters"]]
if numbers != list(range(1, len(numbers) + 1)):
raise RuntimeError("%s: chapters are not 1..%d (%s)"
% (book["code"], len(numbers), numbers))
chapters = []
for chapter in book["chapters"]:
labels = chapter_verses(chapter)
plain = [str(i + 1) for i in range(len(labels))]
chapters.append(len(labels) if labels == plain else labels)
total += len(labels)
out[book["code"]] = chapters
path = os.path.join(out_dir, VERSES_FILE)
with open(path, "w", encoding="utf-8") as fh:
json.dump(out, fh, separators=(",", ":"), ensure_ascii=False)
fh.write("\n")
return path, total
def main(argv=None):
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("source", nargs="?", default="source",
help="directory of eBible .htm files (default: source)")
ap.add_argument("-o", "--out", default="bible",
help="output directory (default: bible)")
args = ap.parse_args(argv)
data, skipped = extract(args.source)
os.makedirs(args.out, exist_ok=True)
total = 0
for book in data["books"]:
total += os.path.getsize(render_book(book, data["translation"], args.out))
render_index(data["books"], data["translation"], args.out)
verses, count = render_verses(data["books"], args.out)
chapters = sum(len(b["chapters"]) for b in data["books"])
notes = sum(len(c["notes"]) for b in data["books"] for c in b["chapters"])
print("read %s/" % args.source.rstrip("/"), file=sys.stderr)
print("books %d" % len(data["books"]), file=sys.stderr)
print("chapters %d" % chapters, file=sys.stderr)
print("notes %d" % notes, file=sys.stderr)
print("skipped %d (contents pages)" % len(skipped), file=sys.stderr)
print("html %.1f MB total, %.0f KB average"
% (total / 1e6, total / len(data["books"]) / 1e3), file=sys.stderr)
print("verses %d in %s (%.1f KB)"
% (count, os.path.basename(verses), os.path.getsize(verses) / 1e3),
file=sys.stderr)
print("wrote %s/" % args.out.rstrip("/"), file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())