cm-live-markdown 0.0.0-stage → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/live.d.ts ADDED
@@ -0,0 +1,69 @@
1
+ import { type Extension } from '@codemirror/state';
2
+ import { EditorView } from '@codemirror/view';
3
+ /**
4
+ * «Живой» Markdown, как Live Preview в Obsidian: текст остаётся Markdown, оформление рисуется поверх,
5
+ * служебные символы видны только там, где стоит курсор. Без фокуса весь текст показан оформлённым.
6
+ */
7
+ /** Свой строчный токен: всё, что совпало с регуляркой, вне курсора заменяется значком */
8
+ export interface InlineToken {
9
+ /** Регулярка с флагом `g`; совпадения внутри кода не трогаются */
10
+ pattern: RegExp;
11
+ /** Значок вместо текста. Вызывается заново после `refreshLivePreview` */
12
+ render: (match: RegExpExecArray, view: EditorView) => HTMLElement;
13
+ /** Класс исходника токена под курсором (по умолчанию `lmd-token-src`) */
14
+ sourceClass?: string;
15
+ }
16
+ export interface ImageOptions {
17
+ /** Адрес для `<img>` по адресу из `![…](адрес)` — например, `file:<id>` → blob/https. По умолчанию как есть */
18
+ resolve?: (src: string) => string | Promise<string>;
19
+ /** Картинка ещё загружается — показать подпись `imageLoading` вместо `<img>` */
20
+ pending?: (src: string) => boolean;
21
+ /**
22
+ * Вставили или бросили файлы-картинки: загрузить и вставить текст в позицию `pos`.
23
+ * Вернуть `false` — не перехватывать (сработает обычная вставка).
24
+ */
25
+ onFiles?: (files: File[], pos: number, view: EditorView) => boolean | void;
26
+ /** Какие файлы считать картинками (по умолчанию `type` начинается с `image/`) */
27
+ accept?: (file: File) => boolean;
28
+ /** Набор адресов картинок в тексте изменился (и при открытии) — чтобы показать их как вложения или убрать */
29
+ onChange?: (srcs: string[]) => void;
30
+ }
31
+ export interface TableOptions {
32
+ /**
33
+ * Отрисовать таблицу (исходник с `|`) в `dom`. Можно вернуть функцию уборки — её вызовут, когда виджет уйдёт.
34
+ * По умолчанию — простая встроенная таблица с текстом ячеек.
35
+ */
36
+ render?: (source: string, dom: HTMLElement) => void | (() => void);
37
+ }
38
+ /** Подписи. По умолчанию английские */
39
+ export interface Phrases {
40
+ imageLoading: string;
41
+ /** К подписи добавляется `: <alt>`, если он есть */
42
+ imageNotFound: string;
43
+ /** Подсказка над отрисованной таблицей */
44
+ tableHint: string;
45
+ }
46
+ export declare const defaultPhrases: Phrases;
47
+ export interface LiveMarkdownOptions {
48
+ /** Свои строчные токены: упоминания, предметы, теги */
49
+ tokens?: readonly InlineToken[];
50
+ /** Картинки `![…](…)`; `false` — показывать исходником */
51
+ images?: ImageOptions | false;
52
+ /** Таблицы вне курсора отрисованы; `false` — оставить текстом */
53
+ tables?: TableOptions | false;
54
+ phrases?: Partial<Phrases>;
55
+ /** Язык Markdown (GFM) из @codemirror/lang-markdown. `false` — подключите свой `markdown()` сами */
56
+ language?: boolean;
57
+ /** Сочетания живого Markdown и продолжение списков по Enter (по умолчанию включены) */
58
+ keymap?: boolean;
59
+ /** Встроенное оформление (CSS-переменные `--lmd-*`). `false` — только своё */
60
+ theme?: boolean;
61
+ /** Ctrl/Cmd+клик по ссылке. По умолчанию — новая вкладка */
62
+ openLink?: (url: string) => void;
63
+ }
64
+ /** Перерисовать токены и картинки — например, когда догрузился справочник для значков */
65
+ export declare const refreshLivePreview: import("@codemirror/state").StateEffectType<null>;
66
+ /** Адреса всех картинок `![…](адрес)` в тексте */
67
+ export declare const imageSources: (text: string) => string[];
68
+ /** Живой Markdown для CodeMirror 6 — одно расширение со всеми частями */
69
+ export declare function liveMarkdown(options?: LiveMarkdownOptions): Extension;
package/dist/live.js ADDED
@@ -0,0 +1,550 @@
1
+ import { markdownKeymap, markdownLanguage } from '@codemirror/lang-markdown';
2
+ import { syntaxTree } from '@codemirror/language';
3
+ import { Prec, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';
4
+ import { Decoration, EditorView, ViewPlugin, WidgetType, keymap, } from '@codemirror/view';
5
+ import { liveMarkdownKeymap } from "./commands.js";
6
+ import { liveMarkdownTheme } from "./theme.js";
7
+ export const defaultPhrases = {
8
+ imageLoading: 'Loading image…',
9
+ imageNotFound: 'Image not found',
10
+ tableHint: 'Click to edit the table',
11
+ };
12
+ /** Перерисовать токены и картинки — например, когда догрузился справочник для значков */
13
+ export const refreshLivePreview = StateEffect.define();
14
+ // ------------------------------------------------------------------ виджеты
15
+ class TokenWidget extends WidgetType {
16
+ text;
17
+ match;
18
+ token;
19
+ generation;
20
+ constructor(match, token, generation) {
21
+ super();
22
+ this.text = match[0];
23
+ this.match = match;
24
+ this.token = token;
25
+ this.generation = generation;
26
+ }
27
+ eq(other) {
28
+ return other.text === this.text && other.token === this.token && other.generation === this.generation;
29
+ }
30
+ toDOM(view) {
31
+ return this.token.render(this.match, view);
32
+ }
33
+ ignoreEvent() {
34
+ return false;
35
+ }
36
+ }
37
+ class CheckboxWidget extends WidgetType {
38
+ checked;
39
+ constructor(checked) {
40
+ super();
41
+ this.checked = checked;
42
+ }
43
+ eq(other) {
44
+ return other.checked === this.checked;
45
+ }
46
+ toDOM() {
47
+ const box = document.createElement('input');
48
+ box.type = 'checkbox';
49
+ box.checked = this.checked;
50
+ box.className = 'lmd-check';
51
+ return box;
52
+ }
53
+ ignoreEvent() {
54
+ return false;
55
+ }
56
+ }
57
+ /** Маркер пункта вне курсора: «• •» по уровню вложенности или номер «3.1.» */
58
+ class ListMarkWidget extends WidgetType {
59
+ text;
60
+ constructor(text) {
61
+ super();
62
+ this.text = text;
63
+ }
64
+ eq(other) {
65
+ return other.text === this.text;
66
+ }
67
+ toDOM() {
68
+ const mark = document.createElement('span');
69
+ mark.className = 'lmd-bullet';
70
+ mark.textContent = this.text;
71
+ return mark;
72
+ }
73
+ }
74
+ class ImageWidget extends WidgetType {
75
+ src;
76
+ alt;
77
+ opts;
78
+ phrases;
79
+ generation;
80
+ constructor(src, alt, opts, phrases, generation) {
81
+ super();
82
+ this.src = src;
83
+ this.alt = alt;
84
+ this.opts = opts;
85
+ this.phrases = phrases;
86
+ this.generation = generation;
87
+ }
88
+ eq(other) {
89
+ return other.src === this.src && other.alt === this.alt && other.generation === this.generation;
90
+ }
91
+ toDOM() {
92
+ const note = (text) => {
93
+ const span = document.createElement('span');
94
+ span.className = 'lmd-img-note';
95
+ span.textContent = text;
96
+ return span;
97
+ };
98
+ // Корень виджета не подменяем: CodeMirror принял бы новый узел за набранный текст и вписал подпись в документ
99
+ const box = document.createElement('span');
100
+ box.className = 'lmd-img-box';
101
+ if (this.opts.pending?.(this.src)) {
102
+ box.append(note(this.phrases.imageLoading));
103
+ return box;
104
+ }
105
+ const img = document.createElement('img');
106
+ img.className = 'lmd-img';
107
+ img.alt = this.alt;
108
+ const missing = () => img.replaceWith(note(this.alt ? `${this.phrases.imageNotFound}: ${this.alt}` : this.phrases.imageNotFound));
109
+ img.addEventListener('error', missing, { once: true });
110
+ Promise.resolve()
111
+ .then(() => (this.opts.resolve ? this.opts.resolve(this.src) : this.src))
112
+ .then((url) => (img.src = url), missing);
113
+ box.append(img);
114
+ return box;
115
+ }
116
+ get estimatedHeight() {
117
+ return 240;
118
+ }
119
+ ignoreEvent() {
120
+ return false;
121
+ }
122
+ }
123
+ // ------------------------------------------------------------------ списки
124
+ const isList = (n) => n?.name === 'BulletList' || n?.name === 'OrderedList';
125
+ /** Уровень пункта: сколько списков над ним (1 — верхний) */
126
+ function listDepth(item) {
127
+ let depth = 0;
128
+ for (let n = item.parent; n; n = n.parent)
129
+ if (isList(n))
130
+ depth++;
131
+ return depth;
132
+ }
133
+ /** Номер пункта: номер первого пункта списка + место среди соседей */
134
+ function itemNumber(state, item) {
135
+ const mark = item.parent?.firstChild?.getChild('ListMark');
136
+ const start = mark ? parseInt(state.sliceDoc(mark.from, mark.to), 10) || 1 : 1;
137
+ let index = 0;
138
+ for (let n = item.prevSibling; n; n = n.prevSibling)
139
+ if (n.name === 'ListItem')
140
+ index++;
141
+ return start + index;
142
+ }
143
+ /** «3.1.2.» — номера всех нумерованных пунктов-предков */
144
+ function outlineNumber(state, item) {
145
+ const parts = [];
146
+ for (let n = item; n; n = n.parent)
147
+ if (n.name === 'ListItem' && n.parent?.name === 'OrderedList')
148
+ parts.unshift(itemNumber(state, n));
149
+ return `${parts.join('.')}.`;
150
+ }
151
+ // ------------------------------------------------------------------ оформление по дереву
152
+ const hide = Decoration.replace({});
153
+ const mark = (cls) => Decoration.mark({ class: cls });
154
+ const line = (cls) => Decoration.line({ class: cls });
155
+ const INLINE = {
156
+ Emphasis: 'lmd-em',
157
+ StrongEmphasis: 'lmd-strong',
158
+ Strikethrough: 'lmd-strike',
159
+ InlineCode: 'lmd-code',
160
+ Link: 'lmd-link',
161
+ };
162
+ const HIDDEN_MARKS = new Set(['EmphasisMark', 'StrikethroughMark', 'LinkMark', 'URL']);
163
+ function build(view, ctx) {
164
+ const { state } = view;
165
+ const sel = state.selection.ranges;
166
+ // Без фокуса показываем всё оформлённым, как в просмотре
167
+ const focused = view.hasFocus;
168
+ /** Участок [from, to] задевает курсор/выделение — показываем исходник */
169
+ const touched = (from, to) => focused && sel.some((r) => r.from <= to && r.to >= from);
170
+ const activeLine = (pos) => {
171
+ const l = state.doc.lineAt(pos);
172
+ return touched(l.from, l.to);
173
+ };
174
+ // Декорации собираем списком и сортируем: дерево и регулярки идут вперемешку
175
+ const out = [];
176
+ const add = (from, to, deco) => out.push({ from, to, deco });
177
+ const addLine = (pos, deco) => out.push({ from: pos, to: pos, deco });
178
+ const codeRanges = [];
179
+ for (const { from, to } of view.visibleRanges) {
180
+ // Токены не часть грамматики Markdown (парсер может увидеть в них ссылку) — ищем регулярками
181
+ const text = state.sliceDoc(from, to);
182
+ const found = [];
183
+ for (const token of ctx.tokens) {
184
+ const re = new RegExp(token.pattern.source, token.pattern.flags.includes('g') ? token.pattern.flags : token.pattern.flags + 'g');
185
+ for (const m of text.matchAll(re)) {
186
+ if (!m[0])
187
+ continue;
188
+ const start = from + m.index;
189
+ found.push({ from: start, to: start + m[0].length, match: m, token });
190
+ }
191
+ }
192
+ syntaxTree(state).iterate({
193
+ from,
194
+ to,
195
+ enter: (node) => {
196
+ if (found.some((t) => node.from >= t.from && node.to <= t.to))
197
+ return false;
198
+ const name = node.name;
199
+ const parent = node.node.parent;
200
+ const heading = /^ATXHeading(\d)$/.exec(name);
201
+ if (heading) {
202
+ addLine(state.doc.lineAt(node.from).from, line(`lmd-h lmd-h${heading[1]}`));
203
+ return;
204
+ }
205
+ if (name === 'HeaderMark' && parent?.name.startsWith('ATXHeading')) {
206
+ if (!activeLine(node.from)) {
207
+ // Вместе с пробелом после #
208
+ const end = Math.min(node.to + 1, state.doc.lineAt(node.from).to);
209
+ add(node.from, end, hide);
210
+ }
211
+ return;
212
+ }
213
+ if (name === 'Image') {
214
+ const url = node.node.getChild('URL');
215
+ if (ctx.images && url && !touched(node.from, node.to)) {
216
+ const alt = state.sliceDoc(node.from + 2, Math.max(node.from + 2, url.from - 2));
217
+ const widget = new ImageWidget(state.sliceDoc(url.from, url.to), alt, ctx.images, ctx.phrases, ctx.generation);
218
+ add(node.from, node.to, Decoration.replace({ widget }));
219
+ }
220
+ return;
221
+ }
222
+ if (INLINE[name]) {
223
+ add(node.from, node.to, mark(INLINE[name]));
224
+ if (name === 'InlineCode')
225
+ codeRanges.push([node.from, node.to]);
226
+ return;
227
+ }
228
+ if ((HIDDEN_MARKS.has(name) || (name === 'CodeMark' && parent?.name === 'InlineCode')) && parent) {
229
+ if (!touched(parent.from, parent.to))
230
+ add(node.from, node.to, hide);
231
+ return;
232
+ }
233
+ if (name === 'FencedCode' || name === 'CodeBlock') {
234
+ codeRanges.push([node.from, node.to]);
235
+ for (let pos = node.from; pos <= node.to;) {
236
+ const l = state.doc.lineAt(pos);
237
+ addLine(l.from, line('lmd-codeblock'));
238
+ pos = l.to + 1;
239
+ }
240
+ return false;
241
+ }
242
+ if (name === 'Blockquote') {
243
+ for (let pos = node.from; pos <= node.to;) {
244
+ const l = state.doc.lineAt(pos);
245
+ addLine(l.from, line('lmd-quote'));
246
+ pos = l.to + 1;
247
+ }
248
+ return;
249
+ }
250
+ if (name === 'QuoteMark') {
251
+ if (!activeLine(node.from))
252
+ add(node.from, Math.min(node.to + 1, state.doc.lineAt(node.from).to), hide);
253
+ return;
254
+ }
255
+ if (name === 'HorizontalRule') {
256
+ if (!activeLine(node.from)) {
257
+ addLine(state.doc.lineAt(node.from).from, line('lmd-hr'));
258
+ add(node.from, node.to, hide);
259
+ }
260
+ return;
261
+ }
262
+ if (name === 'Table') {
263
+ for (let pos = node.from; pos <= node.to;) {
264
+ const l = state.doc.lineAt(pos);
265
+ addLine(l.from, line('lmd-table'));
266
+ pos = l.to + 1;
267
+ }
268
+ return;
269
+ }
270
+ if (name === 'ListMark' && parent && isList(parent.parent)) {
271
+ if (activeLine(node.from))
272
+ return;
273
+ // Пункт с чекбоксом: маркер списка прячем совсем, остаётся флажок
274
+ if (parent.getChild('Task')) {
275
+ add(node.from, Math.min(node.to + 1, state.doc.lineAt(node.from).to), hide);
276
+ return;
277
+ }
278
+ const text = parent.parent.name === 'BulletList'
279
+ ? Array(listDepth(parent)).fill('•').join(' ')
280
+ : outlineNumber(state, parent);
281
+ add(node.from, node.to, Decoration.replace({ widget: new ListMarkWidget(text) }));
282
+ return;
283
+ }
284
+ if (name === 'TaskMarker') {
285
+ if (!touched(node.from, node.to)) {
286
+ const checked = /x/i.test(state.sliceDoc(node.from, node.to));
287
+ add(node.from, node.to, Decoration.replace({ widget: new CheckboxWidget(checked) }));
288
+ if (checked && parent)
289
+ add(node.to, parent.to, mark('lmd-done'));
290
+ }
291
+ return;
292
+ }
293
+ },
294
+ });
295
+ for (const t of found) {
296
+ if (codeRanges.some(([a, b]) => t.from >= a && t.to <= b))
297
+ continue;
298
+ if (touched(t.from, t.to))
299
+ add(t.from, t.to, mark(t.token.sourceClass ?? 'lmd-token-src'));
300
+ else
301
+ add(t.from, t.to, Decoration.replace({ widget: new TokenWidget(t.match, t.token, ctx.generation) }));
302
+ }
303
+ }
304
+ out.sort((a, b) => a.from - b.from || a.deco.startSide - b.deco.startSide);
305
+ const builder = new RangeSetBuilder();
306
+ let lastHideEnd = -1;
307
+ for (const d of out) {
308
+ // Пересекающиеся замены RangeSetBuilder не любит — внутренние пропускаем
309
+ const isReplace = d.from !== d.to && (d.deco.spec.widget || d.deco === hide);
310
+ if (isReplace && d.from < lastHideEnd)
311
+ continue;
312
+ builder.add(d.from, d.to, d.deco);
313
+ if (isReplace)
314
+ lastHideEnd = d.to;
315
+ }
316
+ return builder.finish();
317
+ }
318
+ // ------------------------------------------------------------------ таблицы — отрисованная таблица вне курсора
319
+ /** Встроенная таблица: текст ячеек как есть, без разметки внутри */
320
+ function renderPlainTable(source, dom) {
321
+ const cells = (row) => row
322
+ .trim()
323
+ .replace(/^\||\|$/g, '')
324
+ .split(/(?<!\\)\|/)
325
+ .map((c) => c.trim().replace(/\\\|/g, '|'));
326
+ const rows = source.split('\n').filter((r) => r.trim());
327
+ const table = document.createElement('table');
328
+ table.className = 'lmd-table-view';
329
+ rows.forEach((row, i) => {
330
+ if (i === 1 && /^\s*\|?[\s:|-]+\|?\s*$/.test(row))
331
+ return;
332
+ const tr = document.createElement('tr');
333
+ for (const text of cells(row)) {
334
+ const cell = document.createElement(i === 0 ? 'th' : 'td');
335
+ cell.textContent = text;
336
+ tr.append(cell);
337
+ }
338
+ (i === 0 ? table.createTHead() : (table.tBodies[0] ?? table.createTBody())).append(tr);
339
+ });
340
+ dom.append(table);
341
+ }
342
+ class TableWidget extends WidgetType {
343
+ text;
344
+ opts;
345
+ hint;
346
+ constructor(text, opts, hint) {
347
+ super();
348
+ this.text = text;
349
+ this.opts = opts;
350
+ this.hint = hint;
351
+ }
352
+ eq(other) {
353
+ return other.text === this.text;
354
+ }
355
+ toDOM(view) {
356
+ const dom = document.createElement('div');
357
+ dom.className = 'lmd-table-widget';
358
+ dom.title = this.hint;
359
+ const cleanup = (this.opts.render ?? renderPlainTable)(this.text, dom);
360
+ if (cleanup)
361
+ cleanups.set(dom, cleanup);
362
+ // Клик — курсор в ту же строку исходника: таблица раскрывается в текст с |
363
+ dom.addEventListener('mousedown', (e) => {
364
+ if (e.target.closest('a'))
365
+ return;
366
+ e.preventDefault();
367
+ const rows = [...dom.querySelectorAll('tr')];
368
+ const row = rows.indexOf(e.target.closest('tr'));
369
+ // Строка-разделитель | --- | есть в исходнике, но не в таблице
370
+ const lineOffset = row <= 0 ? 0 : row + 1;
371
+ const first = view.state.doc.lineAt(view.posAtDOM(dom));
372
+ const target = view.state.doc.line(Math.min(first.number + lineOffset, view.state.doc.lines));
373
+ view.dispatch({ selection: { anchor: Math.min(target.from + 2, target.to) } });
374
+ view.focus();
375
+ });
376
+ return dom;
377
+ }
378
+ destroy(dom) {
379
+ cleanups.get(dom)?.();
380
+ cleanups.delete(dom);
381
+ }
382
+ get estimatedHeight() {
383
+ return 32 * this.text.split('\n').length;
384
+ }
385
+ ignoreEvent() {
386
+ return true;
387
+ }
388
+ }
389
+ const cleanups = new WeakMap();
390
+ /** Фокус редактора — в состоянии, чтобы без фокуса таблицы были отрисованы, даже если курсор в них */
391
+ const setFocus = StateEffect.define();
392
+ function buildTables(state, focused, opts, hint) {
393
+ const builder = new RangeSetBuilder();
394
+ syntaxTree(state).iterate({
395
+ enter: (node) => {
396
+ if (node.name !== 'Table')
397
+ return (node.name === 'Document' ||
398
+ node.name.endsWith('List') ||
399
+ node.name === 'ListItem' ||
400
+ node.name === 'Blockquote');
401
+ const from = state.doc.lineAt(node.from).from;
402
+ const to = state.doc.lineAt(node.to).to;
403
+ const inside = state.selection.ranges.some((r) => r.from <= to && r.to >= from);
404
+ // Таблица внутри списка/цитаты — оставляем текстом: префиксы строк не часть таблицы
405
+ if (from !== node.from)
406
+ return false;
407
+ if (!(focused && inside))
408
+ builder.add(from, to, Decoration.replace({ widget: new TableWidget(state.sliceDoc(from, to), opts, hint), block: true }));
409
+ return false;
410
+ },
411
+ });
412
+ return builder.finish();
413
+ }
414
+ function tablesField(opts, hint) {
415
+ return StateField.define({
416
+ create: (state) => ({ focused: false, decos: buildTables(state, false, opts, hint) }),
417
+ update(value, tr) {
418
+ let focused = value.focused;
419
+ for (const e of tr.effects)
420
+ if (e.is(setFocus))
421
+ focused = e.value;
422
+ if (focused === value.focused &&
423
+ !tr.docChanged &&
424
+ !tr.selection &&
425
+ syntaxTree(tr.startState) === syntaxTree(tr.state))
426
+ return value;
427
+ return { focused, decos: buildTables(tr.state, focused, opts, hint) };
428
+ },
429
+ provide: (f) => EditorView.decorations.from(f, (v) => v.decos),
430
+ });
431
+ }
432
+ // ------------------------------------------------------------------ картинки: вставка файлов и список адресов
433
+ const IMAGE_SRC = /!\[[^\]\n]*\]\(([^)\s]+)/g;
434
+ /** Адреса всех картинок `![…](адрес)` в тексте */
435
+ export const imageSources = (text) => [...text.matchAll(IMAGE_SRC)].map((m) => m[1]);
436
+ function imageExtensions(opts) {
437
+ const accept = opts.accept ?? ((f) => f.type.startsWith('image/'));
438
+ const take = (files, pos, view, e) => {
439
+ const images = [...(files ?? [])].filter(accept);
440
+ if (!images.length || !opts.onFiles)
441
+ return false;
442
+ if (opts.onFiles(images, pos, view) === false)
443
+ return false;
444
+ e.preventDefault();
445
+ return true;
446
+ };
447
+ const out = [
448
+ EditorView.domEventHandlers({
449
+ paste: (e, view) => take(e.clipboardData?.files, view.state.selection.main.head, view, e),
450
+ drop: (e, view) => take(e.dataTransfer?.files, view.posAtCoords({ x: e.clientX, y: e.clientY }) ?? view.state.selection.main.head, view, e),
451
+ }),
452
+ ];
453
+ if (opts.onChange) {
454
+ const onChange = opts.onChange;
455
+ out.push(ViewPlugin.define((view) => {
456
+ let last = imageSources(view.state.doc.toString());
457
+ // После создания вида — колбэк может менять состояние приложения
458
+ queueMicrotask(() => onChange(last));
459
+ return {
460
+ update(u) {
461
+ if (!u.docChanged)
462
+ return;
463
+ const next = imageSources(u.state.doc.toString());
464
+ if (next.join('\n') === last.join('\n'))
465
+ return;
466
+ last = next;
467
+ onChange(next);
468
+ },
469
+ };
470
+ }));
471
+ }
472
+ return out;
473
+ }
474
+ // ------------------------------------------------------------------ сборка
475
+ /** Живой Markdown для CodeMirror 6 — одно расширение со всеми частями */
476
+ export function liveMarkdown(options = {}) {
477
+ const phrases = { ...defaultPhrases, ...options.phrases };
478
+ const tokens = options.tokens ?? [];
479
+ const images = options.images === false ? false : (options.images ?? {});
480
+ const openLink = options.openLink ?? ((url) => window.open(url, '_blank', 'noreferrer'));
481
+ const preview = ViewPlugin.fromClass(class {
482
+ decorations;
483
+ generation = 0;
484
+ constructor(view) {
485
+ this.decorations = build(view, { tokens, images, phrases, generation: this.generation });
486
+ }
487
+ update(u) {
488
+ const refresh = u.transactions.some((t) => t.effects.some((e) => e.is(refreshLivePreview)));
489
+ if (refresh)
490
+ this.generation++;
491
+ if (u.docChanged ||
492
+ u.selectionSet ||
493
+ u.focusChanged ||
494
+ u.viewportChanged ||
495
+ refresh ||
496
+ syntaxTree(u.startState) !== syntaxTree(u.state))
497
+ this.decorations = build(u.view, { tokens, images, phrases, generation: this.generation });
498
+ }
499
+ }, {
500
+ decorations: (v) => v.decorations,
501
+ eventHandlers: {
502
+ mousedown(e, view) {
503
+ const target = e.target;
504
+ if (target instanceof HTMLInputElement && target.classList.contains('lmd-check')) {
505
+ const pos = view.posAtDOM(target);
506
+ const text = view.state.sliceDoc(pos, pos + 3);
507
+ if (/^\[[ xX]\]$/.test(text)) {
508
+ view.dispatch({ changes: { from: pos + 1, to: pos + 2, insert: text[1] === ' ' ? 'x' : ' ' } });
509
+ e.preventDefault();
510
+ return true;
511
+ }
512
+ }
513
+ // Ctrl/Cmd+клик по ссылке — открыть
514
+ if (e.metaKey || e.ctrlKey) {
515
+ const pos = view.posAtCoords({ x: e.clientX, y: e.clientY });
516
+ if (pos === null)
517
+ return false;
518
+ for (let n = syntaxTree(view.state).resolveInner(pos, 1); n; n = n.parent) {
519
+ if (n.name !== 'Link')
520
+ continue;
521
+ const url = n.getChild('URL');
522
+ if (url)
523
+ openLink(view.state.sliceDoc(url.from, url.to));
524
+ e.preventDefault();
525
+ return true;
526
+ }
527
+ }
528
+ return false;
529
+ },
530
+ },
531
+ });
532
+ const ext = [];
533
+ // Без markdown(): тот тянет подсветку HTML/CSS/JS (~100 КБ), а нужна только разметка
534
+ if (options.language !== false)
535
+ ext.push(markdownLanguage);
536
+ if (options.keymap !== false)
537
+ // Свои команды раньше стандартных: Tab/Shift+Tab — вложенность списков и ячейки таблиц, Backspace за маркером,
538
+ // Ctrl+B/I/E/K, Ctrl+Enter — чекбокс; затем Enter продолжает список
539
+ ext.push(Prec.high(keymap.of(liveMarkdownKeymap)), Prec.high(keymap.of(markdownKeymap)));
540
+ ext.push(preview);
541
+ if (options.tables !== false) {
542
+ ext.push(tablesField(options.tables ?? {}, phrases.tableHint), EditorView.focusChangeEffect.of((_, focusing) => setFocus.of(focusing)));
543
+ }
544
+ if (images)
545
+ ext.push(imageExtensions(images));
546
+ if (options.theme !== false)
547
+ ext.push(liveMarkdownTheme);
548
+ return ext;
549
+ }
550
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}