@openleaf-editor/core 0.1.0-beta.2 → 0.1.0-beta.4

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 (104) hide show
  1. package/README.md +127 -0
  2. package/dist/autolink.d.ts +7 -4
  3. package/dist/autolink.d.ts.map +1 -1
  4. package/dist/autolink.js +90 -11
  5. package/dist/autolink.js.map +1 -1
  6. package/dist/command-helpers.d.ts +8 -0
  7. package/dist/command-helpers.d.ts.map +1 -0
  8. package/dist/command-helpers.js +36 -0
  9. package/dist/command-helpers.js.map +1 -0
  10. package/dist/commands.d.ts +21 -63
  11. package/dist/commands.d.ts.map +1 -1
  12. package/dist/commands.js +430 -346
  13. package/dist/commands.js.map +1 -1
  14. package/dist/css.d.ts +1 -175
  15. package/dist/css.d.ts.map +1 -1
  16. package/dist/css.js +1 -516
  17. package/dist/css.js.map +1 -1
  18. package/dist/disclosure.d.ts +21 -0
  19. package/dist/disclosure.d.ts.map +1 -0
  20. package/dist/disclosure.js +144 -0
  21. package/dist/disclosure.js.map +1 -0
  22. package/dist/elements.d.ts +2 -0
  23. package/dist/elements.d.ts.map +1 -0
  24. package/dist/elements.js +2 -0
  25. package/dist/elements.js.map +1 -0
  26. package/dist/embed.d.ts +1 -51
  27. package/dist/embed.d.ts.map +1 -1
  28. package/dist/embed.js +1 -115
  29. package/dist/embed.js.map +1 -1
  30. package/dist/errors.d.ts +38 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +40 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/extensions.d.ts +46 -5
  35. package/dist/extensions.d.ts.map +1 -1
  36. package/dist/extensions.js +272 -52
  37. package/dist/extensions.js.map +1 -1
  38. package/dist/figure-drag.d.ts +26 -0
  39. package/dist/figure-drag.d.ts.map +1 -0
  40. package/dist/figure-drag.js +75 -0
  41. package/dist/figure-drag.js.map +1 -0
  42. package/dist/formats.d.ts.map +1 -1
  43. package/dist/formats.js +19 -7
  44. package/dist/formats.js.map +1 -1
  45. package/dist/gapcursor.d.ts +14 -0
  46. package/dist/gapcursor.d.ts.map +1 -0
  47. package/dist/gapcursor.js +17 -0
  48. package/dist/gapcursor.js.map +1 -0
  49. package/dist/html.d.ts +32 -2
  50. package/dist/html.d.ts.map +1 -1
  51. package/dist/html.js +185 -31
  52. package/dist/html.js.map +1 -1
  53. package/dist/index.d.ts +23 -6
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +34 -6
  56. package/dist/index.js.map +1 -1
  57. package/dist/insert-commands.d.ts +172 -0
  58. package/dist/insert-commands.d.ts.map +1 -0
  59. package/dist/insert-commands.js +560 -0
  60. package/dist/insert-commands.js.map +1 -0
  61. package/dist/isolating-selection.d.ts +59 -0
  62. package/dist/isolating-selection.d.ts.map +1 -0
  63. package/dist/isolating-selection.js +251 -0
  64. package/dist/isolating-selection.js.map +1 -0
  65. package/dist/noneditable.d.ts.map +1 -1
  66. package/dist/noneditable.js +18 -4
  67. package/dist/noneditable.js.map +1 -1
  68. package/dist/plugins.d.ts +20 -2
  69. package/dist/plugins.d.ts.map +1 -1
  70. package/dist/plugins.js +27 -2
  71. package/dist/plugins.js.map +1 -1
  72. package/dist/preserve.d.ts +48 -17
  73. package/dist/preserve.d.ts.map +1 -1
  74. package/dist/preserve.js +214 -43
  75. package/dist/preserve.js.map +1 -1
  76. package/dist/schema.d.ts +15 -0
  77. package/dist/schema.d.ts.map +1 -1
  78. package/dist/schema.js +157 -28
  79. package/dist/schema.js.map +1 -1
  80. package/dist/structure.d.ts +32 -0
  81. package/dist/structure.d.ts.map +1 -1
  82. package/dist/structure.js +53 -10
  83. package/dist/structure.js.map +1 -1
  84. package/dist/tables.d.ts +47 -1
  85. package/dist/tables.d.ts.map +1 -1
  86. package/dist/tables.js +417 -40
  87. package/dist/tables.js.map +1 -1
  88. package/dist/testing.d.ts +3 -0
  89. package/dist/testing.d.ts.map +1 -0
  90. package/dist/testing.js +3 -0
  91. package/dist/testing.js.map +1 -0
  92. package/dist/tokens.d.ts +8 -0
  93. package/dist/tokens.d.ts.map +1 -1
  94. package/dist/tokens.js +54 -6
  95. package/dist/tokens.js.map +1 -1
  96. package/dist/url.d.ts +1 -25
  97. package/dist/url.d.ts.map +1 -1
  98. package/dist/url.js +1 -77
  99. package/dist/url.js.map +1 -1
  100. package/dist/visual-aids.d.ts +11 -1
  101. package/dist/visual-aids.d.ts.map +1 -1
  102. package/dist/visual-aids.js +124 -36
  103. package/dist/visual-aids.js.map +1 -1
  104. package/package.json +17 -1
