打造个性化代码高亮组件

简介: 打造个性化代码高亮组件

效果

预览

预览地址:http://120.79.163.94//JYeontuComponents/#/codeHeightLightView

关键代码实现

主要是通过正则表达式来进行匹配替换。

找出嵌套标签
findTag(text) {
    let l = [],
        r = [];
    let res = [];
    for (let i = 0; i < text.length; i++) {
        if (text[i] == "<") {
            if (text[i + 1] == "!") continue;
            if (text[i + 1] == "/") {
                let j = i + 2;
                while (text[j] != ">") {
                    j++;
                }
                res.push(text.slice(l.pop(), j + 1));
            } else {
                l.push(i);
            }
        }
    }
    return res;
}
标签名高亮
replaceDfs(tagReg, textCode) {
    let res = textCode.replace(
        tagReg,
        (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) => {
            let res = "";
            if (s4 == undefined) return "<span>" + s1 + "</span>";
            res += "<span><<span>" + this.getColor("tagWord", s4) + " ";
            let text = s6.match(/>(.*)</);
            if (text && text.length > 1) {
                text = text[1];
            } else {
                text = "";
            }
            s6 = s6
                .split(/>.*<\//)[0]
                .replace(/ *= */g, "=")
                .split(" ");
            for (let i = 0; i < s6.length; i++) {
                if (s6[i] !== "") {
                    let t = s6[i].split("=");
                    if (t.length == 2) {
                        res += this.getColor("attrWord", t[0]);
                        res += " = ";
                        res += this.getColor("attrValue", t[1]);
                        if (i < s6.length - 1) res += " ";
                    } else {
                        t = s6[i].split(":");
                        if (t.length == 2) {
                            res += this.getColor("attrWord", t[0]);
                            res += ":";
                            res += this.getColor("attrValue", t[1]);
                            if (i < s6.length - 1) res += " ";
                        }
                    }
                }
            }
            res +=
                "<span>>" +
                text +
                "<</span>/" +
                this.getColor("tagWord", s4) +
                "<span>></span>";
            return res;
        }
    );
    return res;
}
关键字高亮
//字符串
let regStr = "('|\")(.*)('|\")";
showCode = showCode.replace(
    new RegExp(regStr, "g"),
    "<span style='color : " + colors.strWord + "'>$1$2$3</span>"
);
//js关键字
let keyWord = [...this.jsKeyWord];
keyWord = keyWord.concat([...this.jsKeyObj]);
for (let i = 0; i < keyWord.length; i++) {
    let regKeyWord =
        "((([\\t|\\r|\\n| ])*(" + keyWord[i] + "))( |,|\\.|\\(|;))";
    showCode = showCode.replace(
        new RegExp(regKeyWord, "g"),
        "<span style='color : " + colors.keyWord + "'>$2</span>$5"
    );
}
//自定义关键字
let keyWords = [...this.keyWords];
for (let i = 0; i < keyWords.length; i++) {
    let regKeyWord = "(" + keyWords[i].value + ")";
    showCode = showCode.replace(
        new RegExp(regKeyWord, "g"),
        "<span style='color : " +
            keyWords[i].color +
            " !important;'>$1</span>"
    );
}
//js方法
let functions = /([a-zA-Z0-9_]+)\([A-Za-z,0-9]*\)/g;
let functionKeyWord = showCode.match(functions) || [];
functionKeyWord = functionKeyWord
    .map(item => {
        return item.slice(0, item.indexOf("("));
    })
    .sort((a, b) => {
        return b.length - a.length;
    });
for (let i = 0; i < functionKeyWord.length; i++) {
    let regFunctionKeyWord = "(" + functionKeyWord[i] + ")";
    showCode = showCode.replace(
        new RegExp(regFunctionKeyWord, "g"),
        "<span style='color : " +
            colors.functionkeyWord +
            "'>$1</span>"
    );
}
//内置方法
let methodKeyWord = [...methodKeyWord];
for (let i = 0; i < methodKeyWord.length; i++) {
    let regMethodKeyWord = "(" + methodKeyWord[i] + ")";
    showCode = showCode.replace(
        new RegExp(regMethodKeyWord, "g"),
        "<span style='color : " +
            colors.methodkeyWord +
            "'>$1</span>"
    );
}
//变量名
let varReg = /([a-zA-Z]+):/g;
showCode = showCode.replace(
    varReg,
    "<span style='color : " + colors.varWord + "'>$1</span>:"
);
//注释
showCode = showCode.replace(
    /(\/\/.*)|(\/\*.*([\r\n].*)*\*\/)/g,
    "<span style='color :" + colors.note + "'>$1$2</span>"
);

npm引入

组件以上传到npm,可以直接install使用,0.1.4以上版本加入了该组件。

1.安装
npm i @jyeontu/jvuewheel -S
2.引入
//引入组件库
import jvuewheel from '@jyeontu/jvuewheel'
//引入样式
import '@jyeontu/jvuewheel/lib/jvuewhell.css'
Vue.use(jvuewheel);
3.vue中引用组件
<j-code-height-light :code = "code" 
        :keyWords = "keyWords" 
        :color = "color">
</j-code-height-light>

资源地址

组件使用文档

文档地址:http://120.79.163.94/JYeontuComponents/#/homePage

源码地址

目前该组件还存在一些未知bug,有兴趣的可以一起来改造。

Gitee地址:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse/tree/master/JYeontuComponentWarehouse

目录
相关文章
|
2月前
|
移动开发
Uniapp 多功能富文本编辑组件 可多端使用 H5插入
Uniapp 多功能富文本编辑组件 可多端使用 H5插入
78 0
|
2月前
|
XML 前端开发 JavaScript
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
前端图形学实战: 从零实现编辑器的图层管理面板和实时缩略图(vue3 + vite版)
56 0
|
Python
Markdown 拓展-Docsify 主题美化
docsify-themeable - A delightfully simple theme system for docsify.js https://jhildenbiddle.github.io/docsify-themeable/#/
1154 0
|
16天前
|
编解码 前端开发 JavaScript
带您一步步构建一个基本的动态新闻网站,包括页面布局、样式设计以及交互效果的实现
【6月更文挑战第14天】构建动态新闻网站实战项目,涉及页面布局、样式设计和交互实现。首页采用顶部导航栏、轮播图和新闻列表布局;新闻列表页按分类显示新闻,详情页展示完整内容并可添加相关推荐和评论。设计注重色彩搭配、字体选择和布局间距,实现轮播图效果、导航栏交互和响应式设计,提升用户体验。该项目有助于锻炼HTML和CSS技能,理解网页设计实际应用。
53 1
|
2月前
|
移动开发 小程序 前端开发
【5月开发者日回顾】自定义TabBar、自定义组件支持 observers两大功能即将上线
【5月开发者日回顾】自定义TabBar、自定义组件支持 observers两大功能即将上线
33 11
|
9月前
|
存储 数据可视化 JavaScript
Three.js:打造独一无二的3D模型可视化编辑神器!
因为之前工作过的可视化大屏项目开发3d大屏组件模块需要用到Three.js来完成,其主功能是实现对3d模型的材质,灯光,背景,动画。等属性进行可视化的编辑操作以及模型编辑数据的存储和模型在大屏上面的拖拽显示
323 1
Three.js:打造独一无二的3D模型可视化编辑神器!
|
11月前
|
JavaScript 前端开发 C#
如何将现有的Blazor项目的主题切换写的更好看?
如何将现有的Blazor项目的主题切换写的更好看?
78 1
|
12月前
|
搜索推荐 JavaScript 数据可视化
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
425 0
|
JavaScript
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
173 0
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
|
定位技术 API 开发工具
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块
294 0
【Vue3.0移动端项目--旅游网】-- 集成百度地图以及底部模块