@@ -5,8 +5,11 @@ import { yCollab } from "y-codemirror.next";
55import { WebrtcProvider } from "y-webrtc" ;
66import { EditorView , basicSetup } from "codemirror" ;
77import { EditorState , Compartment } from "@codemirror/state" ;
8- import { javascript } from "@codemirror/lang-javascript" ;
8+ import { javascript , javascriptLanguage } from "@codemirror/lang-javascript" ;
99import { 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" ;
1013import "./styles.scss" ;
1114import { message , Select } from "antd" ;
1215import { language } from "@codemirror/language" ;
@@ -36,26 +39,56 @@ export const userColor =
3639const 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 * d e f \s | \s * c l a s s \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 * ( d e f | c l a s s ) \s / . test ( snippet ) ;
53+ const docIsJava = / ^ \s * ( c l a s s | p u b l i c \s + s t a t i c \s + v o i d \s + m a i n ) \s / . test (
54+ snippet
55+ ) ; // Java has some problems
56+ const docIsCpp = / ^ \s * ( # i n c l u d e | n a m e s p a c e | i n t \s + m a i n ) \s / . test ( snippet ) ; // Yet to test c++
57+ const docIsGo = / ^ ( p a c k a g e | i m p o r t | f u n c | t y p e | v a r | c o n s t ) \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