package/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # @openleaf-editor/core
2
+
3
+ The schema, commands, HTML input and output, and the content-preservation
4
+ layer. No UI, no framework dependencies.
5
+
6
+ > **Editor output is untrusted input.** Whatever the editor produces — and
7
+ > whatever a user pasted into it — must be sanitized **on your server** before it
8
+ > is stored or rendered as HTML. Client-side sanitization is a user-experience
9
+ > feature, not a security control: anything the editor strips can be put back
10
+ > with developer tools, because the editor runs under the user's control.
11
+ >
12
+ > [`@openleaf-editor/sanitize`](https://github.com/PeytonNowlin/openleaf/tree/main/packages/sanitize) ships the
13
+ > canonical allowlist as data and generates configuration for DOMPurify, Python
14
+ > `bleach` and PHP HTMLPurifier from it, so client and server enforce the same
15
+ > rules. Read [SECURITY.md](https://github.com/PeytonNowlin/openleaf/blob/main/SECURITY.md) before you ship.
16
+
17
+ ## Install
18
+
19
+ ```sh
20
+ npm install @openleaf-editor/core@beta
21
+ ```
22
+
23
+ Keep every `@openleaf-editor/*` package on the same version. They pin each other
24
+ exactly, so mixing versions installs two copies of the schema and the toolbar
25
+ registry -- and a node built by one is not a node type the other accepts.
26
+
27
+ ## What it is for
28
+
29
+ Most integrations never import this directly -- they use
30
+ [`@openleaf-editor/element`](../element), which builds an editor out of it. You
31
+ want `core` when you are embedding ProseMirror yourself, running HTML through the
32
+ schema on a server, or writing a plugin.
33
+
34
+ ```ts
35
+ import { coreSchema, parseHtml, serializeHtml, roundTrip } from '@openleaf-editor/core'
36
+
37
+ roundTrip('<p style="text-align:center">hi</p>')
38
+ // '<p style="text-align:center">hi</p>'
39
+ roundTrip('<p><strong class="brand-name">Acme</strong></p>')
40
+ // '<p><strong class="brand-name">Acme</strong></p>'
41
+ ```
42
+
43
+ ## The preservation layer is the point
44
+
45
+ A schema-based editor has to decide what it understands, and the usual answer for
46
+ everything else is to delete it. `core` keeps unrecognised markup as a
47
+ selectable, movable atom that round-trips byte-for-byte instead.
48
+
49
+ Block-level tags the HTML parser will not keep inside a `<p>` (`div`, `section`,
50
+ and the rest of `CLOSES_OPEN_P`) are stored as block atoms even when they appear
51
+ inside a blockquote or list item. Treating them as inline would wrap them in a
52
+ paragraph the next parse splits, growing two empty paragraphs on every save.
53
+
54
+ That is why the schema is larger than it might look: `<table>`, `<figure>`,
55
+ `<details>`, `<video>`, allowlisted `<iframe>` embeds and the typography marks are
56
+ all modelled here rather than in an opt-in plugin. Not because every deployment
57
+ edits them, but because a node type that is absent is content that becomes an
58
+ atom -- and "we kept your tables and you may not touch them" is not something you
59
+ can tell a CMS with a fifteen-year archive. A `<figcaption>` is only a modelled
60
+ node inside a modelled `<figure>`; outside one it is that same atom, so it is
61
+ never emitted inside a `<p>` the next parse would split.
62
+
63
+ The editing chrome for those things is opt-in. The storage format is not.
64
+
65
+ ## Commands and predicates
66
+
67
+ Commands take ProseMirror's `(state, dispatch, view)` shape. Every one has a
68
+ matching predicate, so a control can show its state without duplicating the
69
+ logic:
70
+
71
+ ```ts
72
+ import { setFontFamily, activeFontFamily } from '@openleaf-editor/core'
73
+
74
+ activeFontFamily(view.state) // 'Georgia' | null
75
+ setFontFamily('Georgia')(view.state, view.dispatch) // boolean
76
+ ```
77
+
78
+ `selectedImage` / `updateImage` (and the matching media pair) are how the
79
+ insert-image control also edits: a `NodeSelection` on the picture or its
80
+ `<figure>` prefills the dialog, and Save uses `setNodeMarkup` so caption,
81
+ class and dimensions survive.
82
+
83
+ A predicate returns `null` for a mixed selection rather than the first value it
84
+ finds -- a dropdown showing "Georgia" for a range that is half Georgia would be
85
+ worse than showing nothing.
86
+
87
+ Block-type commands (`setHeading`, `setParagraph`, `toggleCodeBlock`) refuse a
88
+ textblock whose content the destination cannot hold. A captioned `<figure>` is a
89
+ textblock in the schema (`content: 'inline+'`) but not a paragraph: converting it
90
+ used to produce an `<h2>` holding an image and a `<figcaption>`, and
91
+ `toggleCodeBlock` threw. `canInsert` also stops at an isolating node, so
92
+ inserting an `<hr>` cannot split a figure.
93
+
94
+ ## Isolating selections
95
+
96
+ If you construct a ProseMirror editor yourself, install `gapCursorPlugin()`
97
+ and `isolatingSelectionPlugin()` next to `history()` and the keymap.
98
+
99
+ Without the gap cursor, a document that is only a page-break or a `<details>`
100
+ has no legal caret beside it, and typing replaces the atom. Without the
101
+ isolating clamp, a `TextSelection` that starts in a `<blockquote>` and ends
102
+ inside a following `<details>` throws on the next keystroke (`Cannot join
103
+ details onto blockquote`), and the recovery rewrites the document with no undo
104
+ entry. The isolating plugin also handles `beforeinput` so a keystroke cannot
105
+ skip the clamp when the model caret is still collapsed and only the DOM range
106
+ crosses the boundary. `<openleaf-editor>` already installs both. Details are in
107
+ [authoring-plugins.md §4.11](../../docs/authoring-plugins.md#411-isolating-nodes-clamp-the-selection-at-their-boundary).
108
+
109
+ ## Captioned figures
110
+
111
+ If you construct a ProseMirror editor yourself, install `figureDragPlugin()`
112
+ next to `isolatingSelectionPlugin()`. Dragging the `<img>` inside a captioned
113
+ `<figure>` otherwise moves only the image and leaves the caption behind.
114
+ `<openleaf-editor>` already installs the plugin.
115
+
116
+ ## Safety
117
+
118
+ URL, CSS and embed rules come from
119
+ [`@openleaf-editor/content-policy`](../content-policy), shared with
120
+ [`@openleaf-editor/sanitize`](../sanitize) so the editor and your server cannot
121
+ disagree. `javascript:` URLs, `on*` handlers and unallowlisted iframes are dropped
122
+ on the way in, with tests. Sanitize on the server anyway -- anything a client
123
+ strips can be put back with developer tools.
124
+
125
+ ## License
126
+
127
+ Apache-2.0.
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * Turn a typed URL into a link when the author finishes it.
3
3
  *
4
- * Space and Enter are the commit keys, matching the behaviour authors already
5
- * have in mail clients and office software. The plugin never rewrites a range
6
- * that is already a link, and it refuses anything `isSafeUrl` would drop, so
7
- * typing `javascript:` cannot become a mark the serializer would then emit.
4
+ * Space, Enter, and the end of an IME composition are the commit points,
5
+ * matching the behaviour authors already have in mail clients and office
6
+ * software. The plugin never rewrites a range that is already a link, and it
7
+ * refuses anything `isSafeUrl` would drop, so typing `javascript:` cannot
8
+ * become a mark the serializer would then emit. It also never `addMark`s
9
+ * while `view.composing` is true: rewriting the document under an open IME
10
+ * is how keyboards start duplicating or dropping characters.
8
11
  */
9
12
  import { Plugin } from 'prosemirror-state';
10
13
  export declare function hrefFromTypedUrl(raw: string): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"autolink.d.ts","sourceRoot":"","sources":["../src/autolink.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAiD,MAAM,mBAAmB,CAAA;AAYzF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK3D;AAoCD,wBAAgB,cAAc,IAAI,MAAM,CA0BvC"}
1
+ {"version":3,"file":"autolink.d.ts","sourceRoot":"","sources":["../src/autolink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAiD,MAAM,mBAAmB,CAAA;AA+CzF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK3D;AAuCD,wBAAgB,cAAc,IAAI,MAAM,CA6DvC"}
package/dist/autolink.js CHANGED
@@ -1,22 +1,59 @@
1
1
  /**
2
2
  * Turn a typed URL into a link when the author finishes it.
3
3
  *
4
- * Space and Enter are the commit keys, matching the behaviour authors already
5
- * have in mail clients and office software. The plugin never rewrites a range
6
- * that is already a link, and it refuses anything `isSafeUrl` would drop, so
7
- * typing `javascript:` cannot become a mark the serializer would then emit.
4
+ * Space, Enter, and the end of an IME composition are the commit points,
5
+ * matching the behaviour authors already have in mail clients and office
6
+ * software. The plugin never rewrites a range that is already a link, and it
7
+ * refuses anything `isSafeUrl` would drop, so typing `javascript:` cannot
8
+ * become a mark the serializer would then emit. It also never `addMark`s
9
+ * while `view.composing` is true: rewriting the document under an open IME
10
+ * is how keyboards start duplicating or dropping characters.
8
11
  */
9
12
  import { Plugin, PluginKey } from 'prosemirror-state';
10
13
  import { isSafeUrl } from './url.js';
11
14
  const key = new PluginKey('openleaf-autolink');
12
15
  /**
13
- * A URL at the end of a typed run. `www.` is accepted because people type it;
14
- * the href we store is always an absolute `https://` form, so the serializer
15
- * never emits a scheme-less token a browser would treat as a relative path.
16
+ * A URL at the end of a typed run. Parentheses are in the match so
17
+ * `(www.example.com)` and `Foo_(bar)` can both be considered; the strip below
18
+ * decides which trailing `)` is prose and which is the URL. Angle brackets stay
19
+ * out because they are HTML delimiters, not URL characters we want to mark.
16
20
  */
17
- const TRAILING_URL = /(?:https?:\/\/|www\.)[^\s<>"'()]+$/i;
21
+ const TRAILING_URL = /(?:https?:\/\/|www\.)[^\s<>]+$/i;
22
+ /**
23
+ * Closers that end a URL in a sentence, a citation, or quotes. `)` is handled
24
+ * separately: a trailing one is prose when unmatched, and part of the URL when
25
+ * it balances an earlier `(`.
26
+ */
27
+ const TRAILING_PUNCTUATION = /[.,;:!?\]}'"]/;
28
+ function stripTrailingUrlPunctuation(token) {
29
+ let s = token;
30
+ while (s.length > 0) {
31
+ const last = s.charAt(s.length - 1);
32
+ if (TRAILING_PUNCTUATION.test(last)) {
33
+ s = s.slice(0, -1);
34
+ continue;
35
+ }
36
+ if (last === ')') {
37
+ let opens = 0;
38
+ let closes = 0;
39
+ for (let i = 0; i < s.length; i++) {
40
+ const ch = s.charAt(i);
41
+ if (ch === '(')
42
+ opens++;
43
+ else if (ch === ')')
44
+ closes++;
45
+ }
46
+ if (closes > opens) {
47
+ s = s.slice(0, -1);
48
+ continue;
49
+ }
50
+ }
51
+ break;
52
+ }
53
+ return s;
54
+ }
18
55
  export function hrefFromTypedUrl(raw) {
19
- const trimmed = raw.replace(/[.,;:!?)]+$/, '');
56
+ const trimmed = stripTrailingUrlPunctuation(raw);
20
57
  if (!trimmed)
21
58
  return null;
22
59
  const href = /^www\./i.test(trimmed) ? `https://${trimmed}` : trimmed;
@@ -32,11 +69,15 @@ function trailingUrl(state, end) {
32
69
  const match = TRAILING_URL.exec(trimmed);
33
70
  if (!match)
34
71
  return null;
35
- const href = hrefFromTypedUrl(match[0]);
72
+ const token = match[0];
73
+ const bare = stripTrailingUrlPunctuation(token);
74
+ if (!bare)
75
+ return null;
76
+ const href = hrefFromTypedUrl(bare);
36
77
  if (!href)
37
78
  return null;
38
79
  const from = parentStart + (match.index ?? 0);
39
- const to = parentStart + trimmed.length;
80
+ const to = from + bare.length;
40
81
  if (from >= to)
41
82
  return null;
42
83
  const link = state.schema.marks['link'];
@@ -63,9 +104,31 @@ function maybeAutolink(view, end) {
63
104
  return true;
64
105
  }
65
106
  export function autolinkPlugin() {
107
+ // `appendTransaction` is handed states, not the view, and the composing
108
+ // guard is a property of the view. The `view` prop is the supported way to
109
+ // reach one: PM calls it once per editor this plugin is installed in, and
110
+ // `autolinkPlugin()` mints a fresh plugin per editor, so this holds the view
111
+ // that owns the transactions `appendTransaction` sees.
112
+ let host = null;
66
113
  return new Plugin({
67
114
  key,
115
+ view(editorView) {
116
+ host = editorView;
117
+ return {
118
+ destroy() {
119
+ host = null;
120
+ },
121
+ };
122
+ },
68
123
  appendTransaction(transactions, _oldState, newState) {
124
+ // The same guard the three props carry, and the one this path was
125
+ // missing: a composing IME reaches here through `readDOMChange`, which
126
+ // dispatches a doc-changing transaction per composition update. A
127
+ // composition buffer that happens to hold a space after a URL would
128
+ // otherwise get an `addMark` under the open IME -- the exact rewrite the
129
+ // header comment says never happens.
130
+ if (host?.composing)
131
+ return null;
69
132
  if (!transactions.some((tr) => tr.docChanged))
70
133
  return null;
71
134
  if (transactions.some((tr) => tr.getMeta(key)))
@@ -80,13 +143,29 @@ export function autolinkPlugin() {
80
143
  return tr ? tr.setMeta(key, true) : null;
81
144
  },
82
145
  props: {
146
+ handleDOMEvents: {
147
+ compositionend(view) {
148
+ // This prop runs *before* PM's compositionend (which sets composing=false,
149
+ // then flushes pending records on a microtask). Never return true.
150
+ setTimeout(() => {
151
+ if (view.isDestroyed || view.composing)
152
+ return;
153
+ maybeAutolink(view, view.state.selection.from);
154
+ }, 0);
155
+ return false;
156
+ },
157
+ },
83
158
  handleTextInput(view, from, _to, text) {
159
+ if (view.composing)
160
+ return false;
84
161
  if (text !== ' ' && text !== '\u00a0')
85
162
  return false;
86
163
  maybeAutolink(view, from);
87
164
  return false;
88
165
  },
89
166
  handleKeyDown(view, event) {
167
+ if (view.composing)
168
+ return false;
90
169
  if (event.key !== 'Enter' || event.shiftKey)
91
170
  return false;
92
171
  maybeAutolink(view, view.state.selection.from);
@@ -1 +1 @@
1
- {"version":3,"file":"autolink.js","sourceRoot":"","sources":["../src/autolink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autolink.js","sourceRoot":"","sources":["../src/autolink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MarkType, NodeType } from 'prosemirror-model';
2
+ import type { Command, EditorState } from 'prosemirror-state';
3
+ export declare function markIn(state: EditorState, name: string): MarkType | undefined;
4
+ export declare function nodeIn(state: EditorState, name: string): NodeType | undefined;
5
+ export declare function markCommand(name: string, build: (type: MarkType) => Command): Command;
6
+ export declare function nodeCommand(name: string, build: (type: NodeType) => Command): Command;
7
+ export declare function canInsertNode(state: EditorState, nodeName: string): boolean;
8
+ //# sourceMappingURL=command-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-helpers.d.ts","sourceRoot":"","sources":["../src/command-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE7D,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE7E;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE7E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAKrF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAKrF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAa3E"}
@@ -0,0 +1,36 @@
1
+ export function markIn(state, name) {
2
+ return state.schema.marks[name];
3
+ }
4
+ export function nodeIn(state, name) {
5
+ return state.schema.nodes[name];
6
+ }
7
+ export function markCommand(name, build) {
8
+ return (state, dispatch, view) => {
9
+ const type = markIn(state, name);
10
+ return type ? build(type)(state, dispatch, view) : false;
11
+ };
12
+ }
13
+ export function nodeCommand(name, build) {
14
+ return (state, dispatch, view) => {
15
+ const type = nodeIn(state, name);
16
+ return type ? build(type)(state, dispatch, view) : false;
17
+ };
18
+ }
19
+ export function canInsertNode(state, nodeName) {
20
+ const type = nodeIn(state, nodeName);
21
+ if (!type)
22
+ return false;
23
+ const { $from } = state.selection;
24
+ for (let depth = $from.depth; depth >= 0; depth -= 1) {
25
+ const index = $from.index(depth);
26
+ if ($from.node(depth).canReplaceWith(index, index, type))
27
+ return true;
28
+ // Isolating nodes (figure, table cells, details, preserved atoms) must not
29
+ // be split to make room for a sibling. Walking past them is how
30
+ // insertHorizontalRule used to bisect a captioned image.
31
+ if ($from.node(depth).type.spec.isolating)
32
+ return false;
33
+ }
34
+ return false;
35
+ }
36
+ //# sourceMappingURL=command-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../src/command-helpers.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,IAAY;IACrD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,IAAY;IACrD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAkC;IAC1E,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1D,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAkC;IAC1E,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1D,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,QAAgB;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IACvB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,SAAS,CAAA;IACjC,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACrE,2EAA2E;QAC3E,gEAAgE;QAChE,yDAAyD;QACzD,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAA;IACzD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -13,9 +13,8 @@
13
13
  * button disabled-state free -- the same function answers "can I?" and "do it".
14
14
  */
15
15
  import { type Attrs } from 'prosemirror-model';
16
- import type { Command, EditorState } from 'prosemirror-state';
16
+ import { type Command, type EditorState } from 'prosemirror-state';
17
17
  import { type Align, type Dir, type ListStyle } from './css.js';
18
- import { type ImageAlign } from './tokens.js';
19
18
  /**
20
19
  * Is this mark active at the cursor, or across the selection?
21
20
  *
@@ -41,6 +40,16 @@ export declare const toggleInlineCode: Command;
41
40
  export declare const toggleSubscript: Command;
42
41
  export declare const toggleSuperscript: Command;
43
42
  export declare const setParagraph: Command;
43
+ /**
44
+ * `level` is the only attribute this command decides; everything else about the
45
+ * block is the author's and travels with it.
46
+ *
47
+ * `id` needs no special case any more, and that is a property of the schema
48
+ * rather than a shortcut: `paragraph` does not declare an `id`, so `carryOver`
49
+ * cannot promote one from a paragraph, while a heading's own `id` is declared
50
+ * and does come across. A paragraph stored as `<p id="x">` keeps its id anyway,
51
+ * through the carried residue, which is where an unmodelled attribute belongs.
52
+ */
44
53
  export declare function setHeading(level: number): Command;
45
54
  /**
46
55
  * Toggle a heading level: applying the level you are already in returns the
@@ -84,7 +93,11 @@ export declare function activeListStyle(state: EditorState): ListStyle | null;
84
93
  */
85
94
  export declare function activeTextAlign(state: EditorState): Align | null;
86
95
  /**
87
- * Set the alignment of every alignable block in the selection. `null` clears it.
96
+ * Set the alignment of every alignable node in the selection. `null` clears it.
97
+ *
98
+ * Images store `left` / `right` / `center` on `image.attrs.align`; serialization
99
+ * maps those to the `ol-*` classes. Justify is skipped on images, because it
100
+ * is not an image alignment.
88
101
  *
89
102
  * Reports true whenever there is something to align, even if it already carries
90
103
  * this value. The alternative -- returning false because the work is already
@@ -122,68 +135,13 @@ export declare function activeLanguage(state: EditorState): string | null;
122
135
  * Strip character formatting and block decoration from the selection.
123
136
  *
124
137
  * Links stay: they are a destination, not a look. Direction stays: it is
125
- * content. Headings and lists stay: they are structure. Alignment, indent,
126
- * line height, fonts, colours, and the common character marks go.
138
+ * content. Language stays: it is the same kind of fact as direction, only
139
+ * modelled as a mark (`<span lang>`) rather than a node attribute. Headings
140
+ * and lists stay: they are structure. Alignment, indent, line height, fonts,
141
+ * colours, and the common character marks go.
127
142
  */
128
143
  export declare const clearFormatting: Command;
129
- export interface LinkAttrs {
130
- href: string;
131
- title?: string | null;
132
- target?: string | null;
133
- rel?: string | null;
134
- id?: string | null;
135
- }
136
- /**
137
- * Apply or update a link across the selection.
138
- *
139
- * Removes any existing link first: without that, updating a link that only
140
- * partially overlaps the selection leaves two adjacent links with different
141
- * hrefs, which looks fine and is wrong.
142
- */
143
- export declare function setLink(attrs: LinkAttrs): Command;
144
- export declare const unsetLink: Command;
145
- export interface ImageAttrs {
146
- src: string;
147
- alt?: string | null;
148
- title?: string | null;
149
- width?: string | null;
150
- height?: string | null;
151
- align?: ImageAlign | null;
152
- className?: string | null;
153
- /**
154
- * When present, the image is wrapped in `<figure>` with this caption.
155
- * An empty string still wraps: a figure with no caption text is how an
156
- * author says "this will have a caption" without writing one yet.
157
- */
158
- caption?: string | null;
159
- }
160
- export declare function insertImage(attrs: ImageAttrs): Command;
161
- export declare function insertText(text: string): Command;
162
- export declare const insertNonBreakingSpace: Command;
163
- export declare const insertPageBreak: Command;
164
- export declare function insertNamedAnchor(id: string): Command;
165
- export declare function setHeadingId(id: string | null): Command;
166
- export declare function insertDetails(summaryText?: string): Command;
167
- export interface MediaAttrs {
168
- src: string;
169
- title?: string | null;
170
- width?: string | null;
171
- height?: string | null;
172
- controls?: boolean;
173
- poster?: string | null;
174
- allow?: string | null;
175
- allowfullscreen?: boolean;
176
- }
177
- export declare function insertVideo(attrs: MediaAttrs): Command;
178
- export declare function insertAudio(attrs: MediaAttrs): Command;
179
- export declare function insertIframe(attrs: MediaAttrs): Command;
180
- /**
181
- * Parse HTML against the live schema and insert it.
182
- *
183
- * Used by the snippet picker. The HTML still goes through the same parse
184
- * pipeline as stored content, so a snippet cannot smuggle in a `<script>`.
185
- */
186
- export declare function insertHtml(html: string): Command;
144
+ export { insertAudio, insertDetails, insertHtml, insertIframe, insertImage, insertNamedAnchor, insertNonBreakingSpace, insertPageBreak, insertText, insertVideo, selectedImage, selectedMedia, setHeadingId, setLink, unsetLink, updateImage, updateMedia, type ImageAttrs, type LinkAttrs, type MediaAttrs, type MediaSource, type SelectedImage, type SelectedMedia, } from './insert-commands.js';
187
145
  export { redo, undo } from 'prosemirror-history';
188
146
  export declare const canUndo: (state: EditorState) => boolean;
189
147
  export declare const canRedo: (state: EditorState) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}