#!/usr/bin/env python3 import re import os import sys import pwd import subprocess from subprocess import PIPE from base64 import b64encode import os.path as path path_base = '/' # ------------------------------------------------------------ def resolve_mail(addr, frag, comment): outstr = '' msg_id = addr mailfile = subprocess.run(f"mu find -u 'i:{msg_id}' --fields 'l'", shell=True, stdout=PIPE).stdout.decode('UTF-8').strip() mail = subprocess.run(f"mu view {mailfile}", shell=True, stdout=PIPE).stdout.decode('UTF-8') outstr += '\\begin{verbatim}\n' if frag == 'short': last_arrow = False out = [] for line in mail.split('\n'): if not line: out += [''] continue if line[0] == '>': arrow = True if arrow and not last_arrow: out += ['> [...]'] last_arrow = True continue out += [line] outstr += '\n'.join(out) else: outstr += mail + '\n' outstr += '\\end{verbatim}\n' return outstr def resolve_help(addr, frag, comment): pass return '' def resolve_file(addr, frag, comment): extension = addr.split('.')[-1] full_file = path.join(path_base, addr) if extension == 'pdf': return f'\\includepdf[pages=-,pagecommand={{}},width=\\textwidth]{{{full_file}}}\n' # TODO # elif extension == 'tex': # return f'\\subfile{{{full_file}}}\n' else: with open(full_file, 'r') as f: return f.read() + '\n' def resolve_default(addr, frag, comment): outstr = '' if addr == '': page = get_heading(frag, data) outstr += '\\begin{verbatim}\n' outstr += page + '\n' outstr += '\\end{verbatim}\n' else: print(addr) print("Vimwiki intra-page links not yet supported") outstr = '' return outstr # Should all take (url without protocol, fragment, comment) resolvers = { 'mail': resolve_mail, 'file': resolve_file, 'help': resolve_help, } # ------------------------------------------------------------ def get_heading(name, data): start_match = re.search(f'(?m)^(=+) {name} =+$', data) print(start_match) heading_level = len(start_match.group(1)) print(start_match.end()) tail = data[start_match.end():] pat = f'(?m)^(={{1,{heading_level}}} .*|---*)$' print(pat) end_match = re.search(pat, tail) print(end_match) if end_match: return tail[:end_match.start() - 1] else: return tail # ------------------------------------------------------------ [_, infile, heading, *rest] = sys.argv file = open(infile, 'r') data = file.read() path_base = path.dirname(infile) output = open('doc.tex', 'w') name = pwd.getpwuid(os.getuid()).pw_gecos output.write(f''' \\documentclass[a4paper]{{article}} \\usepackage[T1]{{fontenc}} \\usepackage[utf8]{{inputenc}} \\usepackage[swedish]{{babel}} \\usepackage{{verbatim}} \\usepackage{{fullpage}} \\usepackage{{pdfpages}} \\usepackage{{subfiles}} \\title{{{heading}}} \\date\\today \\author{{{name}}} \\begin{{document}} \\maketitle ''') # '\\verbatiminput page1 = get_heading(heading, data) # bilagor = get_heading('Bilagor', page1).strip().split('\n') r = "\\[\\[([^|#\\]]*)(?:#([^|\\]]*))?(?:[|]([^\\]]*))?\\]\\]" # bilagor = re.findall(r, page1) tag_iter = re.finditer(r, page1) # bilagor = [m[0] for m in re.findall(r, data)] bilagor = [] outstr = "" pos = 0 bilaga_nr = 1 for match in tag_iter: url = match.group(1) or '' frag = match.group(2) or '' comment = match.group(3) or '' outstr += page1[pos:match.start()] pos = match.end() uid = b64encode((url + frag).encode('UTF-8')) title = comment or url or fragment # outstr += title + f"(bilaga~\\ref{{{uid}}})" # TODO # outstr += title + f' (bilaga {chr(bilaga_nr + 64)})' outstr += title + " (se bilaga)" bilaga_nr += 1 try: proto, addr = url.split(":", 1) except ValueError: proto = '' addr = url print(proto, addr) # disabled for full PDF:s attach_str = '' attach_str += f"\\section{{{title}}}\n\\label{{{uid}}}\n" resolver = resolvers.get(proto, resolve_default) attach_str += resolver(addr, frag, comment) bilagor += [attach_str] output.write('\\begin{verbatim}\n') output.write(outstr + '\n') output.write('\\end{verbatim}\n\\appendix\n') output.write('\n'.join(bilagor)) output.write('\\end{document}')