167 lines
5.0 KiB
JavaScript
167 lines
5.0 KiB
JavaScript
/**
|
||
* 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';
|
||
/**
|
||
* 配置及公有属性
|
||
**/
|
||
var realWindowWidth = 0;
|
||
var realWindowHeight = 0;
|
||
wx.getSystemInfo({
|
||
success: function (res) {
|
||
realWindowWidth = res.windowWidth
|
||
realWindowHeight = res.windowHeight
|
||
}
|
||
})
|
||
/**
|
||
* 主函数入口区
|
||
*
|
||
* 自添加参数
|
||
* lineFeed :是否识别换行和空格 默认是true 识别的
|
||
*
|
||
**/
|
||
function wxParse(bindName = 'wxParseData', type = 'html', data = '<div class="color:red;">数据不能为空</div>', target, imagePadding, lineFeed = true) {
|
||
var that = target;
|
||
var transData = {}; //存放转化后的数据
|
||
if (type == 'html') {
|
||
transData = HtmlToJson.html2json(data, bindName, lineFeed);
|
||
// 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;
|
||
console.log("that.data[tagFrom]", that.data[tagFrom]);
|
||
var nowImgUrl = e.target.dataset.src;
|
||
var tagFrom = e.target.dataset.from;
|
||
console.log("tagFrom", tagFrom);
|
||
if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
|
||
wx.previewImage({
|
||
current: nowImgUrl, // 当前显示图片的http链接
|
||
urls: (that.data[tagFrom] && that.data[tagFrom].imageUrls) || [nowImgUrl] // 需要预览的图片http链接列表
|
||
// urls: [nowImgUrl] // 需要预览的图片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 || 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);
|
||
var index = temImages[idx].index
|
||
var key = `${bindName}`
|
||
for (var i of index.split('.')) key += `.nodes[${i}]`
|
||
var keyW = key + '.width'
|
||
var keyH = key + '.height'
|
||
that.setData({
|
||
[keyW]: recal.imageWidth,
|
||
[keyH]: recal.imageheight,
|
||
})
|
||
}
|
||
|
||
// 计算视觉优先的图片宽高
|
||
function wxAutoImageCal(originalWidth, originalHeight, that, bindName) {
|
||
//获取图片的原始长宽
|
||
var windowWidth = 0,
|
||
windowHeight = 0;
|
||
var autoWidth = 0,
|
||
autoHeight = 0;
|
||
var results = {};
|
||
var padding = that.data[bindName].view.imagePadding;
|
||
windowWidth = realWindowWidth - 2 * padding;
|
||
windowHeight = realWindowHeight;
|
||
//判断按照那种方式进行缩放
|
||
// console.log("windowWidth" + windowWidth);
|
||
if (originalWidth > windowWidth) { //在图片width大于手机屏幕width时候
|
||
autoWidth = windowWidth;
|
||
// console.log("autoWidth" + autoWidth);
|
||
autoHeight = (autoWidth * originalHeight) / originalWidth;
|
||
// console.log("autoHeight" + autoHeight);
|
||
results.imageWidth = autoWidth;
|
||
results.imageheight = autoHeight;
|
||
} else { //否则展示原来的数据
|
||
results.imageWidth = originalWidth;
|
||
results.imageheight = originalHeight;
|
||
}
|
||
return results;
|
||
}
|
||
|
||
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
|
||
} |