nuckty
EN
Все разделы →

Markdown-расширение

Markdown-расширение добавляет конструкции markdown-разметки через env.markdown. Оно регистрирует обработчик директивы или remark-плагин, который преобразует mdast до перехода в BEMJSON.

Директивы

ВидСинтаксис
Текстовая:name[label]{attrs}
Блочная::name[label]{attrs}
Контейнер:::name{attrs} … :::

Пишите имя без пробела после двоеточий. Для совместимости движок также нормализует простой вариант ::: gallery в начале строки без атрибутов; это не общее правило для всех директив с пробелами.

Неизвестная директива раскрывается в обычное содержимое. Атрибуты доступны как node.attributes, дочерние узлы mdast — как node.children с типом unknown[].

API и пример

env.markdown.directive(name, handler) принимает DirectiveHandler: (node: DirectiveNode, env: unknown) => { raw?: string; [key: string]: unknown } | null. Второй аргумент — окружение моста. null включает обычное преобразование содержимого.

В примере обработчик намеренно сводит текст к строке; оформление и ссылки не сохраняются. Для сложного содержимого реализуйте собственное преобразование узлов.

import type { NucktyEnv } from 'nuckty';

interface TextNode {
    type?: string;
    value?: string;
    children?: TextNode[];
}

function text(nodes: TextNode[]): string {
    return nodes.map((node) => node.type === 'text' || node.type === 'inlineCode'
        ? node.value ?? ''
        : text(node.children ?? [])).join('');
}

export function register(env: NucktyEnv): void {
    env.markdown.directive('callout', (node) => ({
        block: 'callout',
        mods: { type: node.attributes?.class ?? 'note' },
        content: text((node.children ?? []) as TextNode[]),
    }));
    env.markdown.directive('badge', (node) => ({
        block: 'badge',
        mods: { type: node.attributes?.type ?? 'new' },
        content: text((node.children ?? []) as TextNode[]),
    }));
}

Используйте :::callout{.warning} с абзацем внутри или ::badge[1.2]{type=new}. Добавьте callout и badge в bemdecl и предоставьте их шаблоны и стили на уровнях. Само появление узла не добавляет блок в декларацию.

env.markdown.use(plugin) принимает remark-плагин для произвольного преобразования mdast. Например, видео использует ссылки @[provider](id). Директивы галереи и сетки совмещают markdown- и block-расширение в одном пакете; готовые реализации перечислены в каталоге.