@k2b/ui 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Dropdown.js +1 -0
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/content/MatchText.js +61 -0
- package/dist/browser/content/MatchText.js.map +1 -0
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +1358 -0
- package/dist/browser/text-editor/TextEditor.js.map +1 -0
- package/dist/browser/text-editor/clipboard-html.js +152 -0
- package/dist/browser/text-editor/clipboard-html.js.map +1 -0
- package/dist/browser/text-editor/clipboard-loading.js +68 -0
- package/dist/browser/text-editor/clipboard-loading.js.map +1 -0
- package/dist/browser/text-editor/clipboard.js +51 -0
- package/dist/browser/text-editor/clipboard.js.map +1 -0
- package/dist/browser/text-editor/engine.js +125 -0
- package/dist/browser/text-editor/engine.js.map +1 -0
- package/dist/browser/text-editor/format.js +218 -0
- package/dist/browser/text-editor/format.js.map +1 -0
- package/dist/browser/text-editor/formatted.js +164 -0
- package/dist/browser/text-editor/formatted.js.map +1 -0
- package/dist/browser/text-editor/language.js +19 -0
- package/dist/browser/text-editor/language.js.map +1 -0
- package/dist/browser/text-editor/markdown-table.js +563 -0
- package/dist/browser/text-editor/markdown-table.js.map +1 -0
- package/dist/browser/text-editor/messages.js +233 -0
- package/dist/browser/text-editor/messages.js.map +1 -0
- package/dist/browser/text-editor/paste.js +115 -0
- package/dist/browser/text-editor/paste.js.map +1 -0
- package/dist/browser/text-editor/table.js +1760 -0
- package/dist/browser/text-editor/table.js.map +1 -0
- package/dist/browser/text-editor.js +5 -0
- package/dist/browser/text-editor.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +1 -0
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/content/MatchText.js +56 -0
- package/dist/ssr/content/MatchText.js.map +1 -0
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +1155 -0
- package/dist/ssr/text-editor/TextEditor.js.map +1 -0
- package/dist/ssr/text-editor/clipboard-html.js +152 -0
- package/dist/ssr/text-editor/clipboard-html.js.map +1 -0
- package/dist/ssr/text-editor/clipboard-loading.js +68 -0
- package/dist/ssr/text-editor/clipboard-loading.js.map +1 -0
- package/dist/ssr/text-editor/clipboard.js +51 -0
- package/dist/ssr/text-editor/clipboard.js.map +1 -0
- package/dist/ssr/text-editor/engine.js +125 -0
- package/dist/ssr/text-editor/engine.js.map +1 -0
- package/dist/ssr/text-editor/format.js +218 -0
- package/dist/ssr/text-editor/format.js.map +1 -0
- package/dist/ssr/text-editor/formatted.js +164 -0
- package/dist/ssr/text-editor/formatted.js.map +1 -0
- package/dist/ssr/text-editor/language.js +19 -0
- package/dist/ssr/text-editor/language.js.map +1 -0
- package/dist/ssr/text-editor/markdown-table.js +563 -0
- package/dist/ssr/text-editor/markdown-table.js.map +1 -0
- package/dist/ssr/text-editor/messages.js +233 -0
- package/dist/ssr/text-editor/messages.js.map +1 -0
- package/dist/ssr/text-editor/paste.js +115 -0
- package/dist/ssr/text-editor/paste.js.map +1 -0
- package/dist/ssr/text-editor/table.js +1760 -0
- package/dist/ssr/text-editor/table.js.map +1 -0
- package/dist/ssr/text-editor.js +5 -0
- package/dist/ssr/text-editor.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +2 -0
- package/dist/types/content/MatchText.d.ts +21 -0
- package/dist/types/content/index.d.ts +1 -0
- package/dist/types/text-editor/TextEditor.d.ts +69 -0
- package/dist/types/text-editor/clipboard-html.d.ts +9 -0
- package/dist/types/text-editor/clipboard-loading.d.ts +8 -0
- package/dist/types/text-editor/clipboard.d.ts +20 -0
- package/dist/types/text-editor/engine.d.ts +34 -0
- package/dist/types/text-editor/format.d.ts +34 -0
- package/dist/types/text-editor/formatted.d.ts +1 -0
- package/dist/types/text-editor/language.d.ts +8 -0
- package/dist/types/text-editor/markdown-table.d.ts +105 -0
- package/dist/types/text-editor/messages.d.ts +113 -0
- package/dist/types/text-editor/paste.d.ts +6 -0
- package/dist/types/text-editor/table.d.ts +81 -0
- package/dist/types/text-editor.d.ts +4 -0
- package/package.json +23 -3
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
export const textEditorMessages = i18n.define({
|
|
3
|
+
baseLocale: "en",
|
|
4
|
+
messages: {
|
|
5
|
+
en: {
|
|
6
|
+
formatting: "Formatting",
|
|
7
|
+
formatted: "Formatted",
|
|
8
|
+
source: "Markdown",
|
|
9
|
+
view: "View",
|
|
10
|
+
loading: "Loading text",
|
|
11
|
+
bold: "Bold",
|
|
12
|
+
italic: "Italic",
|
|
13
|
+
heading: "Heading",
|
|
14
|
+
heading1: "Heading 1",
|
|
15
|
+
heading2: "Heading 2",
|
|
16
|
+
heading3: "Heading 3",
|
|
17
|
+
strike: "Strikethrough",
|
|
18
|
+
codeBlock: "Code block",
|
|
19
|
+
inlineCode: "Inline code",
|
|
20
|
+
column: column => `Column ${column}`,
|
|
21
|
+
menuRow: row => row === 0 ? "Header row" : `Row ${row}`,
|
|
22
|
+
menuColumn: name => `Column “${name}”`,
|
|
23
|
+
menuAbove: "Above",
|
|
24
|
+
menuBelow: "Below",
|
|
25
|
+
menuUp: "Move up",
|
|
26
|
+
menuDown: "Move down",
|
|
27
|
+
menuInsertLeft: "Insert left",
|
|
28
|
+
menuInsertRight: "Insert right",
|
|
29
|
+
menuMoveLeft: "Move left",
|
|
30
|
+
menuMoveRight: "Move right",
|
|
31
|
+
menuDelete: "Delete",
|
|
32
|
+
menuCopy: "Copy",
|
|
33
|
+
menuMarkdown: "Markdown",
|
|
34
|
+
columnAlignment: column => `Alignment of column ${column}`,
|
|
35
|
+
discardRecovery: "Discard preserved input",
|
|
36
|
+
bulletList: "List",
|
|
37
|
+
orderedList: "Numbered list",
|
|
38
|
+
quote: "Quote",
|
|
39
|
+
link: "Link",
|
|
40
|
+
code: "Code",
|
|
41
|
+
table: "Table",
|
|
42
|
+
insertTable: "Insert table",
|
|
43
|
+
rows: "Rows",
|
|
44
|
+
columns: "Columns",
|
|
45
|
+
insertSize: ({
|
|
46
|
+
rows,
|
|
47
|
+
columns
|
|
48
|
+
}) => `Insert ${rows} × ${columns}`,
|
|
49
|
+
rule: "Horizontal rule",
|
|
50
|
+
rowAbove: "Insert row above",
|
|
51
|
+
rowBelow: "Insert row below",
|
|
52
|
+
colLeft: "Insert column left",
|
|
53
|
+
colRight: "Insert column right",
|
|
54
|
+
deleteRow: "Delete row",
|
|
55
|
+
deleteCol: "Delete column",
|
|
56
|
+
moveRowUp: "Move row up",
|
|
57
|
+
moveRowDown: "Move row down",
|
|
58
|
+
moveColLeft: "Move column left",
|
|
59
|
+
moveColRight: "Move column right",
|
|
60
|
+
toggleHeader: "Header row",
|
|
61
|
+
deleteTable: "Delete table",
|
|
62
|
+
alignment: "Alignment",
|
|
63
|
+
copyTable: "Copy table",
|
|
64
|
+
copyMarkdown: "Copy as Markdown",
|
|
65
|
+
copyingTable: "Copying table…",
|
|
66
|
+
copiedTable: "Table copied",
|
|
67
|
+
copiedMarkdown: "Markdown copied",
|
|
68
|
+
copyFailed: "Could not copy. Allow clipboard access in your browser and try again.",
|
|
69
|
+
alignLeft: "Left",
|
|
70
|
+
alignCenter: "Center",
|
|
71
|
+
alignRight: "Right",
|
|
72
|
+
cellLabel: ({
|
|
73
|
+
row,
|
|
74
|
+
column,
|
|
75
|
+
name
|
|
76
|
+
}) => `${row === 0 ? "Header" : `Row ${row}`}, ${name || `column ${column + 1}`}`,
|
|
77
|
+
structureUnavailable: "Reconnect to insert, move, delete, align or change the header. You can still type and append a row.",
|
|
78
|
+
recoveredInput: "Preserved input — copy it before continuing",
|
|
79
|
+
cellRemoved: "The table changed. Select the cell again to continue. Interrupted input is preserved below for copying.",
|
|
80
|
+
structureFailed: "The table changed or the action could not be confirmed. Check the table before trying again.",
|
|
81
|
+
pasteTooLarge: "This table is too large to paste. Paste a smaller selection.",
|
|
82
|
+
textTooLarge: "This text is too long. Copy your changes and shorten the text before continuing.",
|
|
83
|
+
checkTable: "Check table",
|
|
84
|
+
checkTableDetail: "This row has extra cells. All their text is shown. Add the missing columns.",
|
|
85
|
+
checkSeparatorDetail: "The separator below the header is missing or damaged. Check the table in Markdown. All its text is preserved.",
|
|
86
|
+
reviewMarkdown: "Check Markdown",
|
|
87
|
+
imageHint: "Add images as attachments",
|
|
88
|
+
dismiss: "Dismiss",
|
|
89
|
+
tableMenu: "Edit table",
|
|
90
|
+
tableChanged: ({
|
|
91
|
+
rows,
|
|
92
|
+
columns
|
|
93
|
+
}) => `Table updated: ${rows} rows, ${columns} columns`,
|
|
94
|
+
rowMenu: "Row menu",
|
|
95
|
+
columnMenu: "Column menu",
|
|
96
|
+
addRow: "Row",
|
|
97
|
+
emptyCell: "Type or paste cells",
|
|
98
|
+
editMarkdown: "Edit as Markdown",
|
|
99
|
+
showTable: "Show as table",
|
|
100
|
+
done: "Done",
|
|
101
|
+
markdownValid: "Markdown · valid table",
|
|
102
|
+
markdownInvalid: "This is not one valid table. Continue editing or discard the changes.",
|
|
103
|
+
markdownLine: line => `Line ${line}: `,
|
|
104
|
+
markdownSeparator: ({
|
|
105
|
+
header,
|
|
106
|
+
separator
|
|
107
|
+
}) => `The separator has ${separator} ${separator === 1 ? "column" : "columns"}, but the header has ${header}.`,
|
|
108
|
+
markdownExtra: line => `Line ${line} has extra cells. Add missing columns to keep every cell visible.`,
|
|
109
|
+
applyingTable: "Applying table…",
|
|
110
|
+
markdownApplyFailed: "The table could not be applied. Your Markdown is preserved here; you can copy it or continue editing.",
|
|
111
|
+
markdownStructural: "This change alters the table structure. Keep editing here or discard the changes; it cannot be applied here yet.",
|
|
112
|
+
markdownChanged: "The table changed while you were editing. Your Markdown is preserved here. Copy it before discarding or try again after reviewing the table.",
|
|
113
|
+
discardMarkdown: "Discard changes",
|
|
114
|
+
continueMarkdown: "Continue editing",
|
|
115
|
+
addColumn: "Add column",
|
|
116
|
+
completeColumns: "Add missing columns"
|
|
117
|
+
},
|
|
118
|
+
de: {
|
|
119
|
+
formatting: "Formatierung",
|
|
120
|
+
formatted: "Formatiert",
|
|
121
|
+
source: "Markdown",
|
|
122
|
+
view: "Ansicht",
|
|
123
|
+
loading: "Text wird geladen",
|
|
124
|
+
bold: "Fett",
|
|
125
|
+
italic: "Kursiv",
|
|
126
|
+
heading: "Überschrift",
|
|
127
|
+
heading1: "Überschrift 1",
|
|
128
|
+
heading2: "Überschrift 2",
|
|
129
|
+
heading3: "Überschrift 3",
|
|
130
|
+
strike: "Durchgestrichen",
|
|
131
|
+
codeBlock: "Codeblock",
|
|
132
|
+
inlineCode: "Inline-Code",
|
|
133
|
+
column: column => `Spalte ${column}`,
|
|
134
|
+
menuRow: row => row === 0 ? "Kopfzeile" : `Zeile ${row}`,
|
|
135
|
+
menuColumn: name => `Spalte „${name}“`,
|
|
136
|
+
menuAbove: "Darüber",
|
|
137
|
+
menuBelow: "Darunter",
|
|
138
|
+
menuUp: "Nach oben",
|
|
139
|
+
menuDown: "Nach unten",
|
|
140
|
+
menuInsertLeft: "Links einfügen",
|
|
141
|
+
menuInsertRight: "Rechts einfügen",
|
|
142
|
+
menuMoveLeft: "Nach links",
|
|
143
|
+
menuMoveRight: "Nach rechts",
|
|
144
|
+
menuDelete: "Löschen",
|
|
145
|
+
menuCopy: "Kopieren",
|
|
146
|
+
menuMarkdown: "Markdown",
|
|
147
|
+
columnAlignment: column => `Ausrichtung der Spalte ${column}`,
|
|
148
|
+
discardRecovery: "Gesicherte Eingabe verwerfen",
|
|
149
|
+
bulletList: "Liste",
|
|
150
|
+
orderedList: "Nummerierte Liste",
|
|
151
|
+
quote: "Zitat",
|
|
152
|
+
link: "Link",
|
|
153
|
+
code: "Code",
|
|
154
|
+
table: "Tabelle",
|
|
155
|
+
insertTable: "Tabelle einfügen",
|
|
156
|
+
rows: "Zeilen",
|
|
157
|
+
columns: "Spalten",
|
|
158
|
+
insertSize: ({
|
|
159
|
+
rows,
|
|
160
|
+
columns
|
|
161
|
+
}) => `${rows} × ${columns} einfügen`,
|
|
162
|
+
rule: "Trennlinie",
|
|
163
|
+
rowAbove: "Zeile darüber einfügen",
|
|
164
|
+
rowBelow: "Zeile darunter einfügen",
|
|
165
|
+
colLeft: "Spalte links einfügen",
|
|
166
|
+
colRight: "Spalte rechts einfügen",
|
|
167
|
+
deleteRow: "Zeile löschen",
|
|
168
|
+
deleteCol: "Spalte löschen",
|
|
169
|
+
moveRowUp: "Zeile nach oben",
|
|
170
|
+
moveRowDown: "Zeile nach unten",
|
|
171
|
+
moveColLeft: "Spalte nach links",
|
|
172
|
+
moveColRight: "Spalte nach rechts",
|
|
173
|
+
toggleHeader: "Kopfzeile",
|
|
174
|
+
deleteTable: "Tabelle löschen",
|
|
175
|
+
alignment: "Ausrichtung",
|
|
176
|
+
copyTable: "Tabelle kopieren",
|
|
177
|
+
copyMarkdown: "Als Markdown kopieren",
|
|
178
|
+
copyingTable: "Tabelle wird kopiert…",
|
|
179
|
+
copiedTable: "Tabelle kopiert",
|
|
180
|
+
copiedMarkdown: "Markdown kopiert",
|
|
181
|
+
copyFailed: "Kopieren fehlgeschlagen. Erlaube den Zugriff auf die Zwischenablage im Browser und versuche es erneut.",
|
|
182
|
+
alignLeft: "Links",
|
|
183
|
+
alignCenter: "Mitte",
|
|
184
|
+
alignRight: "Rechts",
|
|
185
|
+
cellLabel: ({
|
|
186
|
+
row,
|
|
187
|
+
column,
|
|
188
|
+
name
|
|
189
|
+
}) => `${row === 0 ? "Kopf" : `Zeile ${row}`}, ${name || `Spalte ${column + 1}`}`,
|
|
190
|
+
structureUnavailable: "Einfügen, Verschieben, Löschen, Ausrichten und die Kopfzeile ändern geht wieder mit Verbindung. Tippen und Zeilen anhängen geht weiter.",
|
|
191
|
+
recoveredInput: "Gesicherte Eingabe — vor dem Fortfahren kopieren",
|
|
192
|
+
cellRemoved: "Die Tabelle hat sich geändert. Wähle die Zelle erneut. Unterbrochene Eingaben bleiben unten zum Kopieren erhalten.",
|
|
193
|
+
structureFailed: "Die Tabelle hat sich geändert oder die Aktion konnte nicht bestätigt werden. Prüfe die Tabelle, bevor du es erneut versuchst.",
|
|
194
|
+
pasteTooLarge: "Diese Tabelle ist zu groß zum Einfügen. Füge eine kleinere Auswahl ein.",
|
|
195
|
+
textTooLarge: "Dieser Text ist zu lang. Kopiere deine Änderungen und kürze den Text, bevor du fortfährst.",
|
|
196
|
+
checkTable: "Tabelle prüfen",
|
|
197
|
+
checkTableDetail: "Diese Zeile hat zusätzliche Zellen. Ihr Text bleibt sichtbar. Ergänze die fehlenden Spalten.",
|
|
198
|
+
checkSeparatorDetail: "Die Trennzeile unter der Kopfzeile fehlt oder ist beschädigt. Prüfe die Tabelle in Markdown. Ihr Text bleibt erhalten.",
|
|
199
|
+
reviewMarkdown: "Markdown prüfen",
|
|
200
|
+
imageHint: "Als Anhang hinzufügen",
|
|
201
|
+
dismiss: "Schließen",
|
|
202
|
+
tableMenu: "Tabelle bearbeiten",
|
|
203
|
+
tableChanged: ({
|
|
204
|
+
rows,
|
|
205
|
+
columns
|
|
206
|
+
}) => `Tabelle geändert: ${rows} Zeilen, ${columns} Spalten`,
|
|
207
|
+
rowMenu: "Zeilenmenü",
|
|
208
|
+
columnMenu: "Spaltenmenü",
|
|
209
|
+
addRow: "Zeile",
|
|
210
|
+
emptyCell: "Tippen oder Zellen einfügen",
|
|
211
|
+
editMarkdown: "Als Markdown bearbeiten",
|
|
212
|
+
showTable: "Als Tabelle anzeigen",
|
|
213
|
+
done: "Fertig",
|
|
214
|
+
markdownValid: "Markdown · gültige Tabelle",
|
|
215
|
+
markdownInvalid: "Das ist keine einzelne gültige Tabelle. Bearbeite sie weiter oder verwirf die Änderungen.",
|
|
216
|
+
markdownLine: line => `Zeile ${line}: `,
|
|
217
|
+
markdownSeparator: ({
|
|
218
|
+
header,
|
|
219
|
+
separator
|
|
220
|
+
}) => `Die Trennzeile hat ${separator} ${separator === 1 ? "Spalte" : "Spalten"}, die Kopfzeile ${header}.`,
|
|
221
|
+
markdownExtra: line => `Zeile ${line} hat zusätzliche Zellen. Ergänze die fehlenden Spalten, damit jede Zelle sichtbar bleibt.`,
|
|
222
|
+
applyingTable: "Tabelle wird übernommen …",
|
|
223
|
+
markdownApplyFailed: "Die Tabelle konnte nicht übernommen werden. Dein Markdown bleibt hier erhalten. Du kannst es kopieren oder weiterbearbeiten.",
|
|
224
|
+
markdownStructural: "Diese Änderung verändert den Tabellenaufbau. Du kannst hier weiterarbeiten oder die Änderungen verwerfen; übernehmen lassen sie sich hier noch nicht.",
|
|
225
|
+
markdownChanged: "Die Tabelle wurde während der Bearbeitung geändert. Dein Markdown bleibt hier erhalten. Kopiere es vor dem Verwerfen oder prüfe die Tabelle vor einem neuen Versuch.",
|
|
226
|
+
discardMarkdown: "Änderungen verwerfen",
|
|
227
|
+
continueMarkdown: "Weiter bearbeiten",
|
|
228
|
+
addColumn: "Spalte ergänzen",
|
|
229
|
+
completeColumns: "Spalten ergänzen"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["text-editor/messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nexport const textEditorMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n formatting: \"Formatting\",\n formatted: \"Formatted\",\n source: \"Markdown\",\n view: \"View\",\n loading: \"Loading text\",\n bold: \"Bold\",\n italic: \"Italic\",\n heading: \"Heading\",\n heading1: \"Heading 1\",\n heading2: \"Heading 2\",\n heading3: \"Heading 3\",\n strike: \"Strikethrough\",\n codeBlock: \"Code block\",\n inlineCode: \"Inline code\",\n column: (column: number) => `Column ${column}`,\n menuRow: (row: number) => (row === 0 ? \"Header row\" : `Row ${row}`),\n menuColumn: (name: string) => `Column “${name}”`,\n menuAbove: \"Above\",\n menuBelow: \"Below\",\n menuUp: \"Move up\",\n menuDown: \"Move down\",\n menuInsertLeft: \"Insert left\",\n menuInsertRight: \"Insert right\",\n menuMoveLeft: \"Move left\",\n menuMoveRight: \"Move right\",\n menuDelete: \"Delete\",\n menuCopy: \"Copy\",\n menuMarkdown: \"Markdown\",\n columnAlignment: (column: number) => `Alignment of column ${column}`,\n discardRecovery: \"Discard preserved input\",\n bulletList: \"List\",\n orderedList: \"Numbered list\",\n quote: \"Quote\",\n link: \"Link\",\n code: \"Code\",\n table: \"Table\",\n insertTable: \"Insert table\",\n rows: \"Rows\",\n columns: \"Columns\",\n insertSize: ({ rows, columns }: { rows: number; columns: number }) => `Insert ${rows} × ${columns}`,\n rule: \"Horizontal rule\",\n rowAbove: \"Insert row above\",\n rowBelow: \"Insert row below\",\n colLeft: \"Insert column left\",\n colRight: \"Insert column right\",\n deleteRow: \"Delete row\",\n deleteCol: \"Delete column\",\n moveRowUp: \"Move row up\",\n moveRowDown: \"Move row down\",\n moveColLeft: \"Move column left\",\n moveColRight: \"Move column right\",\n toggleHeader: \"Header row\",\n deleteTable: \"Delete table\",\n alignment: \"Alignment\",\n copyTable: \"Copy table\",\n copyMarkdown: \"Copy as Markdown\",\n copyingTable: \"Copying table…\",\n copiedTable: \"Table copied\",\n copiedMarkdown: \"Markdown copied\",\n copyFailed: \"Could not copy. Allow clipboard access in your browser and try again.\",\n alignLeft: \"Left\",\n alignCenter: \"Center\",\n alignRight: \"Right\",\n cellLabel: ({ row, column, name }: { row: number; column: number; name?: string }) =>\n `${row === 0 ? \"Header\" : `Row ${row}`}, ${name || `column ${column + 1}`}`,\n structureUnavailable: \"Reconnect to insert, move, delete, align or change the header. You can still type and append a row.\",\n recoveredInput: \"Preserved input — copy it before continuing\",\n cellRemoved: \"The table changed. Select the cell again to continue. Interrupted input is preserved below for copying.\",\n structureFailed: \"The table changed or the action could not be confirmed. Check the table before trying again.\",\n pasteTooLarge: \"This table is too large to paste. Paste a smaller selection.\",\n textTooLarge: \"This text is too long. Copy your changes and shorten the text before continuing.\",\n checkTable: \"Check table\",\n checkTableDetail: \"This row has extra cells. All their text is shown. Add the missing columns.\",\n checkSeparatorDetail: \"The separator below the header is missing or damaged. Check the table in Markdown. All its text is preserved.\",\n reviewMarkdown: \"Check Markdown\",\n imageHint: \"Add images as attachments\",\n dismiss: \"Dismiss\",\n tableMenu: \"Edit table\",\n tableChanged: ({ rows, columns }: { rows: number; columns: number }) => `Table updated: ${rows} rows, ${columns} columns`,\n rowMenu: \"Row menu\",\n columnMenu: \"Column menu\",\n addRow: \"Row\",\n emptyCell: \"Type or paste cells\",\n editMarkdown: \"Edit as Markdown\",\n showTable: \"Show as table\",\n done: \"Done\",\n markdownValid: \"Markdown · valid table\",\n markdownInvalid: \"This is not one valid table. Continue editing or discard the changes.\",\n markdownLine: (line: number) => `Line ${line}: `,\n markdownSeparator: ({ header, separator }: { header: number; separator: number }) =>\n `The separator has ${separator} ${separator === 1 ? \"column\" : \"columns\"}, but the header has ${header}.`,\n markdownExtra: (line: number) => `Line ${line} has extra cells. Add missing columns to keep every cell visible.`,\n applyingTable: \"Applying table…\",\n markdownApplyFailed: \"The table could not be applied. Your Markdown is preserved here; you can copy it or continue editing.\",\n markdownStructural:\n \"This change alters the table structure. Keep editing here or discard the changes; it cannot be applied here yet.\",\n markdownChanged:\n \"The table changed while you were editing. Your Markdown is preserved here. Copy it before discarding or try again after reviewing the table.\",\n discardMarkdown: \"Discard changes\",\n continueMarkdown: \"Continue editing\",\n addColumn: \"Add column\",\n completeColumns: \"Add missing columns\",\n },\n de: {\n formatting: \"Formatierung\",\n formatted: \"Formatiert\",\n source: \"Markdown\",\n view: \"Ansicht\",\n loading: \"Text wird geladen\",\n bold: \"Fett\",\n italic: \"Kursiv\",\n heading: \"Überschrift\",\n heading1: \"Überschrift 1\",\n heading2: \"Überschrift 2\",\n heading3: \"Überschrift 3\",\n strike: \"Durchgestrichen\",\n codeBlock: \"Codeblock\",\n inlineCode: \"Inline-Code\",\n column: (column) => `Spalte ${column}`,\n menuRow: (row) => (row === 0 ? \"Kopfzeile\" : `Zeile ${row}`),\n menuColumn: (name) => `Spalte „${name}“`,\n menuAbove: \"Darüber\",\n menuBelow: \"Darunter\",\n menuUp: \"Nach oben\",\n menuDown: \"Nach unten\",\n menuInsertLeft: \"Links einfügen\",\n menuInsertRight: \"Rechts einfügen\",\n menuMoveLeft: \"Nach links\",\n menuMoveRight: \"Nach rechts\",\n menuDelete: \"Löschen\",\n menuCopy: \"Kopieren\",\n menuMarkdown: \"Markdown\",\n columnAlignment: (column) => `Ausrichtung der Spalte ${column}`,\n discardRecovery: \"Gesicherte Eingabe verwerfen\",\n bulletList: \"Liste\",\n orderedList: \"Nummerierte Liste\",\n quote: \"Zitat\",\n link: \"Link\",\n code: \"Code\",\n table: \"Tabelle\",\n insertTable: \"Tabelle einfügen\",\n rows: \"Zeilen\",\n columns: \"Spalten\",\n insertSize: ({ rows, columns }) => `${rows} × ${columns} einfügen`,\n rule: \"Trennlinie\",\n rowAbove: \"Zeile darüber einfügen\",\n rowBelow: \"Zeile darunter einfügen\",\n colLeft: \"Spalte links einfügen\",\n colRight: \"Spalte rechts einfügen\",\n deleteRow: \"Zeile löschen\",\n deleteCol: \"Spalte löschen\",\n moveRowUp: \"Zeile nach oben\",\n moveRowDown: \"Zeile nach unten\",\n moveColLeft: \"Spalte nach links\",\n moveColRight: \"Spalte nach rechts\",\n toggleHeader: \"Kopfzeile\",\n deleteTable: \"Tabelle löschen\",\n alignment: \"Ausrichtung\",\n copyTable: \"Tabelle kopieren\",\n copyMarkdown: \"Als Markdown kopieren\",\n copyingTable: \"Tabelle wird kopiert…\",\n copiedTable: \"Tabelle kopiert\",\n copiedMarkdown: \"Markdown kopiert\",\n copyFailed: \"Kopieren fehlgeschlagen. Erlaube den Zugriff auf die Zwischenablage im Browser und versuche es erneut.\",\n alignLeft: \"Links\",\n alignCenter: \"Mitte\",\n alignRight: \"Rechts\",\n cellLabel: ({ row, column, name }) => `${row === 0 ? \"Kopf\" : `Zeile ${row}`}, ${name || `Spalte ${column + 1}`}`,\n structureUnavailable:\n \"Einfügen, Verschieben, Löschen, Ausrichten und die Kopfzeile ändern geht wieder mit Verbindung. Tippen und Zeilen anhängen geht weiter.\",\n recoveredInput: \"Gesicherte Eingabe — vor dem Fortfahren kopieren\",\n cellRemoved: \"Die Tabelle hat sich geändert. Wähle die Zelle erneut. Unterbrochene Eingaben bleiben unten zum Kopieren erhalten.\",\n structureFailed:\n \"Die Tabelle hat sich geändert oder die Aktion konnte nicht bestätigt werden. Prüfe die Tabelle, bevor du es erneut versuchst.\",\n pasteTooLarge: \"Diese Tabelle ist zu groß zum Einfügen. Füge eine kleinere Auswahl ein.\",\n textTooLarge: \"Dieser Text ist zu lang. Kopiere deine Änderungen und kürze den Text, bevor du fortfährst.\",\n checkTable: \"Tabelle prüfen\",\n checkTableDetail: \"Diese Zeile hat zusätzliche Zellen. Ihr Text bleibt sichtbar. Ergänze die fehlenden Spalten.\",\n checkSeparatorDetail:\n \"Die Trennzeile unter der Kopfzeile fehlt oder ist beschädigt. Prüfe die Tabelle in Markdown. Ihr Text bleibt erhalten.\",\n reviewMarkdown: \"Markdown prüfen\",\n imageHint: \"Als Anhang hinzufügen\",\n dismiss: \"Schließen\",\n tableMenu: \"Tabelle bearbeiten\",\n tableChanged: ({ rows, columns }) => `Tabelle geändert: ${rows} Zeilen, ${columns} Spalten`,\n rowMenu: \"Zeilenmenü\",\n columnMenu: \"Spaltenmenü\",\n addRow: \"Zeile\",\n emptyCell: \"Tippen oder Zellen einfügen\",\n editMarkdown: \"Als Markdown bearbeiten\",\n showTable: \"Als Tabelle anzeigen\",\n done: \"Fertig\",\n markdownValid: \"Markdown · gültige Tabelle\",\n markdownInvalid: \"Das ist keine einzelne gültige Tabelle. Bearbeite sie weiter oder verwirf die Änderungen.\",\n markdownLine: (line) => `Zeile ${line}: `,\n markdownSeparator: ({ header, separator }) =>\n `Die Trennzeile hat ${separator} ${separator === 1 ? \"Spalte\" : \"Spalten\"}, die Kopfzeile ${header}.`,\n markdownExtra: (line) => `Zeile ${line} hat zusätzliche Zellen. Ergänze die fehlenden Spalten, damit jede Zelle sichtbar bleibt.`,\n applyingTable: \"Tabelle wird übernommen …\",\n markdownApplyFailed:\n \"Die Tabelle konnte nicht übernommen werden. Dein Markdown bleibt hier erhalten. Du kannst es kopieren oder weiterbearbeiten.\",\n markdownStructural:\n \"Diese Änderung verändert den Tabellenaufbau. Du kannst hier weiterarbeiten oder die Änderungen verwerfen; übernehmen lassen sie sich hier noch nicht.\",\n markdownChanged:\n \"Die Tabelle wurde während der Bearbeitung geändert. Dein Markdown bleibt hier erhalten. Kopiere es vor dem Verwerfen oder prüfe die Tabelle vor einem neuen Versuch.\",\n discardMarkdown: \"Änderungen verwerfen\",\n continueMarkdown: \"Weiter bearbeiten\",\n addColumn: \"Spalte ergänzen\",\n completeColumns: \"Spalten ergänzen\",\n },\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clean paste: HTML from Word, Google Docs or web pages becomes the editor's
|
|
3
|
+
* small Markdown set. Styles, classes, fonts, colours and images are dropped.
|
|
4
|
+
* Tab-separated text (Excel, Sheets, Numbers) becomes a table.
|
|
5
|
+
*/
|
|
6
|
+
import { ensureSyntaxTree, syntaxTree } from "@codemirror/language";
|
|
7
|
+
import { EditorView } from "@codemirror/view";
|
|
8
|
+
import { convertClipboardHtml, inspectClipboard } from "./clipboard";
|
|
9
|
+
import { tableFromGrid } from "./markdown-table";
|
|
10
|
+
import { tableHost } from "./table";
|
|
11
|
+
const inCode = state => {
|
|
12
|
+
const {
|
|
13
|
+
from,
|
|
14
|
+
to
|
|
15
|
+
} = state.selection.main;
|
|
16
|
+
const lineEnd = state.doc.lineAt(from).to;
|
|
17
|
+
const tree = ensureSyntaxTree(state, Math.max(to, lineEnd)) ?? syntaxTree(state);
|
|
18
|
+
for (const pos of [from, lineEnd]) {
|
|
19
|
+
for (let node = tree.resolve(pos, -1); node; node = node.parent) {
|
|
20
|
+
if (to > node.to) continue;
|
|
21
|
+
if (node.name === "CodeBlock") return true;
|
|
22
|
+
// An indented block's first node starts after its leading indentation.
|
|
23
|
+
// Only that block may be inferred from the rest of the current line.
|
|
24
|
+
if (pos !== from) continue;
|
|
25
|
+
if (node.name === "InlineCode") {
|
|
26
|
+
const marks = node.getChildren("CodeMark");
|
|
27
|
+
const first = marks[0];
|
|
28
|
+
const last = marks[marks.length - 1];
|
|
29
|
+
if (first && last && from >= first.to && to <= last.from) return true;
|
|
30
|
+
}
|
|
31
|
+
if (node.name === "FencedCode") {
|
|
32
|
+
const marks = node.getChildren("CodeMark");
|
|
33
|
+
const first = marks[0];
|
|
34
|
+
const last = marks[marks.length - 1];
|
|
35
|
+
if (!first || !last) continue;
|
|
36
|
+
const start = state.doc.lineAt(first.to).to + 1;
|
|
37
|
+
const end = marks.length > 1 ? state.doc.lineAt(last.from).from : node.to;
|
|
38
|
+
if (from >= start && to <= end) return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** HTML clipboard content as Markdown; `null` when it is better pasted as plain text. */
|
|
46
|
+
export const htmlToMarkdown = html => convertClipboardHtml(html, false);
|
|
47
|
+
export const cleanPaste = (onDroppedImages, plain = false) => EditorView.domEventHandlers({
|
|
48
|
+
paste(event, view) {
|
|
49
|
+
if (view.state.readOnly) return false;
|
|
50
|
+
const data = event.clipboardData;
|
|
51
|
+
if (!data) return false;
|
|
52
|
+
const host = view.state.facet(tableHost);
|
|
53
|
+
const clipboard = inspectClipboard(data, {
|
|
54
|
+
maxLength: host?.maxLength ?? Infinity,
|
|
55
|
+
maxPasteCells: plain ? Infinity : host?.maxPasteCells ?? 2000
|
|
56
|
+
});
|
|
57
|
+
if ("error" in clipboard) {
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
host?.onError(clipboard.error);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
const {
|
|
63
|
+
html,
|
|
64
|
+
text,
|
|
65
|
+
tsv: grid,
|
|
66
|
+
images,
|
|
67
|
+
files
|
|
68
|
+
} = clipboard;
|
|
69
|
+
if (images) onDroppedImages?.(images, files);
|
|
70
|
+
if (plain) {
|
|
71
|
+
if (images && !text) {
|
|
72
|
+
event.preventDefault();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const code = inCode(view.state);
|
|
78
|
+
if (code && text) return false;
|
|
79
|
+
let insert = null;
|
|
80
|
+
if (html) {
|
|
81
|
+
const converted = convertClipboardHtml(html, code);
|
|
82
|
+
if (converted) {
|
|
83
|
+
insert = converted.markdown;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (insert === null && grid?.length) insert = tableFromGrid(grid);
|
|
87
|
+
if (insert === null) {
|
|
88
|
+
if (images && !text) {
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
const block = !code && insert.includes("\n") && /^(\||#|>|- |\d+\. |```)/m.test(insert);
|
|
96
|
+
const {
|
|
97
|
+
from,
|
|
98
|
+
to
|
|
99
|
+
} = view.state.selection.main;
|
|
100
|
+
if (block) {
|
|
101
|
+
// A block never glues onto the text around it: a table row must not swallow the next paragraph.
|
|
102
|
+
const doc = view.state.doc;
|
|
103
|
+
const before = doc.sliceString(Math.max(0, from - 2), from);
|
|
104
|
+
const after = doc.sliceString(to, Math.min(doc.length, to + 2));
|
|
105
|
+
const lead = from === 0 || before === "\n\n" ? "" : before.endsWith("\n") ? "\n" : "\n\n";
|
|
106
|
+
const trail = to === doc.length || after === "\n\n" ? "" : after.startsWith("\n") ? "\n" : "\n\n";
|
|
107
|
+
insert = `${lead}${insert}${trail}`;
|
|
108
|
+
}
|
|
109
|
+
view.dispatch(view.state.replaceSelection(insert), {
|
|
110
|
+
userEvent: "input.paste"
|
|
111
|
+
});
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=paste.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["text-editor/paste.ts"],"sourcesContent":["/**\n * Clean paste: HTML from Word, Google Docs or web pages becomes the editor's\n * small Markdown set. Styles, classes, fonts, colours and images are dropped.\n * Tab-separated text (Excel, Sheets, Numbers) becomes a table.\n */\nimport { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport type { EditorState } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\nimport { convertClipboardHtml, inspectClipboard } from \"./clipboard\";\nimport { tableFromGrid } from \"./markdown-table\";\nimport { tableHost } from \"./table\";\n\nconst inCode = (state: EditorState): boolean => {\n const { from, to } = state.selection.main;\n const lineEnd = state.doc.lineAt(from).to;\n const tree = ensureSyntaxTree(state, Math.max(to, lineEnd)) ?? syntaxTree(state);\n for (const pos of [from, lineEnd]) {\n for (let node: typeof tree.topNode | null = tree.resolve(pos, -1); node; node = node.parent) {\n if (to > node.to) continue;\n if (node.name === \"CodeBlock\") return true;\n // An indented block's first node starts after its leading indentation.\n // Only that block may be inferred from the rest of the current line.\n if (pos !== from) continue;\n if (node.name === \"InlineCode\") {\n const marks = node.getChildren(\"CodeMark\");\n const first = marks[0];\n const last = marks[marks.length - 1];\n if (first && last && from >= first.to && to <= last.from) return true;\n }\n if (node.name === \"FencedCode\") {\n const marks = node.getChildren(\"CodeMark\");\n const first = marks[0];\n const last = marks[marks.length - 1];\n if (!first || !last) continue;\n const start = state.doc.lineAt(first.to).to + 1;\n const end = marks.length > 1 ? state.doc.lineAt(last.from).from : node.to;\n if (from >= start && to <= end) return true;\n }\n }\n }\n return false;\n};\n\n/** HTML clipboard content as Markdown; `null` when it is better pasted as plain text. */\nexport const htmlToMarkdown = (html: string): { markdown: string; droppedImages: number } | null => convertClipboardHtml(html, false);\n\nexport const cleanPaste = (onDroppedImages?: (count: number, files: File[]) => void, plain = false) =>\n EditorView.domEventHandlers({\n paste(event, view) {\n if (view.state.readOnly) return false;\n const data = event.clipboardData;\n if (!data) return false;\n const host = view.state.facet(tableHost);\n const clipboard = inspectClipboard(data, {\n maxLength: host?.maxLength ?? Infinity,\n maxPasteCells: plain ? Infinity : (host?.maxPasteCells ?? 2000),\n });\n if (\"error\" in clipboard) {\n event.preventDefault();\n host?.onError(clipboard.error);\n return true;\n }\n const { html, text, tsv: grid, images, files } = clipboard;\n if (images) onDroppedImages?.(images, files);\n if (plain) {\n if (images && !text) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n const code = inCode(view.state);\n if (code && text) return false;\n let insert: string | null = null;\n if (html) {\n const converted = convertClipboardHtml(html, code);\n if (converted) {\n insert = converted.markdown;\n }\n }\n if (insert === null && grid?.length) insert = tableFromGrid(grid);\n if (insert === null) {\n if (images && !text) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n event.preventDefault();\n const block = !code && insert.includes(\"\\n\") && /^(\\||#|>|- |\\d+\\. |```)/m.test(insert);\n const { from, to } = view.state.selection.main;\n if (block) {\n // A block never glues onto the text around it: a table row must not swallow the next paragraph.\n const doc = view.state.doc;\n const before = doc.sliceString(Math.max(0, from - 2), from);\n const after = doc.sliceString(to, Math.min(doc.length, to + 2));\n const lead = from === 0 || before === \"\\n\\n\" ? \"\" : before.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n const trail = to === doc.length || after === \"\\n\\n\" ? \"\" : after.startsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n insert = `${lead}${insert}${trail}`;\n }\n view.dispatch(view.state.replaceSelection(insert), { userEvent: \"input.paste\" });\n return true;\n },\n });\n"],"mappings":"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","ignoreList":[]}
|