Skip to content

Commit cd08166

Browse files
onovyredimp
authored andcommitted
feat: add CM6 language registry, theme, and helpers modules
1 parent 1c76bd9 commit cd08166

5 files changed

Lines changed: 561 additions & 10 deletions

File tree

cm6-src/helpers.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';
2+
3+
let _view = null;
4+
5+
export function setView(v) {
6+
_view = v;
7+
}
8+
9+
export function getView() {
10+
return _view;
11+
}
12+
13+
export function getLine(n) {
14+
return _view.state.doc.line(n + 1).text;
15+
}
16+
17+
export function lineCount() {
18+
return _view.state.doc.lines;
19+
}
20+
21+
export function lastLine() {
22+
return _view.state.doc.lines - 1;
23+
}
24+
25+
export function getCursor(which = 'head') {
26+
const sel = _view.state.selection.main;
27+
let offset = sel.head;
28+
29+
if (which === 'start') {
30+
offset = sel.from;
31+
} else if (which === 'end') {
32+
offset = sel.to;
33+
}
34+
35+
const lineAt = _view.state.doc.lineAt(offset);
36+
return {
37+
line: lineAt.number - 1,
38+
ch: offset - lineAt.from,
39+
};
40+
}
41+
42+
export function posToOffset(line, ch) {
43+
return _view.state.doc.line(line + 1).from + ch;
44+
}
45+
46+
export function setCursor(pos) {
47+
_view.dispatch({ selection: { anchor: posToOffset(pos.line, pos.ch) } });
48+
}
49+
50+
export function setSelection(anchor, head) {
51+
_view.dispatch({
52+
selection: {
53+
anchor: posToOffset(anchor.line, anchor.ch),
54+
head: posToOffset(head.line, head.ch),
55+
},
56+
});
57+
}
58+
59+
export function getSelection() {
60+
const sel = _view.state.selection.main;
61+
return _view.state.sliceDoc(sel.from, sel.to);
62+
}
63+
64+
export function replaceSelection(text, select) {
65+
if (select === 'around') {
66+
const { from } = _view.state.selection.main;
67+
_view.dispatch(_view.state.replaceSelection(text));
68+
_view.dispatch({ selection: { anchor: from, head: from + text.length } });
69+
return;
70+
}
71+
72+
_view.dispatch(_view.state.replaceSelection(text));
73+
}
74+
75+
export function replaceRange(text, from, to) {
76+
_view.dispatch({
77+
changes: {
78+
from: posToOffset(from.line, from.ch),
79+
to: posToOffset(to.line, to.ch),
80+
insert: text,
81+
},
82+
});
83+
}
84+
85+
export function getValue() {
86+
return _view.state.doc.toString();
87+
}
88+
89+
export function setValue(text) {
90+
_view.dispatch({
91+
changes: {
92+
from: 0,
93+
to: _view.state.doc.length,
94+
insert: text,
95+
},
96+
});
97+
}
98+
99+
export function focus() {
100+
_view.focus();
101+
}
102+
103+
export function somethingSelected() {
104+
return !_view.state.selection.main.empty;
105+
}
106+
107+
export function hasFocus() {
108+
return _view.hasFocus;
109+
}
110+
111+
export function getDom() {
112+
return _view.dom;
113+
}
114+
115+
export function undo() {
116+
cmUndo(_view);
117+
}
118+
119+
export function redo() {
120+
cmRedo(_view);
121+
}

