#!/bin/python3 # hrtime - transgender research website # Copyright (C) 2025 Olive # see LICENCE file for licensing information import re import sys def ch(st: str) -> str: st = re.sub(r'&', r'&', st) st = re.sub(r'>', r'>', st) st = re.sub(r'<', r'<', st) return st def qch(st: str) -> str: return re.sub('\'', r''', ch(st)) def mdh(line: str) -> str: ret = '' while len(line) > 0: match = re.match(r'!\[(.*?)\]\((.*?)\)', line) if match != None: line = line[match.span()[1]:] ret += f"" + \ f'{ch(match.group(1))}' continue match = re.match(r'\[(.*?)\]\(([^ ]*)\)', line) if match != None: line = line[match.span()[1]:] ret += f"{ch(match.group(1))}' continue match = re.match(r'`(.)(.*?)`', line) if match != None: line = line[match.span()[1]:] ret += r"{ch(match.group(2))}' continue ret += ch(line[0]) line = line[1:] ret = re.sub(r'NOBREAK', r'⁠', ret) return ret def md(line: str) -> str: # allows '|' and '||' escaping to work ret, do = '', True for sec in line.strip().split('|'): if len(sec) == 0: ret += '|' else: ret += mdh(sec) if do else sec do = not do return ret def media(line: str): file, alt = tuple(line.strip().split('|')) file = qch(file) if file[-5:] in ('.webp'): print(f"{qch(alt)}") if file[-4:] in ('.mp4'): print('') if file[-4:] in ('.pdf'): print(f"") print(f"{ch(alt)}") print('') def doc(lines: list[str]): head = '' with open('head.html', 'r') as file: head = file.read() lines[0] = lines[0].strip() if len(lines[0]) > 0: lines[0] = ' — ' + lines[0] head = re.sub(r'TITLE', lines[0], head, count=2) print(head, end='') lines = lines[1:] mode='' for line in lines: if line[1:4] == ' ': if mode != '': if line[0] != '/': cls = f" class='{line[0]}'" print(f'
', end='')
                mode = '
' print(ch(line[4:].rstrip())) continue elif line[:2] == ' ': if mode != '': print("' print(f'
  • {md(line[2:])}
  • ') continue elif line[:2] == '- ': if mode != '': print('' print(f'
  • {md(line[2:])}
  • ') continue if mode != '': print(mode) mode = '' if len(line) == 1: print('\n
    ') elif line[:2] == '# ': print(f'

    {md(line[2:])}

    ') elif line[:3] == '## ': print(f'

    {md(line[3:])}

    ') elif line[:2] == '! ': media(line[2:]) elif line[:2] == '@ ': title, link, desc, date = tuple(line[2:].split('|')) print('
    \n
    ') print(f"

    {md(title)}

    ") print('
    \n
    ') print(f'

    {md(desc)}

    ') print(f'

    ()

    ') print('
    \n
    ') else: print('

    ' + md(line) + '

    ') if mode != '': print(mode) with open('foot.html', 'r') as file: print(file.read(), end='') if __name__ == '__main__': if len(sys.argv) != 2: print('usage: md [file]') else: with open(sys.argv[1], 'r') as file: doc(list(file))