@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.
Files changed (129) hide show
  1. package/build/cjs/core/ExtensionBuilder.d.ts +21 -0
  2. package/build/cjs/core/ExtensionBuilder.js +306 -4
  3. package/build/cjs/core/ExtensionBuilder.js.map +1 -1
  4. package/build/cjs/core/markdown/MarkdownSerializer.d.ts +4 -1
  5. package/build/cjs/core/markdown/MarkdownSerializer.js +86 -23
  6. package/build/cjs/core/markdown/MarkdownSerializer.js.map +1 -1
  7. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
  8. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js +42 -0
  9. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
  10. package/build/cjs/extensions/behavior/SelectionContext/index.js +10 -7
  11. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  12. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
  13. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +24 -56
  14. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  15. package/build/cjs/extensions/behavior/SelectionContext/types.d.ts +10 -0
  16. package/build/cjs/extensions/behavior/SelectionContext/types.js +3 -0
  17. package/build/cjs/extensions/behavior/SelectionContext/types.js.map +1 -0
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  20. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
  21. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js +9 -0
  22. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
  23. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
  24. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js +22 -25
  25. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  26. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
  27. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js +15 -0
  28. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
  29. package/build/cjs/extensions/markdown/Heading/actions.d.ts +2 -2
  30. package/build/cjs/extensions/markdown/Heading/actions.js +3 -4
  31. package/build/cjs/extensions/markdown/Heading/actions.js.map +1 -1
  32. package/build/cjs/extensions/markdown/Heading/commands.d.ts +3 -1
  33. package/build/cjs/extensions/markdown/Heading/commands.js +16 -1
  34. package/build/cjs/extensions/markdown/Heading/commands.js.map +1 -1
  35. package/build/cjs/extensions/markdown/Heading/index.js +7 -9
  36. package/build/cjs/extensions/markdown/Heading/index.js.map +1 -1
  37. package/build/cjs/extensions/markdown/Lists/index.js +1 -0
  38. package/build/cjs/extensions/markdown/Lists/index.js.map +1 -1
  39. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
  40. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +97 -51
  41. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
  42. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  43. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +2 -2
  44. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
  45. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
  46. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +72 -90
  47. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
  48. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
  49. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +14 -1
  50. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
  51. package/build/cjs/extensions/yfm/YfmHeading/actions.js +2 -10
  52. package/build/cjs/extensions/yfm/YfmHeading/actions.js.map +1 -1
  53. package/build/cjs/extensions/yfm/YfmHeading/commands.d.ts +1 -4
  54. package/build/cjs/extensions/yfm/YfmHeading/commands.js +3 -21
  55. package/build/cjs/extensions/yfm/YfmHeading/commands.js.map +1 -1
  56. package/build/cjs/extensions/yfm/YfmHeading/index.d.ts +3 -22
  57. package/build/cjs/extensions/yfm/YfmHeading/index.js +2 -33
  58. package/build/cjs/extensions/yfm/YfmHeading/index.js.map +1 -1
  59. package/build/cjs/presets/yfm-specs.js +5 -1
  60. package/build/cjs/presets/yfm-specs.js.map +1 -1
  61. package/build/cjs/presets/yfm.js +5 -1
  62. package/build/cjs/presets/yfm.js.map +1 -1
  63. package/build/cjs/version.js +1 -1
  64. package/build/cjs/version.js.map +1 -1
  65. package/build/esm/core/ExtensionBuilder.d.ts +21 -0
  66. package/build/esm/core/ExtensionBuilder.js +306 -4
  67. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  68. package/build/esm/core/markdown/MarkdownSerializer.d.ts +4 -1
  69. package/build/esm/core/markdown/MarkdownSerializer.js +86 -23
  70. package/build/esm/core/markdown/MarkdownSerializer.js.map +1 -1
  71. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
  72. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js +38 -0
  73. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
  74. package/build/esm/extensions/behavior/SelectionContext/index.js +10 -7
  75. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  76. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
  77. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +24 -56
  78. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  79. package/build/esm/extensions/behavior/SelectionContext/types.d.ts +10 -0
  80. package/build/esm/extensions/behavior/SelectionContext/types.js +2 -0
  81. package/build/esm/extensions/behavior/SelectionContext/types.js.map +1 -0
  82. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  84. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
  85. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js +6 -0
  86. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
  87. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
  88. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js +5 -10
  89. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  90. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
  91. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js +12 -0
  92. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
  93. package/build/esm/extensions/markdown/Heading/actions.d.ts +2 -2
  94. package/build/esm/extensions/markdown/Heading/actions.js +3 -4
  95. package/build/esm/extensions/markdown/Heading/actions.js.map +1 -1
  96. package/build/esm/extensions/markdown/Heading/commands.d.ts +3 -1
  97. package/build/esm/extensions/markdown/Heading/commands.js +15 -1
  98. package/build/esm/extensions/markdown/Heading/commands.js.map +1 -1
  99. package/build/esm/extensions/markdown/Heading/index.js +9 -11
  100. package/build/esm/extensions/markdown/Heading/index.js.map +1 -1
  101. package/build/esm/extensions/markdown/Lists/index.js +1 -0
  102. package/build/esm/extensions/markdown/Lists/index.js.map +1 -1
  103. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
  104. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +95 -49
  105. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
  106. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  107. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +3 -3
  108. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
  109. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
  110. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +70 -90
  111. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
  112. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
  113. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +11 -0
  114. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
  115. package/build/esm/extensions/yfm/YfmHeading/actions.js +2 -10
  116. package/build/esm/extensions/yfm/YfmHeading/actions.js.map +1 -1
  117. package/build/esm/extensions/yfm/YfmHeading/commands.d.ts +1 -4
  118. package/build/esm/extensions/yfm/YfmHeading/commands.js +3 -21
  119. package/build/esm/extensions/yfm/YfmHeading/commands.js.map +1 -1
  120. package/build/esm/extensions/yfm/YfmHeading/index.d.ts +3 -22
  121. package/build/esm/extensions/yfm/YfmHeading/index.js +0 -31
  122. package/build/esm/extensions/yfm/YfmHeading/index.js.map +1 -1
  123. package/build/esm/presets/yfm-specs.js +5 -1
  124. package/build/esm/presets/yfm-specs.js.map +1 -1
  125. package/build/esm/presets/yfm.js +5 -1
  126. package/build/esm/presets/yfm.js.map +1 -1
  127. package/build/esm/version.js +1 -1
  128. package/build/esm/version.js.map +1 -1
  129. package/package.json +2 -2
