remark-sf
v1.0.0
Published
Remark plugin for parsing dialogue scripts with custom markdown syntax for visual novels and games.
Readme
remark-sf
📚 remark-sf (remark-script-forge) — это плагин для remark, предназначенный для парсинга диалогов, написанных в markdown с кастомной разметкой.
Используется для создания диалоговых деревьев для визуальных новелл и сюжетных игр (например, в Unity) из текстов .md ===
✨ Возможности
- Распознаёт специальные конструкции:
==ИмяПерсонажа- спикер
--тон злой- параметры
// комментарии- з аметки
/команда- команды
-[Текст выбора](узел)→ развилки и выборы игрока
- Группирует блоки по заголовкам # nodeId
- Выдаёт MDAST-совместимое AST-дерево
- Подходит для преобразования в JSON, а затем — в ScriptableObject в Unity
🛠️ Пример входного markdown
Давным-давно, в далекой-предалекой галактике... ==Рассказчик --тон загадочный // ==speaker - флаг, указывающий текущего персонажа, который говорит
ЗВЕЗДНЫЕ ВОЙНЫ!!! --тон торжественный // --тон злой - параметр, указывающий каким тоном говорит персонаж (может влиять на озвучку, эффекты текста и тд)
ЭПИЗОД IV - новая надежда
/идти ==Рассказчик 0, 2
В Галактике бущует гражданская война
Корабли повстанцев, нанеся удар с тайной базы...
Погодите-погодите ==Горностай --тон удивленный
/идти ==Горностай 0, 3
У нас тут далеко не звездные и не войны! --тон злой --скорость 0.5
/квест quest1 начать
- [Давайте все выдохнем и успокоимся!](node2)
- [Правильно, так его!](node3)📤 Пример выходного AST
{
"type": "root",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "Давным-давно, в далекой-предалекой галактике...",
"position": {
"start": { "line": 1, "column": 1, "offset": 0 },
"end": { "line": 1, "column": 49, "offset": 48 }
}
},
{
"type": "speaker",
"value": "==Рассказчик",
"position": {
"start": { "line": 1, "column": 50, "offset": 49 },
"end": { "line": 1, "column": 63, "offset": 62 }
}
},
{
"type": "arg",
"value": "--тон загадочный",
"position": {
"start": { "line": 1, "column": 64, "offset": 63 },
"end": { "line": 1, "column": 81, "offset": 80 }
}
},
{
"type": "comment",
"value": "// ==speaker - флаг, указывающий текущего персонажа, который говорит",
"position": {
"start": { "line": 1, "column": 83, "offset": 82 },
"end": { "line": 1, "column": 148, "offset": 147 }
}
}
],
"position": {
"start": { "line": 1, "column": 1, "offset": 0 },
"end": { "line": 1, "column": 148, "offset": 147 }
}
}
]
}⚙️ Установка
npm install remark-sf🚀 Использование
import { unified } from 'unified'
import remarkParse from 'remark-parse'
import remarkSf from 'remark-sf'
const file = await unified()
.use(remarkParse)
.use(remarkSf)
.parse(markdownSource)📁 Пример использования
Смотри директорию examples/
