在上一篇中讲了怎样实现小程序中的代码高亮,但是并不完美。
高亮的思路是遍历所有 <code>
标签,对 class='lang-xxx'
进行高亮实现。试想,如果我要写一篇文章,在我的文本中刚好出现了 <code class='lang-'>
,显然,这样的文本也会被默认转换,从而造成了信息的缺失。
解决思路
看一下我们的转化函数:
是先对文本中的特殊字符转换后,才进行的代码高亮,也就是说,在转换的过程中,
观察 api
可发现,在 <code>
代码文本中,<
和>
分别用 <
和 &rt
来表示。所以,我们在高亮之前,就把代码段中的 < &rt
转化为了 <>
, 导致高亮的时候,highlight.js
以为代码段中的 <code>
也是 html
标签,才出现上述问题。
解决的方法其实很简单,修改 wxDiscode.js
中的 function strcharacterDiscode(str)
即可。
注释掉原来的转化方法,用上面两个符号
str = str.replace(/</g, '‹');
str = str.replace(/>/g, '›');
//str = str.replace(/</g, '<');
//str = str.replace(/>/g, '>');
这样一来,转化时便会把 <
和 &rt
变成 ‹
›
,因此也就不会被当作文本符号 <
>
去识别,并且还能在文章中无障碍显示,丝毫不影响阅读。这个操作让我想起了年少懵懂,初识 hello world
时看到的一则故事:李雷在接手韩梅梅的代码后,编译一直报错,后来经过熬秃洗礼,已经变成 子田 的李雷终于大彻大悟,原来代码中的 | ( 或)
,是另一个字符 丨 (gun)
。
时间戳转换
在传输过程中,为了传输效率,时间戳会被自动变成 Sun, 24 Feb 2019 01:00:03 GMT
这种格式。如你所见,严重影响阅读,好在微信小程序中快速启动模板下已经把转换烦发写好了。没有使用快速模板也没事,就是几行代码而已。创建 util.js
,粘贴以下代码。
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
module.exports = {
formatTime: formatTime
}
引用该方法,遍历文章集合,把所有 time
进行转换。
var time = require('utils/util.js')
let post_ = res.data.posts; //res.data.posts 你api中的文章
// console.log('xian:' + new Date(post_[0]['time'].replace('GMT','')));
for(var i=0;i<post_.length;i++){
post_[i]['time'] = time.formatTime(new Date(post_[i]['time']))
let comment_ = post_[i].new_comment.comments;
for (var j = 0; j < comment_.length; j++) {
comment_[j]['time'] = time.formatTime(new Date(comment_[j]['time']))
这时可能会出现转换后比原时间慢了 8 小时这种情况,原因是 time
中出现了 GMT
格林威治时间,这是要比北京时间慢 8 小时的,使用 replace
替换掉其中的 GMT
即可恢复正常。
post_[i]['time'] = time.formatTime(new Date(post_[i]['time'].replace('GMT', '')))
好了,结束了。
效果如图:
源代码在: github-Jarry007