@@ -1,100 +1,72 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Popup } from '@gravity-ui/uikit';
3
- import { isFunction } from "../../../lodash.js";
4
2
  import { globalLogger } from "../../../logger.js";
5
3
  import { ErrorLoggerBoundary } from "../../../react-utils/ErrorBoundary.js";
6
- import { Toolbar } from "../../../toolbar/index.js";
7
4
  import { getReactRendererFromState } from "../ReactRenderer/index.js";
8
- const SelectionTooltip = ({ show, poppupProps, ...toolbarProps }) => {
9
- if (!show)
10
- return null;
11
- return (_jsx(Popup, { open: true, ...poppupProps, style: { padding: '4px 8px' }, children: _jsx(Toolbar, { ...toolbarProps }) }));
12
- };
5
+ import { TextSelectionTooltip } from "./TextSelectionTooltip.js";
13
6
  export class TooltipView {
14
7
  #isTooltipOpen = false;
15
8
  logger;
16
9
  actions;
17
10
  menuConfig;
18
11
  placement;
12
+ onPopupOpenChange;
19
13
  view;
20
- baseProps = { show: false, poppupProps: {} };
14
+ visible = false;
15
+ anchor = undefined;
21
16
  _tooltipRenderItem = null;
22
17
  constructor(actions, menuConfig, logger, params) {
23
18
  this.logger = logger;
24
19
  this.actions = actions;
25
20
  this.menuConfig = menuConfig;
26
- const { flip, placement = 'bottom' } = params;
21
+ const { flip, placement = 'bottom', onPopupOpenChange } = params;
27
22
  this.placement = flip ? placement : [placement];
23
+ this.onPopupOpenChange = onPopupOpenChange;
28
24
  }
29
25
  get isTooltipOpen() {
30
26
  return this.#isTooltipOpen;
31
27
  }
32
- show(view, popupProps) {
28
+ show(view) {
33
29
  this.view = view;
34
30
  this.#isTooltipOpen = true;
35
- this.baseProps = {
36
- show: true,
37
- poppupProps: {
38
- ...popupProps,
39
- ...this.calcPosition(view),
40
- },
41
- };
31
+ this.visible = true;
32
+ this.anchor ??= this.createVirtualElement(view);
42
33
  this.renderPopup();
43
34
  }
44
35
  hide(view) {
45
36
  this.view = view;
46
37
  // do not rerender popup if it is already hidden
47
- if (!this.#isTooltipOpen && !this.baseProps.show)
38
+ if (!this.#isTooltipOpen && !this.visible)
48
39
  return;
49
40
  this.#isTooltipOpen = false;
50
- this.baseProps = { show: false, poppupProps: {} };
41
+ this.visible = false;
42
+ this.anchor = undefined;
51
43
  this.renderPopup();
52
44
  }
53
45
  destroy() {
54
46
  this._tooltipRenderItem?.remove();
55
47
  this._tooltipRenderItem = null;
56
48
  }
57
- getSelectionTooltipProps() {
58
- return {
59
- ...this.baseProps,
60
- qa: 'g-md-toolbar-selection',
61
- focus: () => this.view.focus(),
62
- data: this.getFilteredConfig(),
63
- editor: this.actions,
64
- onClick: (id) => {
65
- globalLogger.action({ mode: 'wysiwyg', source: 'context-menu', action: id });
66
- this.logger.action({ source: 'context-menu', action: id });
67
- },
68
- };
69
- }
70
- getFilteredConfig() {
71
- return this.baseProps.show
72
- ? this.menuConfig
73
- .map((groupData) => groupData.filter((item) => {
74
- const { condition } = item;
75
- if (condition === 'enabled') {
76
- return item.isEnable(this.actions);
77
- }
78
- if (isFunction(condition)) {
79
- return condition(this.view.state);
80
- }
81
- return true;
82
- }))
83
- .filter((groupData) => Boolean(groupData.length))
84
- : [];
85
- }
49
+ handleFocus = () => this.view.focus();
50
+ handleClick = (id) => {
51
+ globalLogger.action({ mode: 'wysiwyg', source: 'context-menu', action: id });
52
+ this.logger.action({ source: 'context-menu', action: id });
53
+ };
86
54
  renderPopup() {
87
55
  this.tooltipRenderItem.rerender();
88
56
  }
89
57
  get tooltipRenderItem() {
90
58
  if (!this._tooltipRenderItem) {
91
59
  const reactRenderer = getReactRendererFromState(this.view.state);
92
- this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (_jsx(ErrorLoggerBoundary, { children: _jsx(SelectionTooltip, { ...this.getSelectionTooltipProps() }) })));
60
+ this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => {
61
+ if (!this.visible)
62
+ return null;
63
+ return (_jsx(ErrorLoggerBoundary, { children: _jsx(TextSelectionTooltip, { config: this.menuConfig, editor: this.actions, editorView: this.view, focus: this.handleFocus, onClick: this.handleClick, popupPlacement: this.placement, popupAnchor: this.anchor, popupOnOpenChange: this.onPopupOpenChange }) }));
64
+ });
93
65
  }
94
66
  return this._tooltipRenderItem;
95
67
  }
96
- calcPosition(view) {
97
- const virtualElem = {
68
+ createVirtualElement(view) {
69
+ return {
98
70
  getBoundingClientRect() {
99
71
  // These are in screen coordinates
100
72
  const start = view.coordsAtPos(view.state.selection.from);
@@ -118,10 +90,6 @@ export class TooltipView {
118
90
  };
119
91
  },
120
92
  };
121
- return {
122
- placement: this.placement,
123
- anchorElement: virtualElem,
124
- };
125
93
  }
126
94
  }
127
95
  //# sourceMappingURL=tooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n\n // do not rerender popup if it is already hidden\n if (!this.#isTooltipOpen && !this.baseProps.show) return;\n\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport type {PopupPlacement, PopupProps} from '@gravity-ui/uikit';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {TextSelectionTooltip} from './TextSelectionTooltip';\nimport type {ContextConfig} from './types';\n\nexport type {ContextGroupItemData, ContextGroupData, ContextConfig} from './types';\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n onPopupOpenChange: PopupProps['onOpenChange'];\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n private readonly onPopupOpenChange: PopupProps['onOpenChange'];\n\n private view!: EditorView;\n private visible = false;\n private anchor: PopupProps['anchorElement'] = undefined;\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom', onPopupOpenChange} = params;\n this.placement = flip ? placement : [placement];\n this.onPopupOpenChange = onPopupOpenChange;\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.visible = true;\n this.anchor ??= this.createVirtualElement(view);\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n\n // do not rerender popup if it is already hidden\n if (!this.#isTooltipOpen && !this.visible) return;\n\n this.#isTooltipOpen = false;\n this.visible = false;\n this.anchor = undefined;\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private readonly handleFocus = () => this.view.focus();\n private readonly handleClick = (id: string) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n };\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => {\n if (!this.visible) return null;\n return (\n <ErrorLoggerBoundary>\n <TextSelectionTooltip\n config={this.menuConfig}\n editor={this.actions}\n editorView={this.view}\n focus={this.handleFocus}\n onClick={this.handleClick}\n popupPlacement={this.placement}\n popupAnchor={this.anchor}\n popupOnOpenChange={this.onPopupOpenChange}\n />\n </ErrorLoggerBoundary>\n );\n });\n }\n return this._tooltipRenderItem;\n }\n\n private createVirtualElement(view: EditorView): VirtualElement {\n return {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ActionStorage } from "../../../core/index.js";
2
+ import type { EditorState } from "../../../pm/state.js";
3
+ import type { ToolbarButtonPopupData, ToolbarGroupItemData, ToolbarSingleItemData } from "../../../toolbar/index.js";
4
+ export type ContextGroupItemData = (ToolbarGroupItemData<ActionStorage> & {
5
+ condition?: (state: EditorState) => void;
6
+ }) | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {
7
+ condition?: 'enabled';
8
+ });
9
+ export type ContextGroupData = ContextGroupItemData[];
10
+ export type ContextConfig = ContextGroupData[];
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {ActionStorage} from '#core';\nimport type {EditorState} from '#pm/state';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarSingleItemData,\n} from 'src/toolbar';\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n"]}
@@ -90,41 +90,31 @@ export const CodeBlockSpecs = (builder, opts) => {
90
90
  state.closeBlock(node);
91
91
  },
92
92
  }));
