diff --git a/setup_main_tex_file.py b/setup_main_tex_file.py index 7b4c2ec..243feef 100755 --- a/setup_main_tex_file.py +++ b/setup_main_tex_file.py @@ -27,6 +27,10 @@ LATEX_SUBS = [(re.compile('_'), '\\_'), ] +DOCUMENTCLASS_RE = re.compile(r'\\documentclass\{(?P.+?)\}') +SKBCONFIG_RE = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P.*),\n\s*rep\s*=\s*(?P.*),\n\s*pub\s*=\s*(?P.*),\n\s*fig\s*=\s*(?P.*),\n\s*sli\s*=\s*(?P.*),\n\s*acr\s*=\s*(?P.*),\n\s*bib\s*=\s*(?P.*)\n\s*\]\{skblocal.tex\}', re.M) +SKBINPUT_RE = re.compile(r'[^%]\\skbinput\[from=(?P.*?)(,.*)?\]\{(?P.*?)\}', re.M) + def get_unique_name(base): now = time.localtime() year = str(now[0]) @@ -143,15 +147,11 @@ def main(): """ update function """ - re_class = re.compile(r'\\documentclass\{(?P.*)\}') - #skbconfig_re = re.compile(r'\\skbconfig\[\s*root\s*=\s*(?P.*),\s*rep\s*=\s*(?P.*),\s*pub\s*=\s*(?P.*),\s*fig\s*=\s*(?P.*),\s*sli\s*=\s*(?P.*),\s*acr\s*=\s*(?P.*),\s*bib\s*=\s*(?P.*),\s*\]\{skblocal.tex\}', re.M) - skbconfig_re = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P.*),\n\s*rep\s*=\s*(?P.*),\n\s*pub\s*=\s*(?P.*),\n\s*fig\s*=\s*(?P.*),\n\s*sli\s*=\s*(?P.*),\n\s*acr\s*=\s*(?P.*),\n\s*bib\s*=\s*(?P.*)\n\s*\]\{skblocal.tex\}', re.M) - skbinput_re = re.compile(r'[^%]\\skbinput\[from=(?P.*?)(,.*)?\]\{(?P.*?)\}', re.M) with open(args.master, 'r') as master: tex_master = master.read() - tex_class = re_class.search(tex_master) - tex_skbconfig = skbconfig_re.search(tex_master) - tex_skbinputs = skbinput_re.finditer(tex_master) + tex_class = DOCUMENTCLASS_RE.search(tex_master) + tex_skbconfig = SKBCONFIG_RE.search(tex_master) + tex_skbinputs = SKBINPUT_RE.finditer(tex_master) fragment = TEMPLATES[tex_class.group('document_class')]['fragment'] fragment_pratique = TEMPLATES[tex_class.group('document_class')]['fragment_pratique'] @@ -177,14 +177,69 @@ def main(): """ outline creation """ + part_level = 0 + section_level = 1 + subsection_level = 2 + frametitle_level = 3 + framesubtitle_level = 4 + def file_path_from_skbinput(skbinput_re, master, skbconfig): + rel_path = path.join(skbconfig.group('root'), skbconfig.group(skbinput_re.group('rep')), skbinput_re.group('tex')) + '.tex' + root_path = path.abspath(path.dirname(master)) + return path.normpath(path.join(root_path, rel_path)) + + def reorder_lists(*args): + reordered_list = [] + for l in args: + reordered_list.extend(l) + reordered_list.sort(key=lambda x: x[0]) + return reordered_list + + def outline_from_include(include, start, document_class): + frametitle_re = re.compile(r'\\frametitle\{(?P.*?)\}') + framesubtitle_re = re.compile(r'\\framesubtitle\{(?P.*?)\}') + skbheading_re = re.compile(r'\\skbheading\{(?P.*?)\}') + with open(include, 'r') as include_fh: + content = include_fh.read() + if document_class == 'beamer': + frametitles = frametitle_re.finditer(content) + framesubtitles = framesubtitle_re.finditer(content) + frametitles_list = [(ft.start(), frametitle_level, ft.group('name')) for ft in frametitles] + framesubtitles_list = [(fs.start(), framesubtitle_level, fs.group('name')) for fs in framesubtitles] + frame_list = reorder_lists(frametitles_list, framesubtitles_list) + if frame_list: + div = int('1{}'.format('0'*len(str(frame_list[-1][0])))) + return [(start + f[0]/div, f[1], f[2]) for f in frame_list] + else: + return [] + + def outline_format(headers_list): + levels = list(set([hl[1] for hl in headers_list])) + levels.sort() + flattened_levels = {l: levels.index(l) for l in levels} + for header in headers_list: + print('{}{}'.format('\t' * flattened_levels[header[1]], header[2])) + + + + section_re = re.compile(r'\\section\{(?P.*?)\}') part_re = re.compile(r'\\part\{(?P.*?)}') subsection_re = re.compile(r'\\subsection\{(?P.*?)\}') with open(args.master, 'r') as master_tex: master = master_tex.read() + skbconfig = SKBCONFIG_RE.search(master) + + document_class = DOCUMENTCLASS_RE.search(master).group('document_class') parts = part_re.finditer(master) - section = section_re.finditer(master) - subsection_re = subsection_re.finditer(master) + sections = section_re.finditer(master) + subsections = subsection_re.finditer(master) + includes = SKBINPUT_RE.finditer(master) + print(document_class) + parts_list = [(part.start(), part_level, part.group('name')) for part in parts] + 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)] + subsections_list = [(subsection.start(), subsection_level, subsection.group('name')) for subsection in subsections] + print(outline_format(reorder_lists(parts_list, sections_list, includes_list, subsections_list))) jinja_loader = FileSystemLoader('./templates')