Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

28.08.2023

Модифікація Markdown зі збереженням оригінального синтаксису

Окрім того, щоб парсити, мені ж ще потрібно вносити в документ зміни. Плани поки прості: коли задача створюється, додати їй поточну дату як дату початку: ➕ 2023-08-28. Коли задача є завершеною (має маркер), то дату завершення: ✅ 2023-08-28. Логіка зрозуміла, але як це реалізувати на практиці?

Швидко зрозумів, що підхід “розібрати текст на AST, поміняти та зібрати наново” не працює. Парсер Remark не зберігає повну інформацію про розмітку: як приклад, заголовки можна вказувати або # решітками, або рядком === під заголовком. І те, і те стає в AST просто “заголовком”. Потім при відтворенні Markdown отримуємо заголовки в форматі, який було задано опціями. Одним словом, користувач отримає стандартизований варіант свого файлу. Що буде дивно, бо ми тільки хотіли додати дату в єдиний рядок з задачею.

…Проте дещо Remark зберігає. А саме, кожен вузол дерева посилається на діапазон символів у вхідному тексті, з яких він був утворений. Тобто хоч відтворити оригінал ми не можемо, але можемо просто скопіювати ті фрагменти оригіналу, які лишились без змін. На практиці це означає всі фрагменти, крім задачі, до якої ми додаємо дату.

Таке рішення дуже нагадує віртуальну DOM, знайому по React та інших бібліотеках. Там ми теж хочемо зберігати якнайбільше документу без змін.