import operator import os import datetime import time def jargonParseEntry(filename): if not os.path.isfile(filename): return [] entry = [] line = [] with open(filename) as fp: line = fp.readlines() fp.close() text = '' if len(line) > 2: for i in range(len(line)): if i == 0: entry.append(line[i].replace('\n', '').strip()) if i >= 2: text = text + line[i] text = text.replace('\n', ' ') # remove any gaps pos = text.find(' ') while pos != -1: text = text.replace(' ', ' ') pos = text.find(' ') entry.append(text.strip()) return entry def jargonSubdefinitions(text): """returns the number of sub-definitions within a description""" definitions = 0 prevpos = 0 for i in range(10): definitionStr = str(i+1) + ". " pos = text.find(definitionStr) if pos == -1 or pos < prevpos: break else: definitions = definitions + 1 prevpos = pos if definitions == 0: definitions = 1 # too many definitions if definitions > 8: definitions = 0 return definitions def jargonGetEntries(entriesDir): entries = [] for dirName, subdirList, fileList in os.walk(entriesDir): for filename in fileList: entry = jargonParseEntry(entriesDir + '/' + filename) if entry: entries.append(entry) entries.sort(key=operator.itemgetter(0)) return entries def saveLicense(fp, year, publishername): """saves the license details""" fp.write("Copyright (c) " + str(year) + " " + publishername + "\n") fp.write("Permission is granted to copy, distribute and/or modify this " "document\n") fp.write("under the terms of the GNU Free Documentation License, Version " "1.3\n") fp.write("or any later version published by the Free Software " "Foundation;\n") fp.write("with no Invariant Sections, no Front-Cover Texts, and no " "Back-Cover Texts.\n") fp.write("A copy of the license is included in the section entitled " "\"GNU\n") fp.write("Free Documentation License\".\n\n") def saveGenerated(fp): """saves the last-generated timestamp""" utcnow = datetime.datetime.utcnow().strftime("%A, %d %B %Y %I:%M%p UTC") fp.write("This file last generated " + utcnow + "\n\n") def jargonWithDefinitions(text, definitions, isHtml): result = '' prevpos = 0 for i in range(definitions): pos = text.find(str(i+1) + ". ") if pos > -1 and i > 0: if result != '': result = result + "\n\n" if not isHtml: result = result + text[prevpos:pos] else: result = result + "
" + text[prevpos:pos] + "
" prevpos = pos if not isHtml: result = result + "\n\n" + text[prevpos:] else: result = result + "\n\n" + "" + text[prevpos:] + "
" return result def jargonToManpage(manpageFilename, entries, version, publishername): year = int(time.strftime("%Y")) if not os.path.isdir("docs"): os.system("mkdir docs") if os.path.isfile(manpageFilename + ".gz"): os.system("rm " + manpageFilename + ".gz") fp = open(manpageFilename, 'w') fp.write(".TH \"The Jargon File\" 1 \"" + time.strftime("%x") + "\" \"\" \"" + version + "\"\n\n") fp.write(".SH LICENSE\n\n") saveLicense(fp, year, publishername) fp.write(".SH GENERATED\n\n") saveGenerated(fp) for entry in entries: title = entry[0] text = entry[1] definitions = jargonSubdefinitions(entry[1]) if definitions > 1: text = jargonWithDefinitions(text, definitions, False) fp.write(".SH " + title + "\n") fp.write(text + "\n\n") fp.close() os.system("gzip " + manpageFilename) print("manpage can be installed with the command:") print("sudo install -m 644 " + manpageFilename + ".gz /usr/local/share/man/man1") def jargonToOrgMode(orgFilename, entries, version, publishername): year = int(time.strftime("%Y")) if not os.path.isdir("docs"): os.system("mkdir docs") if os.path.isfile(orgFilename): os.system("rm " + orgFilename) fp = open(orgFilename, 'w') fp.write("#+TITLE: The Jargon File\n") fp.write("#+VERSION " + version + "\n") fp.write("#+OPTIONS: ^:nil\n") fp.write('#+STYLE: \n\n') fp.write("#+BEGIN_CENTER\n") fp.write("*Yet more Jargon*\n") fp.write("#+END_CENTER\n\n") fp.write("* License\n\n") saveLicense(fp, year, publishername) fp.write("* Generated\n\n") saveGenerated(fp) fp.write("* Glossary\n") subsection = '' for entry in entries: title = entry[0] text = entry[1] definitions = jargonSubdefinitions(entry[1]) if definitions > 1: text = jargonWithDefinitions(text, definitions, False) if title[0:1] != subsection: subsection = title[0:1] fp.write("** " + subsection.upper() + "\n") fp.write("*** " + title + "\n") fp.write(text + "\n\n") fp.close() def jargonToHTML(htmlFilename, entries, version, publishername): year = int(time.strftime("%Y")) if not os.path.isdir("docs"): os.system("mkdir docs") if os.path.isfile(htmlFilename): os.system("rm " + htmlFilename) fp = open(htmlFilename, 'w') fp.write("\n") fp.write("\n") fp.write(" \n") fp.write("\n") saveLicense(fp, year, publishername) fp.write("
\n") fp.write("\n") saveGenerated(fp) fp.write("
\n") fp.write("\n") fp.write(" " + text + "\n") fp.write("
\n") fp.write(" \n") fp.write("\n") fp.close() if __name__ == "__main__": version = "x.xx" publishername = "My Name" entries = jargonGetEntries('entries') jargonToManpage("docs/jargon.1", entries, version, publishername) jargonToOrgMode("docs/jargon.org", entries, version, publishername) jargonToHTML("docs/jargon.html", entries, version, publishername)