@gravity-ui/markdown-editor 15.37.0 → 15.38.0
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/build/cjs/core/ExtensionBuilder.d.ts +21 -0
- package/build/cjs/core/ExtensionBuilder.js +306 -4
- package/build/cjs/core/ExtensionBuilder.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownSerializer.d.ts +4 -1
- package/build/cjs/core/markdown/MarkdownSerializer.js +86 -23
- package/build/cjs/core/markdown/MarkdownSerializer.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
- package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js +42 -0
- package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
- package/build/cjs/extensions/behavior/SelectionContext/index.js +10 -7
- package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +24 -56
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/types.d.ts +10 -0
- package/build/cjs/extensions/behavior/SelectionContext/types.js +3 -0
- package/build/cjs/extensions/behavior/SelectionContext/types.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js +9 -0
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js +22 -25
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js +15 -0
- package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
- package/build/cjs/extensions/markdown/Heading/actions.d.ts +2 -2
- package/build/cjs/extensions/markdown/Heading/actions.js +3 -4
- package/build/cjs/extensions/markdown/Heading/actions.js.map +1 -1
- package/build/cjs/extensions/markdown/Heading/commands.d.ts +3 -1
- package/build/cjs/extensions/markdown/Heading/commands.js +16 -1
- package/build/cjs/extensions/markdown/Heading/commands.js.map +1 -1
- package/build/cjs/extensions/markdown/Heading/index.js +7 -9
- package/build/cjs/extensions/markdown/Heading/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Lists/index.js +1 -0
- package/build/cjs/extensions/markdown/Lists/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +97 -51
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +2 -2
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +72 -90
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +14 -1
- package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/actions.js +2 -10
- package/build/cjs/extensions/yfm/YfmHeading/actions.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/commands.d.ts +1 -4
- package/build/cjs/extensions/yfm/YfmHeading/commands.js +3 -21
- package/build/cjs/extensions/yfm/YfmHeading/commands.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmHeading/index.d.ts +3 -22
- package/build/cjs/extensions/yfm/YfmHeading/index.js +2 -33
- package/build/cjs/extensions/yfm/YfmHeading/index.js.map +1 -1
- package/build/cjs/presets/yfm-specs.js +5 -1
- package/build/cjs/presets/yfm-specs.js.map +1 -1
- package/build/cjs/presets/yfm.js +5 -1
- package/build/cjs/presets/yfm.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/core/ExtensionBuilder.d.ts +21 -0
- package/build/esm/core/ExtensionBuilder.js +306 -4
- package/build/esm/core/ExtensionBuilder.js.map +1 -1
- package/build/esm/core/markdown/MarkdownSerializer.d.ts +4 -1
- package/build/esm/core/markdown/MarkdownSerializer.js +86 -23
- package/build/esm/core/markdown/MarkdownSerializer.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
- package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js +38 -0
- package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
- package/build/esm/extensions/behavior/SelectionContext/index.js +10 -7
- package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js +24 -56
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/types.d.ts +10 -0
- package/build/esm/extensions/behavior/SelectionContext/types.js +2 -0
- package/build/esm/extensions/behavior/SelectionContext/types.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js +6 -0
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js +5 -10
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js +12 -0
- package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
- package/build/esm/extensions/markdown/Heading/actions.d.ts +2 -2
- package/build/esm/extensions/markdown/Heading/actions.js +3 -4
- package/build/esm/extensions/markdown/Heading/actions.js.map +1 -1
- package/build/esm/extensions/markdown/Heading/commands.d.ts +3 -1
- package/build/esm/extensions/markdown/Heading/commands.js +15 -1
- package/build/esm/extensions/markdown/Heading/commands.js.map +1 -1
- package/build/esm/extensions/markdown/Heading/index.js +9 -11
- package/build/esm/extensions/markdown/Heading/index.js.map +1 -1
- package/build/esm/extensions/markdown/Lists/index.js +1 -0
- package/build/esm/extensions/markdown/Lists/index.js.map +1 -1
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +95 -49
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +3 -3
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +70 -90
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +11 -0
- package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/actions.js +2 -10
- package/build/esm/extensions/yfm/YfmHeading/actions.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/commands.d.ts +1 -4
- package/build/esm/extensions/yfm/YfmHeading/commands.js +3 -21
- package/build/esm/extensions/yfm/YfmHeading/commands.js.map +1 -1
- package/build/esm/extensions/yfm/YfmHeading/index.d.ts +3 -22
- package/build/esm/extensions/yfm/YfmHeading/index.js +0 -31
- package/build/esm/extensions/yfm/YfmHeading/index.js.map +1 -1
- package/build/esm/presets/yfm-specs.js +5 -1
- package/build/esm/presets/yfm-specs.js.map +1 -1
- package/build/esm/presets/yfm.js +5 -1
- package/build/esm/presets/yfm.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAGpE,OAAO,EAAC,aAAa,EAAC,iCAA8B;AAEpD,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAChE,OAAO,EAAC,OAAO,EAAC,qBAAkB;AAClC,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,EAAC,sBAAmB;AAC7F,OAAO,EAAC,UAAU,EAAC,mBAAgB;AACnC,OAAO,EAAC,wBAAwB,EAA8B,wBAAqB;AACnF,OAAO,EAAC,mBAAmB,EAAC,yCAAsC;AAClE,OAAO,EAAC,gBAAgB,EAAC,sCAAmC;AAE5D,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAQzE,MAAM,CAAC,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE5C,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEjD,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,YAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAGpE,OAAO,EAAC,aAAa,EAAC,iCAA8B;AAEpD,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAChE,OAAO,EAAC,OAAO,EAAC,qBAAkB;AAClC,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,EAAC,sBAAmB;AAC7F,OAAO,EAAC,UAAU,EAAC,mBAAgB;AACnC,OAAO,EAAC,wBAAwB,EAA8B,wBAAqB;AACnF,OAAO,EAAC,mBAAmB,EAAC,yCAAsC;AAClE,OAAO,EAAC,gBAAgB,EAAC,sCAAmC;AAE5D,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAQzE,MAAM,CAAC,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE5C,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEjD,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,YAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,6EAA6E;IAC7E,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAEvC,OAAO;SACF,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC;SAC1D,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC","sourcesContent":["import {liftListItem, splitListItem} from 'prosemirror-schema-list';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {ListsSpecs, blType, liType, olType} from './ListsSpecs';\nimport {actions} from './actions';\nimport {joinPrevList, liftEmptyListItem, sinkOnlySelectedListItem, toList} from './commands';\nimport {ListAction} from './const';\nimport {ListsInputRulesExtension, type ListsInputRulesOptions} from './inputrules';\nimport {collapseListsPlugin} from './plugins/CollapseListsPlugin';\nimport {mergeListsPlugin} from './plugins/MergeListsPlugin';\n\nexport {ListNode, ListsAttr, blType, liType, olType} from './ListsSpecs';\n\nexport type ListsOptions = {\n ulKey?: string | null;\n olKey?: string | null;\n ulInputRules?: ListsInputRulesOptions['bulletListInputRule'];\n};\n\nexport const Lists: ExtensionAuto<ListsOptions> = (builder, opts) => {\n builder.use(ListsSpecs);\n\n builder.addKeymap(({schema}) => {\n const {ulKey, olKey} = opts ?? {};\n const bindings: Keymap = {};\n if (ulKey) bindings[ulKey] = withLogAction('bulletList', toList(blType(schema)));\n if (olKey) bindings[olKey] = withLogAction('orderedList', toList(olType(schema)));\n\n return {\n Tab: sinkOnlySelectedListItem(liType(schema)),\n 'Shift-Tab': liftListItem(liType(schema)),\n Backspace: liftEmptyListItem(liType(schema)),\n\n 'Mod-[': liftListItem(liType(schema)),\n 'Mod-]': sinkOnlySelectedListItem(liType(schema)),\n\n ...bindings,\n };\n }, builder.Priority.High);\n\n builder.addKeymap(\n ({schema}) => ({\n Enter: splitListItem(liType(schema)),\n Backspace: joinPrevList,\n }),\n builder.Priority.Low,\n );\n\n builder.use(ListsInputRulesExtension, {bulletListInputRule: opts?.ulInputRules});\n\n // Order matters: merge must run before collapse (see CollapseListsPlugin.ts)\n builder.addPlugin(mergeListsPlugin);\n builder.addPlugin(collapseListsPlugin);\n\n builder\n .addAction(ListAction.ToBulletList, actions.toBulletList)\n .addAction(ListAction.ToOrderedList, actions.toOrderedList)\n .addAction(ListAction.SinkListItem, actions.sinkListItem)\n .addAction(ListAction.LiftListItem, actions.liftListItem);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [ListAction.ToBulletList]: Action;\n [ListAction.ToOrderedList]: Action;\n [ListAction.SinkListItem]: Action;\n [ListAction.LiftListItem]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { Plugin, type Transaction } from 'prosemirror-state';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Collapses redundant nested lists inside list items
|
|
4
|
+
*
|
|
5
|
+
* Converts structures where a list item starts with
|
|
6
|
+
* a nested list into a flat list structure
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: must be registered AFTER MergeListsPlugin.
|
|
9
|
+
* Collapsing may create adjacent lists that require merging
|
|
10
|
+
*/
|
|
3
11
|
export declare const collapseListsPlugin: () => Plugin<any>;
|
|
4
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Finds list items with redundant nesting, collapses them recursively,
|
|
14
|
+
* and applies replacements in reverse document order
|
|
15
|
+
*/
|
|
16
|
+
export declare function collapseAllNestedListItems(tr: Transaction): number | null;
|
|
@@ -1,71 +1,117 @@
|
|
|
1
1
|
import { Fragment } from 'prosemirror-model';
|
|
2
|
-
import { Plugin,
|
|
2
|
+
import { Plugin, Selection } from 'prosemirror-state';
|
|
3
3
|
// @ts-ignore // TODO: fix cjs build
|
|
4
|
-
import {
|
|
5
|
-
import { getChildrenOfNode } from "../../../../utils/index.js";
|
|
4
|
+
import { hasParentNode } from 'prosemirror-utils';
|
|
6
5
|
import { isListItemNode, isListNode, liType } from "../utils.js";
|
|
6
|
+
const MAX_COLLAPSE_DEPTH = 100;
|
|
7
|
+
/**
|
|
8
|
+
* Collapses redundant nested lists inside list items
|
|
9
|
+
*
|
|
10
|
+
* Converts structures where a list item starts with
|
|
11
|
+
* a nested list into a flat list structure
|
|
12
|
+
*
|
|
13
|
+
* IMPORTANT: must be registered AFTER MergeListsPlugin.
|
|
14
|
+
* Collapsing may create adjacent lists that require merging
|
|
15
|
+
*/
|
|
7
16
|
export const collapseListsPlugin = () => new Plugin({
|
|
8
17
|
appendTransaction(trs, oldState, newState) {
|
|
18
|
+
// early exit if document unchanged
|
|
9
19
|
const docChanged = trs.some((tr) => tr.docChanged);
|
|
10
|
-
if (!docChanged)
|
|
20
|
+
if (!docChanged) {
|
|
11
21
|
return null;
|
|
22
|
+
}
|
|
23
|
+
// early exit if not inside a list
|
|
12
24
|
const hasParentList = hasParentNode(isListNode)(newState.selection) ||
|
|
13
25
|
hasParentNode(isListNode)(oldState.selection);
|
|
14
|
-
if (!hasParentList)
|
|
26
|
+
if (!hasParentList) {
|
|
15
27
|
return null;
|
|
28
|
+
}
|
|
16
29
|
const { tr } = newState;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
currentStepsCount = collapseEmptyListItems(tr, listNodes);
|
|
30
|
+
// collapse of redundant nested lists
|
|
31
|
+
const lastCollapsePos = collapseAllNestedListItems(tr);
|
|
32
|
+
// restore cursor position
|
|
33
|
+
if (lastCollapsePos !== null) {
|
|
34
|
+
const clampedPos = Math.min(lastCollapsePos, tr.doc.content.size);
|
|
35
|
+
tr.setSelection(Selection.near(tr.doc.resolve(clampedPos)));
|
|
24
36
|
}
|
|
25
37
|
return tr.docChanged ? tr : null;
|
|
26
38
|
},
|
|
27
39
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Finds list items with redundant nesting, collapses them recursively,
|
|
42
|
+
* and applies replacements in reverse document order
|
|
43
|
+
*/
|
|
44
|
+
export function collapseAllNestedListItems(tr) {
|
|
45
|
+
const replacements = [];
|
|
46
|
+
const schema = tr.doc.type.schema;
|
|
47
|
+
// skipUntil prevents re-processing children that were already collapsed
|
|
48
|
+
// by the recursive call in collapseListItemContent
|
|
49
|
+
let skipUntil = -1;
|
|
50
|
+
tr.doc.descendants((node, pos) => {
|
|
51
|
+
if (pos < skipUntil || node.isTextblock) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!isListItemNode(node)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
const { firstChild } = node;
|
|
58
|
+
if (!firstChild || !isListNode(firstChild)) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
const collapsedContent = collapseListItemContent(node, schema, 0);
|
|
62
|
+
if (collapsedContent === null) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
replacements.push({
|
|
66
|
+
from: pos,
|
|
67
|
+
to: pos + node.nodeSize,
|
|
68
|
+
content: collapsedContent,
|
|
57
69
|
});
|
|
70
|
+
skipUntil = pos + node.nodeSize;
|
|
71
|
+
return false;
|
|
58
72
|
});
|
|
59
|
-
|
|
73
|
+
if (replacements.length === 0) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// apply from end to start so earlier positions stay valid
|
|
77
|
+
for (let i = replacements.length - 1; i >= 0; i--) {
|
|
78
|
+
const { from, to, content } = replacements[i];
|
|
79
|
+
tr.replaceWith(from, to, content);
|
|
80
|
+
}
|
|
81
|
+
// map the original end of the last replacement to its post-edit position
|
|
82
|
+
const last = replacements[replacements.length - 1];
|
|
83
|
+
return tr.mapping.map(last.to);
|
|
60
84
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Recursively collapses a list item with redundant nesting
|
|
87
|
+
* into a Fragment of flat list items
|
|
88
|
+
*
|
|
89
|
+
* A redundantly nested list item has a list as its first child
|
|
90
|
+
* (instead of a paragraph)
|
|
91
|
+
*/
|
|
92
|
+
function collapseListItemContent(itemNode, schema, depth) {
|
|
93
|
+
const { firstChild } = itemNode;
|
|
94
|
+
if (!firstChild || !isListNode(firstChild)) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
if (depth >= MAX_COLLAPSE_DEPTH) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// .slice(1) = all children except firstChild
|
|
101
|
+
const remaining = itemNode.content.content.slice(1);
|
|
102
|
+
let result = Fragment.empty;
|
|
103
|
+
firstChild.forEach((child) => {
|
|
104
|
+
if (isListItemNode(child)) {
|
|
105
|
+
const collapsed = collapseListItemContent(child, schema, depth + 1);
|
|
106
|
+
result = result.append(collapsed ?? Fragment.from(child));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
result = result.append(Fragment.from(child));
|
|
66
110
|
}
|
|
67
|
-
|
|
111
|
+
});
|
|
112
|
+
if (remaining.length) {
|
|
113
|
+
result = result.append(Fragment.from(liType(schema).create(null, remaining)));
|
|
68
114
|
}
|
|
69
|
-
return
|
|
115
|
+
return result;
|
|
70
116
|
}
|
|
71
117
|
//# sourceMappingURL=CollapseListsPlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapseListsPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Lists/plugins/CollapseListsPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"CollapseListsPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Lists/plugins/CollapseListsPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type Schema} from 'prosemirror-model';\nimport {Plugin, Selection, type Transaction} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNode} from 'prosemirror-utils';\n\nimport {isListItemNode, isListNode, liType} from '../utils';\n\nconst MAX_COLLAPSE_DEPTH = 100;\n\n/**\n * Collapses redundant nested lists inside list items\n *\n * Converts structures where a list item starts with\n * a nested list into a flat list structure\n *\n * IMPORTANT: must be registered AFTER MergeListsPlugin.\n * Collapsing may create adjacent lists that require merging\n */\nexport const collapseListsPlugin = () =>\n new Plugin({\n appendTransaction(trs, oldState, newState) {\n // early exit if document unchanged\n const docChanged = trs.some((tr) => tr.docChanged);\n if (!docChanged) {\n return null;\n }\n\n // early exit if not inside a list\n const hasParentList =\n hasParentNode(isListNode)(newState.selection) ||\n hasParentNode(isListNode)(oldState.selection);\n if (!hasParentList) {\n return null;\n }\n\n const {tr} = newState;\n\n // collapse of redundant nested lists\n const lastCollapsePos = collapseAllNestedListItems(tr);\n\n // restore cursor position\n if (lastCollapsePos !== null) {\n const clampedPos = Math.min(lastCollapsePos, tr.doc.content.size);\n tr.setSelection(Selection.near(tr.doc.resolve(clampedPos)));\n }\n\n return tr.docChanged ? tr : null;\n },\n });\n\ninterface Replacement {\n from: number;\n to: number;\n content: Fragment;\n}\n\n/**\n * Finds list items with redundant nesting, collapses them recursively,\n * and applies replacements in reverse document order\n */\nexport function collapseAllNestedListItems(tr: Transaction): number | null {\n const replacements: Replacement[] = [];\n const schema = tr.doc.type.schema;\n\n // skipUntil prevents re-processing children that were already collapsed\n // by the recursive call in collapseListItemContent\n let skipUntil = -1;\n\n tr.doc.descendants((node, pos) => {\n if (pos < skipUntil || node.isTextblock) {\n return false;\n }\n\n if (!isListItemNode(node)) {\n return true;\n }\n\n const {firstChild} = node;\n if (!firstChild || !isListNode(firstChild)) {\n return true;\n }\n\n const collapsedContent = collapseListItemContent(node, schema, 0);\n if (collapsedContent === null) {\n return true;\n }\n\n replacements.push({\n from: pos,\n to: pos + node.nodeSize,\n content: collapsedContent,\n });\n skipUntil = pos + node.nodeSize;\n\n return false;\n });\n\n if (replacements.length === 0) {\n return null;\n }\n\n // apply from end to start so earlier positions stay valid\n for (let i = replacements.length - 1; i >= 0; i--) {\n const {from, to, content} = replacements[i];\n tr.replaceWith(from, to, content);\n }\n\n // map the original end of the last replacement to its post-edit position\n const last = replacements[replacements.length - 1];\n return tr.mapping.map(last.to);\n}\n\n/**\n * Recursively collapses a list item with redundant nesting\n * into a Fragment of flat list items\n *\n * A redundantly nested list item has a list as its first child\n * (instead of a paragraph)\n */\nfunction collapseListItemContent(itemNode: Node, schema: Schema, depth: number): Fragment | null {\n const {firstChild} = itemNode;\n if (!firstChild || !isListNode(firstChild)) {\n return null;\n }\n if (depth >= MAX_COLLAPSE_DEPTH) {\n return null;\n }\n\n // .slice(1) = all children except firstChild\n const remaining = itemNode.content.content.slice(1);\n\n let result = Fragment.empty;\n firstChild.forEach((child) => {\n if (isListItemNode(child)) {\n const collapsed = collapseListItemContent(child, schema, depth + 1);\n result = result.append(collapsed ?? Fragment.from(child));\n } else {\n result = result.append(Fragment.from(child));\n }\n });\n\n if (remaining.length) {\n result = result.append(Fragment.from(liType(schema).create(null, remaining)));\n }\n\n return result;\n}\n"]}
|
|
@@ -2,7 +2,7 @@ export type { HeadingLevel } from "../../../markdown/Heading/const.js";
|
|
|
2
2
|
export { headingLevelAttr, headingNodeName } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
3
3
|
export declare const YfmHeadingAttr: {
|
|
4
4
|
readonly Level: "level";
|
|
5
|
-
readonly Id: "id";
|
|
6
5
|
readonly DataLine: "data-line";
|
|
6
|
+
readonly Id: "id";
|
|
7
7
|
readonly Folding: "folded";
|
|
8
8
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { headingLevelAttr } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
1
|
+
import { headingLevelAttr, headingLineNumberAttr } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
2
2
|
export { headingLevelAttr, headingNodeName } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
3
3
|
export const YfmHeadingAttr = {
|
|
4
4
|
Level: headingLevelAttr,
|
|
5
|
+
DataLine: headingLineNumberAttr,
|
|
5
6
|
Id: 'id',
|
|
6
|
-
|
|
7
|
-
Folding: 'folded',
|
|
7
|
+
Folding: 'folded', // TODO: move to FoldingHeadingExtension
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,wDAA+C;
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAC,wDAA+C;AAG/F,OAAO,EAAC,gBAAgB,EAAE,eAAe,EAAC,wDAA+C;AAEzF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,qBAAqB;IAC/B,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,QAAQ,EAAE,wCAAwC;CACrD,CAAC","sourcesContent":["import {headingLevelAttr, headingLineNumberAttr} from '../../../markdown/Heading/HeadingSpecs';\nexport type {HeadingLevel} from '../../../markdown/Heading/const';\n\nexport {headingLevelAttr, headingNodeName} from '../../../markdown/Heading/HeadingSpecs';\n\nexport const YfmHeadingAttr = {\n Level: headingLevelAttr,\n DataLine: headingLineNumberAttr,\n Id: 'id',\n Folding: 'folded', // TODO: move to FoldingHeadingExtension\n} as const;\n"]}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { ExtensionAuto } from "../../../../core/index.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type HeadingSpecsOptions } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
3
3
|
export { YfmHeadingAttr } from "./const.js";
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
* @deprecated: use placeholder option in BehaviorPreset instead.
|
|
7
|
-
*/
|
|
8
|
-
headingPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
|
|
9
|
-
};
|
|
4
|
+
export { renderYfmHeadingAttributes, renderYfmHeadingMarkup } from "./utils.js";
|
|
5
|
+
export type YfmHeadingSpecsOptions = HeadingSpecsOptions & {};
|
|
10
6
|
/** YfmHeading extension needs markdown-it-attrs plugin */
|
|
11
7
|
export declare const YfmHeadingSpecs: ExtensionAuto<YfmHeadingSpecsOptions>;
|
|
@@ -1,103 +1,83 @@
|
|
|
1
|
+
import { headingToMarkdown, } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
1
2
|
import { YfmHeadingAttr, headingNodeName } from "./const.js";
|
|
2
3
|
import { headingIdsPlugin } from "./markdown/heading-ids.js";
|
|
3
|
-
import { getNodeAttrs } from "./utils.js";
|
|
4
|
-
const DEFAULT_PLACEHOLDER = (node) => 'Heading ' + node.attrs[YfmHeadingAttr.Level];
|
|
4
|
+
import { getNodeAttrs, renderYfmHeadingAttributes, renderYfmHeadingMarkup } from "./utils.js";
|
|
5
5
|
export { YfmHeadingAttr } from "./const.js";
|
|
6
|
+
export { renderYfmHeadingAttributes, renderYfmHeadingMarkup } from "./utils.js";
|
|
6
7
|
/** YfmHeading extension needs markdown-it-attrs plugin */
|
|
7
|
-
export const YfmHeadingSpecs = (builder,
|
|
8
|
+
export const YfmHeadingSpecs = (builder, _opts) => {
|
|
8
9
|
builder.configureMd((md) => md.use(headingIdsPlugin));
|
|
9
|
-
builder.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
builder.overrideNodeSpec(headingNodeName, (prev) => ({
|
|
11
|
+
...prev,
|
|
12
|
+
attrs: {
|
|
13
|
+
...prev.attrs,
|
|
14
|
+
[YfmHeadingAttr.Id]: { default: '' },
|
|
15
|
+
[YfmHeadingAttr.Folding]: { default: null },
|
|
16
|
+
},
|
|
17
|
+
selectable: true,
|
|
18
|
+
parseDOM: [
|
|
19
|
+
{ tag: 'h1', getAttrs: getNodeAttrs(1), priority: 100, consuming: true },
|
|
20
|
+
{ tag: 'h2', getAttrs: getNodeAttrs(2), priority: 100, consuming: true },
|
|
21
|
+
{ tag: 'h3', getAttrs: getNodeAttrs(3), priority: 100, consuming: true },
|
|
22
|
+
{ tag: 'h4', getAttrs: getNodeAttrs(4), priority: 100, consuming: true },
|
|
23
|
+
{ tag: 'h5', getAttrs: getNodeAttrs(5), priority: 100, consuming: true },
|
|
24
|
+
{ tag: 'h6', getAttrs: getNodeAttrs(6), priority: 100, consuming: true },
|
|
25
|
+
{
|
|
26
|
+
// ignore anchor link inside headings
|
|
27
|
+
tag: 'a.yfm-anchor',
|
|
28
|
+
context: `${headingNodeName}/`,
|
|
29
|
+
skip: true,
|
|
30
|
+
ignore: true,
|
|
31
|
+
priority: 1000,
|
|
16
32
|
},
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{ tag: 'h3', getAttrs: getNodeAttrs(3), priority: 100, consuming: true },
|
|
25
|
-
{ tag: 'h4', getAttrs: getNodeAttrs(4), priority: 100, consuming: true },
|
|
26
|
-
{ tag: 'h5', getAttrs: getNodeAttrs(5), priority: 100, consuming: true },
|
|
27
|
-
{ tag: 'h6', getAttrs: getNodeAttrs(6), priority: 100, consuming: true },
|
|
33
|
+
],
|
|
34
|
+
toDOM(node) {
|
|
35
|
+
const id = node.attrs[YfmHeadingAttr.Id];
|
|
36
|
+
const lineNumber = node.attrs[YfmHeadingAttr.DataLine];
|
|
37
|
+
const folding = node.attrs[YfmHeadingAttr.Folding];
|
|
38
|
+
return [
|
|
39
|
+
'h' + node.attrs[YfmHeadingAttr.Level],
|
|
28
40
|
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
skip: true,
|
|
33
|
-
ignore: true,
|
|
34
|
-
priority: 1000,
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
toDOM(node) {
|
|
38
|
-
const id = node.attrs[YfmHeadingAttr.Id];
|
|
39
|
-
const lineNumber = node.attrs[YfmHeadingAttr.DataLine];
|
|
40
|
-
const folding = node.attrs[YfmHeadingAttr.Folding];
|
|
41
|
-
return [
|
|
42
|
-
'h' + node.attrs[YfmHeadingAttr.Level],
|
|
43
|
-
{
|
|
44
|
-
id: id || null,
|
|
45
|
-
[YfmHeadingAttr.DataLine]: lineNumber,
|
|
46
|
-
[`data-${YfmHeadingAttr.Folding}`]: folding,
|
|
47
|
-
},
|
|
48
|
-
0,
|
|
49
|
-
// [
|
|
50
|
-
// 'a',
|
|
51
|
-
// {
|
|
52
|
-
// href: `#${node.attrs[YfmHeadingAttr.Id]}`,
|
|
53
|
-
// class: 'yfm-anchor',
|
|
54
|
-
// 'aria-hidden': 'true',
|
|
55
|
-
// contenteditable: 'false',
|
|
56
|
-
// },
|
|
57
|
-
// ],
|
|
58
|
-
// ['span', 0],
|
|
59
|
-
];
|
|
60
|
-
},
|
|
61
|
-
placeholder: {
|
|
62
|
-
content: builder.context.get('placeholder')?.heading ??
|
|
63
|
-
opts.headingPlaceholder ??
|
|
64
|
-
DEFAULT_PLACEHOLDER,
|
|
65
|
-
alwaysVisible: true,
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
fromMd: {
|
|
69
|
-
tokenSpec: {
|
|
70
|
-
name: headingNodeName,
|
|
71
|
-
type: 'block',
|
|
72
|
-
getAttrs: (token) => {
|
|
73
|
-
if (token.type.endsWith('_close'))
|
|
74
|
-
return {};
|
|
75
|
-
const attrs = Object.fromEntries(token.attrs || []);
|
|
76
|
-
// if (!attrs[YfmHeadingAttr.Id]) {
|
|
77
|
-
// // calculate id if it was not specified
|
|
78
|
-
// // tokens[index + 1] is child inline token
|
|
79
|
-
// attrs[YfmHeadingAttr.Id] = slugify(tokens[index + 1].content);
|
|
80
|
-
// }
|
|
81
|
-
// attrs have id only if it explicitly specified manually
|
|
82
|
-
return {
|
|
83
|
-
[YfmHeadingAttr.Level]: Number(token.tag.slice(1)),
|
|
84
|
-
[YfmHeadingAttr.Folding]: token.meta?.folding === true ? true : null,
|
|
85
|
-
...attrs,
|
|
86
|
-
};
|
|
41
|
+
id: id || null,
|
|
42
|
+
[YfmHeadingAttr.DataLine]: lineNumber,
|
|
43
|
+
[`data-${YfmHeadingAttr.Folding}`]: folding,
|
|
87
44
|
},
|
|
88
|
-
|
|
45
|
+
0,
|
|
46
|
+
// [
|
|
47
|
+
// 'a',
|
|
48
|
+
// {
|
|
49
|
+
// href: `#${node.attrs[YfmHeadingAttr.Id]}`,
|
|
50
|
+
// class: 'yfm-anchor',
|
|
51
|
+
// 'aria-hidden': 'true',
|
|
52
|
+
// contenteditable: 'false',
|
|
53
|
+
// },
|
|
54
|
+
// ],
|
|
55
|
+
// ['span', 0],
|
|
56
|
+
];
|
|
89
57
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
58
|
+
}));
|
|
59
|
+
builder.overrideMarkdownTokenParserSpec(headingNodeName, (prev) => ({
|
|
60
|
+
...prev,
|
|
61
|
+
getAttrs: (token) => {
|
|
62
|
+
if (token.type.endsWith('_close'))
|
|
63
|
+
return {};
|
|
64
|
+
const attrs = Object.fromEntries(token.attrs || []);
|
|
65
|
+
// if (!attrs[YfmHeadingAttr.Id]) {
|
|
66
|
+
// // calculate id if it was not specified
|
|
67
|
+
// // tokens[index + 1] is child inline token
|
|
68
|
+
// attrs[YfmHeadingAttr.Id] = slugify(tokens[index + 1].content);
|
|
69
|
+
// }
|
|
70
|
+
// attrs have id only if it explicitly specified manually
|
|
71
|
+
return {
|
|
72
|
+
[YfmHeadingAttr.Level]: Number(token.tag.slice(1)),
|
|
73
|
+
[YfmHeadingAttr.Folding]: token.meta?.folding === true ? true : null,
|
|
74
|
+
...attrs,
|
|
75
|
+
};
|
|
100
76
|
},
|
|
101
77
|
}));
|
|
78
|
+
builder.overrideNodeSerializerSpec(headingNodeName, () => headingToMarkdown({
|
|
79
|
+
renderMarkup: renderYfmHeadingMarkup,
|
|
80
|
+
renderAttributes: renderYfmHeadingAttributes,
|
|
81
|
+
}));
|
|
102
82
|
};
|
|
103
83
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto} from '#core';\nimport {\n type HeadingSpecsOptions,\n headingToMarkdown,\n} from 'src/extensions/markdown/Heading/HeadingSpecs';\n\nimport {YfmHeadingAttr, headingNodeName} from './const';\nimport {headingIdsPlugin} from './markdown/heading-ids';\nimport {getNodeAttrs, renderYfmHeadingAttributes, renderYfmHeadingMarkup} from './utils';\n\nexport {YfmHeadingAttr} from './const';\nexport {renderYfmHeadingAttributes, renderYfmHeadingMarkup} from './utils';\n\nexport type YfmHeadingSpecsOptions = HeadingSpecsOptions & {};\n\n/** YfmHeading extension needs markdown-it-attrs plugin */\nexport const YfmHeadingSpecs: ExtensionAuto<YfmHeadingSpecsOptions> = (builder, _opts) => {\n builder.configureMd((md) => md.use(headingIdsPlugin));\n\n builder.overrideNodeSpec(headingNodeName, (prev) => ({\n ...prev,\n attrs: {\n ...prev.attrs,\n [YfmHeadingAttr.Id]: {default: ''},\n [YfmHeadingAttr.Folding]: {default: null},\n },\n selectable: true,\n parseDOM: [\n {tag: 'h1', getAttrs: getNodeAttrs(1), priority: 100, consuming: true},\n {tag: 'h2', getAttrs: getNodeAttrs(2), priority: 100, consuming: true},\n {tag: 'h3', getAttrs: getNodeAttrs(3), priority: 100, consuming: true},\n {tag: 'h4', getAttrs: getNodeAttrs(4), priority: 100, consuming: true},\n {tag: 'h5', getAttrs: getNodeAttrs(5), priority: 100, consuming: true},\n {tag: 'h6', getAttrs: getNodeAttrs(6), priority: 100, consuming: true},\n {\n // ignore anchor link inside headings\n tag: 'a.yfm-anchor',\n context: `${headingNodeName}/`,\n skip: true,\n ignore: true,\n priority: 1000,\n },\n ],\n toDOM(node) {\n const id = node.attrs[YfmHeadingAttr.Id];\n const lineNumber = node.attrs[YfmHeadingAttr.DataLine];\n const folding = node.attrs[YfmHeadingAttr.Folding];\n return [\n 'h' + node.attrs[YfmHeadingAttr.Level],\n {\n id: id || null,\n [YfmHeadingAttr.DataLine]: lineNumber,\n [`data-${YfmHeadingAttr.Folding}`]: folding,\n },\n 0,\n // [\n // 'a',\n // {\n // href: `#${node.attrs[YfmHeadingAttr.Id]}`,\n // class: 'yfm-anchor',\n // 'aria-hidden': 'true',\n // contenteditable: 'false',\n // },\n // ],\n // ['span', 0],\n ];\n },\n }));\n\n builder.overrideMarkdownTokenParserSpec(headingNodeName, (prev) => ({\n ...prev,\n getAttrs: (token) => {\n if (token.type.endsWith('_close')) return {};\n\n const attrs = Object.fromEntries(token.attrs || []);\n // if (!attrs[YfmHeadingAttr.Id]) {\n // // calculate id if it was not specified\n // // tokens[index + 1] is child inline token\n // attrs[YfmHeadingAttr.Id] = slugify(tokens[index + 1].content);\n // }\n\n // attrs have id only if it explicitly specified manually\n return {\n [YfmHeadingAttr.Level]: Number(token.tag.slice(1)),\n [YfmHeadingAttr.Folding]: token.meta?.folding === true ? true : null,\n ...attrs,\n };\n },\n }));\n\n builder.overrideNodeSerializerSpec(headingNodeName, () =>\n headingToMarkdown({\n renderMarkup: renderYfmHeadingMarkup,\n renderAttributes: renderYfmHeadingAttributes,\n }),\n );\n};\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { TagParseRule } from 'prosemirror-model';
|
|
2
|
+
import type { SerializerNodeToken } from "../../../../core/index.js";
|
|
2
3
|
import { type HeadingLevel } from "../const.js";
|
|
3
4
|
export { hasParentHeading, headingRule } from "../../../markdown/Heading/utils.js";
|
|
4
5
|
export { headingType } from "../../../markdown/Heading/HeadingSpecs/index.js";
|
|
5
6
|
export declare const getNodeAttrs: (level: HeadingLevel) => TagParseRule["getAttrs"];
|
|
7
|
+
export declare const renderYfmHeadingMarkup: SerializerNodeToken;
|
|
8
|
+
export declare const renderYfmHeadingAttributes: SerializerNodeToken;
|
|
@@ -22,4 +22,15 @@ function getFoldingAttr(node) {
|
|
|
22
22
|
// lower: true,
|
|
23
23
|
// remove: /[*+~.()'"!:@]/g,
|
|
24
24
|
// });
|
|
25
|
+
export const renderYfmHeadingMarkup = (state, node) => {
|
|
26
|
+
const folding = node.attrs[YfmHeadingAttr.Folding];
|
|
27
|
+
const level = node.attrs[YfmHeadingAttr.Level];
|
|
28
|
+
state.write(state.repeat('#', level) + (typeof folding === 'boolean' ? '+' : '') + ' ');
|
|
29
|
+
};
|
|
30
|
+
export const renderYfmHeadingAttributes = (state, node) => {
|
|
31
|
+
const anchor = node.attrs[YfmHeadingAttr.Id];
|
|
32
|
+
if (anchor /*&& anchor !== node.firstChild?.textContent*/) {
|
|
33
|
+
state.write(` {#${anchor}}`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
25
36
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,cAAc,EAAC,oBAAiB;AAC3D,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,2CAAwC;AAC9E,OAAO,EAAC,WAAW,EAAC,wDAA+C;AAEnE,mCAAmC;AAEnC,MAAM,CAAC,MAAM,YAAY,GACrB,CAAC,KAAmB,EAA4B,EAAE,CAClD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACP,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK;IAC7B,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;IAClD,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC;CACjD,CAAC,CAAC;AAEP,SAAS,cAAc,CAAC,IAAiB;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,0CAA0C;AAC1C,yCAAyC;AACzC,yGAAyG;AACzG,kBAAkB;AAClB,uBAAuB;AACvB,oCAAoC;AACpC,UAAU;AAEV,MAAM,CAAC,MAAM,sBAAsB,GAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAE/C,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAE7C,IAAI,MAAM,CAAC,8CAA8C,EAAE,CAAC;QACxD,KAAK,CAAC,KAAK,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import type {TagParseRule} from 'prosemirror-model';\n\nimport type {SerializerNodeToken} from '#core';\n\nimport {type HeadingLevel, YfmHeadingAttr} from '../const';\nexport {hasParentHeading, headingRule} from '../../../markdown/Heading/utils';\nexport {headingType} from '../../../markdown/Heading/HeadingSpecs';\n\n// const slug = require('slugify');\n\nexport const getNodeAttrs =\n (level: HeadingLevel): TagParseRule['getAttrs'] =>\n (node) => ({\n [YfmHeadingAttr.Level]: level,\n [YfmHeadingAttr.Id]: node.getAttribute('id') || '',\n [YfmHeadingAttr.Folding]: getFoldingAttr(node),\n });\n\nfunction getFoldingAttr(node: HTMLElement): boolean | null {\n const value = node.getAttribute(`data-${YfmHeadingAttr.Folding}`);\n if (value === 'true') return true;\n if (value === 'false') return false;\n return null;\n}\n\n// export const slugify = (str: string) =>\n// // same config as in yfm-transform\n// // https://github.com/yandex-cloud/yfm-transform/blob/master/lib/plugins/anchors/index.js#L97-L100\n// slug(str, {\n// lower: true,\n// remove: /[*+~.()'\"!:@]/g,\n// });\n\nexport const renderYfmHeadingMarkup: SerializerNodeToken = (state, node) => {\n const folding = node.attrs[YfmHeadingAttr.Folding];\n const level = node.attrs[YfmHeadingAttr.Level];\n\n state.write(state.repeat('#', level) + (typeof folding === 'boolean' ? '+' : '') + ' ');\n};\n\nexport const renderYfmHeadingAttributes: SerializerNodeToken = (state, node) => {\n const anchor = node.attrs[YfmHeadingAttr.Id];\n\n if (anchor /*&& anchor !== node.firstChild?.textContent*/) {\n state.write(` {#${anchor}}`);\n }\n};\n"]}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export const headingAction = (level) => {
|
|
4
|
-
const cmd = toHeading(level);
|
|
5
|
-
return {
|
|
6
|
-
isActive: hasParentHeading(level),
|
|
7
|
-
isEnable: cmd,
|
|
8
|
-
run: cmd,
|
|
9
|
-
};
|
|
10
|
-
};
|
|
1
|
+
import { headingAction as headingActionBase } from "../../markdown/Heading/actions.js";
|
|
2
|
+
export const headingAction = (level) => headingActionBase({}, level);
|
|
11
3
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmHeading/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmHeading/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,IAAI,iBAAiB,EAAC,0CAAgD;AAI3F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAc,EAAE,CAC7D,iBAAiB,CAAC,EAAc,EAAE,KAAK,CAAC,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {headingAction as headingActionBase} from 'src/extensions/markdown/Heading/actions';\n\nimport type {HeadingLevel} from './const';\n\nexport const headingAction = (level: HeadingLevel): ActionSpec =>\n headingActionBase({} as NodeType, level);\n"]}
|