@@ -4,12 +4,15 @@ import {CustomElement, State} from 'jdomjs/src/decorators.ts'
44
55import { CodeEditor } from 'petrel/index.js'
66import { JavaScriptAutoComplete , DockerfileAutoComplete , HTMLAutoComplete , JSONAutoComplete , JavaAutoComplete , MarkdownAutoComplete , PHPAutoComplete , SQLAutoComplete , YAMLAutoComplete } from 'petrel/autocompletions.js'
7+ import emmet from 'petrel/src/plugins/emmet.js'
78import hljs from 'highlight.js'
89import LANGUAGE_REPLACEMENTS from './langReplacements.ts'
10+ import importHelper from "./importHelper.ts" ;
911const LANGUAGES = hljs . listLanguages ( )
1012
1113const AUTOCOMPLETIONS = [
1214 { language : "javascript" , file : JavaScriptAutoComplete } ,
15+ { language : "typescript" , file : JavaScriptAutoComplete } ,
1316 { language : "dockerfile" , file : DockerfileAutoComplete } ,
1417 { language : "html" , file : HTMLAutoComplete } ,
1518 { language : "json" , file : JSONAutoComplete } ,
@@ -26,6 +29,9 @@ export default class CodeEditorPart extends JDOMComponent {
2629 @State ( )
2730 selected = state < any > ( { } )
2831
32+ @State ( )
33+ files = state < any [ ] > ( [ ] )
34+
2935 codeEditor = new CodeEditor ( null )
3036
3137 currentLanguage = ''
@@ -34,6 +40,9 @@ export default class CodeEditorPart extends JDOMComponent {
3440
3541 timer : number = null
3642
43+ lastName : string = null
44+ deleteEmmetPlugin : any = null
45+
3746 constructor ( ) {
3847 super ( {
3948 shadowed : false
@@ -47,7 +56,6 @@ export default class CodeEditorPart extends JDOMComponent {
4756 }
4857
4958 updateEditorLang ( ) {
50- console . log ( 'huh' , this . selected . value . name )
5159 if ( ! this . selected . value . name || ( this . selected . value . name instanceof Hook ) )
5260 return ;
5361 let language ;
@@ -74,11 +82,18 @@ export default class CodeEditorPart extends JDOMComponent {
7482 this . codeEditor . setHighlighter ( c => hljs . highlight ( language , c ) . value )
7583
7684 this . codeEditor . setAutoCompleteHandler ( null )
77- for ( const autocompletion of AUTOCOMPLETIONS ) {
78- if ( autocompletion . language == language || ( autocompletion . language == "html" && isHTML ) ) {
79- ( async ( ) => {
80- this . codeEditor . setAutoCompleteHandler ( new autocompletion . file )
81- } ) ( )
85+ console . log ( { language } )
86+
87+ if ( language === 'xml' && (
88+ this . selected . value ?. name . endsWith ( '.vue' )
89+ || this . selected . value ?. name . endsWith ( '.svelte' )
90+ ) ) {
91+ this . codeEditor . setAutoCompleteHandler ( new JavaScriptAutoComplete ( ) )
92+ } else {
93+ for ( const autocompletion of AUTOCOMPLETIONS ) {
94+ if ( autocompletion . language == language || ( autocompletion . language == "html" && isHTML ) ) {
95+ this . codeEditor . setAutoCompleteHandler ( new autocompletion . file ( ) )
96+ }
8297 }
8398 }
8499 }
@@ -94,16 +109,72 @@ export default class CodeEditorPart extends JDOMComponent {
94109 }
95110 }
96111
112+ async updateLanguageAutocompletions ( ) {
113+ console . log ( 'Setting autocompletions' )
114+ if ( this . codeEditor . autoCompleteHandler instanceof JavaScriptAutoComplete ) {
115+ this . codeEditor . autoCompleteHandler . importScripts = [ ]
116+ this . files . value
117+ ?. filter ( f => f . name !== this . selected . value . name )
118+ ?. filter ( f => f . name . endsWith ( '.js' ) || f . name . endsWith ( '.jsx' ) )
119+ ?. forEach ( f => {
120+ const fHandler = new JavaScriptAutoComplete ( { disableAutoLoad : true } )
121+ fHandler . analyseCode ( f . contents )
122+ this . codeEditor . autoCompleteHandler . importScripts . push (
123+ {
124+ file : './' + f . name ,
125+ analysed : fHandler . analysed
126+ }
127+ )
128+ } )
129+
130+ this . files . value
131+ ?. filter ( f => f . name !== this . selected . value . name )
132+ ?. filter ( f => f . name . endsWith ( '.svelte' ) || f . name . endsWith ( '.vue' ) )
133+ ?. forEach ( f => {
134+ const fHandler = new JavaScriptAutoComplete ( { disableAutoLoad : true } )
135+ fHandler . analyseCode ( f . contents )
136+ this . codeEditor . autoCompleteHandler . importScripts . push (
137+ {
138+ file : './' + f . name ,
139+ analysed : {
140+ defaultExport : f . name . replace ( '.vue' , '' ) . replace ( '.svelte' , '' ) ,
141+ exports : [ ]
142+ }
143+ }
144+ )
145+ } )
146+
147+ this . codeEditor . autoCompleteHandler . importScripts . push ( ...importHelper )
148+ console . log ( 'ÖÖÖÖÖ' , this . codeEditor . autoCompleteHandler . importScripts )
149+ }
150+ }
151+
97152 dettach ( ) {
98153 this . selected . removeListener ( this . selectListener )
99154 }
100155
101156 render ( ) {
102157 const element = document . createElement ( 'div' )
103158 this . codeEditor . parentElement = element
159+ emmet ( this . codeEditor , {
160+ preventer : ( ) => {
161+ console . log ( this . codeEditor . autoCompleteHandler instanceof HTMLAutoComplete )
162+ return ! (
163+ this . codeEditor . autoCompleteHandler instanceof HTMLAutoComplete
164+ || this . selected . value ?. name ?. endsWith ( '.vue' )
165+ || this . selected . value ?. name ?. endsWith ( '.svelte' )
166+ || this . selected . value ?. name ?. endsWith ( '.jsx' )
167+ || this . selected . value ?. name ?. endsWith ( '.tsx' )
168+ )
169+ }
170+ } )
104171
105172 this . selectListener = this . selected . addListener ( v => {
106173 this . updateEditorLang ( )
174+ if ( this . lastName !== v . name ) {
175+ this . updateLanguageAutocompletions ( )
176+ this . lastName = v . name
177+ }
107178 if ( this . codeEditor . value !== v . contents ) {
108179 this . codeEditor . setValue ( v . contents )
109180 }
@@ -138,6 +209,7 @@ export default class CodeEditorPart extends JDOMComponent {
138209 this . codeEditor . setAutoCompleteHandler ( new JavaScriptAutoComplete ( ) )
139210 this . codeEditor . create ( )
140211 this . updateEditorLang ( )
212+ this . updateLanguageAutocompletions ( )
141213
142214 return html `${ element } `
143215 }
0 commit comments