Monaco Editor实现sql和java代码提示实现示例

作者:柳杉 时间:2023-01-31 16:59:48 

monaco editor创建

//创建和设置值
if (!this.monacoEditor) {
 this.monacoEditor = monaco.editor.create(this._node, {
   value: value || code,
   language: language,
   ...options
 });
 this.monacoEditor.onDidChangeModelContent(e => {
   const value = this.monacoEditor.getValue(); //使value和其值保持一致
   if (value !== this.value) {
     this.value = value;
     this.props.getValue && this.props.getValue(value)
   }
 });
}
// 设置编辑器语言
 this.completionItemProvider = monaco.languages.registerCompletionItemProvider(
   language,
   {
     triggerCharacters: [' ', '.', ...this.triggerCharacters],
     provideCompletionItems: (model, position) =>
       this.sqlSnippets.provideCompletionItems(model, position)
   }
 )

sql提示(库表字段关联)

async provideCompletionItems(model, position) {
 const { lineNumber, column } = position
 // 光标前文本
 const textBeforePointer = model.getValueInRange({
   startLineNumber: lineNumber,
   startColumn: 0,
   endLineNumber: lineNumber,
   endColumn: column
 })
 const textBeforePointerMulti = model.getValueInRange({
   startLineNumber: 1,
   startColumn: 0,
   endLineNumber: lineNumber,
   endColumn: column
 })
 // 光标后文本
 // const textAfterPointer = model.getValueInRange({
 //   startLineNumber: lineNumber,
 //   startColumn: column,
 //   endLineNumber: lineNumber,
 //   endColumn: model.getLineMaxColumn(model.getLineCount())
 // })
 const textAfterPointerMulti = model.getValueInRange({
   startLineNumber: lineNumber,
   startColumn: column,
   endLineNumber: model.getLineCount(),
   endColumn: model.getLineMaxColumn(model.getLineCount())
 })
 // const nextTokens = textAfterPointer.trim().split(/\s+/)
 // const nextToken = nextTokens[0].toLowerCase()
 const tokens = textBeforePointer.trim().split(/\s+/)
 const lastToken = tokens[tokens.length - 1].toLowerCase()
 // 数据库名联想
 if (lastToken === 'database') {
   return {
     suggestions: this.getDataBaseSuggest()
   }
   // <库名>.<表名> || <别名>.<字段>
 } else if (lastToken.endsWith('.')) {
   // 去掉点后的字符串
   const tokenNoDot = lastToken.slice(0, lastToken.length - 1)
   if (this.dbSchema.find(db => db.dbName === tokenNoDot.replace(/^.*,/g, ''))) {
     // <库名>.<表名>联想
     return {
       suggestions: [...this.getTableSuggestByDbName(tokenNoDot.replace(/^.*,/g, ''))]
     }
   } else if (this.getTableNameAndTableAlia(textBeforePointerMulti.split(';')[textBeforePointerMulti.split(';').length - 1] + textAfterPointerMulti.split(';')[0])) {
     const tableInfoList = this.getTableNameAndTableAlia(textBeforePointerMulti.split(';')[textBeforePointerMulti.split(';').length - 1] + textAfterPointerMulti.split(';')[0])
     const currentTable = tableInfoList.find(item => item.tableAlia === tokenNoDot.replace(/^.*,/g, ''))
     // <别名>.<字段>联想
     if (currentTable && currentTable.tableName) {
       return {
         suggestions: await this.getTableColumnSuggestByTableAlia(currentTable.tableName)
       }
     } else {
       return {
         suggestions: []
       }
     }
   } else {
     return {
       suggestions: []
     }
   }
   // 库名联想
 } else if (lastToken === 'from' || lastToken === 'join' || /(from|join)\s+.*?\s?,\s*$/.test(textBeforePointer.replace(/.*?(/gm, '').toLowerCase())) {
   // const tables = this.getTableSuggest()
   const databases = this.getDataBaseSuggest()
   return {
     suggestions: databases
   }
   // 字段联想
 } else if (['select', 'where', 'order by', 'group by', 'by', 'and', 'or', 'having', 'distinct', 'on'].includes(lastToken.replace(/.*?(/g, '')) || (lastToken.endsWith('.') && !this.dbSchema.find(db => `${db.dbName}.` === lastToken)) || /(select|where|order by|group by|by|and|or|having|distinct|on)\s+.*?\s?,\s*$/.test(textBeforePointer.toLowerCase())) {
   return {
     suggestions: await this.getTableColumnSuggest()
   }
   // 自定义字段联想
 } else if (this.customKeywords.toString().includes(lastToken)) {
   return {
     suggestions: this.getCustomSuggest(lastToken.startsWith('$'))
   }
   // 默认联想
 } else {
   return {
     suggestions: [...this.getDataBaseSuggest(), ...this.getTableSuggest(), ...this.getKeywordSuggest()]
   }
 }
}

java自定义联想

monaco.languages.registerCompletionItemProvider(
 language,
 {
   triggerCharacters: ['ds.','.'],
   provideCompletionItems: (model, position) =>{
     const { lineNumber, column } = position
     // 光标前文本
     const textBeforePointer = model.getValueInRange({
       startLineNumber: lineNumber,
       startColumn: 0,
       endLineNumber: lineNumber,
       endColumn: column
     })
     if(['ds.'].includes(textBeforePointer)){
       return {suggestions: [
           {
             label: 'connection("")', //显示的提示名称
             insertText: 'connection("")' //选择后粘贴到编辑器中的文字
           },
           {
             label: 'query("","")',
             insertText: 'query("","")'
           },
         ]};
     }
     if(['ds.connection("").'].includes(textBeforePointer)){
       return {suggestions: [
           {
             label: 'query("")',
             insertText: 'query("")',
           },
         ]};
     }
   }
 }
)

来源:https://juejin.cn/post/6986907628937379871

标签:Monaco,Editor,代码提示,sql,java
0
投稿

猜你喜欢

  • 在springboot中对kafka进行读写的示例代码

    2023-11-26 00:48:02
  • Flink开发IDEA环境搭建与测试的方法

    2023-02-21 21:20:46
  • IDEA 2019.2.3破解激活教程(亲测有效)

    2023-02-21 22:16:23
  • c# 反射+自定义特性保存数据至本地

    2023-03-14 03:07:40
  • Java实例讲解动态代理

    2023-03-21 22:56:45
  • 聊聊Spring——AOP详解(AOP概览)

    2023-11-01 04:44:18
  • Android APK反编译图文教程

    2022-02-04 01:46:46
  • Android Dialog 设置字体大小的具体方法

    2023-09-12 12:46:49
  • Java SpringBoot拦截器详解

    2021-11-01 15:29:37
  • Java实现插入排序实例

    2023-02-13 17:09:21
  • spring启动加载程序的几种方法介绍

    2022-03-11 14:15:32
  • java 中锁的性能提高办法

    2021-07-28 10:50:28
  • C#执行外部命令的方法

    2022-12-21 18:03:32
  • Java 栈与队列实战真题训练

    2021-06-11 01:46:08
  • Android AIDL实现两个APP间的跨进程通信实例

    2022-03-29 08:37:54
  • Java读取json数据并存入数据库的操作代码

    2023-09-23 06:00:57
  • Java锁擦除与锁粗化概念和使用详解

    2022-02-09 15:32:30
  • Android Studio快捷键生成TAG、Log.x日志输出介绍

    2022-03-14 02:10:37
  • Java 抽象类定义与方法实例详解

    2022-10-20 09:26:38
  • Java 从互联网上爬邮箱代码示例

    2022-02-27 16:40:57
  • asp之家 软件编程 m.aspxhome.com