1
0
favro-sync/favro_sync/favro_markdown.py

73 lines
1.6 KiB
Python

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))