import dataclasses import errno import re import stat from collections.abc import Iterator from logging import getLogger import frontmatter import marko import marko.md_renderer from .favro_data_model import Card, SeqId @dataclasses.dataclass(frozen=True) class CardContents: name: str description: str markdown = marko.Markdown() renderer = marko.md_renderer.MarkdownRenderer() OBSIDIAN_MODE = True def format_card_contents(card: CardContents) -> str: ls = [] # Frontmatter if OBSIDIAN_MODE: if card.name: ls.append('---\n') # TODO: Tags ls.append('aliases:\n') ls.append(' - ') ls.append(card.name) ls.append('\n') ls.append('---\n\n') # Card name if card.name: ls.append('# ') ls.append(card.name) ls.append('\n\n') # Card contents if card.description: ls.append(card.description) return ''.join(ls) def parse_card_contents(contents: str) -> CardContents: """ 1. Strips frontmatter 2. Parses header 3. Finds content. """ fm = frontmatter.loads(contents) del contents document = markdown.parse(fm.content.strip()) name = None for elem in document.children: if isinstance(elem, marko.block.Heading): name = renderer.render_children(elem) document.children.remove(elem) break return CardContents( name, renderer.render_children(document).strip(), ) def format_card(card: Card) -> str: return format_card_contents(CardContents(card.name, card.detailed_description))