背景

最近遇到一个需求是在 sql-hint提供的自动提示关键词的基础上,需要可以自定义关键词。

解析

在上一篇文章我们知道,实现自动提示的功能,需要引入下面四个js文件

require("codemirror/lib/codemirror");
require("codemirror/mode/sql/sql");
require("codemirror/addon/hint/show-hint");
require("codemirror/addon/hint/sql-hint");

这里面sql-hint是针对sql提示的js文件,我们找到它的位置并查看其源码:

源码里最开始定义的变量:tablesdefaultTablekeywords。tables是可以直接在options配置的hintOptions属性设置的,如果我们需要自动提示表名和表的字段:

options:{hintOptions:{tables:{xxx0_table_name:[],xxx1_table_name:['attribute_1','attribute_2']}}
}

而keywords自然和我们需要实现的自定义关键字有关系,搜索这个keywords,发现源码有一个方法:

 function getKeywords(editor) {var mode = editor.doc.modeOption;if (mode === "sql") mode = "text/x-sql";return CodeMirror.resolveMode(mode).keywords;}

然后在registerHelper(这个是提供给外界定义提示模式配置的方法,我们也可以自己调用它)方法中,

CodeMirror.registerHelper("hint", "sql", function(editor, options) {...keywords = getKeywords(editor);...
}

得出结论

这样就明显了,关键词是通过 CodeMirror.resolveMode(mode).keywords得到的。mode我自己设置的是’text/x-mariadb’, 我们打印一下CodeMirror.resolveMode(mode)这个对象看看:

let CodeMirror = require("codemirror/lib/codemirror");
console.log(CodeMirror.resolveMode("text/x-mariadb"));

打印的结果:

keywords 就是关键词的配置,可以看到,它是使用对象格式的。

实现功能

现在我们在一个常量文件里配置我们自己的关键词数组:

  SQL_CUSTOM_KEYWORDS: ['xxxxxxxx'],

然后在使用编辑器的地方把它加入关键词:

 constant.SQL_CUSTOM_KEYWORDS.forEach(words => {CodeMirror.resolveMode("text/x-mariadb").keywords[words] = true;});

附加知识

在stackoverflow有人在js-hint里自定义关键字使用这样的方式:

var orig = CodeMirror.hint.javascript;
CodeMirror.hint.javascript = function(cm) {var inner = orig(cm) || {from: cm.getCursor(), to: cm.getCursor(), list: []};inner.list.push("bozo");return inner;
};

我试着将CodeMirror.hint.javascript切换为sql,自动提示列表确实出现了push的内容,不过并没有和其他关键字一样高亮,结合sql-hint源码

CodeMirror.registerHelper("hint", "sql", function(editor, options) {......addMatches(result, search, defaultTable, function(w) {return objectOrClass(w, "CodeMirror-hint-table CodeMirror-hint-default-table");});addMatches(result,search,tables, function(w) {return objectOrClass(w, "CodeMirror-hint-table");});if (!disableKeywords)addMatches(result, search, keywords, function(w) {return objectOrClass(w.toUpperCase(), "CodeMirror-hint-keyword");});return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};}

CodeMirror.hint.sql的内容看上去和registerHelper的回调方法是一件事情,只是由于直接往list里push字符串,它并不能知道是keyword还是table/default-table,所以没有高亮。

CodeMirror自定义关键词以及关键词功能的源码相关推荐

  1. Thinkphp内核SEO按天关键词计费排名查询系统源码

    本资源可免费获取,请至尾部读阅! Thinkphp内核SEO按天关键词计费排名查询系统源码. 功能特点: 1.会员管理: 系统共分三级会员流程.总站管理员, 代理, 和会员(会员分三个等级,普通会员, ...

  2. 抖音账号矩阵系统/抖音seo霸屏系统源码/关键词短视频账号矩阵源码/独立私有部署/可定制开发

    前言:抖音账号矩阵系统/抖音seo霸屏系统源码/关键词短视频账号矩阵源码/独立私有部署/可定制开发 场景:抖音账号矩阵系统/抖音seo霸屏系统/抖音矩阵seo系统源码/独立部署,技术团队如何围绕抖音矩 ...

  3. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)

    场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...

  4. 购物车的功能——JS源码

    此CSS的对应的是"购物车的功能--界面源码"的内容和"购物车的功能--CSS源码"的内容,希望大家不要乱 $(function(){//点击复选框全选或全不选 ...

  5. Qt利用avilib实现录屏功能_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...

    内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...

  6. arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...

    内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...

  7. VC++利用笔记本自带摄像头扫二维码功能(附源码demo)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第8章:VC++利用笔记本自带摄像头扫二维码功能(附源码demo) 源代码demo已上传到百度网盘:永久生效  ,代码实现了打开笔记本 ...

  8. VC++实现的软键盘功能(附源码)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 软键盘界面如下: 置于桌面窗口最顶层: 置顶介绍: if (hwnd = FindWindow(NULL, szTitle)){// ...

  9. srs可以用java开发吗,为SRS流媒体服务器添加HLS加密功能(附源码)

    #为SRS流媒体服务器添加HLS加密功能(附源码)# 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的 ...

  10. 135k代驾安装教程+功能模块源码+前端源码

    简介: 135k代驾安装教程+功能模块源码+前端源码 网盘下载地址: http://kekewangLuo.net/pOYRFCVcFvC0 教程: 微信公众号配置: 登录服务号,注意:必须是服务号, ...

最新文章

  1. 微擎 jssdk php文件,微擎register_jssdk分享到朋友功能无法使用的问题及解决办法
  2. 深度学习的实时面部姿势估计研究
  3. 解决Tomcat 7遇到StackOverflowError的异常
  4. 如何配置pom.xml用maven打包java工程
  5. JAR文件——2017.08.04
  6. matlab中描绘简单曲线和点
  7. 采用ASP.NET IIS 注册工具 (Aspnet_regiis.exe)对web.config实行本地加密
  8. 联想办公计算机,办公娱乐两不误!联想这些笔记本电脑不容错过
  9. edmonds算法matlab,匈牙利算法的matlab实现
  10. 动态规划进阶题目之滑雪
  11. asmack xmpp应用遇到的问题
  12. PIFA-平面倒F天线[搬运]
  13. 反转链表-递归反转法
  14. 辽宁民办计算机学校排名2015,2021辽宁民办大学排名 最新高校排行榜
  15. 微信小游戏声明文件(d.ts)
  16. 华为p4不是鸿蒙吗怎么又改为安卓_鸿蒙系统是不是就是改版的安卓系统?
  17. 【QT小记】设置窗口背景透明
  18. 百度闪电算法实时解读
  19. 常见服务器返回状态码
  20. 微软苏州校招1月3日在线编程题1——constellations

热门文章

  1. love the way you lie
  2. 站在CNN肩膀上的巨大腾飞,Swin Transformer:实现对各类SOTA的降维打击
  3. el-calendar尺寸修改
  4. python音乐下载器交互界面设计_Python爬虫实战:制作各大音乐平台的聚合的音乐下载器...
  5. MQ 之 RocketMQ 核心知识点
  6. 黑白照片如何变彩色?手把手教你变彩色
  7. CSS3 3D旋转图片立方体特效
  8. windows上面运行jar文件
  9. vue 点击删除常用方式
  10. iPhone/iPad查看UDID教程