收藏
评论

Parser-基于wxParse的二次开发

在社区文章里看到老哥分享的。尝试使用了下。

Parser

微信小程序富文本插件

功能介绍

  • 支持解析<style>标签中的全局样式(.和#两种方式)
    示例:

    <style>
    .demo1{
     text-align:center;
    }
    #demo2{
     color:blue;
    }
    </style>
    <div class="demo1">
     <label>Hello </label>
     <label id="demo2">World!</label>
    </div>
    

    解析style

  • 支持的标签种类丰富,包括视频表格
    rich-text组件的基础上增加支持以下标签:

    标签 属性
    video src, controls, height, width
    font face, color
    style
    section
    html
    body

    示例:
    解析表格
    解析图文

  • 图片支持大小自适应,点击图片可以预览(预览时通过左右滑动可以查看所有图片)

    <img width="50px" src="img1.png" />
    <br />
    <img src="img2.jpg" />
    
  • 长按a标签可以复制链接(小程序不能直接打开外链,可以复制链接并通过浏览器打开)

    <a href="https://github.com">长按复制链接</a>
    

    示例:
    解析a标签

  • 容错性强,稳定性高,不需要网络请求
    以下情况都可以正常解析:

    <!--冒号不匹配-->
    <div style="font-family:"宋体";text-align:center;">Hello</div>
    <!--标签首尾不匹配-->
    <div> World</label>
    <!--缺少尾标签-->
    <div>!
    
  • 功能强大,支持无限层级,解析速度快,包大小仅约40KB

使用方法

代码片段

  1. 下载Parser文件夹至小程序目录
    目录结构
  2. 在需要引用的页面的json文件中添加
    {
      "usingComponents": {
        "Parser":"../Parser/index"
      }
    }
    
  3. 在需要引用的页面的wxml文件中添加
    <Parser html="{{html}}" bindparser="parser" />
    
  4. 在需要引用的页面的js文件中添加
    onLoad:function(){
      this.setData({
        html:'your html'
      })
    },
    parser:function(e){
      console.log(e);
    }
    
  • 组件属性:

    属性 类型 默认值 必填 说明
    html String/Object/Array 要显示的富文本数据,具体格式见下方说明
    space String/Boolean false 是否显示连续空格,合法输入值见下方说明
    selectable Boolean true 是否允许长按复制a标签连接
    preview Boolean true 是否允许预览图片
    • html格式:

      1. string类型:一个html字符串,例如:<div>Hello World!</div>
      2. object类型:一个形如{ nodes:[Array],imgList:[Array] }的结构体,其中nodes数组的格式同rich-text, imgList为其中所有图片地址的数组(回调函数bindparser的返回值就是这样的结构体)
      3. array类型:格式要求同rich-text(用此格式传入预览图片时,将不能通过左右滑动查看所有图片)
      4. 使用b, c方法可以节省解析的时间,提高性能
    • space格式(同rich-text):

      说明
      ensp 中文字符空格一半大小
      emsp 中文字符空格大小
      nbsp 根据字体设置的空格大小
    • 关于preview
        该属性为true时,是通过模板的循环解析实现图片的预览,这可能导致在排版较为复杂(如左右排布)等时显示不出正确的效果,此时可以将该属性设置为{{false}},插件会直接用rich-text组件渲染,能达到更好的排版效果。

    • 回调函数

      名称 功能 说明
      bindparser 在解析完成时调用(仅当传入的html为字符串时会调用) 返回一个object, 其中nodes为解析后的节点数组, imgList为图片列表,该object可以在下次调用直接作为html属性的值,节省解析的时间

后端解析

为提高页面性能,可以在服务器端提前解析好html,该插件同样可以在node.js中使用(只需要DomHandler.js, Parser.js, Tokenizer.js即可)
具有的功能:

  1. 删除script, head, html, body, 注释等无用的标签
  2. style标签中的样式解析到各标签的style中,例如:
const Parser=require('./Parser.js');
var html='<style>.demo{text-align:center}</style><div class="demo">Hello World!</div>';
Parser(html).then(function(e){
  console.log(e)
})

{ 
  "nodes": [{ 
    "name": "div", 
    "attrs": {
      "class": "demo",
      "style": "text-align:center"
    }, 
    "children": [{ 
      "text": "Hello World!", 
      "type": "text" 
    }] 
  }],
  "imgList": [] 
}
  1. img标签的style中添加max-width:100%;,实现宽度自适应
  2. section标签用div取代
  3. font标签用label取代,并将face, color属性解析到style
  4. a标签的style中添加text-decoration: underline;color:#0000ff;
  5. 对于该节点下含有a, imgpreviewtrue时), video标签的,continue的值会被设置为true(用于前端显示)
  6. 解析完成将返回一个形如{ nodes:[Array], imgList:[Array] }结构体,其中nodes数组可以直接应用于rich-text组件,整个结构体可以直接作为Parser组件的参数

原理简介

  该插件结合了WxParse中模板循环的方式和rich-text组件,对于节点下有img, video, a标签的,使用模板循环的方式显示,否则直接通过rich-text组件显示,这样既解决了WxParse中过多的标签数(rich-text可以节省大量的标签),层数容易不够(对于大于20层的直接用rich-text解析,理论上可以显示无限层级),无法解析表格,一些组件显示格式不正确(rich-text可以解析出更好的效果)等缺点;也弥补了rich-text图片无法预览,无法显示视频,无法复制链接,部分标签不支持(在解析过程中进行替换)等缺点,另外该解析脚本还减小了包的大小,提高了解析效率,通过包装成一个自定义组件,简单易用且功能强大。

最后一次编辑于  2019-11-21
收藏

