102 lines
4.2 KiB
JavaScript
102 lines
4.2 KiB
JavaScript
/* 配置文件 */
|
||
const canIUse = wx.canIUse('editor'); // 高基础库标识,用于兼容
|
||
const Prism = require('./prism.js');
|
||
module.exports = {
|
||
// 过滤器函数
|
||
filter(node, cxt) {
|
||
if (node.name == 'pre')
|
||
cxt.bubble(); // 使得 pre 不被 rich-text 包含(为实现长按复制)
|
||
},
|
||
// 代码高亮函数
|
||
highlight(content, attrs) {
|
||
var info = content.match(/<code.*?language-([a-z-]+).*?>([\s\S]+)<\/code.*?>/m);
|
||
if (!info) return content;
|
||
var lan = info[1];
|
||
content = info[2].replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');
|
||
attrs['data-content'] = content; // 记录原始内容,长按复制时使用
|
||
switch (lan) {
|
||
case 'js':
|
||
case 'javascript':
|
||
content = Prism.highlight(content, Prism.languages.javascript, 'javascript');
|
||
break;
|
||
case 'html':
|
||
case 'html-editor':
|
||
case 'wxml':
|
||
case 'vue':
|
||
content = Prism.highlight(content, Prism.languages.html, 'html');
|
||
break;
|
||
case 'json':
|
||
content = Prism.highlight(content, Prism.languages.json, 'json');
|
||
break;
|
||
case 'md':
|
||
case 'md-editor':
|
||
case 'markdown':
|
||
content = Prism.highlight(content, Prism.languages.markdown, 'markdown');
|
||
break;
|
||
case 'c':
|
||
case 'cpp':
|
||
content = Prism.highlight(content, Prism.languages.clike, 'clike');
|
||
}
|
||
// 增加语言显示
|
||
if (!lan.includes('editor'))
|
||
content = `<span style="position:absolute;top:3px;right:8px;font-size:.6rem;color:#808080;font-weight:bold">${lan}</span><div style='overflow:auto;max-width:100%;padding-bottom:1em'>${content}</div>`;
|
||
return content;
|
||
},
|
||
// 文本处理函数
|
||
onText: null,
|
||
// 实体编码列表
|
||
entities: {
|
||
quot: '"',
|
||
apos: "'",
|
||
semi: ';',
|
||
nbsp: '\xA0',
|
||
ndash: '–',
|
||
mdash: '—',
|
||
middot: '·',
|
||
lsquo: '‘',
|
||
rsquo: '’',
|
||
ldquo: '“',
|
||
rdquo: '”',
|
||
bull: '•',
|
||
hellip: '…'
|
||
},
|
||
blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'),
|
||
inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong'),
|
||
// 块级标签,将被转为 div
|
||
blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,section' + (canIUse ? '' : ',pre')),
|
||
// 将被移除的标签
|
||
ignoreTags: makeMap('area,base,basefont,canvas,command,embed,frame,iframe,input,isindex,keygen,link,map,meta,param,script,source,style,svg,textarea,title,track,use,wbr' + (canIUse ? ',rp' : '')),
|
||
// 只能被 rich-text 显示的标签
|
||
richOnlyTags: makeMap('a,colgroup,fieldset,legend,picture,table' + (canIUse ? ',bdi,bdo,rt,ruby' : '')),
|
||
// 自闭合的标签
|
||
selfClosingTags: makeMap('area,base,basefont,br,col,circle,ellipse,embed,frame,hr,img,input,isindex,keygen,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
|
||
// 信任的属性
|
||
trustAttrs: makeMap('align,alt,app-id,author,autoplay,border,cellpadding,cellspacing,class,color,colspan,controls,data-src,dir,face,height,href,id,ignore,loop,media,muted,name,path,poster,rowspan,size,span,src,start,style,type,unit-id,width,xmlns'),
|
||
// bool 型的属性
|
||
boolAttrs: makeMap('autoplay,controls,ignore,loop,muted'),
|
||
// 信任的标签
|
||
trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video' + (canIUse ? ',bdi,bdo,caption,pre,rt,ruby' : '')),
|
||
// 默认的标签样式
|
||
userAgentStyles: {
|
||
address: 'font-style:italic',
|
||
big: 'display:inline;font-size:1.2em',
|
||
blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px',
|
||
caption: 'display:table-caption;text-align:center',
|
||
center: 'text-align:center',
|
||
cite: 'font-style:italic',
|
||
dd: 'margin-left:40px',
|
||
mark: 'background-color:yellow',
|
||
pre: 'font-family:monospace;white-space:pre;overflow:scroll',
|
||
s: 'text-decoration:line-through',
|
||
small: 'display:inline;font-size:0.8em',
|
||
u: 'text-decoration:underline'
|
||
}
|
||
}
|
||
|
||
function makeMap(str) {
|
||
var map = {},
|
||
list = str.split(',');
|
||
for (var i = list.length; i--;)
|
||
map[list[i]] = true;
|
||
return map;
|
||
} |