123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /**
- * author: Di (微信小程序开发工程师)
- * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
- * 垂直微信小程序开发交流社区
- *
- * github地址: https://github.com/icindy/wxParse
- *
- * for: 微信小程序富文本解析
- * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
- */
- /**
- * utils函数引入
- **/
- import showdown from 'showdown.js';
- import HtmlToJson from 'html2json.js';
- /**
- * 配置及公有属性
- **/
- /**
- * 主函数入口区
- **/
- function wxParse(bindName = 'wxParseData', type='html', data='<div class="color:red;">数据不能为空</div>', target,imagePadding) {
- var that = target;
- var transData = {};//存放转化后的数据
- if (type == 'html') {
- transData = HtmlToJson.html2json(data, bindName);
- // console.log(JSON.stringify(transData, ' ', ' '));
- } else if (type == 'md' || type == 'markdown') {
- var converter = new showdown.Converter();
- var html = converter.makeHtml(data);
- transData = HtmlToJson.html2json(html, bindName);
- // console.log(JSON.stringify(transData, ' ', ' '));
- }
- transData.view = {};
- transData.view.imagePadding = 0;
- if(typeof(imagePadding) != 'undefined'){
- transData.view.imagePadding = imagePadding
- }
- var bindData = {};
- bindData[bindName] = transData;
- that.setData(bindData)
- that.wxParseImgLoad = wxParseImgLoad;
- that.wxParseImgTap = wxParseImgTap;
- }
- // 图片点击事件
- function wxParseImgTap(e) {
- var that = this;
- var nowImgUrl = e.target.dataset.src;
- var tagFrom = e.target.dataset.from;
- if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
- wx.previewImage({
- current: nowImgUrl, // 当前显示图片的http链接
- urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表
- })
- }
- }
- /**
- * 图片视觉宽高计算函数区
- **/
- function wxParseImgLoad(e) {
- var that = this;
- var tagFrom = e.target.dataset.from;
- var idx = e.target.dataset.idx;
- if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
- calMoreImageInfo(e, idx, that, tagFrom)
- }
- }
- // 假循环获取计算图片视觉最佳宽高
- function calMoreImageInfo(e, idx, that, bindName) {
- var temData = that.data[bindName];
- if (temData.images.length == 0) {
- return;
- }
- var temImages = temData.images;
- //因为无法获取view宽度 需要自定义padding进行计算,稍后处理
- var recal = wxAutoImageCal(e.detail.width, e.detail.height,that,bindName);
- temImages[idx].width = recal.imageWidth;
- temImages[idx].height = recal.imageheight;
- temData.images = temImages;
- var bindData = {};
- bindData[bindName] = temData;
- that.setData(bindData);
- }
- // 计算视觉优先的图片宽高
- function wxAutoImageCal(originalWidth, originalHeight,that,bindName) {
- // 使用同步接口获取窗口信息
- const windowInfo = wx.getWindowInfo();
-
- // 安全获取边距配置(防止undefined错误)
- const padding = that.data?.[bindName]?.view?.imagePadding || 0;
-
- // 计算可用显示宽度(窗口宽度 - 左右边距)
- const maxWidth = windowInfo.windowWidth - 2 * padding;
-
- let targetWidth = originalWidth;
- let targetHeight = originalHeight;
-
- // 按宽度比例缩放
- if (targetWidth > maxWidth) {
- targetWidth = maxWidth;
- targetHeight = (targetWidth * originalHeight) / originalWidth;
- }
-
- // 返回标准化命名的结果(驼峰命名)
- return {
- imageWidth: targetWidth,
- imageHeight: targetHeight // 修正原代码拼写错误 (imageheight → imageHeight)
- };
- }
- function wxParseTemArray(temArrayName,bindNameReg,total,that){
- var array = [];
- var temData = that.data;
- var obj = null;
- for(var i = 0; i < total; i++){
- var simArr = temData[bindNameReg+i].nodes;
- array.push(simArr);
- }
- temArrayName = temArrayName || 'wxParseTemArray';
- obj = JSON.parse('{"'+ temArrayName +'":""}');
- obj[temArrayName] = array;
- that.setData(obj);
- }
- /**
- * 配置emojis
- *
- */
- function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){
- HtmlToJson.emojisInit(reg,baseSrc,emojis);
- }
- module.exports = {
- wxParse: wxParse,
- wxParseTemArray:wxParseTemArray,
- emojisInit:emojisInit
- }
|