9 个评论

  • 六只肥羊
    六只肥羊
    2023-07-27

    这个只能转html字符串、不能转wxml字符串吧?

    2023-07-27
    赞同
    回复 2
    • TNT
      TNT
      2023-07-28
      是的
      2023-07-28
      回复
    • TNT
      TNT
      2023-07-28
      wxml需要自己开发了
      2023-07-28
      回复
  • ℳℓ 辉
    ℳℓ 辉
    2020-11-10

    IOS手机为什么不能长按选中复制?

    2020-11-10
    赞同
    回复 6
    • TNT
      TNT
      2020-11-10
      看下最新版本的text的selectable是否换为user-select了
      2020-11-10
      回复
    • ℳℓ 辉
      ℳℓ 辉
      2020-11-12回复TNT
      Parser解析组件没有text的标签,都是rich-text标签,根本加不了user-select
      2020-11-12
      回复
    • ℳℓ 辉
      ℳℓ 辉
      2020-11-12回复ℳℓ 辉
      2020-11-12
      回复
    • ℳℓ 辉
      ℳℓ 辉
      2020-11-12回复TNT
      2020-11-12
      回复
    • ℳℓ 辉
      ℳℓ 辉
      2020-11-12回复TNT
      无法解决。
      2020-11-12
      回复
    查看更多(1)
  • @
    @
    2020-06-22

    如图,后台是给图片右对齐,但是解析成text-align:right,所以图片格式不对,怎么解决呀?

    2020-06-22
    赞同
    回复 3
  • ..
    ..
    2020-05-01

    为什么我用那个推出来的parser测试小程序可以解析出它,但是一到本地跑的时候,它连放在冒号里都不行了呢

    2020-05-01
    赞同
    回复 3
    • TNT
      TNT
      2020-05-06
      提供下这段代码。。写个代码片段分享出来。
      2020-05-06
      回复
    • 打不死的小强
      打不死的小强
      2020-05-27
      请问下面这种情况可以把字符串的标签转换为文字吗?
      2020-05-27
      回复
    • 打不死的小强
      打不死的小强
      2020-05-27
      2020-05-27
      回复
  • K兔
    K兔
    2020-01-07

    亲,这个图片中间有空白条怎么处理了?

    2020-01-07
    赞同
    回复 8
    • TNT
      TNT
      2020-01-07
      parser解析的html吗?
      2020-01-07
      回复
    • K兔
      K兔
      2020-01-07回复TNT
      似的,嗯嗯  可以了,默认给的图片是display:inline-block,改成display:block就可以了   非常感谢楼主的分享!
      2020-01-07
      回复
    • TNT
      TNT
      2020-01-07回复K兔
      👌
      2020-01-07
      回复
    • 相信自己
      相信自己
      2020-03-13回复K兔
      还要加上font-size: 0;才得  搞了半天才知道  坑啊
      2020-03-13
      回复
    • 相信自己
      相信自己
      2020-03-13
      还有这个编辑器不能解析后台文本返回来的

      测试排版测试排版/h1>的数据

      2020-03-13
      回复
    查看更多(3)
  • Programmer
    Programmer
    2019-12-16

    支持加载js吗?

    2019-12-16
    赞同
    回复 3
    • TNT
      TNT
      2019-12-16
      js逻辑?还是只展示
      2019-12-16
      回复
    • Programmer
      Programmer
      2019-12-16回复TNT
      还是比较复杂的,类似旅游景点详情,没有数据交互,静态网页,其中有一些页面效果是通过js实现的
      2019-12-16
      回复
    • Programmer
      Programmer
      2019-12-16回复TNT
      好的,谢谢
      2019-12-16
      回复
  • I'am  大豆博文    ark
    I'am 大豆博文 ark
    2019-05-28

    您好,我用的这个,模拟器测试没问题,但是真机和预览没有显示,我打开调试,看到节点并未被渲染成功,只到了<scroll-view  x-scroll="true"  y-scroll="true"><scroll>就没了;模拟器是可以看到全部的;

    2019-05-28
    赞同
    回复 3
    • TNT
      TNT
      2019-05-28

      可以写个代码片段吗?

      2019-05-28
      回复
    • I'am  大豆博文    ark
      I'am 大豆博文 ark
      2019-05-28回复TNT

      已经好了,后台数据问题;

      2019-05-28
      回复
    • TNT
      TNT
      2019-05-28回复I'am 大豆博文 ark

      好的

      2019-05-28
      回复
  • 2019-04-17

    我是后端没有配置啥,直接按照你的在小程序里都配置了,结果啥也没显示,但是我有打印数据,是有值的 啊,请问能指教一下吗?

    2019-04-17
    赞同
    回复 23
    • TNT
      TNT
      2019-04-18

      打印的啥值 能截个图么

      2019-04-18
      回复
    • 2019-04-18回复TNT


      你好,麻烦你了,不急哈,你有时间的话回复我下就行

      2019-04-18
      回复
    • TNT
      TNT
      2019-04-18回复

      这是你们的协议吧。可以写个代码片段给我么?  写死返回的数据。

      2019-04-18
      回复
    • 2019-04-18回复TNT

      我是直接拿的你的内容,没有什么协议的,就是普通的后台百度editor编辑内容,保存到数据库,前台是直接拿的数据库的数据

      2019-04-18
      回复
    • TNT
      TNT
      2019-04-18回复

      可以看下我的小程序 《青团社兼职实习 》  首页上拉到下面图片的地方 点击进去 里面基本都是 wxParse解析的html文件。

      2019-04-18
      回复
    查看更多(18)
  • 2019-04-17

    你好,想问下,这个对于富文本的内容是还得后台处理一下吗,然后您这个组件才能使用?

    2019-04-17
    赞同
    回复
登录 后发表内容