Skip to content

Instantly share code, notes, and snippets.

@rubdos
Created January 5, 2015 15:45
Show Gist options
  • Save rubdos/b688e946c9a9d3b7226e to your computer and use it in GitHub Desktop.
Save rubdos/b688e946c9a9d3b7226e to your computer and use it in GitHub Desktop.
compile_procedures.py
#!/usr/bin/python
# Please put this file in the $FG_ROOT directory, chmod +x and run, then look in the procedures subdirectory.
import xml.etree.ElementTree as etree
import os
import shutil
from subprocess import call
def generate_procedures(source):
root = os.path.join("procedures", source['name'])
checklists_path = os.path.join(root, "checklists")
if(not os.path.isdir(root)):
os.mkdir(root)
if(not os.path.isdir(checklists_path)):
os.mkdir(checklists_path)
preamble = open(os.path.join(root, "preamble.tex"), "w")
preamble.write("\\section{Preamble}")
preamble.write("This procedure list should be considered incomplete and it is not intended for real world use. It is automatically generated documentation intended for FlightGear flight simulator.")
procedures_tex = open(os.path.join(root, source['name'] + "_procedures.tex"), "w")
procedures_tex.write("\\documentclass{article}\n")
procedures_tex.write("\\usepackage{hyperref}\n\usepackage{graphicx}\n")
procedures_tex.write("\\title{"+source['name']+" procedures}\n")
procedures_tex.write("\\author{FlightGear team}\n")
procedures_tex.write("\\begin{document}\n")
procedures_tex.write("\\maketitle\n")
if(source['thumbnail']):
shutil.copyfile("Aircraft/" + source['name'] + "/thumbnail.jpg",
os.path.join(root, "thumbnail.jpg"))
procedures_tex.write("\\begin{figure}[h!]\\centering")
procedures_tex.write("\\includegraphics{thumbnail.jpg}")
procedures_tex.write("\\end{figure}")
procedures_tex.write("\\tableofcontents\n")
procedures_tex.write("\\input{preamble.tex}\n")
if(source['sources'] > 0):
procedures_tex.write("\\input{checklists.tex}\n")
checklists_tex = open(os.path.join(root, "checklists.tex"), "w")
checklists_tex.write("\\section{Checklists}\n")
for xmlfile in source['sources']:
tree = etree.parse(xmlfile)
chkl_root = tree.getroot()
for checklist in chkl_root:
if checklist.tag != "checklist":
print "Unrecognised tag in", xmlfile
continue
title = checklist.find("title")
if title is None:
title = "Untitled"
else:
title = title.text
items = []
for item in checklist.findall("item"):
name = item.find("name")
value = item.find("value")
if name is None or value is None:
continue
if name.text is None or value.text is None:
continue
items.append({
'name': name.text,
'value': value.text
})
filename = title + ".tex"
filename = filename.replace("/", "_")
filename = filename.replace(" ", "_")
checklists_tex.write("\\input{checklists/"+filename+"}\n")
f = open(os.path.join(checklists_path,filename), "w")
f.write("\\subsection{" + title + "}\n")
if len(items) > 0:
f.write("\\begin{description}\n")
for item in items:
f.write("\\item["+item['name']+"] " + item['value']+"\n")
f.write("\\end{description}\n")
procedures_tex.write("\\end{document}\n")
def generate_index(directory = "Aircraft"):
checklists = []
for aircraft in os.listdir(directory):
checklist = {
'sources' : [],
'name' : aircraft,
'thumbnail': False
}
if os.path.isfile(os.path.join(directory, aircraft + "/thumbnail.jpg")):
checklist['thumbnail'] = True
for root, dirs, files in os.walk(os.path.join(directory, aircraft), topdown=False):
for name in files:
if(name.endswith("checklists.xml")):
checklist['sources'].append(os.path.join(root,name))
if(len(checklist['sources']) > 0):
checklists.append(checklist)
return checklists
def compile_procedures(source):
wd = os.getcwd()
root = os.path.join("procedures", source['name'])
os.chdir(root)
mainfile = source['name'] + "_procedures.tex"
call(["pdflatex", "-interaction", "nonstopmode", mainfile])
call(["pdflatex", "-interaction", "nonstopmode", mainfile])
os.chdir(wd)
checklists_source = generate_index()
if(len(checklists_source) == 0 ):
print "No aircraft found; wrong directory?"
if(not os.path.isdir("procedures")):
os.mkdir("procedures")
for src in checklists_source:
generate_procedures(src)
compile_procedures(src)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment