博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度编辑器(ueditor)魔改:3、高亮提示、搜索(广告词、违禁词等)
阅读量:4162 次
发布时间:2019-05-26

本文共 9500 字,大约阅读时间需要 31 分钟。

-----------------------------------------------------------

最近广告法实施力度好大,很多词都要下线了,但是新发的时候总得给用户一个提示,所以我们来做一个高亮显示的功能吧。

之前我们追加的按钮adwordfilter就是做这个用的

第一步:定义提醒词条

UE.commands['adwordfilter'] = {    execCommand: function (cmd, opt) {        var fw = ['最', '最佳', '最具', '最爱', '最赚', '最优', '最优秀', '最好', '最大', '最大程度', '最高'];        fw.push('最高档', '最高级', '最奢侈', '最低', '最低级', '最低价', '最底', '最便宜', '时尚最低价', '最流行');        fw.push('最受欢迎', '最时尚', '最聚拢', '最符合', '最舒适', '最先', '最先进', '最先进科学', '最先进加工工艺');        fw.push('最先享受', '最后', '最后一波', '最新', '最新科技', '最新科学', '与“一”有关', '第一', '中国第一');        fw.push('全网第一', '销量第一', '排名第一', '唯一', '第一品牌', 'NO.1', 'TOP.1', '独一无二', '全国第一', '一流');        fw.push('一天', '仅此', '最后一波', '大品牌之一', '国家级', '全球级', '宇宙级', '世界级', '顶级', '顶尖', '尖端');        fw.push('顶级工艺', '顶级享受', '极品', '极佳', '绝佳', '绝对', '终极', '极致', '首个', '首选', '独家', '独家配方');        fw.push('全国首发', '首款', '全国销量冠军', '国家级产品', '国家', '国家免检', '填补国内空白', '王牌', '领袖品牌');        fw.push('世界领先', '领导者', '缔造者', '创领品牌', '领先上市', '至尊', '巅峰', '领袖', '之王', '王者', '冠军');        fw.push('史无前例', '前无古人', '永久', '万能', '祖传', '特效', '无敌', '纯天然', '100%', '恭喜获奖', '全民免单');        fw.push('倒计时', '趁现在', '仅限', '周末', '周年庆', '特惠趴', '购物大趴', '闪购', '品牌团', '精品团', '单品团');        fw.push('随时涨价', '马上降价', '机关推荐', '机关专供', '特供', '质量免检', '免抽检', '老字号', '中国驰名商标');        fw.push('特供', '专供', '化解小人', '增加事业运', '招财进宝', '健康富贵', '提升运气', '有助事业', '护身');        fw.push('平衡正负能量', '消除精神压力', '调和气压', '逢凶化吉', '时来运转', '万事亨通', '旺人', '旺财', '助吉避凶');        fw.push('转富招福', '特效', '高效', '全效', '强效', '速效', '天见效', '周期见效', '超强', '激活', '全方位');        fw.sort();        fw.sort(function (x, y) {            if (x.indexOf(y) > -1) {                return -1;            } else {                return 1;            }        });        var filter = new RegExp('(' + fw.join('|').replace(/\./gi, '\\.') + ')', 'gi');        var me = this;    }}

这个词条可以自己任意定义,用数组方式是为了方便维护,然后将词条转成正则,用正则的方式匹配正文,然后加样式进行处理

在定义词条的数组,我们还进行了两次排序,是为了避免出现短词比长词提醒优先的问题,例如“最大”,应该是两个字同时高亮,而不是只有一个最字高亮,所以进行排序

第二步:加上高亮

打开themes\default\iframe.css,这个文件是编辑器内部的样式,如果在编辑器内要显示不同样式,在这里定义即可

.highlight {background:yellow;color:red;}

定义好高亮样式后,在编辑器内的内容,就可以直接追加这个样式了

打开src\adapter\editor.js,找到editor.addListener("afterpaste", function () {这一行,我们在这个事件里追加一个动作

editor.execCommand('adwordfilter','highlight');

目的是在用户将内容粘贴到编辑器时,高亮所有的提醒词

那么,我们的adwordfilter就需要调整一下了

UE.commands['adwordfilter'] = {    execCommand: function (cmd, opt) {        var fw = ['最', '最佳', '最具', '最爱', '最赚', '最优', '最优秀', '最好', '最大', '最大程度', '最高'];        fw.push('最高档', '最高级', '最奢侈', '最低', '最低级', '最低价', '最底', '最便宜', '时尚最低价', '最流行');        fw.push('最受欢迎', '最时尚', '最聚拢', '最符合', '最舒适', '最先', '最先进', '最先进科学', '最先进加工工艺');        fw.push('最先享受', '最后', '最后一波', '最新', '最新科技', '最新科学', '与“一”有关', '第一', '中国第一');        fw.push('全网第一', '销量第一', '排名第一', '唯一', '第一品牌', 'NO.1', 'TOP.1', '独一无二', '全国第一', '一流');        fw.push('一天', '仅此', '最后一波', '大品牌之一', '国家级', '全球级', '宇宙级', '世界级', '顶级', '顶尖', '尖端');        fw.push('顶级工艺', '顶级享受', '极品', '极佳', '绝佳', '绝对', '终极', '极致', '首个', '首选', '独家', '独家配方');        fw.push('全国首发', '首款', '全国销量冠军', '国家级产品', '国家', '国家免检', '填补国内空白', '王牌', '领袖品牌');        fw.push('世界领先', '领导者', '缔造者', '创领品牌', '领先上市', '至尊', '巅峰', '领袖', '之王', '王者', '冠军');        fw.push('史无前例', '前无古人', '永久', '万能', '祖传', '特效', '无敌', '纯天然', '100%', '恭喜获奖', '全民免单');        fw.push('倒计时', '趁现在', '仅限', '周末', '周年庆', '特惠趴', '购物大趴', '闪购', '品牌团', '精品团', '单品团');        fw.push('随时涨价', '马上降价', '机关推荐', '机关专供', '特供', '质量免检', '免抽检', '老字号', '中国驰名商标');        fw.push('特供', '专供', '化解小人', '增加事业运', '招财进宝', '健康富贵', '提升运气', '有助事业', '护身');        fw.push('平衡正负能量', '消除精神压力', '调和气压', '逢凶化吉', '时来运转', '万事亨通', '旺人', '旺财', '助吉避凶');        fw.push('转富招福', '特效', '高效', '全效', '强效', '速效', '天见效', '周期见效', '超强', '激活', '全方位');        fw.sort();        fw.sort(function (x, y) {            if (x.indexOf(y) > -1) {                return -1;            } else {                return 1;            }        });        var filter = new RegExp('(' + fw.join('|').replace(/\./gi, '\\.') + ')', 'gi');        var me = this;        function HighLight() {            var html = me.getContent();            html = html.replace(/(.*?)<\/span>/gi, '$1');            html = html.replace(filter, '$1');            // setContent会触发contentchange事件,所以不使用            // me.setContent(html);            // 更新内容到编辑器            var root = UE.htmlparser(html);            me.filterInputRule(root);            html = root.toHtml();            me.body.innerHTML = html;        }        if (opt) {            switch (opt.toLowerCase().trim()) {                case 'highlight':                    HighLight();                    break;            }        }    }}

在我们的定义里,追加一个Highlight方法,对编辑器内容进行调整

第三步:显示提醒词的数量

在我们高亮的同时,我们应该达到这样的效果,在按钮中显示有多少个提醒词,点击按钮时,查找并选中提醒词

那么,我们再来改造一下这个定义

UE.commands['adwordfilter'] = {    execCommand: function (cmd, opt) {        var fw = ['最', '最佳', '最具', '最爱', '最赚', '最优', '最优秀', '最好', '最大', '最大程度', '最高'];        fw.push('最高档', '最高级', '最奢侈', '最低', '最低级', '最低价', '最底', '最便宜', '时尚最低价', '最流行');        fw.push('最受欢迎', '最时尚', '最聚拢', '最符合', '最舒适', '最先', '最先进', '最先进科学', '最先进加工工艺');        fw.push('最先享受', '最后', '最后一波', '最新', '最新科技', '最新科学', '与“一”有关', '第一', '中国第一');        fw.push('全网第一', '销量第一', '排名第一', '唯一', '第一品牌', 'NO.1', 'TOP.1', '独一无二', '全国第一', '一流');        fw.push('一天', '仅此', '最后一波', '大品牌之一', '国家级', '全球级', '宇宙级', '世界级', '顶级', '顶尖', '尖端');        fw.push('顶级工艺', '顶级享受', '极品', '极佳', '绝佳', '绝对', '终极', '极致', '首个', '首选', '独家', '独家配方');        fw.push('全国首发', '首款', '全国销量冠军', '国家级产品', '国家', '国家免检', '填补国内空白', '王牌', '领袖品牌');        fw.push('世界领先', '领导者', '缔造者', '创领品牌', '领先上市', '至尊', '巅峰', '领袖', '之王', '王者', '冠军');        fw.push('史无前例', '前无古人', '永久', '万能', '祖传', '特效', '无敌', '纯天然', '100%', '恭喜获奖', '全民免单');        fw.push('倒计时', '趁现在', '仅限', '周末', '周年庆', '特惠趴', '购物大趴', '闪购', '品牌团', '精品团', '单品团');        fw.push('随时涨价', '马上降价', '机关推荐', '机关专供', '特供', '质量免检', '免抽检', '老字号', '中国驰名商标');        fw.push('特供', '专供', '化解小人', '增加事业运', '招财进宝', '健康富贵', '提升运气', '有助事业', '护身');        fw.push('平衡正负能量', '消除精神压力', '调和气压', '逢凶化吉', '时来运转', '万事亨通', '旺人', '旺财', '助吉避凶');        fw.push('转富招福', '特效', '高效', '全效', '强效', '速效', '天见效', '周期见效', '超强', '激活', '全方位');        fw.sort();        fw.sort(function (x, y) {            if (x.indexOf(y) > -1) {                return -1;            } else {                return 1;            }        });        var filter = new RegExp('(' + fw.join('|').replace(/\./gi, '\\.') + ')', 'gi');        var me = this;        function searchNext() {            HighLight();            var el = $('.edui-toolbar .edui-for-adwordfilter .edui-button-wrap .edui-button-body .edui-icon');            var els = $(me.body).find('.highlight');            var sn = parseInt(el.html());            sn = isNaN(sn) ? 0 : sn;            if (sn >= els.length) { sn = 0; }            if (els.length > 0) {                els[sn].click();                var rng = me.selection.getRange();                rng.setStart(els[sn], 0).setEnd(els[sn], 1);                rng.select();                sn++;                if (sn >= els.length) { sn = 0; }            }            el.html(sn);            me.focus();        }        function Prompt() {            $('#adwordfilter').remove();            var html = me.getContent();            var match = html.match(filter);            var cnt = match ? match.length : 0;            $('').appendTo($(document.documentElement));        }        function HighLight() {            var html = me.getContent();            html = html.replace(/(.*?)<\/span>/gi, '$1');            html = html.replace(filter, '$1');            // setContent会触发contentchange事件,所以不使用            // me.setContent(html);            // 更新内容到编辑器            var root = UE.htmlparser(html);            me.filterInputRule(root);            html = root.toHtml();            me.body.innerHTML = html;        }        if (opt) {            switch (opt.toLowerCase().trim()) {                case 'highlight':                    HighLight();                    break;                case 'prompt':                    Prompt();            }        } else {            searchNext();        }    }}

我们通过修改.edui-toolbar .edui-for-adwordfilter .edui-button-wrap .edui-button-body .edui-icon:before这个伪类的定义,来修改提醒词数量

点击按钮则执行searchNext来定位提醒词,这里不得不吐槽百度编辑器,居然不支持正则查找

第四步:动态改变提醒词数量

除了粘贴之外,用户也会在编辑器内直接进行编辑修改内容,这个时候提醒词数量会发生变动,所以我们追加一个方法

$(document).ready(function () {                $('textarea[class*=ueditor]').each(function () {                    var id = $(this).attr('id');                    UE.getEditor(id, { initialFrameHeight: 500, initialFrameWidth: null });                    UE.getEditor(id).addListener('contentchange', function () {                        //console.log(this)                        this.execCommand('adwordfilter','prompt');                    })                });            });

我们对所有样式包含ueditor的textarea进行定义,调用百度编辑器,并在初始化后追加一个监听,当contentchange,即内容变动时,调用adwordfilter里的prompt方法,这样我们在编辑内容时,提醒词数量也就跟随变动了

第五步:动态高亮

这个。。。。老顾并没有实现成功,不是不能动态高亮,而是文盲做不到在用户自行编辑时,光标保留在当前编辑位置

当Hightlight运行后,光标会自动跑到文档首位,老顾折腾了半天,也没把光标弄到编辑时的位置上,这个需要大家帮忙来实现了,毕竟文盲对range和selection不熟悉

出现的问题:Range.js : The given range isn't in document.

在文盲的searchNext时,rng.select()时会出现这个错误

var rng = me.selection.getRange();                rng.setStart(els[sn], 0).setEnd(els[sn], 1);                rng.select();

虽然在实际使用中没有发现问题,但是有这么个错误一直向外跳,也很不舒服,那么就在这里寻求一下,rng该怎么写才能不出现这个错误了

最后:再说一句,广告法提示的这些词,未必是一定要删除的,比如说实验条件,光和水是唯一的条件,那么这个地方的“唯一”是不需要删除的,而我们是国内唯一能做到这个深度的企业,这个时候,唯一就是属于违反广告法了,需要删除,但只删这个词,语句都不通顺了,所以,老顾只做高亮提醒,具体处理还是交给编辑和用户去操作吧

转载地址:http://dxvxi.baihongyu.com/

你可能感兴趣的文章
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>
进程创建时信号处理函数处理
查看>>
进程创建时信号处理
查看>>
进程创建时内存描述符处理
查看>>
进程创建时命名空间处理
查看>>
进程创建时IO处理
查看>>
进程创建时线程栈处理
查看>>
进程创建时pid分配
查看>>
进程创建时安全计算处理
查看>>
内核线程创建
查看>>
史上最详细MFC调用mapX5.02.26步骤(附地图测试GST文件)
查看>>
CMFCShellListCtrl使用方法
查看>>
mapnik的demo运行
查看>>
python支持下的mapnik安装
查看>>
milvus手册
查看>>
多目标跟踪的简单理解
查看>>
Visual Tracking Using Attention-Modulated Disintegration and Integration
查看>>
Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning
查看>>