import re
import json as _json
_COUNTER = [0]
PATTERN = r'>([NI])\s*(.*?)\n(.*?)\n<$'
def _next_id(prefix: str) -> str:
_COUNTER[0] += 1
return f"margin-{prefix}-{_COUNTER[0]}"
def _replace_block(match):
symbol = match.group(1) title = match.group(2).strip()
body = match.group(3).strip()
mid = _next_id(symbol.lower())
anchor = f'<span class="margin-anchor" data-margin="{mid}"></span>'
if symbol == 'N':
title_html = f'<span class="margin-note-title">{title}</span>\n' if title else ''
note = (
f'<div class="margin-note" data-margin="{mid}">'
f'{title_html}'
f'{body}'
f'</div>'
)
else:
try:
_json.loads(body)
data_attr = body.replace('"', '"')
except ValueError:
data_attr = '{}'
label_attr = title.replace('"', '"')
note = (
f'<div class="margin-interactive" data-margin="{mid}" '
f'data-label="{label_attr}" '
f'data-steps="{data_attr}">'
f'</div>'
)
return f'{anchor}\n\n{note}'
def process(content: str) -> str:
_COUNTER[0] = 0 return re.sub(PATTERN, _replace_block, content, flags=re.MULTILINE | re.DOTALL)