119 lines
3.7 KiB
Python
Executable File
119 lines
3.7 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
"""
|
|
populate.py
|
|
|
|
This script should be run from within `bin/` with a single argument, which
|
|
should correspond to a director in `src/`, e.g. `./populate.py issue001`.
|
|
It will then create a corresponding directory in `zine` and populate it
|
|
with:
|
|
|
|
* Exact copies of any .gmi files found in e.g. `src/issue001/texts`
|
|
* Roughly Gopher-friendly .txt files generated from each .gmi file
|
|
(wrapped to 80 characters)
|
|
* A template index.gmi file containing links to all the .gmi files
|
|
* A template gophermap file containing links to all the .txt files
|
|
|
|
The idea is *not* that after adding all the submissions to `src/*/texts` you
|
|
run this script and hey-presto that zine issue is ready. This is just to
|
|
automate the drudge work so you can focus on doing the stuff that isn't so
|
|
easily automated.
|
|
"""
|
|
|
|
import glob
|
|
import os
|
|
import os.path
|
|
import shutil
|
|
import sys
|
|
import textwrap
|
|
|
|
def populate_issue(issue):
|
|
# Make sure issue exists
|
|
issue_src_path = os.path.join("../src", issue)
|
|
if not os.path.exists(issue_src_path):
|
|
print("Could not find issue {}!".format(issue_src_path))
|
|
return
|
|
|
|
# Make sure issue contains articles
|
|
articles = glob.glob(os.path.join(issue_src_path, "texts", "*.gmi"))
|
|
if not articles:
|
|
print("No articles found in {}!".format(issue_src_path))
|
|
return
|
|
|
|
# Create destination directory
|
|
issue_dst_path = os.path.join("..", "zine", issue)
|
|
if not os.path.exists(issue_dst_path):
|
|
os.mkdir(issue_dst_path)
|
|
|
|
# Copy .gmi files
|
|
dest_articles = []
|
|
for article in articles:
|
|
article_filename = os.path.split(article)[1]
|
|
print("Copying article {}...".format(article_filename))
|
|
dest_path = os.path.join(issue_dst_path, article_filename)
|
|
shutil.copy(article, dest_path)
|
|
dest_articles.append(dest_path)
|
|
|
|
# Create index
|
|
index_filename = os.path.join(issue_dst_path, "index.gmi")
|
|
create_index(index_filename, issue, dest_articles)
|
|
|
|
# Translate .gmi articles to .txt for Gopher
|
|
for article in dest_articles:
|
|
article_filename = os.path.split(article)[1]
|
|
txt_path = os.path.splitext(article)[0] + ".txt"
|
|
txt_filename = os.path.split(txt_path)[1]
|
|
print("Translating article {} to {}...".format(article_filename, txt_filename))
|
|
gemini_to_gopher(article, txt_path)
|
|
|
|
# TODO: Translate index to gophermap
|
|
|
|
def create_index(index_file, issue, article_list):
|
|
articles = [os.path.split(x)[1] for x in article_list]
|
|
fp = open(index_file, "w")
|
|
# Title
|
|
fp.write("# Circumlunar Transmissions - {}\n\n".format(issue))
|
|
|
|
# Preface
|
|
if "preface.gmi" in articles:
|
|
fp.write("## Preface\n\n")
|
|
fp.write("=> preface.gmi Editor's introduction\n\n")
|
|
|
|
# Features
|
|
fp.write("## Features\n\n")
|
|
for article in article_list:
|
|
article_filename = os.path.split(article)[1]
|
|
if article_filename == "preface.gmi":
|
|
continue
|
|
with open(article, "r") as fp_art:
|
|
first_line = fp_art.readline()
|
|
if first_line.startswith("#"):
|
|
title = first_line[1:].strip()
|
|
else:
|
|
title = article_filename
|
|
fp.write("=> {} {}\n".format(article_filename, title))
|
|
|
|
fp.close()
|
|
|
|
def gemini_to_gopher(article, txt_path):
|
|
fp_in = open(article, "r")
|
|
fp_out = open(txt_path, "w")
|
|
verbatim = False
|
|
for line in fp_in:
|
|
if line.startswith("```"):
|
|
verbatim = not verbatim
|
|
elif verbatim:
|
|
fp_out.write(line)
|
|
elif line.startswith("=> "):
|
|
fp_out.write(line)
|
|
else:
|
|
fp_out.write(textwrap.fill(line, 80)+"\n")
|
|
fp_in.close()
|
|
fp_out.close()
|
|
|
|
issues = sys.argv[1:]
|
|
|
|
for issue in issues:
|
|
populate_issue(issue)
|
|
|