Output outline in contenu.tex rather than on standard output

This commit is contained in:
Benjamin Bohard 2020-09-04 19:41:11 +02:00
parent c10d63b115
commit eb6ee9c947
1 changed files with 62 additions and 2 deletions

View File

@ -26,7 +26,6 @@ TEMPLATES = {
LATEX_SUBS = [(re.compile('_'), '\\_'), LATEX_SUBS = [(re.compile('_'), '\\_'),
] ]
DOCUMENTCLASS_RE = re.compile(r'\\documentclass\{(?P<document_class>.+?)\}') DOCUMENTCLASS_RE = re.compile(r'\\documentclass\{(?P<document_class>.+?)\}')
SKBCONFIG_RE = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P<root>.*),\n\s*rep\s*=\s*(?P<rep>.*),\n\s*pub\s*=\s*(?P<pub>.*),\n\s*fig\s*=\s*(?P<fig>.*),\n\s*sli\s*=\s*(?P<sli>.*),\n\s*acr\s*=\s*(?P<acr>.*),\n\s*bib\s*=\s*(?P<bib>.*)\n\s*\]\{skblocal.tex\}', re.M) SKBCONFIG_RE = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P<root>.*),\n\s*rep\s*=\s*(?P<rep>.*),\n\s*pub\s*=\s*(?P<pub>.*),\n\s*fig\s*=\s*(?P<fig>.*),\n\s*sli\s*=\s*(?P<sli>.*),\n\s*acr\s*=\s*(?P<acr>.*),\n\s*bib\s*=\s*(?P<bib>.*)\n\s*\]\{skblocal.tex\}', re.M)
SKBINPUT_RE = re.compile(r'[^%]\\skbinput\[from=(?P<rep>.*?)(,.*)?\]\{(?P<tex>.*?)\}', re.M) SKBINPUT_RE = re.compile(r'[^%]\\skbinput\[from=(?P<rep>.*?)(,.*)?\]\{(?P<tex>.*?)\}', re.M)
@ -242,7 +241,28 @@ def main():
for header in headers_list: for header in headers_list:
print('{}{}'.format('\t' * flattened_levels[header[1]], header[2])) print('{}{}'.format('\t' * flattened_levels[header[1]], header[2]))
def render_outline(header_list, master):
item = "\\item {content}"
itemize = "\\begin{{itemize}}\n{content}\n\\end{{itemize}}"
content_file = path.join(path.dirname(path.abspath(master)), 'programme', 'contenu.tex')
with open(content_file, 'w') as content_fh:
content_fh.write(itemize.format(content='\n'.join([item.format(content=c[2]) for c in header_list])))
def structure_outline(header_list):
root = Outline('Contenu')
current_outline = root
for header in header_list:
if header[1] > current_outline.level:
parent = current_outline
elif header[1] == current_outline.level:
parent = current_outline.get_parent()
elif header[1] == current_outline.level - 1:
parent = current_outline.get_parent().get_parent()
else:
parent = root
current_outline = Outline(header[2], parent, header[1])
parent.add_child(current_outline)
return root
section_re = re.compile(r'\\section\{(?P<name>.*?)\}') section_re = re.compile(r'\\section\{(?P<name>.*?)\}')
@ -261,7 +281,10 @@ def main():
sections_list = [(section.start(), section_level, section.group('name')) for section in sections] sections_list = [(section.start(), section_level, section.group('name')) for section in sections]
includes_list = [element for skbinput in includes for element in outline_from_include(file_path_from_skbinput(skbinput, args.master, skbconfig), skbinput.start(), document_class)] includes_list = [element for skbinput in includes for element in outline_from_include(file_path_from_skbinput(skbinput, args.master, skbconfig), skbinput.start(), document_class)]
subsections_list = [(subsection.start(), subsection_level, subsection.group('name')) for subsection in subsections] subsections_list = [(subsection.start(), subsection_level, subsection.group('name')) for subsection in subsections]
print(outline_format(filter_outlines(reorder_lists(parts_list, sections_list, includes_list, subsections_list)))) structured_outline = structure_outline(filter_outlines(reorder_lists(parts_list, sections_list, includes_list, subsections_list)))
content_file = path.join(path.dirname(path.abspath(args.master)), 'programme', 'contenu.tex')
with open(content_file, 'w') as content_fh:
content_fh.write(structured_outline.render())
jinja_loader = FileSystemLoader('./templates') jinja_loader = FileSystemLoader('./templates')
@ -297,6 +320,43 @@ def main():
args.func(args) args.func(args)
class Outline:
item = "{indent}\\item {content}"
itemize = "\n{indent}\\begin{{itemize}}\n{content}\n{indent}\\end{{itemize}}"
def __init__(self, content, parent=None, level=-1):
self.children = []
self.parent = parent
self.level = level
self.content = content
def is_leaf(self):
if self.children:
return False
return True
def add_child(self, child):
self.children.append(child)
def get_children(self):
return self.children
def get_parent(self):
return self.parent
def render(self):
if self.get_parent():
rendered = self.item.format(indent=' '*self.level, content=self.content)
else:
rendered = ''
if not self.is_leaf():
rendered += self.itemize.format(indent=' '*self.level, content='\n'.join([c.render() for c in self.get_children()]))
return rendered
def __repr__(self):
return f"<Outline {self.content} - {self.level}>"