@fieldia/code 0.13.0 → 0.14.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/README.md +47 -8
- package/package.json +19 -4
- package/src/index.d.mts +2 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/code.d.mts +6 -1
- package/src/lib/code.d.ts +6 -1
- package/src/lib/code.js +15 -4
- package/src/lib/code.js.map +1 -1
- package/src/lib/code.mjs +14 -4
- package/src/lib/code.mjs.map +1 -1
- package/src/lib/languages.d.mts +25 -0
- package/src/lib/languages.d.ts +25 -0
- package/src/lib/languages.js +137 -0
- package/src/lib/languages.js.map +1 -0
- package/src/lib/languages.mjs +132 -0
- package/src/lib/languages.mjs.map +1 -0
- package/src/lib/palette.d.mts +36 -0
- package/src/lib/palette.d.ts +36 -0
- package/src/lib/palette.js +50 -0
- package/src/lib/palette.js.map +1 -0
- package/src/lib/palette.mjs +47 -0
- package/src/lib/palette.mjs.map +1 -0
- package/src/lib/styles.d.mts +1 -1
- package/src/lib/styles.d.ts +1 -1
- package/src/lib/styles.js +12 -1
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +12 -1
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/text-code.d.mts +2 -0
- package/src/lib/text-code.d.ts +2 -0
- package/src/lib/text-code.js +123 -0
- package/src/lib/text-code.js.map +1 -0
- package/src/lib/text-code.mjs +119 -0
- package/src/lib/text-code.mjs.map +1 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
|
|
2
|
+
import { bracketMatching, indentOnInput, syntaxHighlighting } from '@codemirror/language';
|
|
3
|
+
import { Compartment, EditorState } from '@codemirror/state';
|
|
4
|
+
import { EditorView, keymap, lineNumbers, placeholder } from '@codemirror/view';
|
|
5
|
+
import { loadCodeLanguage } from './languages.mjs';
|
|
6
|
+
import { codeHighlightStyle } from './palette.mjs';
|
|
7
|
+
import { installCodeStyles } from './styles.mjs';
|
|
8
|
+
/**
|
|
9
|
+
* A text or char field as code, coloured in the language the page names:
|
|
10
|
+
* `{ "widget": "code", "options": { "language": "python" } }`. The grammar
|
|
11
|
+
* loads when the field is drawn, and only that one; a language the editor
|
|
12
|
+
* does not know is plain text. What is typed reaches the form as text, an
|
|
13
|
+
* empty editor as nothing. Tab is left to move between fields; Ctrl+] and
|
|
14
|
+
* Ctrl+[ indent. Code reads left to right, on an Arabic page too.
|
|
15
|
+
*/
|
|
16
|
+
const textOf = (value) => (value === null || value === undefined ? '' : String(value));
|
|
17
|
+
/** A char field is one line: Enter adds nothing, and pasted lines join, as a text box joins them. */
|
|
18
|
+
const oneLine = EditorState.transactionFilter.of((tr) => {
|
|
19
|
+
if (!tr.docChanged || tr.newDoc.lines === 1)
|
|
20
|
+
return tr;
|
|
21
|
+
let words = false;
|
|
22
|
+
const changes = [];
|
|
23
|
+
tr.changes.iterChanges((from, to, _fromB, _toB, inserted) => {
|
|
24
|
+
const text = inserted.toString();
|
|
25
|
+
if (text.trim() !== '')
|
|
26
|
+
words = true;
|
|
27
|
+
changes.push({ from, to, insert: text.replace(/\s*[\r\n]+\s*/g, ' ') });
|
|
28
|
+
});
|
|
29
|
+
if (!words)
|
|
30
|
+
return [];
|
|
31
|
+
const joined = tr.startState.changes(changes);
|
|
32
|
+
return { changes: joined, selection: { anchor: joined.mapPos(tr.startState.selection.main.head, 1) }, scrollIntoView: true };
|
|
33
|
+
});
|
|
34
|
+
/** No longer than the field's size: a change that would make it longer is refused, as a text box's maxlength does. */
|
|
35
|
+
const atMost = (size) => EditorState.transactionFilter.of((tr) => (tr.docChanged && tr.newDoc.length > size && tr.newDoc.length > tr.startState.doc.length ? [] : tr));
|
|
36
|
+
export const textCodeWidget = ({ form, name, field, node, id, document }) => {
|
|
37
|
+
installCodeStyles(document);
|
|
38
|
+
const line = field.type === 'char';
|
|
39
|
+
const element = document.createElement('div');
|
|
40
|
+
element.className = line ? 'fd-code fd-code-text fd-code-line' : 'fd-code fd-code-text';
|
|
41
|
+
element.dir = 'ltr';
|
|
42
|
+
const size = (field.type === 'char' || field.type === 'text') && field.size !== undefined ? field.size : undefined;
|
|
43
|
+
const grammar = new Compartment();
|
|
44
|
+
const editable = new Compartment();
|
|
45
|
+
const described = new Compartment();
|
|
46
|
+
/** What the form holds as text, as last written or shown: its echo of what was typed changes nothing. */
|
|
47
|
+
let known = textOf(form.getState().values[name]);
|
|
48
|
+
let writing = false;
|
|
49
|
+
let readonly = null;
|
|
50
|
+
let attributes = '';
|
|
51
|
+
const view = new EditorView({
|
|
52
|
+
parent: element,
|
|
53
|
+
state: EditorState.create({
|
|
54
|
+
doc: known,
|
|
55
|
+
extensions: [
|
|
56
|
+
line ? oneLine : lineNumbers(),
|
|
57
|
+
size !== undefined ? atMost(size) : [],
|
|
58
|
+
history(),
|
|
59
|
+
bracketMatching(),
|
|
60
|
+
indentOnInput(),
|
|
61
|
+
syntaxHighlighting(codeHighlightStyle),
|
|
62
|
+
grammar.of([]),
|
|
63
|
+
keymap.of([...defaultKeymap, ...historyKeymap]),
|
|
64
|
+
node.placeholder ? placeholder(node.placeholder) : [],
|
|
65
|
+
editable.of([]),
|
|
66
|
+
// Named by the field's label, like every other field; its state said as the form says it.
|
|
67
|
+
EditorView.contentAttributes.of({ id, 'aria-labelledby': `${id}-label` }),
|
|
68
|
+
described.of([]),
|
|
69
|
+
EditorView.updateListener.of((update) => {
|
|
70
|
+
if (!update.docChanged || writing)
|
|
71
|
+
return;
|
|
72
|
+
known = update.state.doc.toString();
|
|
73
|
+
form.setValue(name, known === '' ? null : known);
|
|
74
|
+
}),
|
|
75
|
+
],
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
// The language's grammar, once loaded; nothing if the page names none the editor knows. (An editor
|
|
79
|
+
// destroyed meanwhile takes the change quietly.)
|
|
80
|
+
void loadCodeLanguage(node.options?.['language']).then((support) => {
|
|
81
|
+
if (support)
|
|
82
|
+
view.dispatch({ effects: grammar.reconfigure(support) });
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
element,
|
|
86
|
+
focus: () => view.focus(),
|
|
87
|
+
destroy: () => view.destroy(),
|
|
88
|
+
update(state) {
|
|
89
|
+
const effects = [];
|
|
90
|
+
if (state.readonly !== readonly) {
|
|
91
|
+
readonly = state.readonly;
|
|
92
|
+
element.toggleAttribute('data-readonly', readonly);
|
|
93
|
+
effects.push(editable.reconfigure([EditorView.editable.of(!readonly), EditorState.readOnly.of(readonly)]));
|
|
94
|
+
}
|
|
95
|
+
const said = { 'aria-invalid': String(state.invalid), 'aria-required': String(state.required), 'aria-readonly': String(state.readonly) };
|
|
96
|
+
// Read-only code is still reached by Tab, as a read-only text box is: to read it, and copy from it.
|
|
97
|
+
if (state.readonly)
|
|
98
|
+
said['tabindex'] = '0';
|
|
99
|
+
if (state.describedBy)
|
|
100
|
+
said['aria-describedby'] = state.describedBy;
|
|
101
|
+
if (JSON.stringify(said) !== attributes) {
|
|
102
|
+
attributes = JSON.stringify(said);
|
|
103
|
+
effects.push(described.reconfigure(EditorView.contentAttributes.of(said)));
|
|
104
|
+
}
|
|
105
|
+
if (effects.length)
|
|
106
|
+
view.dispatch({ effects });
|
|
107
|
+
// A value from elsewhere (loaded, discarded, set by a step) replaces the text; the echo of what was typed does not.
|
|
108
|
+
const incoming = textOf(state.value);
|
|
109
|
+
if (incoming === known)
|
|
110
|
+
return;
|
|
111
|
+
known = incoming;
|
|
112
|
+
writing = true;
|
|
113
|
+
// Shown whole, whatever its length or lines: the filters are for what is typed.
|
|
114
|
+
view.dispatch({ changes: { from: 0, to: view.state.doc.length, insert: incoming }, filter: false });
|
|
115
|
+
writing = false;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=text-code.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-code.mjs","sourceRoot":"","sources":["../../../../../libs/code/src/lib/text-code.ts"],"names":[],"mappings":"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"}
|