Monaco Editor怎么实现SQL和Java代码提示

数据库   发布日期:2024年10月07日   浏览次数:39

这篇文章主要介绍了Monaco Editor怎么实现SQL和Java代码提示的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Monaco Editor怎么实现SQL和Java代码提示文章都会有所收获,下面我们一起来看看吧。

monaco editor创建

  1. //创建和设置值
  2. if (!this.monacoEditor) {
  3. this.monacoEditor = monaco.editor.create(this._node, {
  4. value: value || code,
  5. language: language,
  6. ...options
  7. });
  8. this.monacoEditor.onDidChangeModelContent(e => {
  9. const value = this.monacoEditor.getValue(); //使value和其值保持一致
  10. if (value !== this.value) {
  11. this.value = value;
  12. this.props.getValue && this.props.getValue(value)
  13. }
  14. });
  15. }
  1. // 设置编辑器语言
  2. this.completionItemProvider = monaco.languages.registerCompletionItemProvider(
  3. language,
  4. {
  5. triggerCharacters: [' ', '.', ...this.triggerCharacters],
  6. provideCompletionItems: (model, position) =>
  7. this.sqlSnippets.provideCompletionItems(model, position)
  8. }
  9. )

sql提示(库表字段关联)

  1. async provideCompletionItems(model, position) {
  2. const { lineNumber, column } = position
  3. // 光标前文本
  4. const textBeforePointer = model.getValueInRange({
  5. startLineNumber: lineNumber,
  6. startColumn: 0,
  7. endLineNumber: lineNumber,
  8. endColumn: column
  9. })
  10. const textBeforePointerMulti = model.getValueInRange({
  11. startLineNumber: 1,
  12. startColumn: 0,
  13. endLineNumber: lineNumber,
  14. endColumn: column
  15. })
  16. // 光标后文本
  17. // const textAfterPointer = model.getValueInRange({
  18. // startLineNumber: lineNumber,
  19. // startColumn: column,
  20. // endLineNumber: lineNumber,
  21. // endColumn: model.getLineMaxColumn(model.getLineCount())
  22. // })
  23. const textAfterPointerMulti = model.getValueInRange({
  24. startLineNumber: lineNumber,
  25. startColumn: column,
  26. endLineNumber: model.getLineCount(),
  27. endColumn: model.getLineMaxColumn(model.getLineCount())
  28. })
  29. // const nextTokens = textAfterPointer.trim().split(/s+/)
  30. // const nextToken = nextTokens[0].toLowerCase()
  31. const tokens = textBeforePointer.trim().split(/s+/)
  32. const lastToken = tokens[tokens.length - 1].toLowerCase()
  33. // 数据库名联想
  34. if (lastToken === 'database') {
  35. return {
  36. suggestions: this.getDataBaseSuggest()
  37. }
  38. // <库名>.<表名> || <别名>.<字段>
  39. } else if (lastToken.endsWith('.')) {
  40. // 去掉点后的字符串
  41. const tokenNoDot = lastToken.slice(0, lastToken.length - 1)
  42. if (this.dbSchema.find(db => db.dbName === tokenNoDot.replace(/^.*,/g, ''))) {
  43. // <库名>.<表名>联想
  44. return {
  45. suggestions: [...this.getTableSuggestByDbName(tokenNoDot.replace(/^.*,/g, ''))]
  46. }
  47. } else if (this.getTableNameAndTableAlia(textBeforePointerMulti.split(';')[textBeforePointerMulti.split(';').length - 1] + textAfterPointerMulti.split(';')[0])) {
  48. const tableInfoList = this.getTableNameAndTableAlia(textBeforePointerMulti.split(';')[textBeforePointerMulti.split(';').length - 1] + textAfterPointerMulti.split(';')[0])
  49. const currentTable = tableInfoList.find(item => item.tableAlia === tokenNoDot.replace(/^.*,/g, ''))
  50. // <别名>.<字段>联想
  51. if (currentTable && currentTable.tableName) {
  52. return {
  53. suggestions: await this.getTableColumnSuggestByTableAlia(currentTable.tableName)
  54. }
  55. } else {
  56. return {
  57. suggestions: []
  58. }
  59. }
  60. } else {
  61. return {
  62. suggestions: []
  63. }
  64. }
  65. // 库名联想
  66. } else if (lastToken === 'from' || lastToken === 'join' || /(from|join)s+.*?s?,s*$/.test(textBeforePointer.replace(/.*?(/gm, '').toLowerCase())) {
  67. // const tables = this.getTableSuggest()
  68. const databases = this.getDataBaseSuggest()
  69. return {
  70. suggestions: databases
  71. }
  72. // 字段联想
  73. } 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())) {
  74. return {
  75. suggestions: await this.getTableColumnSuggest()
  76. }
  77. // 自定义字段联想
  78. } else if (this.customKeywords.toString().includes(lastToken)) {
  79. return {
  80. suggestions: this.getCustomSuggest(lastToken.startsWith('$'))
  81. }
  82. // 默认联想
  83. } else {
  84. return {
  85. suggestions: [...this.getDataBaseSuggest(), ...this.getTableSuggest(), ...this.getKeywordSuggest()]
  86. }
  87. }
  88. }

java自定义联想

  1. monaco.languages.registerCompletionItemProvider(
  2. language,
  3. {
  4. triggerCharacters: ['ds.','.'],
  5. provideCompletionItems: (model, position) =>{
  6. const { lineNumber, column } = position
  7. // 光标前文本
  8. const textBeforePointer = model.getValueInRange({
  9. startLineNumber: lineNumber,
  10. startColumn: 0,
  11. endLineNumber: lineNumber,
  12. endColumn: column
  13. })
  14. if(['ds.'].includes(textBeforePointer)){
  15. return {suggestions: [
  16. {
  17. label: 'connection("")', //显示的提示名称
  18. insertText: 'connection("")' //选择后粘贴到编辑器中的文字
  19. },
  20. {
  21. label: 'query("","")',
  22. insertText: 'query("","")'
  23. },
  24. ]};
  25. }
  26. if(['ds.connection("").'].includes(textBeforePointer)){
  27. return {suggestions: [
  28. {
  29. label: 'query("")',
  30. insertText: 'query("")',
  31. },
  32. ]};
  33. }
  34. }
  35. }
  36. )

以上就是Monaco Editor怎么实现SQL和Java代码提示的详细内容,更多关于Monaco Editor怎么实现SQL和Java代码提示的资料请关注九品源码其它相关文章!