cm6-src/languages.js

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
// CodeMirror 6 Language Modes Registry
2+
// Supports all languages from CM5 Makefile (lines 84-86)
3+
4+
import { LanguageDescription, StreamLanguage } from '@codemirror/language';
5+
6+
// Dedicated language packages
7+
import { javascript } from '@codemirror/lang-javascript';
8+
import { python } from '@codemirror/lang-python';
9+
import { xml } from '@codemirror/lang-xml';
10+
import { markdown } from '@codemirror/lang-markdown';
11+
import { php } from '@codemirror/lang-php';
12+
import { sql } from '@codemirror/lang-sql';
13+
import { go } from '@codemirror/lang-go';
14+
import { rust } from '@codemirror/lang-rust';
15+
import { yaml } from '@codemirror/lang-yaml';
16+
import { html } from '@codemirror/lang-html';
17+
import { css } from '@codemirror/lang-css';
18+
import { json } from '@codemirror/lang-json';
19+
20+
// Legacy StreamLanguage modes
21+
import { shell } from '@codemirror/legacy-modes/mode/shell';
22+
import { c, cpp, java, csharp, scala, kotlin } from '@codemirror/legacy-modes/mode/clike';
23+
import { toml } from '@codemirror/legacy-modes/mode/toml';
24+
import { cmake } from '@codemirror/legacy-modes/mode/cmake';
25+
import { perl } from '@codemirror/legacy-modes/mode/perl';
26+
import { http } from '@codemirror/legacy-modes/mode/http';
27+
import { dockerFile } from '@codemirror/legacy-modes/mode/dockerfile';
28+
import { powerShell } from '@codemirror/legacy-modes/mode/powershell';
29+
import { properties } from '@codemirror/legacy-modes/mode/properties';
30+
import { stex } from '@codemirror/legacy-modes/mode/stex';
31+
import { nginx } from '@codemirror/legacy-modes/mode/nginx';
32+
import { haskell } from '@codemirror/legacy-modes/mode/haskell';
33+
import { lua } from '@codemirror/legacy-modes/mode/lua';
34+
import { jinja2 } from '@codemirror/legacy-modes/mode/jinja2';
35+
import { ruby } from '@codemirror/legacy-modes/mode/ruby';
36+
37+
/**
38+
* Language registry for CodeMirror 6
39+
* Covers all languages from CM5 Makefile: shell, clike, xml, python, javascript, markdown, yaml, php, sql, toml, cmake, perl, http, go, rust, dockerfile, powershell, properties, stex, nginx, haskell, lua, jinja2, ruby
40+
*/
41+
export const codeLanguages = [
42+
LanguageDescription.of({
43+
name: 'JavaScript',
44+
alias: ['javascript', 'js'],
45+
support: javascript()
46+
}),
47+
LanguageDescription.of({
48+
name: 'TypeScript',
49+
alias: ['typescript', 'ts'],
50+
support: javascript({ typescript: true })
51+
}),
52+
LanguageDescription.of({
53+
name: 'Python',
54+
alias: ['python', 'py'],
55+
support: python()
56+
}),
57+
LanguageDescription.of({
58+
name: 'XML',
59+
alias: ['xml'],
60+
support: xml()
61+
}),
62+
LanguageDescription.of({
63+
name: 'HTML',
64+
alias: ['html'],
65+
support: html()
66+
}),
67+
LanguageDescription.of({
68+
name: 'CSS',
69+
alias: ['css'],
70+
support: css()
71+
}),
72+
LanguageDescription.of({
73+
name: 'JSON',
74+
alias: ['json'],
75+
support: json()
76+
}),
77+
LanguageDescription.of({
78+
name: 'Markdown',
79+
alias: ['markdown', 'md'],
80+
support: markdown()
81+
}),
82+
LanguageDescription.of({
83+
name: 'YAML',
84+
alias: ['yaml', 'yml'],
85+
support: yaml()
86+
}),
87+
LanguageDescription.of({
88+
name: 'PHP',
89+
alias: ['php'],
90+
support: php()
91+
}),
92+
LanguageDescription.of({
93+
name: 'SQL',
94+
alias: ['sql'],
95+
support: sql()
96+
}),
97+
LanguageDescription.of({
98+
name: 'Go',
99+
alias: ['go'],
100+
support: go()
101+
}),
102+
LanguageDescription.of({
103+
name: 'Rust',
104+
alias: ['rust'],
105+
support: rust()
106+
}),
107+
LanguageDescription.of({
108+
name: 'Shell',
109+
alias: ['shell', 'bash', 'sh'],
110+
support: StreamLanguage.define(shell)
111+
}),
112+
LanguageDescription.of({
113+
name: 'C',
114+
alias: ['c'],
115+
support: StreamLanguage.define(c)
116+
}),
117+
LanguageDescription.of({
118+
name: 'C++',
119+
alias: ['cpp', 'c++'],
120+
support: StreamLanguage.define(cpp)
121+
}),
122+
LanguageDescription.of({
123+
name: 'Java',
124+
alias: ['java'],
125+
support: StreamLanguage.define(java)
126+
}),
127+
LanguageDescription.of({
128+
name: 'C#',
129+
alias: ['csharp', 'cs'],
130+
support: StreamLanguage.define(csharp)
131+
}),
132+
LanguageDescription.of({
133+
name: 'Scala',
134+
alias: ['scala'],
135+
support: StreamLanguage.define(scala)
136+
}),
137+
LanguageDescription.of({
138+
name: 'Kotlin',
139+
alias: ['kotlin'],
140+
support: StreamLanguage.define(kotlin)
141+
}),
142+
LanguageDescription.of({
143+
name: 'TOML',
144+
alias: ['toml'],
145+
support: StreamLanguage.define(toml)
146+
}),
147+
LanguageDescription.of({
148+
name: 'CMake',
149+
alias: ['cmake'],
150+
support: StreamLanguage.define(cmake)
151+
}),
152+
LanguageDescription.of({
153+
name: 'Perl',
154+
alias: ['perl'],
155+
support: StreamLanguage.define(perl)
156+
}),
157+
LanguageDescription.of({
158+
name: 'HTTP',
159+
alias: ['http'],
160+
support: StreamLanguage.define(http)
161+
}),
162+
LanguageDescription.of({
163+
name: 'Dockerfile',
164+
alias: ['dockerfile'],
165+
support: StreamLanguage.define(dockerFile)
166+
}),
167+
LanguageDescription.of({
168+
name: 'PowerShell',
169+
alias: ['powershell', 'ps1'],
170+
support: StreamLanguage.define(powerShell)
171+
}),
172+
LanguageDescription.of({
173+
name: 'Properties',
174+
alias: ['properties'],
175+
support: StreamLanguage.define(properties)
176+
}),
177+
LanguageDescription.of({
178+
name: 'LaTeX',
179+
alias: ['latex', 'tex', 'stex'],
180+
support: StreamLanguage.define(stex)
181+
}),
182+
LanguageDescription.of({
183+
name: 'Nginx',
184+
alias: ['nginx'],
185+
support: StreamLanguage.define(nginx)
186+
}),
187+
LanguageDescription.of({
188+
name: 'Haskell',
189+
alias: ['haskell'],
190+
support: StreamLanguage.define(haskell)
191+
}),
192+
LanguageDescription.of({
193+
name: 'Lua',
194+
alias: ['lua'],
195+
support: StreamLanguage.define(lua)
196+
}),
197+
LanguageDescription.of({
198+
name: 'Jinja2',
199+
alias: ['jinja2', 'jinja'],
200+
support: StreamLanguage.define(jinja2)
201+
}),
202+
LanguageDescription.of({
203+
name: 'Ruby',
204+
alias: ['ruby', 'rb'],
205+
support: StreamLanguage.define(ruby)
206+
})
207+
];
208+
209+
/**
210+
* Get language support by name (case-insensitive)
211+
* Supports all aliases defined in codeLanguages
212+
* @param {string} name - Language name or alias
213+
* @returns {LanguageSupport|null} Language support or null if not found
214+
*/
215+
export function getLanguage(name) {
216+
if (!name) return null;
217+
218+
const lower = name.toLowerCase();
219+
220+
// Find language by alias
221+
const desc = codeLanguages.find(d => d.alias.includes(lower));
222+
return desc ? desc.support : null;
223+
}

0 commit comments

Comments
 (0)