93
- builder.addNode('fence', () => ({
94
- // we adding this node only for define specific 'fence' parser token,
95
- // which parse fence md token to code_block node
96
- spec: {},
97
- fromMd: {
98
- tokenSpec: {
99
- name: codeBlockNodeName,
100
- type: 'block',
101
- noCloseToken: true,
102
- getAttrs: (tok) => {
103
- const attrs = {
104
- [CodeBlockNodeAttr.Markup]: tok.markup,
105
- [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),
106
- };
107
- if (tok.info) {
108
- // like in markdown-it
109
- // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37
110
- const parts = tok.info.split(/\s+/);
111
- const isFirstPartForLineNumbers = opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';
112
- attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];
113
- }
114
- if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {
115
- attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';
116
- }
117
- else {
118
- attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';
119
- }
120
- return attrs;
121
- },
122
- prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \n at the end
123
- },
124
- },
125
- toMd: () => {
126
- throw new Error('Unexpected toMd() call on fence node');
93
+ builder.addMarkdownTokenParserSpec('fence', () => ({
94
+ name: codeBlockNodeName,
95
+ type: 'block',
96
+ noCloseToken: true,
97
+ getAttrs: (tok) => {
98
+ const attrs = {
99
+ [CodeBlockNodeAttr.Markup]: tok.markup,
100
+ [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),
101
+ };
102
+ if (tok.info) {
103
+ // like in markdown-it
104
+ // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37
105
+ const parts = tok.info.split(/\s+/);
106
+ const isFirstPartForLineNumbers = opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';
107
+ attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];
108
+ }
109
+ if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {
110
+ attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';
111
+ }
112
+ else {
113
+ attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';
114
+ }
115
+ return attrs;
127
116
  },
117
+ prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \n at the end
128
118
  }));
129
119
  builder.addKeymap(() => ({
130
120
  Tab: (state, dispatch) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,eAAe,EAAE,wBAAwB;CACnC,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;AAuBhE,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,EAAE;IACpC,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAE7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAEjD,IACI,iBAAiB;YACjB,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM;YACnD,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC9C,CAAC;YACC,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5E,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,QAAQ;QACnB,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACvC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,KAAK,EAAC;gBAC5C,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBACzC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO;oBACzB,CAAC,CAAC;wBACI,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE;4BACjC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;yBACxD;qBACJ;oBACH,CAAC,CAAC,EAAE,CAAC;aACZ;YACD,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,KAAK;YACrB,QAAQ,EAAE;gBACN;oBACI,GAAG,EAAE,KAAK;oBACV,kBAAkB,EAAE,MAAM;oBAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;wBACf,OAAO;4BACH,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,IAAe,CAAC;yBAC3D,CAAC;oBACN,CAAC;iBACJ;aACJ;YACD,KAAK,CAAC,EAAC,KAAK,EAAC;gBACT,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;SACJ;QACD,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBACd,OAAO;wBACH,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;wBAClD,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;4BACrE,CAAC,CAAC,MAAM;4BACR,CAAC,CAAC,EAAE;qBACX,CAAC;gBACN,CAAC;gBACD,cAAc,EAAE,kBAAkB,EAAE,sDAAsD;aAC7F;SACJ;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,MAAM,IAAI,GAAW,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,eAAe,GAAW,IAAI,CAAC,WAAW,EAAE,OAAO;gBACrD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC;gBAC/C,CAAC,CAAC,EAAE,CAAC;YAET,IAAI,IAAI,GAAG,IAAI,CAAC;YAEhB,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;gBAC7B,IAAI,IAAI,kBAAkB,CAAC;YAC/B,CAAC;YAED,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACpC,oEAAoE;YACpE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5B,sEAAsE;QACtE,iDAAiD;QACjD,IAAI,EAAE,EAAE;QACR,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBACd,MAAM,KAAK,GAAkC;wBACzC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM;wBACtC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;qBACrD,CAAC;oBACF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;wBACX,sBAAsB;wBACtB,oHAAoH;wBACpH,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAEpC,MAAM,yBAAyB,GAC3B,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC;wBAEhE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9E,CAAC;oBACD,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBACrE,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;oBACtD,CAAC;yBAAM,CAAC;wBACJ,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;oBAClD,CAAC;oBAED,OAAO,KAAK,CAAC;gBACjB,CAAC;gBACD,cAAc,EAAE,kBAAkB,EAAE,uDAAuD;aAC9F;SACJ;QACD,IAAI,EAAE,GAAG,EAAE;YACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;KACJ,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACrB,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACrB,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,GAAG,KAAK,CAAC,SAAS,CAAC;YACzC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC9E,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;gBACpF,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC;KACJ,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,SAAS,kBAAkB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACnF,CAAC","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n /** Configure line numbers in code block */\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n /** Configure line numbers in code block */\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addMarkdownTokenParserSpec('fence', () => ({\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const headingNodeName = "heading";
2
+ export declare const headingLevelAttr = "level";
3
+ export declare const headingLineNumberAttr = "data-line";
4
+ export declare const headingType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
@@ -0,0 +1,6 @@
1
+ import { nodeTypeFactory } from "../../../../utils/schema.js";
2
+ export const headingNodeName = 'heading';
3
+ export const headingLevelAttr = 'level';
4
+ export const headingLineNumberAttr = 'data-line';
5
+ export const headingType = nodeTypeFactory(headingNodeName);
6
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Heading/HeadingSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAC;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC","sourcesContent":["import {nodeTypeFactory} from 'src/utils/schema';\n\nexport const headingNodeName = 'heading';\nexport const headingLevelAttr = 'level';\nexport const headingLineNumberAttr = 'data-line';\nexport const headingType = nodeTypeFactory(headingNodeName);\n"]}
@@ -1,9 +1,7 @@
1
- import type { NodeSpec } from 'prosemirror-model';
2
1
  import type { ExtensionAuto } from "../../../../core/index.js";
3
- export declare const headingNodeName = "heading";
4
- export declare const headingLevelAttr = "level";
5
- export declare const headingLineNumberAttr = "data-line";
6
- export declare const headingType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
2
+ import type { NodeSpec } from "../../../../pm/model.js";
3
+ export * from "./const.js";
4
+ export { headingToMarkdown } from "./utils.js";
7
5
  export type HeadingSpecsOptions = {
8
6
  /**
9
7
  * @deprecated use placeholder option in BehaviorPreset instead.
@@ -1,8 +1,7 @@
1
- import { nodeTypeFactory } from "../../../../utils/schema.js";
2
- export const headingNodeName = 'heading';
3
- export const headingLevelAttr = 'level';
4
- export const headingLineNumberAttr = 'data-line';
5
- export const headingType = nodeTypeFactory(headingNodeName);
1
+ import { headingLevelAttr, headingLineNumberAttr, headingNodeName } from "./const.js";
2
+ import { headingToMarkdown } from "./utils.js";
3
+ export * from "./const.js";
4
+ export { headingToMarkdown } from "./utils.js";
6
5
  const DEFAULT_PLACEHOLDER = (node) => 'Heading ' + node.attrs[headingLevelAttr];
7
6
  export const HeadingSpecs = (builder, opts) => {
8
7
  builder.addNode(headingNodeName, () => ({
@@ -41,11 +40,7 @@ export const HeadingSpecs = (builder, opts) => {
41
40
  getAttrs: (tok) => ({ [headingLevelAttr]: Number(tok.tag.slice(1)) }),
42
41
  },
43
42
  },
44
- toMd: (state, node) => {
45
- state.write(state.repeat('#', node.attrs[headingLevelAttr]) + ' ');
46
- state.renderInline(node);
47
- state.closeBlock(node);
48
- },
43
+ toMd: headingToMarkdown(),
49
44
  }));
50
45
  };
51
46
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Heading/HeadingSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node, NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport const headingNodeName = 'heading';\nexport const headingLevelAttr = 'level';\nexport const headingLineNumberAttr = 'data-line';\nexport const headingType = nodeTypeFactory(headingNodeName);\n\nconst DEFAULT_PLACEHOLDER = (node: Node) => 'Heading ' + node.attrs[headingLevelAttr];\n\nexport type HeadingSpecsOptions = {\n /**\n * @deprecated use placeholder option in BehaviorPreset instead.\n */\n headingPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nexport const HeadingSpecs: ExtensionAuto<HeadingSpecsOptions> = (builder, opts) => {\n builder.addNode(headingNodeName, () => ({\n spec: {\n attrs: {[headingLevelAttr]: {default: 1}, [headingLineNumberAttr]: {default: null}},\n content: '(text | inline)*',\n group: 'block',\n defining: true,\n parseDOM: [\n {tag: 'h1', attrs: {[headingLevelAttr]: 1}},\n {tag: 'h2', attrs: {[headingLevelAttr]: 2}},\n {tag: 'h3', attrs: {[headingLevelAttr]: 3}},\n {tag: 'h4', attrs: {[headingLevelAttr]: 4}},\n {tag: 'h5', attrs: {[headingLevelAttr]: 5}},\n {tag: 'h6', attrs: {[headingLevelAttr]: 6}},\n ],\n toDOM(node) {\n const lineNumber = node.attrs[headingLineNumberAttr];\n\n return [\n 'h' + node.attrs[headingLevelAttr],\n lineNumber === null ? {} : {[headingLineNumberAttr]: lineNumber},\n 0,\n ];\n },\n placeholder: {\n content:\n builder.context.get('placeholder')?.heading ??\n opts.headingPlaceholder ??\n DEFAULT_PLACEHOLDER,\n alwaysVisible: true,\n },\n },\n fromMd: {\n tokenSpec: {\n name: headingNodeName,\n type: 'block',\n getAttrs: (tok) => ({[headingLevelAttr]: Number(tok.tag.slice(1))}),\n },\n },\n toMd: (state, node) => {\n state.write(state.repeat('#', node.attrs[headingLevelAttr]) + ' ');\n state.renderInline(node);\n state.closeBlock(node);\n },\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Heading/HeadingSpecs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,eAAe,EAAC,mBAAgB;AACjF,OAAO,EAAC,iBAAiB,EAAC,mBAAgB;AAE1C,2BAAwB;AACxB,OAAO,EAAC,iBAAiB,EAAC,mBAAgB;AAE1C,MAAM,mBAAmB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAStF,MAAM,CAAC,MAAM,YAAY,GAAuC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9E,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE;YACF,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,EAAC,OAAO,EAAE,CAAC,EAAC,EAAE,CAAC,qBAAqB,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,EAAC;YACnF,OAAO,EAAE,kBAAkB;YAC3B,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE;gBACN,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;gBAC3C,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;gBAC3C,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;gBAC3C,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;gBAC3C,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;gBAC3C,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAC,EAAC;aAC9C;YACD,KAAK,CAAC,IAAI;gBACN,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAErD,OAAO;oBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;oBAClC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAC;oBAChE,CAAC;iBACJ,CAAC;YACN,CAAC;YACD,WAAW,EAAE;gBACT,OAAO,EACH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,OAAO;oBAC3C,IAAI,CAAC,kBAAkB;oBACvB,mBAAmB;gBACvB,aAAa,EAAE,IAAI;aACtB;SACJ;QACD,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC;aACtE;SACJ;QACD,IAAI,EAAE,iBAAiB,EAAE;KAC5B,CAAC,CAAC,CAAC;AACR,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '#core';\nimport type {Node, NodeSpec} from '#pm/model';\n\nimport {headingLevelAttr, headingLineNumberAttr, headingNodeName} from './const';\nimport {headingToMarkdown} from './utils';\n\nexport * from './const';\nexport {headingToMarkdown} from './utils';\n\nconst DEFAULT_PLACEHOLDER = (node: Node) => 'Heading ' + node.attrs[headingLevelAttr];\n\nexport type HeadingSpecsOptions = {\n /**\n * @deprecated use placeholder option in BehaviorPreset instead.\n */\n headingPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nexport const HeadingSpecs: ExtensionAuto<HeadingSpecsOptions> = (builder, opts) => {\n builder.addNode(headingNodeName, () => ({\n spec: {\n attrs: {[headingLevelAttr]: {default: 1}, [headingLineNumberAttr]: {default: null}},\n content: '(text | inline)*',\n group: 'block',\n defining: true,\n parseDOM: [\n {tag: 'h1', attrs: {[headingLevelAttr]: 1}},\n {tag: 'h2', attrs: {[headingLevelAttr]: 2}},\n {tag: 'h3', attrs: {[headingLevelAttr]: 3}},\n {tag: 'h4', attrs: {[headingLevelAttr]: 4}},\n {tag: 'h5', attrs: {[headingLevelAttr]: 5}},\n {tag: 'h6', attrs: {[headingLevelAttr]: 6}},\n ],\n toDOM(node) {\n const lineNumber = node.attrs[headingLineNumberAttr];\n\n return [\n 'h' + node.attrs[headingLevelAttr],\n lineNumber === null ? {} : {[headingLineNumberAttr]: lineNumber},\n 0,\n ];\n },\n placeholder: {\n content:\n builder.context.get('placeholder')?.heading ??\n opts.headingPlaceholder ??\n DEFAULT_PLACEHOLDER,\n alwaysVisible: true,\n },\n },\n fromMd: {\n tokenSpec: {\n name: headingNodeName,\n type: 'block',\n getAttrs: (tok) => ({[headingLevelAttr]: Number(tok.tag.slice(1))}),\n },\n },\n toMd: headingToMarkdown(),\n }));\n};\n"]}
@@ -0,0 +1,7 @@
1
+ import type { SerializerNodeToken } from "../../../../core/index.js";
2
+ type HeadingToMarkdownParams = {
3
+ renderMarkup?: SerializerNodeToken;
4
+ renderAttributes?: SerializerNodeToken;
5
+ };
6
+ export declare function headingToMarkdown({ renderMarkup, renderAttributes, }?: HeadingToMarkdownParams): SerializerNodeToken;
7
+ export {};
@@ -0,0 +1,12 @@
1
+ import { headingLevelAttr } from "./const.js";
2
+ const defaultMarkupRender = (state, node) => state.write(state.repeat('#', node.attrs[headingLevelAttr]) + ' ');
3
+ export function headingToMarkdown({ renderMarkup = defaultMarkupRender, renderAttributes, } = {}) {
4
+ return (...args) => {
5
+ const [state, node] = args;
6
+ renderMarkup(...args);
7
+ state.renderInline(node);
8
+ renderAttributes?.(...args);
9
+ state.closeBlock(node);
10
+ };
11
+ }
12
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Heading/HeadingSpecs/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,mBAAgB;AAOzC,MAAM,mBAAmB,GAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAC7D,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAAC,EAC9B,YAAY,GAAG,mBAAmB,EAClC,gBAAgB,MACS,EAAE;IAC3B,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3B,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QACtB,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,gBAAgB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type {SerializerNodeToken} from '#core';\n\nimport {headingLevelAttr} from './const';\n\ntype HeadingToMarkdownParams = {\n renderMarkup?: SerializerNodeToken;\n renderAttributes?: SerializerNodeToken;\n};\n\nconst defaultMarkupRender: SerializerNodeToken = (state, node) =>\n state.write(state.repeat('#', node.attrs[headingLevelAttr]) + ' ');\n\nexport function headingToMarkdown({\n renderMarkup = defaultMarkupRender,\n renderAttributes,\n}: HeadingToMarkdownParams = {}): SerializerNodeToken {\n return (...args) => {\n const [state, node] = args;\n renderMarkup(...args);\n state.renderInline(node);\n renderAttributes?.(...args);\n state.closeBlock(node);\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { NodeType } from 'prosemirror-model';
2
2
  import type { ActionSpec } from "../../../core/index.js";
3
- import { type HeadingLevel } from "./const.js";
4
- export declare const headingAction: (nodeType: NodeType, level: HeadingLevel) => ActionSpec;
3
+ import type { HeadingLevel } from "./const.js";
4
+ export declare const headingAction: (_nodeType: NodeType, level: HeadingLevel) => ActionSpec;
@@ -1,8 +1,7 @@
1
- import { setBlockType } from 'prosemirror-commands';
2
- import { headingLevelAttr } from "./const.js";
1
+ import { toHeading } from "./commands.js";
3
2
  import { hasParentHeading } from "./utils.js";
4
- export const headingAction = (nodeType, level) => {
5
- const cmd = setBlockType(nodeType, { [headingLevelAttr]: level });
3
+ export const headingAction = (_nodeType, level) => {
4
+ const cmd = toHeading(level);
6
5
  return {
7
6
  isActive: hasParentHeading(level),
8
7
  isEnable: cmd,
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAKlD,OAAO,EAAoB,gBAAgB,EAAC,mBAAgB;AAC5D,OAAO,EAAC,gBAAgB,EAAC,mBAAgB;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAkB,EAAE,KAAmB,EAAc,EAAE;IACjF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAC,CAAC,CAAC;IAChE,OAAO;QACH,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,GAAG;QACb,GAAG,EAAE,GAAG;KACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {setBlockType} from 'prosemirror-commands';\nimport type {NodeType} from 'prosemirror-model';\n\nimport type {ActionSpec} from '../../../core';\n\nimport {type HeadingLevel, headingLevelAttr} from './const';\nimport {hasParentHeading} from './utils';\n\nexport const headingAction = (nodeType: NodeType, level: HeadingLevel): ActionSpec => {\n const cmd = setBlockType(nodeType, {[headingLevelAttr]: level});\n return {\n isActive: hasParentHeading(level),\n isEnable: cmd,\n run: cmd,\n };\n};\n"]}
1
+ {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/actions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAC,sBAAmB;AAErC,OAAO,EAAC,gBAAgB,EAAC,mBAAgB;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAmB,EAAE,KAAmB,EAAc,EAAE;IAClF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO;QACH,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,GAAG;QACb,GAAG,EAAE,GAAG;KACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {NodeType} from 'prosemirror-model';\n\nimport type {ActionSpec} from '../../../core';\n\nimport {toHeading} from './commands';\nimport type {HeadingLevel} from './const';\nimport {hasParentHeading} from './utils';\n\nexport const headingAction = (_nodeType: NodeType, level: HeadingLevel): ActionSpec => {\n const cmd = toHeading(level);\n return {\n isActive: hasParentHeading(level),\n isEnable: cmd,\n run: cmd,\n };\n};\n"]}
@@ -1,2 +1,4 @@
1
- import type { Command } from 'prosemirror-state';
1
+ import type { Command } from "../../../pm/state.js";
2
+ import type { HeadingLevel } from "./const.js";
2
3
  export declare const resetHeading: Command;
4
+ export declare const toHeading: (level: HeadingLevel) => Command;
@@ -1,5 +1,7 @@
1
+ import { setBlockType } from "../../../pm/commands.js";
2
+ import { findParentNodeOfType } from "../../../pm/utils.js";
1
3
  import { toParagraph } from "../../base/BaseSchema/index.js";
2
- import { headingType } from "./HeadingSpecs/index.js";
4
+ import { headingLevelAttr, headingType } from "./HeadingSpecs/index.js";
3
5
  export const resetHeading = (state, dispatch, view) => {
4
6
  const { selection } = state;
5
7
  if (selection.empty &&
@@ -9,4 +11,16 @@ export const resetHeading = (state, dispatch, view) => {
9
11
  }
10
12
  return false;
11
13
  };
14
+ export const toHeading = (level) => (state, dispatch, view) => {
15
+ const attrs = {};
16
+ const parentHeading = findParentNodeOfType(headingType(state.schema))(state.selection);
17
+ if (parentHeading) {
18
+ if (parentHeading.node.attrs[headingLevelAttr] === level) {
19
+ return toParagraph(state, dispatch, view);
20
+ }
21
+ Object.assign(attrs, parentHeading.node.attrs);
22
+ }
23
+ attrs[headingLevelAttr] = level;
24
+ return setBlockType(headingType(state.schema), attrs)(state, dispatch);
25
+ };
12
26
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,uCAA8B;AAClD,OAAO,EAAC,WAAW,EAAC,gCAAgC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,EAAC,SAAS,EAAC,GAAG,KAAK,CAAC;IAC1B,IACI,SAAS,CAAC,KAAK;QACf,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QACzD,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,EACzC,CAAC;QACC,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import type {Command} from 'prosemirror-state';\n\nimport {toParagraph} from '../../base/BaseSchema';\nimport {headingType} from '../Heading/HeadingSpecs';\n\nexport const resetHeading: Command = (state, dispatch, view) => {\n const {selection} = state;\n if (\n selection.empty &&\n selection.$from.parent.type === headingType(state.schema) &&\n view?.endOfTextblock('backward', state)\n ) {\n return toParagraph(state, dispatch, view);\n }\n return false;\n};\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,gCAAqB;AAE1C,OAAO,EAAC,oBAAoB,EAAC,6BAAkB;AAE/C,OAAO,EAAC,WAAW,EAAC,uCAA8B;AAClD,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,gCAAgC;AAItE,MAAM,CAAC,MAAM,YAAY,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,EAAC,SAAS,EAAC,GAAG,KAAK,CAAC;IAC1B,IACI,SAAS,CAAC,KAAK;QACf,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QACzD,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,EACzC,CAAC;QACC,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAClB,CAAC,KAAmB,EAAW,EAAE,CACjC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,MAAM,aAAa,GAAG,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,aAAa,EAAE,CAAC;QAChB,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC;YACvD,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IAEhC,OAAO,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC,CAAC","sourcesContent":["import {setBlockType} from '#pm/commands';\nimport type {Command} from '#pm/state';\nimport {findParentNodeOfType} from '#pm/utils';\n\nimport {toParagraph} from '../../base/BaseSchema';\nimport {headingLevelAttr, headingType} from '../Heading/HeadingSpecs';\n\nimport type {HeadingLevel} from './const';\n\nexport const resetHeading: Command = (state, dispatch, view) => {\n const {selection} = state;\n if (\n selection.empty &&\n selection.$from.parent.type === headingType(state.schema) &&\n view?.endOfTextblock('backward', state)\n ) {\n return toParagraph(state, dispatch, view);\n }\n return false;\n};\n\nexport const toHeading =\n (level: HeadingLevel): Command =>\n (state, dispatch, view) => {\n const attrs: Record<string, any> = {};\n\n const parentHeading = findParentNodeOfType(headingType(state.schema))(state.selection);\n if (parentHeading) {\n if (parentHeading.node.attrs[headingLevelAttr] === level) {\n return toParagraph(state, dispatch, view);\n }\n\n Object.assign(attrs, parentHeading.node.attrs);\n }\n\n attrs[headingLevelAttr] = level;\n\n return setBlockType(headingType(state.schema), attrs)(state, dispatch);\n };\n"]}
@@ -1,31 +1,29 @@
1
- import { setBlockType } from 'prosemirror-commands';
2
1
  import { withLogAction } from "../../../utils/keymap.js";
3
2
  import { HeadingSpecs, headingType } from "./HeadingSpecs/index.js";
4
3
  import { headingAction } from "./actions.js";
5
- import { resetHeading } from "./commands.js";
6
- import { HeadingAction, headingLevelAttr } from "./const.js";
4
+ import { resetHeading, toHeading } from "./commands.js";
5
+ import { HeadingAction } from "./const.js";
7
6
  import { headingRule } from "./utils.js";
8
7
  export { headingNodeName, headingType } from "./HeadingSpecs/index.js";
9
8
  export { HeadingAction } from "./const.js";
10
9
  export const Heading = (builder, opts) => {
11
10
  builder.use(HeadingSpecs, opts);
12
11
  builder
13
- .addKeymap(({ schema }) => {
12
+ .addKeymap(() => {
14
13
  const { h1Key, h2Key, h3Key, h4Key, h5Key, h6Key } = opts ?? {};
15
- const cmd4lvl = (level) => setBlockType(headingType(schema), { [headingLevelAttr]: level });
16
14
  const bindings = { Backspace: resetHeading };
17
15
  if (h1Key)
18
- bindings[h1Key] = withLogAction('heading1', cmd4lvl(1));
16
+ bindings[h1Key] = withLogAction('heading1', toHeading(1));
19
17
  if (h2Key)
20
- bindings[h2Key] = withLogAction('heading2', cmd4lvl(2));
18
+ bindings[h2Key] = withLogAction('heading2', toHeading(2));
21
19
  if (h3Key)
22
- bindings[h3Key] = withLogAction('heading3', cmd4lvl(3));
20
+ bindings[h3Key] = withLogAction('heading3', toHeading(3));
23
21
  if (h4Key)
24
- bindings[h4Key] = withLogAction('heading4', cmd4lvl(4));
22
+ bindings[h4Key] = withLogAction('heading4', toHeading(4));
25
23
  if (h5Key)
26
- bindings[h5Key] = withLogAction('heading5', cmd4lvl(5));
24
+ bindings[h5Key] = withLogAction('heading5', toHeading(5));
27
25
  if (h6Key)
28
- bindings[h6Key] = withLogAction('heading6', cmd4lvl(6));
26
+ bindings[h6Key] = withLogAction('heading6', toHeading(6));
29
27
  return bindings;
30
28
  })
31
29
  .addInputRules(({ schema }) => ({ rules: [headingRule(headingType(schema), 6)] }));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {setBlockType} from 'prosemirror-commands';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {HeadingSpecs, type HeadingSpecsOptions, headingType} from './HeadingSpecs';\nimport {headingAction} from './actions';\nimport {resetHeading} from './commands';\nimport {HeadingAction, type HeadingLevel, headingLevelAttr} from './const';\nimport {headingRule} from './utils';\n\nexport {headingNodeName, headingType} from './HeadingSpecs';\nexport {HeadingAction} from './const';\n\nexport type HeadingOptions = HeadingSpecsOptions & {\n h1Key?: string | null;\n h2Key?: string | null;\n h3Key?: string | null;\n h4Key?: string | null;\n h5Key?: string | null;\n h6Key?: string | null;\n};\n\nexport const Heading: ExtensionAuto<HeadingOptions> = (builder, opts) => {\n builder.use(HeadingSpecs, opts);\n\n builder\n .addKeymap(({schema}) => {\n const {h1Key, h2Key, h3Key, h4Key, h5Key, h6Key} = opts ?? {};\n const cmd4lvl = (level: HeadingLevel) =>\n setBlockType(headingType(schema), {[headingLevelAttr]: level});\n\n const bindings: Keymap = {Backspace: resetHeading};\n if (h1Key) bindings[h1Key] = withLogAction('heading1', cmd4lvl(1));\n if (h2Key) bindings[h2Key] = withLogAction('heading2', cmd4lvl(2));\n if (h3Key) bindings[h3Key] = withLogAction('heading3', cmd4lvl(3));\n if (h4Key) bindings[h4Key] = withLogAction('heading4', cmd4lvl(4));\n if (h5Key) bindings[h5Key] = withLogAction('heading5', cmd4lvl(5));\n if (h6Key) bindings[h6Key] = withLogAction('heading6', cmd4lvl(6));\n return bindings;\n })\n .addInputRules(({schema}) => ({rules: [headingRule(headingType(schema), 6)]}));\n\n builder\n .addAction(HeadingAction.ToH1, ({schema}) => headingAction(headingType(schema), 1))\n .addAction(HeadingAction.ToH2, ({schema}) => headingAction(headingType(schema), 2))\n .addAction(HeadingAction.ToH3, ({schema}) => headingAction(headingType(schema), 3))\n .addAction(HeadingAction.ToH4, ({schema}) => headingAction(headingType(schema), 4))\n .addAction(HeadingAction.ToH5, ({schema}) => headingAction(headingType(schema), 5))\n .addAction(HeadingAction.ToH6, ({schema}) => headingAction(headingType(schema), 6));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [HeadingAction.ToH1]: Action;\n [HeadingAction.ToH2]: Action;\n [HeadingAction.ToH3]: Action;\n [HeadingAction.ToH4]: Action;\n [HeadingAction.ToH5]: Action;\n [HeadingAction.ToH6]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Heading/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {HeadingSpecs, type HeadingSpecsOptions, headingType} from './HeadingSpecs';\nimport {headingAction} from './actions';\nimport {resetHeading, toHeading} from './commands';\nimport {HeadingAction} from './const';\nimport {headingRule} from './utils';\n\nexport {headingNodeName, headingType} from './HeadingSpecs';\nexport {HeadingAction} from './const';\n\nexport type HeadingOptions = HeadingSpecsOptions & {\n h1Key?: string | null;\n h2Key?: string | null;\n h3Key?: string | null;\n h4Key?: string | null;\n h5Key?: string | null;\n h6Key?: string | null;\n};\n\nexport const Heading: ExtensionAuto<HeadingOptions> = (builder, opts) => {\n builder.use(HeadingSpecs, opts);\n\n builder\n .addKeymap(() => {\n const {h1Key, h2Key, h3Key, h4Key, h5Key, h6Key} = opts ?? {};\n\n const bindings: Keymap = {Backspace: resetHeading};\n if (h1Key) bindings[h1Key] = withLogAction('heading1', toHeading(1));\n if (h2Key) bindings[h2Key] = withLogAction('heading2', toHeading(2));\n if (h3Key) bindings[h3Key] = withLogAction('heading3', toHeading(3));\n if (h4Key) bindings[h4Key] = withLogAction('heading4', toHeading(4));\n if (h5Key) bindings[h5Key] = withLogAction('heading5', toHeading(5));\n if (h6Key) bindings[h6Key] = withLogAction('heading6', toHeading(6));\n return bindings;\n })\n .addInputRules(({schema}) => ({rules: [headingRule(headingType(schema), 6)]}));\n\n builder\n .addAction(HeadingAction.ToH1, ({schema}) => headingAction(headingType(schema), 1))\n .addAction(HeadingAction.ToH2, ({schema}) => headingAction(headingType(schema), 2))\n .addAction(HeadingAction.ToH3, ({schema}) => headingAction(headingType(schema), 3))\n .addAction(HeadingAction.ToH4, ({schema}) => headingAction(headingType(schema), 4))\n .addAction(HeadingAction.ToH5, ({schema}) => headingAction(headingType(schema), 5))\n .addAction(HeadingAction.ToH6, ({schema}) => headingAction(headingType(schema), 6));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [HeadingAction.ToH1]: Action;\n [HeadingAction.ToH2]: Action;\n [HeadingAction.ToH3]: Action;\n [HeadingAction.ToH4]: Action;\n [HeadingAction.ToH5]: Action;\n [HeadingAction.ToH6]: Action;\n }\n }\n}\n"]}
@@ -31,6 +31,7 @@ export const Lists = (builder, opts) => {
31
31
  Backspace: joinPrevList,
32
32
  }), builder.Priority.Low);
33
33
  builder.use(ListsInputRulesExtension, { bulletListInputRule: opts?.ulInputRules });
34
+ // Order matters: merge must run before collapse (see CollapseListsPlugin.ts)
34
35
  builder.addPlugin(mergeListsPlugin);
35
36
  builder.addPlugin(collapseListsPlugin);
36
37
  builder