Skip to content

Commit e5acf02

Browse files
committed
Add configuration for other auto language detection and syntax highlighting
1 parent a0d4d02 commit e5acf02

File tree

3 files changed

+109
-18
lines changed

3 files changed

+109
-18
lines changed

apps/frontend/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
"dependencies": {
1212
"@ant-design/icons": "^5.5.1",
1313
"@ant-design/nextjs-registry": "^1.0.1",
14+
"@codemirror/lang-cpp": "^6.0.2",
15+
"@codemirror/lang-go": "^6.0.1",
16+
"@codemirror/lang-java": "^6.0.1",
1417
"@codemirror/lang-javascript": "^6.2.2",
1518
"@codemirror/lang-python": "^6.1.6",
1619
"@codemirror/language": "^6.10.3",

apps/frontend/pnpm-lock.yaml

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/frontend/src/components/CollaborativeEditor/CollaborativeEditor.tsx

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import { yCollab } from "y-codemirror.next";
55
import { WebrtcProvider } from "y-webrtc";
66
import { EditorView, basicSetup } from "codemirror";
77
import { EditorState, Compartment } from "@codemirror/state";
8-
import { javascript } from "@codemirror/lang-javascript";
8+
import { javascript, javascriptLanguage } from "@codemirror/lang-javascript";
99
import { python, pythonLanguage } from "@codemirror/lang-python";
10+
import { javaLanguage, java } from "@codemirror/lang-java";
11+
import { cppLanguage, cpp } from "@codemirror/lang-cpp";
12+
import { goLanguage, go } from "@codemirror/lang-go";
1013
import "./styles.scss";
1114
import { message, Select } from "antd";
1215
import { language } from "@codemirror/language";
@@ -36,26 +39,56 @@ export const userColor =
3639
const CollaborativeEditor = (props: CollaborativeEditorProps) => {
3740
const editorRef = useRef(null);
3841
// const viewRef = useRef<EditorView | null>(null);
39-
const [selectedLanguage, setSelectedLanguage] = useState("javascript");
42+
const [selectedLanguage, setSelectedLanguage] = useState("JavaScript");
4043
const [trigger, setTrigger] = useState(false);
4144

4245
const languageConf = new Compartment();
4346

4447
const autoLanguage = EditorState.transactionExtender.of((tr) => {
4548
if (!tr.docChanged) return null;
46-
const docIsPython = /^\s*def\s|\s*class\s/.test(
47-
tr.newDoc.sliceString(0, 100)
48-
);
49-
const stateIsPython = tr.startState.facet(language) === pythonLanguage;
50-
if (docIsPython === stateIsPython) return null;
5149

52-
const newLanguage = docIsPython ? "python" : "javascript";
53-
setSelectedLanguage(newLanguage);
50+
const snippet = tr.newDoc.sliceString(0, 100);
51+
// Test for various language
52+
const docIsPython = /^\s*(def|class)\s/.test(snippet);
53+
const docIsJava = /^\s*(class|public\s+static\s+void\s+main)\s/.test(
54+
snippet
55+
); // Java has some problems
56+
const docIsCpp = /^\s*(#include|namespace|int\s+main)\s/.test(snippet); // Yet to test c++
57+
const docIsGo = /^(package|import|func|type|var|const)\s/.test(snippet);
58+
59+
let newLanguage;
60+
let languageType;
61+
let languageLabel;
62+
63+
if (docIsPython) {
64+
newLanguage = python();
65+
languageLabel = "Python";
66+
languageType = pythonLanguage;
67+
} else if (docIsJava) {
68+
newLanguage = java();
69+
languageLabel = "Java";
70+
languageType = javaLanguage;
71+
} else if (docIsGo) {
72+
newLanguage = go();
73+
languageLabel = "Go";
74+
languageType = goLanguage;
75+
} else if (docIsCpp) {
76+
newLanguage = cpp();
77+
languageLabel = "C++";
78+
languageType = cppLanguage;
79+
} else {
80+
newLanguage = javascript(); // Default to JavaScript
81+
languageLabel = "JavaScript";
82+
languageType = javascriptLanguage;
83+
}
84+
85+
const stateLanguage = tr.startState.facet(language);
86+
if (languageType == stateLanguage) return null;
87+
88+
setSelectedLanguage(languageLabel);
5489

5590
return {
56-
effects: languageConf.reconfigure(
57-
newLanguage === "python" ? python() : javascript()
58-
),
91+
effects: languageConf.reconfigure(newLanguage),
5992
};
6093
});
6194

@@ -164,19 +197,15 @@ const CollaborativeEditor = (props: CollaborativeEditorProps) => {
164197
defaultValue={selectedLanguage}
165198
options={ProgrammingLanguageOptions}
166199
onSelect={(val) => setSelectedLanguage(val)}
200+
disabled
167201
/>
168202
</div>
169203
<div
170204
ref={editorRef}
171205
style={{ height: "400px", border: "1px solid #ddd" }}
172206
/>
173207
<div className="language-detected">
174-
<strong>Current Language Detected: </strong>{" "}
175-
{
176-
ProgrammingLanguageOptions.find(
177-
(language) => language.value === selectedLanguage
178-
)?.label
179-
}
208+
<strong>Current Language Detected: </strong> {selectedLanguage}
180209
</div>
181210
</>
182211
);

0 commit comments

Comments
 (0)