Browse Source

feat: 升级agent-ui

lizhaocai 16 hours ago
parent
commit
fa1366d625
93 changed files with 7182 additions and 836 deletions
  1. 163 83
      components/agent-ui/chatFile/index.vue
  2. 429 384
      components/agent-ui/index.vue
  3. 317 0
      components/agent-ui/md5.js
  4. 9 86
      components/agent-ui/tools.js
  5. 4 1
      components/agent-ui/wd-markdown/index.vue
  6. 278 0
      components/agent-ui/wd-markdown/mp-html/index.vue
  7. 1032 0
      components/agent-ui/wd-markdown/mp-html/node/node.vue
  8. 512 0
      components/agent-ui/wd-markdown/mp-html/parser.js
  9. 9 2
      pages/index/aichat.vue
  10. 2 0
      static/components/agent-ui/imgs/wechat.svg
  11. 193 0
      uni_modules/mp-html/README.md
  12. 129 0
      uni_modules/mp-html/changelog.md
  13. 498 0
      uni_modules/mp-html/components/mp-html/mp-html.vue
  14. 576 0
      uni_modules/mp-html/components/mp-html/node/node.vue
  15. 1335 0
      uni_modules/mp-html/components/mp-html/parser.js
  16. 76 0
      uni_modules/mp-html/package.json
  17. 1 0
      uni_modules/mp-html/static/app-plus/mp-html/js/handler.js
  18. 1 0
      uni_modules/mp-html/static/app-plus/mp-html/js/uni.webview.min.js
  19. 1 0
      uni_modules/mp-html/static/app-plus/mp-html/local.html
  20. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/circlePages/addShare.js.map
  21. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/circlePages/circle.js.map
  22. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  23. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  24. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  25. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/components/w-select/w-select.js.map
  26. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/minePages/set.js.map
  27. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/comm/comm.js.map
  28. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/comm/search.js.map
  29. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/home.js.map
  30. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
  31. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/info.js.map
  32. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/login.js.map
  33. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/about.js.map
  34. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/addFeed.js.map
  35. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/coll.js.map
  36. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/feedback.js.map
  37. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/mine.js.map
  38. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/need.js.map
  39. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/share.js.map
  40. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-badge/tn-badge.js.map
  41. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-button/tn-button.js.map
  42. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-checkbox/tn-checkbox.js.map
  43. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-empty/tn-empty.js.map
  44. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-grid-item/tn-grid-item.js.map
  45. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-grid/tn-grid.js.map
  46. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-list-cell/tn-list-cell.js.map
  47. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-load-more/tn-load-more.js.map
  48. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-loading/tn-loading.js.map
  49. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-modal/tn-modal.js.map
  50. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-nav-bar/tn-nav-bar.js.map
  51. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-popup/tn-popup.js.map
  52. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.js.map
  53. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-tag/tn-tag.js.map
  54. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-badge/components/uni-badge/uni-badge.js.map
  55. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-card/components/uni-card/uni-card.js.map
  56. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.js.map
  57. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js.map
  58. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.js.map
  59. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map
  60. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map
  61. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map
  62. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.js.map
  63. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-forms/components/uni-forms/uni-forms.js.map
  64. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map
  65. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-list/components/uni-list-item/uni-list-item.js.map
  66. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-list/components/uni-list/uni-list.js.map
  67. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map
  68. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.js.map
  69. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-sticky/components/uv-sticky/uv-sticky.js.map
  70. 5 5
      unpackage/dist/dev/mp-weixin/circlePages/addShare.js
  71. 1 1
      unpackage/dist/dev/mp-weixin/circlePages/circle.js
  72. 0 1
      unpackage/dist/dev/mp-weixin/common/main.js
  73. 2 2
      unpackage/dist/dev/mp-weixin/common/runtime.js
  74. 1365 27
      unpackage/dist/dev/mp-weixin/common/vendor.js
  75. 14 14
      unpackage/dist/dev/mp-weixin/components/w-select/w-select.js
  76. 14 14
      unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-badge/tn-badge.js
  77. 14 14
      unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-loading/tn-loading.js
  78. 1 1
      unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-modal/tn-modal.js
  79. 14 14
      unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-popup/tn-popup.js
  80. 1 1
      unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.js
  81. 14 14
      unpackage/dist/dev/mp-weixin/uni_modules/uni-badge/components/uni-badge/uni-badge.js
  82. 14 14
      unpackage/dist/dev/mp-weixin/uni_modules/uni-card/components/uni-card/uni-card.js
  83. 15 15
      unpackage/dist/dev/mp-weixin/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.js
  84. 1 1
      unpackage/dist/dev/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js
  85. 1 1
      unpackage/dist/dev/mp-weixin/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.js
  86. 2 2
      unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js
  87. 14 14
      unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js
  88. 14 14
      unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js
  89. 15 15
      unpackage/dist/dev/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js
  90. 16 16
      unpackage/dist/dev/mp-weixin/uni_modules/uni-list/components/uni-list-item/uni-list-item.js
  91. 14 14
      unpackage/dist/dev/mp-weixin/uni_modules/uni-list/components/uni-list/uni-list.js
  92. 15 15
      unpackage/dist/dev/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js
  93. 1 1
      unpackage/dist/dev/mp-weixin/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.js

+ 163 - 83
components/agent-ui/chatFile/index.vue

@@ -1,21 +1,26 @@
 <template>
     <!-- components/agent-ui-new/chatFIle/chatFile.wxml -->
     <!-- <text>components/agent-ui-new/chatFIle/chatFile.wxml</text> -->
-    <view class="chat_file">
+    <view class="chat_file" @tap="openFile">
         <view class="chat_file__content">
             <image class="chat_file__icon" :src="iconPath" />
             <view class="chat_file__info">
-                <view class="chat_file__name">{{ fileData.fileName }}</view>
+                <view class="chat_file__name">{{ fileData.rawFileName || fileData.tempFileName }}</view>
                 <view class="chat_file__size">
                     {{ formatSize }}
-                    <image v-if="!fileData.fileId" style="width: 20px; height: 20px" src="/static/components/agent-ui/imgs/loading.svg" mode="" />
+                    <image
+                        v-if="!fileData.fileId || !fileData.parsed"
+                        style="width: 15px; height: 15px; margin-left: 5px"
+                        src="/static/components/agent-ui/imgs/loading.svg"
+                        mode=""
+                    />
                 </view>
             </view>
         </view>
         <image
-            v-if="'enableDel'"
+            v-if="enableDel"
             @tap="removeFileFromParents"
-            style="width: 15px; height: 15px; position: absolute; top: 0px; right: 0px"
+            style="width: 15px; height: 15px; position: absolute; top: -7px; right: -7px"
             src="/static/components/agent-ui/imgs/close-filled.png"
             mode="aspectFill"
         />
@@ -39,15 +44,14 @@ export default {
 
     watch: {
         'fileData.fileId': function (fileId) {
-            if (!fileId) {
-                this.setData({
-                    formatSize: '解析中'
-                });
-            } else {
-                this.setData({
-                    formatSize: this.transformSize(this.fileData.fileSize)
-                });
-            }
+            this.setData({
+                formatSize: fileId ? this.transformSize(this.fileData.fileSize) : '上传中'
+            });
+        },
+        'fileData.parsed': function (parsed) {
+            this.setData({
+                formatSize: parsed ? this.transformSize(this.fileData.fileSize) : '解析中'
+            });
         }
     },
 
@@ -57,18 +61,20 @@ export default {
     props: {
         enableDel: {
             type: Boolean,
-            default: true
+            default: false
         },
         fileData: {
             type: Object,
             default: () => ({
                 tempId: '',
                 rawType: '',
-                fileName: '',
+                tempFileName: '',
+                rawFileName: '',
                 tempPath: '',
                 fileSize: 0,
                 fileUrl: '',
-                fileId: ''
+                fileId: '',
+                parsed: false
             })
         }
     },
@@ -78,71 +84,85 @@ export default {
      */
     methods: {
         attached: function () {
-            // const formatSize = this.transformSize(this.data.fileSize)
-            const { fileName, tempPath, fileId } = this.fileData;
-            const type = this.getFileType(fileName);
+            console.log('enableDel', this.enableDel);
+            const { tempFileName, rawFileName, rawType, tempPath, fileId, botId, parsed } = this.fileData;
+            const type = this.getFileType(tempFileName);
             console.log('type', type);
-            if (fileId) {
+            if (!fileId) {
+                this.setData({
+                    formatSize: '上传中',
+                    iconPath: '/static/components/agent-ui/imgs/' + type + '.svg'
+                });
+            }
+            if (fileId && parsed) {
                 this.setData({
                     formatSize: this.transformSize(this.fileData.fileSize),
                     iconPath: '/static/components/agent-ui/imgs/' + type + '.svg'
                 });
                 return;
             }
-            this.setData({
-                formatSize: '解析中',
-                iconPath: '/static/components/agent-ui/imgs/' + type + '.svg'
-            });
-			
-			// 上传云存储获取 fileId
-			  wx.cloud.uploadFile({
-			    cloudPath: fileName, // 云上文件路径
-			    filePath: tempPath, // 本地文件路径
-			    success: res => {
-			        console.log('上传成功,fileID为:', res.fileID);
-			        // 此时你可以使用res.fileID进行后续操作
-			        // this.setData({
-			        //   fileData: {
-			        //     ...this.data.fileData,
-			        //     fileId: res.fileID
-			        //   }
-			        // })
-			        this.triggerEvent('changeChild', {tempId: this.data.fileData.tempId, fileId: res.fileID})
-			    },
-			    fail: err => {
-			        console.error('上传失败:', err);
-			    }
-			});
 
             // 上传云存储获取 fileId
-            // uniCloud.uploadFile({
-            //     cloudPath: fileName,
-
-            //     // 云上文件路径
-            //     filePath: tempPath,
-
-            //     // 本地文件路径
-            //     success: (res) => {
-            //         console.log('上传成功,fileID为:', res.fileID);
-            //         // 此时你可以使用res.fileID进行后续操作
-            //         // this.setData({
-            //         //   fileData: {
-            //         //     ...this.data.fileData,
-            //         //     fileId: res.fileID
-            //         //   }
-            //         // })
-            //         this.$emit('changeChild', {
-            //             detail: {
-            //                 tempId: this.fileData.tempId,
-            //                 fileId: res.fileID
-            //             }
-            //         });
-            //     },
-
-            //     fail: (err) => {
-            //         console.error('上传失败:', err);
-            //     }
-            // });
+            console.log('rawFileName tempFileName tempPath', rawFileName, tempFileName, tempPath);
+            wx.cloud.uploadFile({
+                cloudPath: this.generateCosUploadPath(botId, rawFileName ? rawFileName.split('.')[0] + '-' + tempFileName : tempFileName),
+
+                // 云上文件路径
+                filePath: tempPath,
+
+                success: async (res) => {
+                    const { token } = await wx.cloud.extend.AI.bot.tokenManager.getToken();
+                    const fileId = res.fileID;
+                    this.setData({
+                        formatSize: '解析中'
+                    });
+                    uni.request({
+                        url: `https://${wx.cloud.extend.AI.bot.context.env}.api.tcloudbasegateway.com/v1/aibot/bots/${botId}/files`,
+
+                        data: {
+                            fileList: [
+                                {
+                                    fileName: rawFileName || tempFileName,
+                                    fileId,
+                                    type: rawType
+                                }
+                            ]
+                        },
+
+                        header: {
+                            Authorization: `Bearer ${token}`
+                        },
+
+                        method: 'POST',
+
+                        success: (res) => {
+                            console.log('resolve agent file res', res);
+                            this.setData({
+                                formatSize: this.transformSize(this.fileData.fileSize)
+                            });
+                            this.$emit('changeChild', {
+                                detail: {
+                                    tempId: this.fileData.tempId,
+                                    fileId,
+                                    parsed: true
+                                }
+                            });
+                        },
+
+                        fail(e) {
+                            console.log('resolve agent file e', e);
+                        }
+                    });
+                },
+
+                fail: (err) => {
+                    console.error('上传失败:', err);
+                }
+            });
+        },
+
+        generateCosUploadPath: function (botId, fileName) {
+            return `agent_file/${botId}/${fileName}`;
         },
 
         // 提取文件后缀
@@ -152,27 +172,21 @@ export default {
             if (fileExt === 'docx' || fileExt === 'doc') {
                 return 'word';
             }
-            if (fileExt === 'xlsx' || fileExt === 'xls') {
+            if (fileExt === 'xlsx' || fileExt === 'xls' || fileExt === 'csv') {
                 return 'excel';
             }
             if (fileExt === 'png' || fileExt === 'jpg' || fileExt === 'jpeg' || fileExt === 'svg') {
                 return 'image';
             }
+            if (fileExt === 'ppt' || fileExt === 'pptx') {
+                return 'ppt';
+            }
             if (fileExt === 'pdf') {
                 return 'pdf';
             }
             return 'file';
         },
 
-        // getFileIcon: function (fileName) {
-        //   const type = this.getFileType(fileName)
-        //   console.log('type', type)
-        //   if(type === 'pdf') {
-        //     return 'pdf.png'
-        //   }
-
-        //   return 'image.png'
-        // },
         // 转换文件大小(原始单位为B)
         transformSize: function (size) {
             if (size < 1024) {
@@ -191,6 +205,70 @@ export default {
                     tempId: this.fileData.tempId
                 }
             });
+        },
+
+        openFileByWx: function (tempPath) {
+            const fileExt = tempPath.split('.')[1];
+            if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'].includes(fileExt)) {
+                uni.openDocument({
+                    filePath: tempPath,
+                    success: function (res) {
+                        console.log('打开文档成功');
+                    },
+                    fail: function (err) {
+                        console.log('打开文档失败', err);
+                    }
+                });
+            } else {
+                uni.showModal({
+                    content: '当前支持预览文件类型为 pdf、doc、docx、ppt、pptx、xls、xlsx',
+                    showCancel: false,
+                    confirmText: '确定'
+                });
+            }
+        },
+
+        previewImageByWx: function (fileId) {
+            uni.previewImage({
+                urls: [fileId],
+                showmenu: true,
+                success: function (res) {
+                    console.log('previewImage res', res);
+                },
+                fail: function (e) {
+                    console.log('previewImage e', e);
+                }
+            });
+        },
+
+        openFile: function () {
+            if (this.fileData.tempPath) {
+                // 本地上传的文件
+                if (this.fileData.rawType === 'file') {
+                    this.openFileByWx(this.fileData.tempPath);
+                } else {
+                    console.log('fileId', this.fileData.fileId);
+                    if (this.fileData.fileId) {
+                        this.previewImageByWx(this.fileData.fileId);
+                    }
+                }
+            } else if (this.fileData.fileId) {
+                // 针对历史记录中带cloudID的处理(历史记录中附带的文件)
+                wx.cloud.downloadFile({
+                    fileID: this.fileData.fileId,
+                    success: (res) => {
+                        console.log('download res', res);
+                        if (this.fileData.rawType === 'file') {
+                            this.openFileByWx(res.tempFilePath);
+                        } else {
+                            this.previewImageByWx(this.fileData.fileId);
+                        }
+                    },
+                    fail: (err) => {
+                        console.log('download err', err);
+                    }
+                });
+            }
         }
     },
 
@@ -242,5 +320,7 @@ export default {
 .chat_file__size {
     font-size: 24rpx;
     color: #999999;
+    display: flex;
+    align-items: center;
 }
 </style>

File diff suppressed because it is too large
+ 429 - 384
components/agent-ui/index.vue


+ 317 - 0
components/agent-ui/md5.js

@@ -0,0 +1,317 @@
+!(function (n) {
+    'use strict';
+
+    function d(n, t) {
+        var r = (65535 & n) + (65535 & t);
+        return (((n >> 16) + (t >> 16) + (r >> 16)) << 16) | (65535 & r);
+    }
+    function f(n, t, r, e, o, u) {
+        return d(
+            (function (n, t) {
+                return (n << t) | (n >>> (32 - t));
+            })(d(d(t, n), d(e, u)), o),
+            r
+        );
+    }
+    function l(n, t, r, e, o, u, c) {
+        return f((t & r) | (~t & e), n, t, o, u, c);
+    }
+    function g(n, t, r, e, o, u, c) {
+        return f((t & e) | (r & ~e), n, t, o, u, c);
+    }
+    function v(n, t, r, e, o, u, c) {
+        return f(t ^ r ^ e, n, t, o, u, c);
+    }
+    function m(n, t, r, e, o, u, c) {
+        return f(r ^ (t | ~e), n, t, o, u, c);
+    }
+    function i(n, t) {
+        var r;
+        var e;
+        var o;
+        var u;
+        var c;
+        n[t >> 5] |= 128 << t % 32;
+        n[14 + (((t + 64) >>> 9) << 4)] = t;
+        var f = 1732584193;
+        var i = -271733879;
+        var a = -1732584194;
+        var h = 271733878;
+        for (r = 0; r < n.length; r += 16) {
+            i = m(
+                (i = m(
+                    (i = m(
+                        (i = m(
+                            (i = v(
+                                (i = v(
+                                    (i = v(
+                                        (i = v(
+                                            (i = g(
+                                                (i = g(
+                                                    (i = g(
+                                                        (i = g(
+                                                            (i = l(
+                                                                (i = l(
+                                                                    (i = l(
+                                                                        (i = l(
+                                                                            (o = i),
+                                                                            (a = l(
+                                                                                (u = a),
+                                                                                (h = l((c = h), (f = l((e = f), i, a, h, n[r], 7, -680876936)), i, a, n[r + 1], 12, -389564586)),
+                                                                                f,
+                                                                                i,
+                                                                                n[r + 2],
+                                                                                17,
+                                                                                606105819
+                                                                            )),
+                                                                            h,
+                                                                            f,
+                                                                            n[r + 3],
+                                                                            22,
+                                                                            -1044525330
+                                                                        )),
+                                                                        (a = l(
+                                                                            a,
+                                                                            (h = l(h, (f = l(f, i, a, h, n[r + 4], 7, -176418897)), i, a, n[r + 5], 12, 1200080426)),
+                                                                            f,
+                                                                            i,
+                                                                            n[r + 6],
+                                                                            17,
+                                                                            -1473231341
+                                                                        )),
+                                                                        h,
+                                                                        f,
+                                                                        n[r + 7],
+                                                                        22,
+                                                                        -45705983
+                                                                    )),
+                                                                    (a = l(
+                                                                        a,
+                                                                        (h = l(h, (f = l(f, i, a, h, n[r + 8], 7, 1770035416)), i, a, n[r + 9], 12, -1958414417)),
+                                                                        f,
+                                                                        i,
+                                                                        n[r + 10],
+                                                                        17,
+                                                                        -42063
+                                                                    )),
+                                                                    h,
+                                                                    f,
+                                                                    n[r + 11],
+                                                                    22,
+                                                                    -1990404162
+                                                                )),
+                                                                (a = l(
+                                                                    a,
+                                                                    (h = l(h, (f = l(f, i, a, h, n[r + 12], 7, 1804603682)), i, a, n[r + 13], 12, -40341101)),
+                                                                    f,
+                                                                    i,
+                                                                    n[r + 14],
+                                                                    17,
+                                                                    -1502002290
+                                                                )),
+                                                                h,
+                                                                f,
+                                                                n[r + 15],
+                                                                22,
+                                                                1236535329
+                                                            )),
+                                                            (a = g(
+                                                                a,
+                                                                (h = g(h, (f = g(f, i, a, h, n[r + 1], 5, -165796510)), i, a, n[r + 6], 9, -1069501632)),
+                                                                f,
+                                                                i,
+                                                                n[r + 11],
+                                                                14,
+                                                                643717713
+                                                            )),
+                                                            h,
+                                                            f,
+                                                            n[r],
+                                                            20,
+                                                            -373897302
+                                                        )),
+                                                        (a = g(
+                                                            a,
+                                                            (h = g(h, (f = g(f, i, a, h, n[r + 5], 5, -701558691)), i, a, n[r + 10], 9, 38016083)),
+                                                            f,
+                                                            i,
+                                                            n[r + 15],
+                                                            14,
+                                                            -660478335
+                                                        )),
+                                                        h,
+                                                        f,
+                                                        n[r + 4],
+                                                        20,
+                                                        -405537848
+                                                    )),
+                                                    (a = g(
+                                                        a,
+                                                        (h = g(h, (f = g(f, i, a, h, n[r + 9], 5, 568446438)), i, a, n[r + 14], 9, -1019803690)),
+                                                        f,
+                                                        i,
+                                                        n[r + 3],
+                                                        14,
+                                                        -187363961
+                                                    )),
+                                                    h,
+                                                    f,
+                                                    n[r + 8],
+                                                    20,
+                                                    1163531501
+                                                )),
+                                                (a = g(
+                                                    a,
+                                                    (h = g(h, (f = g(f, i, a, h, n[r + 13], 5, -1444681467)), i, a, n[r + 2], 9, -51403784)),
+                                                    f,
+                                                    i,
+                                                    n[r + 7],
+                                                    14,
+                                                    1735328473
+                                                )),
+                                                h,
+                                                f,
+                                                n[r + 12],
+                                                20,
+                                                -1926607734
+                                            )),
+                                            (a = v(a, (h = v(h, (f = v(f, i, a, h, n[r + 5], 4, -378558)), i, a, n[r + 8], 11, -2022574463)), f, i, n[r + 11], 16, 1839030562)),
+                                            h,
+                                            f,
+                                            n[r + 14],
+                                            23,
+                                            -35309556
+                                        )),
+                                        (a = v(a, (h = v(h, (f = v(f, i, a, h, n[r + 1], 4, -1530992060)), i, a, n[r + 4], 11, 1272893353)), f, i, n[r + 7], 16, -155497632)),
+                                        h,
+                                        f,
+                                        n[r + 10],
+                                        23,
+                                        -1094730640
+                                    )),
+                                    (a = v(a, (h = v(h, (f = v(f, i, a, h, n[r + 13], 4, 681279174)), i, a, n[r], 11, -358537222)), f, i, n[r + 3], 16, -722521979)),
+                                    h,
+                                    f,
+                                    n[r + 6],
+                                    23,
+                                    76029189
+                                )),
+                                (a = v(a, (h = v(h, (f = v(f, i, a, h, n[r + 9], 4, -640364487)), i, a, n[r + 12], 11, -421815835)), f, i, n[r + 15], 16, 530742520)),
+                                h,
+                                f,
+                                n[r + 2],
+                                23,
+                                -995338651
+                            )),
+                            (a = m(a, (h = m(h, (f = m(f, i, a, h, n[r], 6, -198630844)), i, a, n[r + 7], 10, 1126891415)), f, i, n[r + 14], 15, -1416354905)),
+                            h,
+                            f,
+                            n[r + 5],
+                            21,
+                            -57434055
+                        )),
+                        (a = m(a, (h = m(h, (f = m(f, i, a, h, n[r + 12], 6, 1700485571)), i, a, n[r + 3], 10, -1894986606)), f, i, n[r + 10], 15, -1051523)),
+                        h,
+                        f,
+                        n[r + 1],
+                        21,
+                        -2054922799
+                    )),
+                    (a = m(a, (h = m(h, (f = m(f, i, a, h, n[r + 8], 6, 1873313359)), i, a, n[r + 15], 10, -30611744)), f, i, n[r + 6], 15, -1560198380)),
+                    h,
+                    f,
+                    n[r + 13],
+                    21,
+                    1309151649
+                )),
+                (a = m(a, (h = m(h, (f = m(f, i, a, h, n[r + 4], 6, -145523070)), i, a, n[r + 11], 10, -1120210379)), f, i, n[r + 2], 15, 718787259)),
+                h,
+                f,
+                n[r + 9],
+                21,
+                -343485551
+            );
+            f = d(f, e);
+            i = d(i, o);
+            a = d(a, u);
+            h = d(h, c);
+        }
+        return [f, i, a, h];
+    }
+    function a(n) {
+        var t;
+        var r = '';
+        var e = 32 * n.length;
+        for (t = 0; t < e; t += 8) {
+            r += String.fromCharCode((n[t >> 5] >>> t % 32) & 255);
+        }
+        return r;
+    }
+    function h(n) {
+        var t;
+        var r = [];
+        for (r[(n.length >> 2) - 1] = void 0, t = 0; t < r.length; t += 1) {
+            r[t] = 0;
+        }
+        var e = 8 * n.length;
+        for (t = 0; t < e; t += 8) {
+            r[t >> 5] |= (255 & n.charCodeAt(t / 8)) << t % 32;
+        }
+        return r;
+    }
+    function e(n) {
+        var t;
+        var r;
+        var e = '0123456789abcdef';
+        var o = '';
+        for (r = 0; r < n.length; r += 1) {
+            t = n.charCodeAt(r);
+            o += e.charAt((t >>> 4) & 15) + e.charAt(15 & t);
+        }
+        return o;
+    }
+    function r(n) {
+        return unescape(encodeURIComponent(n));
+    }
+    function o(n) {
+        return (function (n) {
+            return a(i(h(n), 8 * n.length));
+        })(r(n));
+    }
+    function u(n, t) {
+        return (function (n, t) {
+            var r;
+            var e;
+            var o = h(n);
+            var u = [];
+            var c = [];
+            for (u[15] = c[15] = void 0, 16 < o.length && (o = i(o, 8 * n.length)), r = 0; r < 16; r += 1) {
+                u[r] = 909522486 ^ o[r];
+                c[r] = 1549556828 ^ o[r];
+            }
+            e = i(u.concat(h(t)), 512 + 8 * t.length);
+            return a(i(c.concat(e), 640));
+        })(r(n), r(t));
+    }
+    function t(n, t, r) {
+        return t
+            ? r
+                ? u(t, n)
+                : (function (n, t) {
+                      return e(u(n, t));
+                  })(t, n)
+            : r
+            ? o(n)
+            : (function (n) {
+                  return e(o(n));
+              })(n);
+    }
+    'function' == typeof define && define.amd
+        ? define(function () {
+              return t;
+          })
+        : 'object' == typeof module && module.exports
+        ? (module.exports = t)
+        : (n.md5 = t);
+})(this);
+//# sourceMappingURL=md5.min.js.map

+ 9 - 86
components/agent-ui/tools.js

@@ -1,95 +1,18 @@
-export const guide = `agent ui组件配置不正确,请参照使用说明进行配置。
-
-## 使用说明
-
-### 1、前置条件
-
-#### 1.1、开通微信云开发
-agent ui 小程序组件依赖微信云开发 AI 服务,需要开通微信云开发服务。
-
-开通方式
-
-![](https://qcloudimg.tencent-cloud.cn/raw/f06ca4761f54ecc8ed8d9644229c92f9.png)
-
-如已开通微信云开发服务,请跳转至云开发平台(\`https://tcb.cloud.tencent.com/dev\`)创建AI服务。
-
-#### 1.2、创建AI服务
-- 方式一:直接使用agent智能体服务
- ![](https://qcloudimg.tencent-cloud.cn/raw/97786aaaa15aa1f23e9bbd39a7a6762f.png)
-
-- 方式二:接入大模型
- ![](https://qcloudimg.tencent-cloud.cn/raw/876d2238b5331a7bdcbd91a1b38b8248.png)
-
-### 2、配置 agent ui 小程序组件
-#### 2.1、配置云开发环境ID
-打开\`miniprogram/app.js\`文件,配置云开发环境ID。
-\`\`\`js
-App({
-  onLaunch: function () {
-    if (!wx.cloud) {
-      console.error("请使用 2.2.3 或以上的基础库以使用云能力");
-    } else {
-      wx.cloud.init({
-        env: "",// 环境id
-        traceUser: true,
-      });
-    }
-
-    this.globalData = {};
-  },
-});
-\`\`\`
-#### 2.1、 agent ui 小程序组件配置
-打开小程序\`miniprogram/pages/index/index.js\`文件,配置 agent ui 小程序组件。
-
-组件参数说明如下:
-
-| 参数名称  | 参数说明         | 参数类型 | 是否必填 | 默认值 |
-| --------- | ---------------- | -------- | -------- | ------ |
-| type      | 对接ai服务类型   | String   | 是       | -      |
-| botId     | agent ID         | String   | 否       | -      |
-| modelName | ai大模型服务商   | String   | 否       | -      |
-| model     | 具体使用的大模型 | String   | 否       | -      |
-| logo     | 图标 | String   | 否       | -      |
-| welcomeMessage     | 欢迎语 | String   | 否       | -      |
-
-对接 agent 服务时,type 为 bot,botId 必填,配置如下:
-\`\`\`js
-agentConfig: {
-      type: "bot",
-      botId: "bot-e7d1e736", 
-      modelName: "", 
-      model:"",
-      logo:"",
-      welcomeMessage:""
-    } 
-\`\`\`
-对接 ai 大模型服务时,type 为 model,modelName 和 modelName必填,配置如下:
-\`\`\`js
-agentConfig: {
-      type: "model",
-      botId: "", 
-      modelName: "hunyuan", 
-      model:"hunyuan-lite",
-      logo:"",
-      welcomeMessage:"" 
-    } 
-\`\`\`
-`;
-export const checkConfig = (config) => {
-    const { type, botId, modelName, model } = config;
+export const checkConfig = (chatMode, agentConfig, modelConfig) => {
+    const { botId } = agentConfig || {};
+    const { modelProvider, quickResponseModel, deepReasoningModel } = modelConfig || {};
     // 检测AI能力,不存在提示用户
     if (!wx.cloud.extend || !wx.cloud.extend.AI) {
         return [false, '使用AI能力需基础库为3.7.7及以上,请升级基础库版本或微信客户端'];
     }
-    if (!['bot', 'model'].includes(type)) {
-        return [false, 'type 不正确,值应为“bot”或“model”'];
+    if (!['bot', 'model'].includes(chatMode)) {
+        return [false, 'chatMode 不正确,值应为“bot”或“model”'];
     }
-    if (type === 'bot' && !botId) {
-        return [false, '当前type值为bot,请配置botId'];
+    if (chatMode === 'bot' && !botId) {
+        return [false, '当前chatMode值为bot,请配置botId'];
     }
-    if (type === 'model' && (!modelName || !model)) {
-        return [false, '当前type值为model,请配置modelNam和model'];
+    if (chatMode === 'model' && (!modelProvider || !quickResponseModel)) {
+        return [false, '当前chatMode值为model,请配置modelProvider和quickResponseModel'];
     }
     return [true, ''];
 };

+ 4 - 1
components/agent-ui/wd-markdown/index.vue

@@ -1,6 +1,7 @@
 <template>
     <view class="wd-markdown" :style="'font-size: ' + fontSize + 'rpx;'">
-        <rich-text :nodes="_html_var" />
+        <!-- <rich-text nodes="{{__html}}" /> -->
+        <mp-html :content="_html_var" :scroll-table="true" :selectable="true" />
     </view>
 </template>
 
@@ -10,7 +11,9 @@ import highlight from './utils/highlight.min.js';
 import hljsJs from './utils/hljs_javascript.min.js';
 import hljsCss from './utils/hljs_css.min.js';
 import { addCustomClassPlugin } from './utils/plugin';
+
 export default {
+    components: {},
     data() {
         return {
             _html_var: '',

+ 278 - 0
components/agent-ui/wd-markdown/mp-html/index.vue

@@ -0,0 +1,278 @@
+<template>
+    <view :class="'_root ' + (selectable ? '_select' : '')" :style="containerStyle">
+        <slot v-if="!nodes[0]" />
+        <node id="_root" :childs="nodes" :opts="[lazyLoad, loadingImg, errorImg, showImgMenu, selectable]" @add.stop.prevent="addFun($event, { tagId: '_root' })" />
+    </view>
+</template>
+
+<script>
+'use strict';
+import node from './node/node';
+function e(t) {
+    '@babel/helpers - typeof';
+
+    return (e =
+        'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator
+            ? function (e) {
+                  return typeof e;
+              }
+            : function (e) {
+                  return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e;
+              })(t);
+}
+function t(e, t, o) {
+    (t = n(t)) in e
+        ? Object.defineProperty(e, t, {
+              value: o,
+              enumerable: true,
+              configurable: true,
+              writable: true
+          })
+        : (e[t] = o);
+    return e;
+}
+function n(t) {
+    var n = o(t, 'string');
+    return 'symbol' == e(n) ? n : n + '';
+}
+function o(t, n) {
+    if ('object' != e(t) || !t) {
+        return t;
+    }
+    var o = t[Symbol.toPrimitive];
+    if (void 0 !== o) {
+        var i = o.call(t, n || 'default');
+        if ('object' != e(i)) {
+            return i;
+        }
+        throw new TypeError('@@toPrimitive must return a primitive value.');
+    }
+    return ('string' === n ? String : Number)(t);
+}
+/*!
+ * mp-html v2.5.0
+ * https://github.com/jin-yufeng/mp-html
+ *
+ * Released under the MIT license
+ * Author: Jin Yufeng
+ */
+var i = require('./parser');
+var r = [];
+export default {
+    components: {
+        node
+    },
+    data() {
+        return {
+            nodes: []
+        };
+    },
+    props: {
+        containerStyle: String,
+        content: {
+            type: String,
+            default: ''
+        },
+        copyLink: {
+            type: Boolean,
+            default: true
+        },
+        domain: String,
+        errorImg: String,
+        lazyLoad: Boolean,
+        loadingImg: String,
+        pauseVideo: {
+            type: Boolean,
+            default: true
+        },
+        previewImg: {
+            type: null,
+            default: true
+        },
+        scrollTable: Boolean,
+        selectable: null,
+        setTitle: {
+            type: Boolean,
+            default: true
+        },
+        showImgMenu: {
+            type: Boolean,
+            default: true
+        },
+        tagStyle: Object,
+        useAnchor: null
+    },
+    created: function () {
+        this.plugins = [];
+        for (var e = r.length; e--; ) {
+            this.plugins.push(new r[e](this));
+        }
+    },
+    destroyed: function () {
+        this.hookFun('onDetached');
+    },
+    methods: {
+        inFun: function (e, t, n) {
+            if (e && t && n) {
+                this._in = {
+                    page: e,
+                    selector: t,
+                    scrollTop: n
+                };
+            }
+        },
+        navigateTo: function (e, n) {
+            var that = this;
+            return new Promise(function (i, r) {
+                if (!that.useAnchor) {
+                    return void r(Error('Anchor is disabled'));
+                }
+                var a = uni
+                    .createSelectorQuery()
+                    .in(that._in ? that._in.page : that)
+                    .select((that._in ? that._in.selector : '._root') + (e ? ''.concat('>>>', '#').concat(e) : ''))
+                    .boundingClientRect();
+                that._in ? a.select(that._in.selector).scrollOffset().select(that._in.selector).boundingClientRect() : a.selectViewport().scrollOffset();
+                a.exec(function (e) {
+                    if (!e[0]) {
+                        return void r(Error('Label not found'));
+                    }
+                    var a = e[1].scrollTop + e[0].top - (e[2] ? e[2].top : 0) + (n || parseInt(that.useAnchor) || 0);
+                    that._in
+                        ? that._in.page.setData(t({}, that._in.scrollTop, a))
+                        : uni.pageScrollTo({
+                              scrollTop: a,
+                              duration: 300
+                          });
+                    i();
+                });
+            });
+        },
+        getText: function (e) {
+            var t = '';
+            (function e(n) {
+                for (var o = 0; o < n.length; o++) {
+                    var i = n[o];
+                    if ('text' === i.type) t += i.text.replace(/&amp;/g, '&');
+                    else if ('br' === i.name) {
+                        t += '\n';
+                    } else {
+                        var r = 'p' === i.name || 'div' === i.name || 'tr' === i.name || 'li' === i.name || ('h' === i.name[0] && i.name[1] > '0' && i.name[1] < '7');
+                        if (r && t && '\n' !== t[t.length - 1]) {
+                            t += '\n';
+                        }
+                        if (i.children) {
+                            e(i.children);
+                        }
+                        r && '\n' !== t[t.length - 1] ? (t += '\n') : ('td' !== i.name && 'th' !== i.name) || (t += '\t');
+                    }
+                }
+            })(e || this.nodes);
+            return t;
+        },
+        getRect: function () {
+            var that = this;
+            return new Promise(function (t, n) {
+                uni.createSelectorQuery()
+                    .in(that)
+                    .select('._root')
+                    .boundingClientRect()
+                    .exec(function (e) {
+                        return e[0] ? t(e[0]) : n(Error('Root label not found'));
+                    });
+            });
+        },
+        pauseMedia: function () {
+            for (var e = (this._videos || []).length; e--; ) {
+                this._videos[e].pause();
+            }
+        },
+        setPlaybackRate: function (e) {
+            this.playbackRate = e;
+            for (var t = (this._videos || []).length; t--; ) {
+                this._videos[t].playbackRate(e);
+            }
+        },
+        setContent: function (e, t) {
+            var that = this;
+            (this.imgList && t) || (this.imgList = []);
+            this._videos = [];
+            var o = {};
+            var r = new i(this).parse(e);
+            if (t) {
+                for (var a = this.nodes.length, s = r.length; s--; ) {
+                    o['nodes['.concat(a + s, ']')] = r[s];
+                }
+            } else {
+                o.nodes = r;
+            }
+            this.setData(o, function () {
+                that.hookFun('onLoad');
+                that.$emit('load');
+            });
+            if (this.lazyLoad || this.imgList._unloadimgs < this.imgList.length / 2) {
+                var l = 0;
+                var c = function (e) {
+                    (e && e.height) || (e = {});
+                    e.height === l
+                        ? that.$emit('ready', {
+                              detail: e
+                          })
+                        : ((l = e.height),
+                          setTimeout(function () {
+                              that.getRect().then(c).catch(c);
+                          }, 350));
+                };
+                this.getRect().then(c).catch(c);
+            } else {
+                this.imgList._unloadimgs ||
+                    this.getRect()
+                        .then(function (e) {
+                            that.$emit('ready', {
+                                detail: e
+                            });
+                        })
+                        .catch(function () {
+                            that.$emit('ready', {
+                                detail: {}
+                            });
+                        });
+            }
+        },
+        hookFun: function (e) {
+            for (var t = r.length; t--; ) {
+                if (this.plugins[t][e]) {
+                    this.plugins[t][e]();
+                }
+            }
+        },
+        addFun: function (e, _dataset) {
+            /* ---处理dataset begin--- */
+            this.handleDataset(e, _dataset);
+            /* ---处理dataset end--- */
+            e.detail.root = this;
+        }
+    },
+    watch: {
+        content: {
+            handler: function (e) {
+                this.setContent(e);
+            },
+
+            immediate: true
+        }
+    }
+};
+</script>
+<style>
+._root {
+    /* padding: 1px 0;
+  overflow-x: auto;
+  overflow-y: hidden; */
+}
+
+._select {
+    -webkit-user-select: text;
+    user-select: text;
+}
+</style>

File diff suppressed because it is too large
+ 1032 - 0
components/agent-ui/wd-markdown/mp-html/node/node.vue


+ 512 - 0
components/agent-ui/wd-markdown/mp-html/parser.js

@@ -0,0 +1,512 @@
+"use strict";
+function t(t, e) {
+  var s = "undefined" != typeof Symbol && t[Symbol.iterator] || t["@@iterator"];
+  if (!s) {
+    if (Array.isArray(t) || (s = i(t)) || e && t && "number" == typeof t.length) {
+      s && (t = s);
+      var n = 0,
+        a = function () {};
+      return {
+        s: a,
+        n: function () {
+          return n >= t.length ? {
+            done: !0
+          } : {
+            done: !1,
+            value: t[n++]
+          };
+        },
+        e: function (t) {
+          throw t;
+        },
+        f: a
+      };
+    }
+    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+  }
+  var r,
+    o = !0,
+    l = !1;
+  return {
+    s: function () {
+      s = s.call(t);
+    },
+    n: function () {
+      var t = s.next();
+      return o = t.done, t;
+    },
+    e: function (t) {
+      l = !0, r = t;
+    },
+    f: function () {
+      try {
+        o || null == s.return || s.return();
+      } finally {
+        if (l) throw r;
+      }
+    }
+  };
+}
+function i(t, i) {
+  if (t) {
+    if ("string" == typeof t) return e(t, i);
+    var s = {}.toString.call(t).slice(8, -1);
+    return "Object" === s && t.constructor && (s = t.constructor.name), "Map" === s || "Set" === s ? Array.from(t) : "Arguments" === s || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s) ? e(t, i) : void 0;
+  }
+}
+function e(t, i) {
+  (null == i || i > t.length) && (i = t.length);
+  for (var e = 0, s = Array(i); e < i; e++) s[e] = t[e];
+  return s;
+}
+function s(t) {
+  for (var i = Object.create(null), e = t.split(","), s = e.length; s--;) i[e[s]] = !0;
+  return i;
+}
+function n(t, i) {
+  for (var e = t.indexOf("&"); -1 !== e;) {
+    var s = t.indexOf(";", e + 3),
+      n = void 0;
+    if (-1 === s) break;
+    "#" === t[e + 1] ? (n = parseInt(("x" === t[e + 2] ? "0" : "") + t.substring(e + 2, s)), isNaN(n) || (t = t.substr(0, e) + String.fromCharCode(n) + t.substr(s + 1))) : (n = t.substring(e + 1, s), (l.entities[n] || "amp" === n && i) && (t = t.substr(0, e) + (l.entities[n] || "&") + t.substr(s + 1))), e = t.indexOf("&", e + 1);
+  }
+  return t;
+}
+function a(t) {
+  for (var i = t.length - 1, e = i; e >= -1; e--) (-1 === e || t[e].c || !t[e].name || "div" !== t[e].name && "p" !== t[e].name && "h" !== t[e].name[0] || (t[e].attrs.style || "").includes("inline")) && (i - e >= 5 && t.splice(e + 1, i - e, {
+    name: "div",
+    attrs: {},
+    children: t.slice(e + 1, i + 1)
+  }), i = e - 1);
+}
+function r(t) {
+  this.options = t.data || {}, this.tagStyle = Object.assign({}, l.tagStyle, this.options.tagStyle), this.imgList = t.imgList || [], this.imgList._unloadimgs = 0, this.plugins = t.plugins || [], this.attrs = Object.create(null), this.stack = [], this.nodes = [], this.pre = (this.options.containerStyle || "").includes("white-space") && this.options.containerStyle.includes("pre") ? 2 : 0;
+}
+function o(t) {
+  this.handler = t;
+}
+var l = {
+    trustTags: s("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,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video"),
+    blockTags: s("address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section"),
+    ignoreTags: s("area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr"),
+    voidTags: s("area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr"),
+    entities: {
+      lt: "<",
+      gt: ">",
+      quot: '"',
+      apos: "'",
+      ensp: " ",
+      emsp: " ",
+      nbsp: " ",
+      semi: ";",
+      ndash: "–",
+      mdash: "—",
+      middot: "·",
+      lsquo: "‘",
+      rsquo: "’",
+      ldquo: "“",
+      rdquo: "”",
+      bull: "•",
+      hellip: "…",
+      larr: "←",
+      uarr: "↑",
+      rarr: "→",
+      darr: "↓"
+    },
+    tagStyle: {
+      address: "font-style:italic",
+      big: "display:inline;font-size:1.2em",
+      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",
+      s: "text-decoration:line-through",
+      small: "display:inline;font-size:0.8em",
+      strike: "text-decoration:line-through",
+      u: "text-decoration:underline"
+    },
+    svgDict: {
+      animatetransform: "animateTransform",
+      lineargradient: "linearGradient",
+      viewbox: "viewBox",
+      attributename: "attributeName",
+      repeatcount: "repeatCount",
+      repeatdur: "repeatDur",
+      foreignobject: "foreignObject"
+    }
+  },
+  h = {},
+  c = uni.getSystemInfoSync(),
+  d = c.windowWidth,
+  p = c.system,
+  u = s(" ,\r,\n,\t,\f"),
+  f = 0;
+r.prototype.parse = function (t) {
+  for (var i = this.plugins.length; i--;) this.plugins[i].onUpdate && (t = this.plugins[i].onUpdate(t, l) || t);
+  for (new o(this).parse(t); this.stack.length;) this.popNode();
+  return this.nodes.length > 50 && a(this.nodes), this.nodes;
+}, r.prototype.expose = function () {
+  for (var t = this.stack.length; t--;) {
+    var i = this.stack[t];
+    if (i.c || "a" === i.name || "video" === i.name || "audio" === i.name) return;
+    i.c = 1;
+  }
+}, r.prototype.hook = function (t) {
+  for (var i = this.plugins.length; i--;) if (this.plugins[i].onParse && !1 === this.plugins[i].onParse(t, this)) return !1;
+  return !0;
+}, r.prototype.getUrl = function (t) {
+  var i = this.options.domain;
+  return "/" === t[0] ? "/" === t[1] ? t = (i ? i.split("://")[0] : "http") + ":" + t : i && (t = i + t) : !i || t.includes("data:") || t.includes("://") || (t = i + "/" + t), t;
+}, r.prototype.parseStyle = function (t) {
+  var i = t.attrs,
+    e = (this.tagStyle[t.name] || "").split(";").concat((i.style || "").split(";")),
+    s = {},
+    n = "";
+  i.id && !this.xml && (this.options.useAnchor ? this.expose() : "img" !== t.name && "a" !== t.name && "video" !== t.name && "audio" !== t.name && (i.id = void 0)), i.width && (s.width = parseFloat(i.width) + (i.width.includes("%") ? "%" : "px"), i.width = void 0), i.height && (s.height = parseFloat(i.height) + (i.height.includes("%") ? "%" : "px"), i.height = void 0);
+  for (var a = 0, r = e.length; a < r; a++) {
+    var o = e[a].split(":");
+    if (!(o.length < 2)) {
+      var l = o.shift().trim().toLowerCase(),
+        h = o.join(":").trim();
+      if ("-" === h[0] && h.lastIndexOf("-") > 0 || h.includes("safe")) n += ";".concat(l, ":").concat(h);else if (!s[l] || h.includes("import") || !s[l].includes("import")) {
+        if (h.includes("url")) {
+          var c = h.indexOf("(") + 1;
+          if (c) {
+            for (; '"' === h[c] || "'" === h[c] || u[h[c]];) c++;
+            h = h.substr(0, c) + this.getUrl(h.substr(c));
+          }
+        } else h.includes("rpx") && (h = h.replace(/[0-9.]+\s*rpx/g, function (t) {
+          return parseFloat(t) * d / 750 + "px";
+        }));
+        s[l] = h;
+      }
+    }
+  }
+  return t.attrs.style = n, s;
+}, r.prototype.onTagName = function (t) {
+  this.tagName = this.xml ? t : t.toLowerCase(), "svg" === this.tagName && (this.xml = (this.xml || 0) + 1, l.ignoreTags.style = void 0);
+}, r.prototype.onAttrName = function (t) {
+  t = this.xml ? t : t.toLowerCase(), "data-" === t.substr(0, 5) ? "data-src" !== t || this.attrs.src ? "img" === this.tagName || "a" === this.tagName ? this.attrName = t : this.attrName = void 0 : this.attrName = "src" : (this.attrName = t, this.attrs[t] = "T");
+}, r.prototype.onAttrVal = function (t) {
+  var i = this.attrName || "";
+  "style" === i || "href" === i ? this.attrs[i] = n(t, !0) : i.includes("src") ? this.attrs[i] = this.getUrl(n(t, !0)) : i && (this.attrs[i] = t);
+}, r.prototype.onOpenTag = function (t) {
+  var i = Object.create(null);
+  i.name = this.tagName, i.attrs = this.attrs, this.attrs = Object.create(null);
+  var e = i.attrs,
+    s = this.stack[this.stack.length - 1],
+    n = s ? s.children : this.nodes,
+    a = this.xml ? t : l.voidTags[i.name];
+  if (h[i.name] && (e.class = h[i.name] + (e.class ? " " + e.class : "")), "embed" === i.name) {
+    var r = e.src || "";
+    r.includes(".mp4") || r.includes(".3gp") || r.includes(".m3u8") || (e.type || "").includes("video") ? i.name = "video" : (r.includes(".mp3") || r.includes(".wav") || r.includes(".aac") || r.includes(".m4a") || (e.type || "").includes("audio")) && (i.name = "audio"), e.autostart && (e.autoplay = "T"), e.controls = "T";
+  }
+  if ("video" !== i.name && "audio" !== i.name || ("video" !== i.name || e.id || (e.id = "v" + f++), e.controls || e.autoplay || (e.controls = "T"), i.src = [], e.src && (i.src.push(e.src), e.src = void 0), this.expose()), a) {
+    if (!this.hook(i) || l.ignoreTags[i.name]) return void ("base" !== i.name || this.options.domain ? "source" === i.name && s && ("video" === s.name || "audio" === s.name) && e.src && s.src.push(e.src) : this.options.domain = e.href);
+    var o = this.parseStyle(i);
+    if ("img" === i.name) {
+      if (e.src && (e.src.includes("webp") && (i.webp = "T"), e.src.includes("data:") && "all" !== this.options.previewImg && !e["original-src"] && (e.ignore = "T"), !e.ignore || i.webp || e.src.includes("cloud://"))) {
+        for (var c = this.stack.length; c--;) {
+          var p = this.stack[c];
+          "table" !== p.name || i.webp || e.src.includes("cloud://") || (!o.display || o.display.includes("inline") ? i.t = "inline-block" : i.t = o.display, o.display = void 0);
+          var u = p.attrs.style || "";
+          if (!u.includes("flex:") || u.includes("flex:0") || u.includes("flex: 0") || o.width && !(parseInt(o.width) > 100)) {
+            if (u.includes("flex") && "100%" === o.width) for (var g = c + 1; g < this.stack.length; g++) {
+              var m = this.stack[g].attrs.style || "";
+              if (!m.includes(";width") && !m.includes(" width") && 0 !== m.indexOf("width")) {
+                o.width = "";
+                break;
+              }
+            } else u.includes("inline-block") && (o.width && "%" === o.width[o.width.length - 1] ? (p.attrs.style += ";max-width:" + o.width, o.width = "") : p.attrs.style += ";max-width:100%");
+          } else {
+            o.width = "100% !important", o.height = "";
+            for (var v = c + 1; v < this.stack.length; v++) this.stack[v].attrs.style = (this.stack[v].attrs.style || "").replace("inline-", "");
+          }
+          "a" === p.name ? i.a = p.attrs : p.c = 1;
+        }
+        i.i = this.imgList.length;
+        var y = e["original-src"] || e.src;
+        if (this.imgList.includes(y)) {
+          var b = y.indexOf("://");
+          if (-1 !== b) {
+            b += 3;
+            for (var x = y.substr(0, b); b < y.length && "/" !== y[b]; b++) x += Math.random() > .5 ? y[b].toUpperCase() : y[b];
+            x += y.substr(b), y = x;
+          }
+        }
+        this.imgList.push(y), i.t || (this.imgList._unloadimgs += 1);
+      }
+      "inline" === o.display && (o.display = ""), e.ignore && (o["max-width"] = o["max-width"] || "100%", e.style += ";-webkit-touch-callout:none"), parseInt(o.width) > d && (o.height = void 0), isNaN(parseInt(o.width)) || (i.w = "T"), !isNaN(parseInt(o.height)) && (!o.height.includes("%") || s && (s.attrs.style || "").includes("height")) && (i.h = "T"), i.w && i.h && o["object-fit"] && ("contain" === o["object-fit"] ? i.m = "aspectFit" : "cover" === o["object-fit"] && (i.m = "aspectFill"));
+    } else if ("svg" === i.name) return n.push(i), this.stack.push(i), void this.popNode();
+    for (var w in o) o[w] && (e.style += ";".concat(w, ":").concat(o[w].replace(" !important", "")));
+    e.style = e.style.substr(1) || void 0;
+  } else ("pre" === i.name || (e.style || "").includes("white-space") && e.style.includes("pre")) && 2 !== this.pre && (this.pre = i.pre = 1), i.children = [], this.stack.push(i);
+  n.push(i);
+}, r.prototype.onCloseTag = function (t) {
+  t = this.xml ? t : t.toLowerCase();
+  var i;
+  for (i = this.stack.length; i-- && this.stack[i].name !== t;);
+  if (-1 !== i) for (; this.stack.length > i;) this.popNode();else if ("p" === t || "br" === t) {
+    var e = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes;
+    e.push({
+      name: t,
+      attrs: {
+        class: h[t],
+        style: this.tagStyle[t]
+      }
+    });
+  }
+}, r.prototype.popNode = function () {
+  var i = this.stack.pop(),
+    e = i.attrs,
+    s = i.children,
+    n = this.stack[this.stack.length - 1],
+    r = n ? n.children : this.nodes;
+  if (!this.hook(i) || l.ignoreTags[i.name]) return "title" === i.name && s.length && "text" === s[0].type && this.options.setTitle && uni.setNavigationBarTitle({
+    title: s[0].text
+  }), void r.pop();
+  if (i.pre && 2 !== this.pre) {
+    this.pre = i.pre = void 0;
+    for (var o = this.stack.length; o--;) this.stack[o].pre && (this.pre = 1);
+  }
+  if ("svg" === i.name) {
+    if (this.xml > 1) return void this.xml--;
+    var h = "",
+      c = e.style;
+    return e.style = "", e.xmlns = "http://www.w3.org/2000/svg", function i(e) {
+      if ("text" === e.type) return void (h += e.text);
+      var s = l.svgDict[e.name] || e.name;
+      if ("foreignObject" === s) {
+        var n,
+          a = t(e.children || []);
+        try {
+          for (a.s(); !(n = a.n()).done;) {
+            var r = n.value;
+            if (r.attrs && !r.attrs.xmlns) {
+              r.attrs.xmlns = "http://www.w3.org/1999/xhtml";
+              break;
+            }
+          }
+        } catch (t) {
+          a.e(t);
+        } finally {
+          a.f();
+        }
+      }
+      h += "<" + s;
+      for (var o in e.attrs) {
+        var c = e.attrs[o];
+        c && (h += " ".concat(l.svgDict[o] || o, '="').concat(c.replace(/"/g, ""), '"'));
+      }
+      if (e.children) {
+        h += ">";
+        for (var d = 0; d < e.children.length; d++) i(e.children[d]);
+        h += "</" + s + ">";
+      } else h += "/>";
+    }(i), i.name = "img", i.attrs = {
+      src: "data:image/svg+xml;utf8," + h.replace(/#/g, "%23"),
+      style: c,
+      ignore: "T"
+    }, i.children = void 0, this.xml = !1, void (l.ignoreTags.style = !0);
+  }
+  var p = {};
+  if (e.align && ("table" === i.name ? "center" === e.align ? p["margin-inline-start"] = p["margin-inline-end"] = "auto" : p.float = e.align : p["text-align"] = e.align, e.align = void 0), e.dir && (p.direction = e.dir, e.dir = void 0), "font" === i.name && (e.color && (p.color = e.color, e.color = void 0), e.face && (p["font-family"] = e.face, e.face = void 0), e.size)) {
+    var u = parseInt(e.size);
+    isNaN(u) || (u < 1 ? u = 1 : u > 7 && (u = 7), p["font-size"] = ["x-small", "small", "medium", "large", "x-large", "xx-large", "xxx-large"][u - 1]), e.size = void 0;
+  }
+  if ((e.class || "").includes("align-center") && (p["text-align"] = "center"), Object.assign(p, this.parseStyle(i)), "table" !== i.name && parseInt(p.width) > d && (p["max-width"] = "100%", p["box-sizing"] = "border-box"), l.blockTags[i.name]) i.name = "div";else if (l.trustTags[i.name] || this.xml) {
+    if ("a" === i.name || "ad" === i.name) this.expose();else if ("video" === i.name || "audio" === i.name) (p.height || "").includes("auto") && (p.height = void 0), i.children = void 0;else if ("ul" !== i.name && "ol" !== i.name || !i.c) {
+      if ("table" === i.name) {
+        var f = parseFloat(e.cellpadding),
+          g = parseFloat(e.cellspacing),
+          m = parseFloat(e.border),
+          v = p["border-color"],
+          y = p["border-style"];
+        if (i.c && (isNaN(f) && (f = 2), isNaN(g) && (g = 2)), m && (e.style += ";border:".concat(m, "px ").concat(y || "solid", " ").concat(v || "gray")), i.flag && i.c) {
+          i.flag = void 0, p.display = "grid", "collapse" === p["border-collapse"] && (p["border-collapse"] = void 0, g = 0), g ? (p["grid-gap"] = g + "px", p.padding = g + "px") : m && (e.style += ";border-left:0;border-top:0");
+          var b = [],
+            x = [],
+            w = [],
+            k = {};
+          !function i(e) {
+            for (var s = 0; s < e.length; s++) if ("tr" === e[s].name) x.push(e[s]);else if ("colgroup" === e[s].name) {
+              var n,
+                a = 1,
+                r = t(e[s].children || []);
+              try {
+                for (r.s(); !(n = r.n()).done;) {
+                  var o = n.value;
+                  if ("col" === o.name) {
+                    var l = o.attrs.style || "",
+                      h = l.indexOf("width") ? l.indexOf(";width") : 0;
+                    if (-1 !== h) {
+                      var c = l.indexOf(";", h + 6);
+                      -1 === c && (c = l.length), b[a] = l.substring(h ? h + 7 : 6, c);
+                    }
+                    a += 1;
+                  }
+                }
+              } catch (t) {
+                r.e(t);
+              } finally {
+                r.f();
+              }
+            } else i(e[s].children || []);
+          }(s);
+          for (var N = 1; N <= x.length; N++) {
+            for (var T = 1, O = 0; O < x[N - 1].children.length; O++) {
+              var j = x[N - 1].children[O];
+              if ("td" === j.name || "th" === j.name) {
+                for (; k[N + "." + T];) T++;
+                j.c = 1;
+                var S = j.attrs.style || "",
+                  C = S.indexOf("width") ? S.indexOf(";width") : 0;
+                if (-1 !== C) {
+                  var I = S.indexOf(";", C + 6);
+                  -1 === I && (I = S.length), j.attrs.colspan || (b[T] = S.substring(C ? C + 7 : 6, I)), S = S.substr(0, C) + S.substr(I);
+                }
+                if (S += ";display:flex;flex-direction:column", -1 !== (C = S.indexOf("vertical-align"))) {
+                  var A = S.substr(C + 15, 10);
+                  A.includes("middle") ? S += ";justify-content:center" : A.includes("bottom") && (S += ";justify-content:flex-end");
+                } else S += ";justify-content:center";
+                if (-1 !== (C = S.indexOf("text-align"))) {
+                  var L = S.substr(C + 11, 10);
+                  L.includes("center") ? S += ";justify-content: center" : L.includes("right") && (S += ";justify-content: right");
+                }
+                if (S = (m ? ";border:".concat(m, "px ").concat(y || "solid", " ").concat(v || "gray") + (g ? "" : ";border-right:0;border-bottom:0") : "") + (f ? ";padding:".concat(f, "px") : "") + ";" + S, j.attrs.colspan && (S += ";grid-column-start:".concat(T, ";grid-column-end:").concat(T + parseInt(j.attrs.colspan)), j.attrs.rowspan || (S += ";grid-row-start:".concat(N, ";grid-row-end:").concat(N + 1)), T += parseInt(j.attrs.colspan) - 1), j.attrs.rowspan) {
+                  S += ";grid-row-start:".concat(N, ";grid-row-end:").concat(N + parseInt(j.attrs.rowspan)), j.attrs.colspan || (S += ";grid-column-start:".concat(T, ";grid-column-end:").concat(T + 1));
+                  for (var z = 1; z < j.attrs.rowspan; z++) for (var F = 0; F < (j.attrs.colspan || 1); F++) k[N + z + "." + (T - F)] = 1;
+                }
+                S && (j.attrs.style = S), w.push(j), T++;
+              }
+            }
+            if (1 === N) {
+              for (var U = "", q = 1; q < T; q++) U += (b[q] ? b[q] : "auto") + " ";
+              p["grid-template-columns"] = U;
+            }
+          }
+          i.children = w;
+        } else i.c && (p.display = "table"), isNaN(g) || (p["border-spacing"] = g + "px"), (m || f || i.c) && function t(e) {
+          for (var s = 0; s < e.length; s++) {
+            var n = e[s];
+            i.c && (n.c = 1), "th" === n.name || "td" === n.name ? (m && (n.attrs.style = "border:".concat(m, "px ").concat(y || "solid", " ").concat(v || "gray", ";").concat(n.attrs.style || "")), f && (n.attrs.style = "padding:".concat(f, "px;").concat(n.attrs.style || ""))) : n.children && t(n.children);
+          }
+        }(s);
+        if (this.options.scrollTable && !(e.style || "").includes("inline")) {
+          var V = Object.assign({}, i);
+          i.name = "div", i.attrs = {
+            style: "overflow-x:auto;padding:1px"
+          }, i.children = [V], e = V.attrs;
+        }
+      } else if (("tbody" === i.name || "tr" === i.name) && i.flag && i.c) i.flag = void 0, function t(i) {
+        for (var e = 0; e < i.length; e++) if ("td" === i[e].name) for (var s = 0, n = ["color", "background", "background-color"]; s < n.length; s++) {
+          var a = n[s];
+          p[a] && (i[e].attrs.style = a + ":" + p[a] + ";" + (i[e].attrs.style || ""));
+        } else t(i[e].children || []);
+      }(s);else if ("td" !== i.name && "th" !== i.name || !e.colspan && !e.rowspan) {
+        if ("ruby" === i.name) {
+          i.name = "span";
+          for (var D = 0; D < s.length - 1; D++) "text" === s[D].type && "rt" === s[D + 1].name && (s[D] = {
+            name: "span",
+            attrs: {
+              style: "display:inline-block;text-align:center"
+            },
+            children: [{
+              name: "div",
+              attrs: {
+                style: "font-size:50%;" + (s[D + 1].attrs.style || "")
+              },
+              children: s[D + 1].children
+            }, s[D]]
+          }, s.splice(D + 1, 1));
+        }
+      } else for (var B = this.stack.length; B--;) "table" !== this.stack[B].name && "tbody" !== this.stack[B].name && "tr" !== this.stack[B].name || (this.stack[B].flag = 1);
+    } else {
+      var M = {
+        a: "lower-alpha",
+        A: "upper-alpha",
+        i: "lower-roman",
+        I: "upper-roman"
+      };
+      M[e.type] && (e.style += ";list-style-type:" + M[e.type], e.type = void 0), i.c = 1;
+      for (var P = s.length; P--;) "li" === s[P].name && (s[P].c = 1);
+    }
+  } else i.name = "span";
+  if ((p.display || "").includes("flex") && !i.c) for (var Z = s.length; Z--;) {
+    var _ = s[Z];
+    _.f && (_.attrs.style = (_.attrs.style || "") + _.f, _.f = void 0);
+  }
+  var E = n && ((n.attrs.style || "").includes("flex") || (n.attrs.style || "").includes("grid")) && !i.c && !(p.display || "").includes("inline");
+  E && (i.f = ";max-width:100%"), s.length >= 50 && i.c && !(p.display || "").includes("flex") && a(s);
+  for (var G in p) if (p[G]) {
+    var W = ";".concat(G, ":").concat(p[G].replace(" !important", ""));
+    E && (G.includes("flex") && "flex-direction" !== G || "align-self" === G || G.includes("grid") || "-" === p[G][0] || G.includes("width") && W.includes("%")) ? (i.f += W, "width" === G && (e.style += ";width:100%")) : e.style += W;
+  }
+  e.style = e.style.substr(1) || void 0;
+}, r.prototype.onText = function (t) {
+  if (!this.pre) {
+    for (var i, e = "", s = 0, a = t.length; s < a; s++) u[t[s]] ? (" " !== e[e.length - 1] && (e += " "), "\n" !== t[s] || i || (i = !0)) : e += t[s];
+    if (" " === e && i) return;
+    t = e;
+  }
+  var r = Object.create(null);
+  if (r.type = "text", r.text = n(t), this.hook(r)) {
+    "force" === this.options.selectable && p.includes("iOS") && !uni.canIUse("rich-text.user-select") && this.expose();
+    (this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes).push(r);
+  }
+}, o.prototype.parse = function (t) {
+  this.content = t || "", this.i = 0, this.start = 0, this.state = this.text;
+  for (var i = this.content.length; -1 !== this.i && this.i < i;) this.state();
+}, o.prototype.checkClose = function (t) {
+  var i = "/" === this.content[this.i];
+  return !!(">" === this.content[this.i] || i && ">" === this.content[this.i + 1]) && (t && this.handler[t](this.content.substring(this.start, this.i)), this.i += i ? 2 : 1, this.start = this.i, this.handler.onOpenTag(i), "script" === this.handler.tagName ? (this.i = this.content.indexOf("</", this.i), -1 !== this.i && (this.i += 2, this.start = this.i), this.state = this.endTag) : this.state = this.text, !0);
+}, o.prototype.text = function () {
+  if (this.i = this.content.indexOf("<", this.i), -1 === this.i) return void (this.start < this.content.length && this.handler.onText(this.content.substring(this.start, this.content.length)));
+  var t = this.content[this.i + 1];
+  if (t >= "a" && t <= "z" || t >= "A" && t <= "Z") this.start !== this.i && this.handler.onText(this.content.substring(this.start, this.i)), this.start = ++this.i, this.state = this.tagName;else if ("/" === t || "!" === t || "?" === t) {
+    this.start !== this.i && this.handler.onText(this.content.substring(this.start, this.i));
+    var i = this.content[this.i + 2];
+    if ("/" === t && (i >= "a" && i <= "z" || i >= "A" && i <= "Z")) return this.i += 2, this.start = this.i, void (this.state = this.endTag);
+    var e = "--\x3e";
+    "!" === t && "-" === this.content[this.i + 2] && "-" === this.content[this.i + 3] || (e = ">"), this.i = this.content.indexOf(e, this.i), -1 !== this.i && (this.i += e.length, this.start = this.i);
+  } else this.i++;
+}, o.prototype.tagName = function () {
+  if (u[this.content[this.i]]) {
+    for (this.handler.onTagName(this.content.substring(this.start, this.i)); u[this.content[++this.i]];);
+    this.i < this.content.length && !this.checkClose() && (this.start = this.i, this.state = this.attrName);
+  } else this.checkClose("onTagName") || this.i++;
+}, o.prototype.attrName = function () {
+  var t = this.content[this.i];
+  if (u[t] || "=" === t) {
+    this.handler.onAttrName(this.content.substring(this.start, this.i));
+    for (var i = "=" === t, e = this.content.length; ++this.i < e;) if (t = this.content[this.i], !u[t]) {
+      if (this.checkClose()) return;
+      if (i) return this.start = this.i, void (this.state = this.attrVal);
+      if ("=" !== this.content[this.i]) return this.start = this.i, void (this.state = this.attrName);
+      i = !0;
+    }
+  } else this.checkClose("onAttrName") || this.i++;
+}, o.prototype.attrVal = function () {
+  var t = this.content[this.i],
+    i = this.content.length;
+  if ('"' === t || "'" === t) {
+    if (this.start = ++this.i, this.i = this.content.indexOf(t, this.i), -1 === this.i) return;
+    this.handler.onAttrVal(this.content.substring(this.start, this.i));
+  } else for (; this.i < i; this.i++) {
+    if (u[this.content[this.i]]) {
+      this.handler.onAttrVal(this.content.substring(this.start, this.i));
+      break;
+    }
+    if (this.checkClose("onAttrVal")) return;
+  }
+  for (; u[this.content[++this.i]];);
+  this.i < i && !this.checkClose() && (this.start = this.i, this.state = this.attrName);
+}, o.prototype.endTag = function () {
+  var t = this.content[this.i];
+  if (u[t] || ">" === t || "/" === t) {
+    if (this.handler.onCloseTag(this.content.substring(this.start, this.i)), ">" !== t && (this.i = this.content.indexOf(">", this.i), -1 === this.i)) return;
+    this.start = ++this.i, this.state = this.text;
+  } else this.i++;
+}, module.exports = r;

+ 9 - 2
pages/index/aichat.vue

@@ -14,7 +14,9 @@
         <!-- index.wxml -->
 		 <!-- <navigationBar></navigationBar> -->
 		 <!-- <button open-type="contact" bindcontact="handleContact" session-from="sessionFrom">111</button> -->
-        <agent-ui   :agentConfig="agentConfig" showBotAvatar="true"></agent-ui>
+		 <agent-ui :agentConfig="agentConfig"  showBotAvatar="true" chatMode="bot"></agent-ui>
+
+        
     </view>
 </template>
 
@@ -32,7 +34,12 @@ export default {
                 // 值为'bot'或'model'。当type='bot'时,botId必填;当type='model'时,modelName和model必填
                 botId: 'bot-df4c8ed6',
                 // agent id
-                showBotAvatar:true// 是否在对话框左侧显示头像
+                showBotAvatar:true,// 是否在对话框左侧显示头像
+				allowWebSearch: true,
+				// 允许客户端选择启用联网搜索
+				allowUploadFile: true,
+				// 允许上传文件
+				allowPullRefresh: true // 允许下拉刷新
                 // 具体的模型版本
                 // logo: 'https://cloud1-6g83nk504b196aa9-1328241815.tcloudbaseapp.com/resources/2025-03/lowcode-2171303',
                 // 图标(只在model模式下生效)

File diff suppressed because it is too large
+ 2 - 0
static/components/agent-ui/imgs/wechat.svg


+ 193 - 0
uni_modules/mp-html/README.md

@@ -0,0 +1,193 @@
+## 为减小组件包的大小,默认组件包中不包含编辑、latex 公式等扩展功能,需要使用扩展功能的请参考下方的 插件扩展 栏的说明
+
+## 功能介绍
+- 全端支持(含 `v3、NVUE`)
+- 支持丰富的标签(包括 `table`、`video`、`svg` 等)
+- 支持丰富的事件效果(自动预览图片、链接处理等)
+- 支持设置占位图(加载中、出错时、预览时)
+- 支持锚点跳转、长按复制等丰富功能
+- 支持大部分 *html* 实体
+- 丰富的插件(关键词搜索、内容编辑、`latex` 公式等)
+- 效率高、容错性强且轻量化
+
+查看 [功能介绍](https://jin-yufeng.gitee.io/mp-html/#/overview/feature) 了解更多
+
+## 使用方法
+- `uni_modules` 方式  
+  1. 点击右上角的 `使用 HBuilder X 导入插件` 按钮直接导入项目或点击 `下载插件 ZIP` 按钮下载插件包并解压到项目的 `uni_modules/mp-html` 目录下  
+  2. 在需要使用页面的 `(n)vue` 文件中添加  
+     ```html
+     <!-- 不需要引入,可直接使用 -->
+     <mp-html :content="html" />
+     ```
+     ```javascript
+     export default {
+       data() {
+         return {
+           html: '<div>Hello World!</div>'
+         }
+       }
+     }
+     ```
+  3. 需要更新版本时在 `HBuilder X` 中右键 `uni_modules/mp-html` 目录选择 `从插件市场更新` 即可  
+
+- 源码方式  
+  1. 从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 下载源码  
+     插件市场的 **非 uni_modules 版本** 无法更新,不建议从插件市场获取  
+  2. 在需要使用页面的 `(n)vue` 文件中添加  
+     ```html
+     <mp-html :content="html" />
+     ```
+     ```javascript
+     import mpHtml from '@/components/mp-html/mp-html'
+     export default {
+       // HBuilderX 2.5.5+ 可以通过 easycom 自动引入
+       components: {
+         mpHtml
+       },
+       data() {
+         return {
+           html: '<div>Hello World!</div>'
+         }
+       }
+     }
+     ```
+
+- npm 方式  
+  1. 在项目根目录下执行  
+     ```bash
+     npm install mp-html
+     ```
+  2. 在需要使用页面的 `(n)vue` 文件中添加  
+     ```html
+     <mp-html :content="html" />
+     ```
+     ```javascript
+     import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html'
+     export default {
+       // 不可省略
+       components: {
+         mpHtml
+       },
+       data() {
+         return {
+           html: '<div>Hello World!</div>'
+         }
+       }
+     }
+     ```
+  3. 需要更新版本时执行以下命令即可  
+     ```bash
+     npm update mp-html
+     ```
+  
+  使用 *cli* 方式运行的项目,通过 *npm* 方式引入时,需要在 *vue.config.js* 中配置 *transpileDependencies*,详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687)  
+  如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下,否则无法运行  
+
+查看 [快速开始](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart) 了解更多
+
+## 组件属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|:---:|:---:|:---:|---|
+| container-style | String |  | 容器的样式([2.1.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v210)) |
+| content | String |  | 用于渲染的 html 字符串 |
+| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 |
+| domain | String |  | 主域名(用于链接拼接) |
+| error-img | String |  | 图片出错时的占位图链接 |
+| lazy-load | Boolean | false | 是否开启图片懒加载 |
+| loading-img | String |  | 图片加载过程中的占位图链接 |
+| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 |
+| preview-img | Boolean | true | 是否允许图片被点击时自动预览 |
+| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 |
+| selectable | Boolean | false | 是否开启文本长按复制 |
+| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 |
+| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 |
+| tag-style | Object |  | 设置标签的默认样式 |
+| use-anchor | Boolean | false | 是否使用锚点链接 |
+
+查看 [属性](https://jin-yufeng.gitee.io/mp-html/#/basic/prop) 了解更多
+
+## 组件事件
+
+| 名称 | 触发时机 |
+|:---:|---|
+| load | dom 树加载完毕时 |
+| ready | 图片加载完毕时 |
+| error | 发生渲染错误时 |
+| imgtap | 图片被点击时 |
+| linktap | 链接被点击时 |
+| play | 音视频播放时 |
+
+查看 [事件](https://jin-yufeng.gitee.io/mp-html/#/basic/event) 了解更多
+
+## api
+组件实例上提供了一些 `api` 方法可供调用
+
+| 名称 | 作用 |
+|:---:|---|
+| in | 将锚点跳转的范围限定在一个 scroll-view 内 |
+| navigateTo | 锚点跳转 |
+| getText | 获取文本内容 |
+| getRect | 获取富文本内容的位置和大小 |
+| setContent | 设置富文本内容 |
+| imgList | 获取所有图片的数组 |
+| pauseMedia | 暂停播放音视频([2.2.2+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v222)) |
+| setPlaybackRate | 设置音视频播放速率([2.4.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v240)) |
+
+查看 [api](https://jin-yufeng.gitee.io/mp-html/#/advanced/api) 了解更多
+
+## 插件扩展  
+除基本功能外,本组件还提供了丰富的扩展,可按照需要选用
+
+| 名称 | 作用 |
+|:---:|---|
+| audio | 音乐播放器 |
+| editable | 富文本 **编辑**([示例项目](https://mp-html.oss-cn-hangzhou.aliyuncs.com/editable.zip)) |
+| emoji | 解析 emoji |
+| highlight | 代码块高亮显示 |
+| markdown | 渲染 markdown |
+| search | 关键词搜索 |
+| style | 匹配 style 标签中的样式 |
+| txv-video | 使用腾讯视频 |
+| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) |
+| latex | 渲染 latex 公式 by [@Zeng-J](https://github.com/Zeng-J) |
+
+从插件市场导入的包中 **不含有** 扩展插件,使用插件需通过微信小程序 `富文本插件` 获取或参考以下方法进行打包:  
+1. 获取完整组件包  
+   ```bash
+   npm install mp-html
+   ```
+2. 编辑 `tools/config.js` 中的 `plugins` 项,选择需要的插件  
+3. 生成新的组件包  
+   在 `node_modules/mp-html` 目录下执行  
+   ```bash
+   npm install
+   npm run build:uni-app
+   ```
+4. 拷贝 `dist/uni-app` 中的内容到项目根目录  
+
+查看 [插件](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin) 了解更多
+
+## 关于 nvue
+`nvue` 使用原生渲染,不支持部分 `css` 样式,为实现和 `html` 相同的效果,组件内部通过 `web-view` 进行渲染,性能上差于原生,根据 `weex` 官方建议,`web` 标签仅应用在非常规的降级场景。因此,如果通过原生的方式(如 `richtext`)能够满足需要,则不建议使用本组件,如果有较多的富文本内容,则可以直接使用 `vue` 页面  
+由于渲染方式与其他端不同,有以下限制:  
+1. 不支持 `lazy-load` 属性
+2. 视频不支持全屏播放
+3. 如果在 `flex-direction: row` 的容器中使用,需要给组件设置宽度或设置 `flex: 1` 占满剩余宽度
+
+纯 `nvue` 模式下,[此问题](https://ask.dcloud.net.cn/question/119678) 修复前,不支持通过 `uni_modules` 引入,需要本地引入(将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下)  
+
+## 立即体验
+![富文本插件](https://mp-html.oss-cn-hangzhou.aliyuncs.com/qrcode.jpg)
+
+## 问题反馈
+遇到问题时,请先查阅 [常见问题](https://jin-yufeng.gitee.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题  
+可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问,不建议在评论区提问(不方便回复)  
+提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ,描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式,对于 **描述不清**、**无法复现** 或重复的问题将不予回复  
+
+欢迎加入 `QQ` 交流群:  
+群1(已满):`699734691`  
+群2:`778239129`  
+
+查看 [问题反馈](https://jin-yufeng.gitee.io/mp-html/#/question/feedback) 了解更多

+ 129 - 0
uni_modules/mp-html/changelog.md

@@ -0,0 +1,129 @@
+## v2.4.2(2023-05-14)
+1. `A` `editable` 插件支持修改文字颜色 [详细](https://github.com/jin-yufeng/mp-html/issues/254)
+2. `F` 修复了 `svg` 中有 `style` 不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/505)
+3. `F` 修复了使用旧版编译器可能报错 `Bad attr nodes` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/472)
+4. `F` 修复了 `app` 端可能出现无法读取 `lazyLoad` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/513)
+5. `F` 修复了 `editable` 插件在点击换图时未拼接 `domain` 的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/497) by [@TwoKe945](https://github.com/TwoKe945)
+6. `F` 修复了 `latex` 插件部分情况下不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/515) 
+7. `F` 修复了 `editable` 插件点击音视频时其他标签框不消失的问题
+## v2.4.1(2022-12-25)
+1. `F` 修复了没有图片时 `ready` 事件可能不触发的问题
+2. `F` 修复了加载过程中可能出现 `Root label not found` 错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/470)
+3. `F` 修复了 `audio` 插件退出页面可能会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/457)
+4. `F` 修复了 `vue3` 运行到 `app` 在 `HBuilder X 3.6.10` 以上报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/480)
+5. `F` 修复了 `nvue` 端链接中包含 `%22` 时可能无法显示的问题
+6. `F` 修复了 `vue3` 使用 `highlight` 插件可能报错的问题
+## v2.4.0(2022-08-27)
+1. `A` 增加了 [setPlaybackRate](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#setPlaybackRate) 的 `api`,可以设置音视频的播放速率 [详细](https://github.com/jin-yufeng/mp-html/issues/452)
+2. `A` 示例小程序代码开源 [详细](https://github.com/jin-yufeng/mp-html-demo)
+3. `U` 优化 `ready` 事件触发时机,未设置懒加载的情况下基本可以准确触发 [详细](https://github.com/jin-yufeng/mp-html/issues/195)
+4. `U` `highlight` 插件在编辑状态下不进行高亮处理,便于编辑
+5. `F` 修复了 `flex` 布局下图片大小可能不正确的问题
+6. `F` 修复了 `selectable` 属性没有设置 `force` 也可能出现渲染异常的问题
+7. `F` 修复了表格中的图片大小可能不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/448)
+8. `F` 修复了含有合并单元格的表格可能无法设置竖直对齐的问题
+9. `F` 修复了 `editable` 插件在 `scroll-view` 中使用时工具条位置可能不正确的问题
+10. `F` 修复了 `vue3` 使用 [search](advanced/plugin#search) 插件可能导致错误换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/449)
+## v2.3.2(2022-08-13)
+1. `A` 增加 [latex](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#latex) 插件,可以渲染数学公式 [详细](https://github.com/jin-yufeng/mp-html/pull/447) by [@Zeng-J](https://github.com/Zeng-J)
+2. `U` 优化根节点下有很多标签的长内容渲染速度
+3. `U` `highlight` 插件适配 `lang-xxx` 格式
+4. `F` 修复了 `table` 标签设置 `border` 属性后可能无法修改边框样式的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/439) by [@zouxingjie](https://github.com/zouxingjie)
+5. `F` 修复了 `editable` 插件输入连续空格无效的问题
+6. `F` 修复了 `vue3` 图片设置 `inline` 会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/438)
+7. `F` 修复了 `vue3` 使用 `table` 可能报错的问题
+## v2.3.1(2022-05-20)
+1. `U` `app` 端支持使用本地图片
+2. `U` 优化了微信小程序 `selectable` 属性在 `ios` 端的处理 [详细](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable)
+3. `F` 修复了 `editable` 插件不在顶部时 `tooltip` 位置可能错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/430)
+4. `F` 修复了 `vue3` 运行到微信小程序可能报错丢失内容的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/414)
+5. `F` 修复了 `vue3` 部分标签可能被错误换行的问题
+6. `F` 修复了 `editable` 插件 `app` 端插入视频无法预览的问题
+## v2.3.0(2022-04-01)
+1. `A` 增加了 `play` 事件,音视频播放时触发,可用于与页面其他音视频进行互斥播放 [详细](basic/event#play)
+2. `U` `show-img-menu` 属性支持控制预览时是否长按弹出菜单
+3. `U` 优化 `wxs` 处理,提高渲染性能 [详细](https://developers.weixin.qq.com/community/develop/article/doc/0006cc2b204740f601bd43fa25a413)  
+4. `U` `video` 标签支持 `object-fit` 属性
+5. `U` 增加支持一些常用实体编码 [详细](https://github.com/jin-yufeng/mp-html/issues/418)
+6. `F` 修复了图片仅设置高度可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/410)
+7. `F` 修复了 `video` 标签高度设置为 `auto` 不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/411)
+8. `F` 修复了使用 `grid` 布局时可能样式错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/413)
+9. `F` 修复了含有合并单元格的表格部分情况下显示异常的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/417)
+10. `F` 修复了 `editable` 插件连续插入内容时顺序不正确的问题
+11. `F` 修复了 `uni-app` 包 `vue3` 使用 `audio` 插件报错的问题
+12. `F` 修复了 `uni-app` 包 `highlight` 插件使用自定义的 `prism.min.js` 报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/416)
+## v2.2.2(2022-02-26)
+1. `A` 增加了 [pauseMedia](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#pauseMedia) 的 `api`,可用于暂停播放音视频 [详细](https://github.com/jin-yufeng/mp-html/issues/317)
+2. `U` 优化了长内容的加载速度  
+3. `U` 适配 `vue3` [#389](https://github.com/jin-yufeng/mp-html/issues/389)、[#398](https://github.com/jin-yufeng/mp-html/pull/398) by [@zhouhuafei](https://github.com/zhouhuafei)、[#400](https://github.com/jin-yufeng/mp-html/issues/400)
+4. `F` 修复了小程序端图片高度设置为百分比时可能不显示的问题
+5. `F` 修复了 `highlight` 插件部分情况下可能显示不完整的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/403)
+## v2.2.1(2021-12-24)
+1. `A` `editable` 插件增加上下移动标签功能
+2. `U` `editable` 插件支持在文本中间光标处插入内容
+3. `F` 修复了 `nvue` 端设置 `margin` 后可能导致高度不正确的问题
+4. `F` 修复了 `highlight` 插件使用压缩版的 `prism.css` 可能导致背景失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/367)
+5. `F` 修复了编辑状态下使用 `emoji` 插件内容为空时可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/371)
+6. `F` 修复了使用 `editable` 插件后将 `selectable` 属性设置为 `force` 不生效的问题
+## v2.2.0(2021-10-12)
+1. `A` 增加 `customElements` 配置项,便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350)
+2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett)
+3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件,便于删除已上传的文件
+4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342)
+5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名
+6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356)
+7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351)
+8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题
+## v2.1.5(2021-08-13)
+1. `A` 增加支持标签的 `dir` 属性
+2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325)
+3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题
+4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)
+5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)
+## v2.1.4(2021-07-14)
+1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318)
+2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题
+3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322)
+4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett)
+## v2.1.3(2021-06-12)
+1. `A` `editable` 插件增加 `insertTable` 方法
+2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310)
+3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298)
+4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu)
+5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题
+6. `F` 修复了编译到头条小程序时可能报错的问题
+7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题
+8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题
+9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题
+10. `F` 修复了 `editable` 插件插入音频不显示的问题
+## v2.1.2(2021-04-24)
+1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件,可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea)
+2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space)
+3. `U` 代码风格符合 [standard](https://standardjs.com) 标准
+4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286)
+5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题
+6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291)
+## v2.1.1(2021-04-09)
+1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题
+2. 修复了 `svg` 标签中的文本无法显示的问题
+3. 修复了使用 `editable` 插件编辑表格时可能报错的问题
+4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280)
+5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284)
+6. 修复了 `style` 插件连续子选择器失效的问题
+7. 修复了 `editable` 插件无法修改图片和字体大小的问题
+## v2.1.0.2(2021-03-21)
+修复了 `nvue` 端使用可能报错的问题
+## v2.1.0(2021-03-20)
+1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1)
+2. `A` 增加支持 `strike` 标签
+3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)
+4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)
+5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting)
+6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题
+## v2.0.5(2021-03-12)
+1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271)
+2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效(文本块会变成 `inline-block`) [详细](https://github.com/jin-yufeng/mp-html/issues/267)
+3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182)
+4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题
+5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265)
+6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui)

+ 498 - 0
uni_modules/mp-html/components/mp-html/mp-html.vue

@@ -0,0 +1,498 @@
+<template>
+  <view id="_root" :class="(selectable?'_select ':'')+'_root'" :style="containerStyle">
+    <slot v-if="!nodes[0]" />
+    <!-- #ifndef APP-PLUS-NVUE -->
+    <node v-else :childs="nodes" :opts="[lazyLoad,loadingImg,errorImg,showImgMenu,selectable]" name="span" />
+    <!-- #endif -->
+    <!-- #ifdef APP-PLUS-NVUE -->
+    <web-view ref="web" src="/uni_modules/mp-html/static/app-plus/mp-html/local.html" :style="'margin-top:-2px;height:' + height + 'px'" @onPostMessage="_onMessage" />
+    <!-- #endif -->
+  </view>
+</template>
+
+<script>
+/**
+ * mp-html v2.4.2
+ * @description 富文本组件
+ * @tutorial https://github.com/jin-yufeng/mp-html
+ * @property {String} container-style 容器的样式
+ * @property {String} content 用于渲染的 html 字符串
+ * @property {Boolean} copy-link 是否允许外部链接被点击时自动复制
+ * @property {String} domain 主域名,用于拼接链接
+ * @property {String} error-img 图片出错时的占位图链接
+ * @property {Boolean} lazy-load 是否开启图片懒加载
+ * @property {string} loading-img 图片加载过程中的占位图链接
+ * @property {Boolean} pause-video 是否在播放一个视频时自动暂停其他视频
+ * @property {Boolean} preview-img 是否允许图片被点击时自动预览
+ * @property {Boolean} scroll-table 是否给每个表格添加一个滚动层使其能单独横向滚动
+ * @property {Boolean | String} selectable 是否开启长按复制
+ * @property {Boolean} set-title 是否将 title 标签的内容设置到页面标题
+ * @property {Boolean} show-img-menu 是否允许图片被长按时显示菜单
+ * @property {Object} tag-style 标签的默认样式
+ * @property {Boolean | Number} use-anchor 是否使用锚点链接
+ * @event {Function} load dom 结构加载完毕时触发
+ * @event {Function} ready 所有图片加载完毕时触发
+ * @event {Function} imgtap 图片被点击时触发
+ * @event {Function} linktap 链接被点击时触发
+ * @event {Function} play 音视频播放时触发
+ * @event {Function} error 媒体加载出错时触发
+ */
+// #ifndef APP-PLUS-NVUE
+import node from './node/node'
+// #endif
+import Parser from './parser'
+const plugins=[]
+// #ifdef APP-PLUS-NVUE
+const dom = weex.requireModule('dom')
+// #endif
+export default {
+  name: 'mp-html',
+  data () {
+    return {
+      nodes: [],
+      // #ifdef APP-PLUS-NVUE
+      height: 3
+      // #endif
+    }
+  },
+  props: {
+    containerStyle: {
+      type: String,
+      default: ''
+    },
+    content: {
+      type: String,
+      default: ''
+    },
+    copyLink: {
+      type: [Boolean, String],
+      default: true
+    },
+    domain: String,
+    errorImg: {
+      type: String,
+      default: ''
+    },
+    lazyLoad: {
+      type: [Boolean, String],
+      default: false
+    },
+    loadingImg: {
+      type: String,
+      default: ''
+    },
+    pauseVideo: {
+      type: [Boolean, String],
+      default: true
+    },
+    previewImg: {
+      type: [Boolean, String],
+      default: true
+    },
+    scrollTable: [Boolean, String],
+    selectable: [Boolean, String],
+    setTitle: {
+      type: [Boolean, String],
+      default: true
+    },
+    showImgMenu: {
+      type: [Boolean, String],
+      default: true
+    },
+    tagStyle: Object,
+    useAnchor: [Boolean, Number]
+  },
+  // #ifdef VUE3
+  emits: ['load', 'ready', 'imgtap', 'linktap', 'play', 'error'],
+  // #endif
+  // #ifndef APP-PLUS-NVUE
+  components: {
+    node
+  },
+  // #endif
+  watch: {
+    content (content) {
+      this.setContent(content)
+    }
+  },
+  created () {
+    this.plugins = []
+    for (let i = plugins.length; i--;) {
+      this.plugins.push(new plugins[i](this))
+    }
+  },
+  mounted () {
+    if (this.content && !this.nodes.length) {
+      this.setContent(this.content)
+    }
+  },
+  beforeDestroy () {
+    this._hook('onDetached')
+  },
+  methods: {
+    /**
+     * @description 将锚点跳转的范围限定在一个 scroll-view 内
+     * @param {Object} page scroll-view 所在页面的示例
+     * @param {String} selector scroll-view 的选择器
+     * @param {String} scrollTop scroll-view scroll-top 属性绑定的变量名
+     */
+    in (page, selector, scrollTop) {
+      // #ifndef APP-PLUS-NVUE
+      if (page && selector && scrollTop) {
+        this._in = {
+          page,
+          selector,
+          scrollTop
+        }
+      }
+      // #endif
+    },
+
+    /**
+     * @description 锚点跳转
+     * @param {String} id 要跳转的锚点 id
+     * @param {Number} offset 跳转位置的偏移量
+     * @returns {Promise}
+     */
+    navigateTo (id, offset) {
+      return new Promise((resolve, reject) => {
+        if (!this.useAnchor) {
+          reject(Error('Anchor is disabled'))
+          return
+        }
+        offset = offset || parseInt(this.useAnchor) || 0
+        // #ifdef APP-PLUS-NVUE
+        if (!id) {
+          dom.scrollToElement(this.$refs.web, {
+            offset
+          })
+          resolve()
+        } else {
+          this._navigateTo = {
+            resolve,
+            reject,
+            offset
+          }
+          this.$refs.web.evalJs('uni.postMessage({data:{action:"getOffset",offset:(document.getElementById(' + id + ')||{}).offsetTop}})')
+        }
+        // #endif
+        // #ifndef APP-PLUS-NVUE
+        let deep = ' '
+        // #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+        deep = '>>>'
+        // #endif
+        const selector = uni.createSelectorQuery()
+          // #ifndef MP-ALIPAY
+          .in(this._in ? this._in.page : this)
+          // #endif
+          .select((this._in ? this._in.selector : '._root') + (id ? `${deep}#${id}` : '')).boundingClientRect()
+        if (this._in) {
+          selector.select(this._in.selector).scrollOffset()
+            .select(this._in.selector).boundingClientRect()
+        } else {
+          // 获取 scroll-view 的位置和滚动距离
+          selector.selectViewport().scrollOffset() // 获取窗口的滚动距离
+        }
+        selector.exec(res => {
+          if (!res[0]) {
+            reject(Error('Label not found'))
+            return
+          }
+          const scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + offset
+          if (this._in) {
+            // scroll-view 跳转
+            this._in.page[this._in.scrollTop] = scrollTop
+          } else {
+            // 页面跳转
+            uni.pageScrollTo({
+              scrollTop,
+              duration: 300
+            })
+          }
+          resolve()
+        })
+        // #endif
+      })
+    },
+
+    /**
+     * @description 获取文本内容
+     * @return {String}
+     */
+    getText (nodes) {
+      let text = '';
+      (function traversal (nodes) {
+        for (let i = 0; i < nodes.length; i++) {
+          const node = nodes[i]
+          if (node.type === 'text') {
+            text += node.text.replace(/&amp;/g, '&')
+          } else if (node.name === 'br') {
+            text += '\n'
+          } else {
+            // 块级标签前后加换行
+            const isBlock = node.name === 'p' || node.name === 'div' || node.name === 'tr' || node.name === 'li' || (node.name[0] === 'h' && node.name[1] > '0' && node.name[1] < '7')
+            if (isBlock && text && text[text.length - 1] !== '\n') {
+              text += '\n'
+            }
+            // 递归获取子节点的文本
+            if (node.children) {
+              traversal(node.children)
+            }
+            if (isBlock && text[text.length - 1] !== '\n') {
+              text += '\n'
+            } else if (node.name === 'td' || node.name === 'th') {
+              text += '\t'
+            }
+          }
+        }
+      })(nodes || this.nodes)
+      return text
+    },
+
+    /**
+     * @description 获取内容大小和位置
+     * @return {Promise}
+     */
+    getRect () {
+      return new Promise((resolve, reject) => {
+        uni.createSelectorQuery()
+          // #ifndef MP-ALIPAY
+          .in(this)
+          // #endif
+          .select('#_root').boundingClientRect().exec(res => res[0] ? resolve(res[0]) : reject(Error('Root label not found')))
+      })
+    },
+
+    /**
+     * @description 暂停播放媒体
+     */
+    pauseMedia () {
+      for (let i = (this._videos || []).length; i--;) {
+        this._videos[i].pause()
+      }
+      // #ifdef APP-PLUS
+      const command = 'for(var e=document.getElementsByTagName("video"),i=e.length;i--;)e[i].pause()'
+      // #ifndef APP-PLUS-NVUE
+      let page = this.$parent
+      while (!page.$scope) page = page.$parent
+      page.$scope.$getAppWebview().evalJS(command)
+      // #endif
+      // #ifdef APP-PLUS-NVUE
+      this.$refs.web.evalJs(command)
+      // #endif
+      // #endif
+    },
+
+    /**
+     * @description 设置媒体播放速率
+     * @param {Number} rate 播放速率
+     */
+    setPlaybackRate (rate) {
+      this.playbackRate = rate
+      for (let i = (this._videos || []).length; i--;) {
+        this._videos[i].playbackRate(rate)
+      }
+      // #ifdef APP-PLUS
+      const command = 'for(var e=document.getElementsByTagName("video"),i=e.length;i--;)e[i].playbackRate=' + rate
+      // #ifndef APP-PLUS-NVUE
+      let page = this.$parent
+      while (!page.$scope) page = page.$parent
+      page.$scope.$getAppWebview().evalJS(command)
+      // #endif
+      // #ifdef APP-PLUS-NVUE
+      this.$refs.web.evalJs(command)
+      // #endif
+      // #endif
+    },
+
+    /**
+     * @description 设置内容
+     * @param {String} content html 内容
+     * @param {Boolean} append 是否在尾部追加
+     */
+    setContent (content, append) {
+      if (!append || !this.imgList) {
+        this.imgList = []
+      }
+      const nodes = new Parser(this).parse(content)
+      // #ifdef APP-PLUS-NVUE
+      if (this._ready) {
+        this._set(nodes, append)
+      }
+      // #endif
+      this.$set(this, 'nodes', append ? (this.nodes || []).concat(nodes) : nodes)
+
+      // #ifndef APP-PLUS-NVUE
+      this._videos = []
+      this.$nextTick(() => {
+        this._hook('onLoad')
+        this.$emit('load')
+      })
+
+      if (this.lazyLoad || this.imgList._unloadimgs < this.imgList.length / 2) {
+        // 设置懒加载,每 350ms 获取高度,不变则认为加载完毕
+        let height = 0
+        const callback = rect => {
+          if (!rect || !rect.height) rect = {}
+          // 350ms 总高度无变化就触发 ready 事件
+          if (rect.height === height) {
+            this.$emit('ready', rect)
+          } else {
+            height = rect.height
+            setTimeout(() => {
+              this.getRect().then(callback).catch(callback)
+            }, 350)
+          }
+        }
+        this.getRect().then(callback).catch(callback)
+      } else {
+        // 未设置懒加载,等待所有图片加载完毕
+        if (!this.imgList._unloadimgs) {
+          this.getRect().then(rect => {
+            this.$emit('ready', rect)
+          }).catch(() => {
+            this.$emit('ready', {})
+          })
+        }
+      }
+      // #endif
+    },
+
+    /**
+     * @description 调用插件钩子函数
+     */
+    _hook (name) {
+      for (let i = plugins.length; i--;) {
+        if (this.plugins[i][name]) {
+          this.plugins[i][name]()
+        }
+      }
+    },
+
+    // #ifdef APP-PLUS-NVUE
+    /**
+     * @description 设置内容
+     */
+    _set (nodes, append) {
+      this.$refs.web.evalJs('setContent(' + JSON.stringify(nodes).replace(/%22/g, '') + ',' + JSON.stringify([this.containerStyle.replace(/(?:margin|padding)[^;]+/g, ''), this.errorImg, this.loadingImg, this.pauseVideo, this.scrollTable, this.selectable]) + ',' + append + ')')
+    },
+
+    /**
+     * @description 接收到 web-view 消息
+     */
+    _onMessage (e) {
+      const message = e.detail.data[0]
+      switch (message.action) {
+        // web-view 初始化完毕
+        case 'onJSBridgeReady':
+          this._ready = true
+          if (this.nodes) {
+            this._set(this.nodes)
+          }
+          break
+        // 内容 dom 加载完毕
+        case 'onLoad':
+          this.height = message.height
+          this._hook('onLoad')
+          this.$emit('load')
+          break
+        // 所有图片加载完毕
+        case 'onReady':
+          this.getRect().then(res => {
+            this.$emit('ready', res)
+          }).catch(() => {
+            this.$emit('ready', {})
+          })
+          break
+        // 总高度发生变化
+        case 'onHeightChange':
+          this.height = message.height
+          break
+        // 图片点击
+        case 'onImgTap':
+          this.$emit('imgtap', message.attrs)
+          if (this.previewImg) {
+            uni.previewImage({
+              current: parseInt(message.attrs.i),
+              urls: this.imgList
+            })
+          }
+          break
+        // 链接点击
+        case 'onLinkTap': {
+          const href = message.attrs.href
+          this.$emit('linktap', message.attrs)
+          if (href) {
+            // 锚点跳转
+            if (href[0] === '#') {
+              if (this.useAnchor) {
+                dom.scrollToElement(this.$refs.web, {
+                  offset: message.offset
+                })
+              }
+            } else if (href.includes('://')) {
+              // 打开外链
+              if (this.copyLink) {
+                plus.runtime.openWeb(href)
+              }
+            } else {
+              uni.navigateTo({
+                url: href,
+                fail () {
+                  uni.switchTab({
+                    url: href
+                  })
+                }
+              })
+            }
+          }
+          break
+        }
+        case 'onPlay':
+          this.$emit('play')
+          break
+        // 获取到锚点的偏移量
+        case 'getOffset':
+          if (typeof message.offset === 'number') {
+            dom.scrollToElement(this.$refs.web, {
+              offset: message.offset + this._navigateTo.offset
+            })
+            this._navigateTo.resolve()
+          } else {
+            this._navigateTo.reject(Error('Label not found'))
+          }
+          break
+        // 点击
+        case 'onClick':
+          this.$emit('tap')
+          this.$emit('click')
+          break
+        // 出错
+        case 'onError':
+          this.$emit('error', {
+            source: message.source,
+            attrs: message.attrs
+          })
+      }
+    }
+    // #endif
+  }
+}
+</script>
+
+<style>
+/* #ifndef APP-PLUS-NVUE */
+/* 根节点样式 */
+._root {
+  padding: 1px 0;
+  overflow-x: auto;
+  overflow-y: hidden;
+  -webkit-overflow-scrolling: touch;
+}
+
+/* 长按复制 */
+._select {
+  user-select: text;
+}
+/* #endif */
+</style>

+ 576 - 0
uni_modules/mp-html/components/mp-html/node/node.vue

@@ -0,0 +1,576 @@
+<template>
+  <view :id="attrs.id" :class="'_block _'+name+' '+attrs.class" :style="attrs.style">
+    <block v-for="(n, i) in childs" v-bind:key="i">
+      <!-- 图片 -->
+      <!-- 占位图 -->
+      <image v-if="n.name==='img'&&!n.t&&((opts[1]&&!ctrl[i])||ctrl[i]<0)" class="_img" :style="n.attrs.style" :src="ctrl[i]<0?opts[2]:opts[1]" mode="widthFix" />
+      <!-- 显示图片 -->
+      <!-- #ifdef H5 || (APP-PLUS && VUE2) -->
+      <img v-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+n.attrs.style" :src="n.attrs.src||(ctrl.load?n.attrs['data-src']:'')" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || (APP-PLUS && VUE2) -->
+      <!-- 表格中的图片,使用 rich-text 防止大小不正确 -->
+      <rich-text v-if="n.name==='img'&&n.t" :style="'display:'+n.t" :nodes="[{attrs:{style:n.attrs.style,src:n.attrs.src},name:'img'}]" :data-i="i" @tap.stop="imgTap" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || APP-PLUS -->
+      <image v-else-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;height:1px;'+n.attrs.style" :src="n.attrs.src" :mode="!n.h?'widthFix':(!n.w?'heightFix':'')" :lazy-load="opts[0]" :webp="n.webp" :show-menu-by-longpress="opts[3]&&!n.attrs.ignore" :image-menu-prevent="!opts[3]||n.attrs.ignore" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- #ifdef APP-PLUS && VUE3 -->
+      <image v-else-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;'+n.attrs.style" :src="n.attrs.src||(ctrl.load?n.attrs['data-src']:'')" :mode="!n.h?'widthFix':(!n.w?'heightFix':'')" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- 文本 -->
+      <!-- #ifdef MP-WEIXIN -->
+      <text v-else-if="n.text" :user-select="opts[4]=='force'&&isiOS" decode>{{n.text}}</text>
+      <!-- #endif -->
+      <!-- #ifndef MP-WEIXIN || MP-BAIDU || MP-ALIPAY || MP-TOUTIAO -->
+      <text v-else-if="n.text" decode>{{n.text}}</text>
+      <!-- #endif -->
+      <text v-else-if="n.name==='br'">\n</text>
+      <!-- 链接 -->
+      <view v-else-if="n.name==='a'" :id="n.attrs.id" :class="(n.attrs.href?'_a ':'')+n.attrs.class" hover-class="_hover" :style="'display:inline;'+n.attrs.style" :data-i="i" @tap.stop="linkTap">
+        <node name="span" :childs="n.children" :opts="opts" style="display:inherit" />
+      </view>
+      <!-- 视频 -->
+      <!-- #ifdef APP-PLUS -->
+      <view v-else-if="n.html" :id="n.attrs.id" :class="'_video '+n.attrs.class" :style="n.attrs.style" v-html="n.html" @vplay.stop="play" />
+      <!-- #endif -->
+      <!-- #ifndef APP-PLUS -->
+      <video v-else-if="n.name==='video'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay" :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :object-fit="n.attrs['object-fit']" :poster="n.attrs.poster" :src="n.src[ctrl[i]||0]" :data-i="i" @play="play" @error="mediaError" />
+      <!-- #endif -->
+      <!-- #ifdef H5 || APP-PLUS -->
+      <iframe v-else-if="n.name==='iframe'" :style="n.attrs.style" :allowfullscreen="n.attrs.allowfullscreen" :frameborder="n.attrs.frameborder" :src="n.attrs.src" />
+      <embed v-else-if="n.name==='embed'" :style="n.attrs.style" :src="n.attrs.src" />
+      <!-- #endif -->
+      <!-- #ifndef MP-TOUTIAO || ((H5 || APP-PLUS) && VUE3) -->
+      <!-- 音频 -->
+      <audio v-else-if="n.name==='audio'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author" :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster" :src="n.src[ctrl[i]||0]" :data-i="i" @play="play" @error="mediaError" />
+      <!-- #endif -->
+      <view v-else-if="(n.name==='table'&&n.c)||n.name==='li'" :id="n.attrs.id" :class="'_'+n.name+' '+n.attrs.class" :style="n.attrs.style">
+        <node v-if="n.name==='li'" :childs="n.children" :opts="opts" />
+        <view v-else v-for="(tbody, x) in n.children" v-bind:key="x" :class="'_'+tbody.name+' '+tbody.attrs.class" :style="tbody.attrs.style">
+          <node v-if="tbody.name==='td'||tbody.name==='th'" :childs="tbody.children" :opts="opts" />
+          <block v-else v-for="(tr, y) in tbody.children" v-bind:key="y">
+            <view v-if="tr.name==='td'||tr.name==='th'" :class="'_'+tr.name+' '+tr.attrs.class" :style="tr.attrs.style">
+              <node :childs="tr.children" :opts="opts" />
+            </view>
+            <view v-else :class="'_'+tr.name+' '+tr.attrs.class" :style="tr.attrs.style">
+              <view v-for="(td, z) in tr.children" v-bind:key="z" :class="'_'+td.name+' '+td.attrs.class" :style="td.attrs.style">
+                <node :childs="td.children" :opts="opts" />
+              </view>
+            </view>
+          </block>
+        </view>
+      </view>
+      
+      <!-- 富文本 -->
+      <!-- #ifdef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->
+      <rich-text v-else-if="!n.c&&!handler.isInline(n.name, n.attrs.style)" :id="n.attrs.id" :style="n.f" :user-select="opts[4]" :nodes="[n]" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->
+      <rich-text v-else-if="!n.c" :id="n.attrs.id" :style="'display:inline;'+n.f" :preview="false" :selectable="opts[4]" :user-select="opts[4]" :nodes="[n]" />
+      <!-- #endif -->
+      <!-- 继续递归 -->
+      <view v-else-if="n.c===2" :id="n.attrs.id" :class="'_block _'+n.name+' '+n.attrs.class" :style="n.f+';'+n.attrs.style">
+        <node v-for="(n2, j) in n.children" v-bind:key="j" :style="n2.f" :name="n2.name" :attrs="n2.attrs" :childs="n2.children" :opts="opts" />
+      </view>
+      <node v-else :style="n.f" :name="n.name" :attrs="n.attrs" :childs="n.children" :opts="opts" />
+    </block>
+  </view>
+</template>
+<script module="handler" lang="wxs">
+// 行内标签列表
+var inlineTags = {
+  abbr: true,
+  b: true,
+  big: true,
+  code: true,
+  del: true,
+  em: true,
+  i: true,
+  ins: true,
+  label: true,
+  q: true,
+  small: true,
+  span: true,
+  strong: true,
+  sub: true,
+  sup: true
+}
+/**
+ * @description 判断是否为行内标签
+ */
+module.exports = {
+  isInline: function (tagName, style) {
+    return inlineTags[tagName] || (style || '').indexOf('display:inline') !== -1
+  }
+}
+</script>
+<script>
+
+import node from './node'
+export default {
+  name: 'node',
+  options: {
+    // #ifdef MP-WEIXIN
+    virtualHost: true,
+    // #endif
+    // #ifdef MP-TOUTIAO
+    addGlobalClass: false
+    // #endif
+  },
+  data () {
+    return {
+      ctrl: {},
+      // #ifdef MP-WEIXIN
+      isiOS: uni.getSystemInfoSync().system.includes('iOS')
+      // #endif
+    }
+  },
+  props: {
+    name: String,
+    attrs: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    childs: Array,
+    opts: Array
+  },
+  components: {
+
+    // #ifndef (H5 || APP-PLUS) && VUE3
+    node
+    // #endif
+  },
+  mounted () {
+    this.$nextTick(() => {
+      for (this.root = this.$parent; this.root.$options.name !== 'mp-html'; this.root = this.root.$parent);
+    })
+    // #ifdef H5 || APP-PLUS
+    if (this.opts[0]) {
+      let i
+      for (i = this.childs.length; i--;) {
+        if (this.childs[i].name === 'img') break
+      }
+      if (i !== -1) {
+        this.observer = uni.createIntersectionObserver(this).relativeToViewport({
+          top: 500,
+          bottom: 500
+        })
+        this.observer.observe('._img', res => {
+          if (res.intersectionRatio) {
+            this.$set(this.ctrl, 'load', 1)
+            this.observer.disconnect()
+          }
+        })
+      }
+    }
+    // #endif
+  },
+  beforeDestroy () {
+    // #ifdef H5 || APP-PLUS
+    if (this.observer) {
+      this.observer.disconnect()
+    }
+    // #endif
+  },
+  methods:{
+    // #ifdef MP-WEIXIN
+    toJSON () { return this },
+    // #endif
+    /**
+     * @description 播放视频事件
+     * @param {Event} e
+     */
+    play (e) {
+      this.root.$emit('play')
+      // #ifndef APP-PLUS
+      if (this.root.pauseVideo) {
+        let flag = false
+        const id = e.target.id
+        for (let i = this.root._videos.length; i--;) {
+          if (this.root._videos[i].id === id) {
+            flag = true
+          } else {
+            this.root._videos[i].pause() // 自动暂停其他视频
+          }
+        }
+        // 将自己加入列表
+        if (!flag) {
+          const ctx = uni.createVideoContext(id
+            // #ifndef MP-BAIDU
+            , this
+            // #endif
+          )
+          ctx.id = id
+          if (this.root.playbackRate) {
+            ctx.playbackRate(this.root.playbackRate)
+          }
+          this.root._videos.push(ctx)
+        }
+      }
+      // #endif
+    },
+
+    /**
+     * @description 图片点击事件
+     * @param {Event} e
+     */
+    imgTap (e) {
+      const node = this.childs[e.currentTarget.dataset.i]
+      if (node.a) {
+        this.linkTap(node.a)
+        return
+      }
+      if (node.attrs.ignore) return
+      // #ifdef H5 || APP-PLUS
+      node.attrs.src = node.attrs.src || node.attrs['data-src']
+      // #endif
+      this.root.$emit('imgtap', node.attrs)
+      // 自动预览图片
+      if (this.root.previewImg) {
+        uni.previewImage({
+          // #ifdef MP-WEIXIN
+          showmenu: this.root.showImgMenu,
+          // #endif
+          // #ifdef MP-ALIPAY
+          enablesavephoto: this.root.showImgMenu,
+          enableShowPhotoDownload: this.root.showImgMenu,
+          // #endif
+          current: parseInt(node.attrs.i),
+          urls: this.root.imgList
+        })
+      }
+    },
+
+    /**
+     * @description 图片长按
+     */
+    imgLongTap (e) {
+      // #ifdef APP-PLUS
+      const attrs = this.childs[e.currentTarget.dataset.i].attrs
+      if (this.opts[3] && !attrs.ignore) {
+        uni.showActionSheet({
+          itemList: ['保存图片'],
+          success: () => {
+            const save = path => {
+              uni.saveImageToPhotosAlbum({
+                filePath: path,
+                success () {
+                  uni.showToast({
+                    title: '保存成功'
+                  })
+                }
+              })
+            }
+            if (this.root.imgList[attrs.i].startsWith('http')) {
+              uni.downloadFile({
+                url: this.root.imgList[attrs.i],
+                success: res => save(res.tempFilePath)
+              })
+            } else {
+              save(this.root.imgList[attrs.i])
+            }
+          }
+        })
+      }
+      // #endif
+    },
+
+    /**
+     * @description 图片加载完成事件
+     * @param {Event} e
+     */
+    imgLoad (e) {
+      const i = e.currentTarget.dataset.i
+      /* #ifndef H5 || (APP-PLUS && VUE2) */
+      if (!this.childs[i].w) {
+        // 设置原宽度
+        this.$set(this.ctrl, i, e.detail.width)
+      } else /* #endif */ if ((this.opts[1] && !this.ctrl[i]) || this.ctrl[i] === -1) {
+        // 加载完毕,取消加载中占位图
+        this.$set(this.ctrl, i, 1)
+      }
+      this.checkReady()
+    },
+
+    /**
+     * @description 检查是否所有图片加载完毕
+     */
+    checkReady () {
+      if (this.root && !this.root.lazyLoad) {
+        this.root._unloadimgs -= 1
+        if (!this.root._unloadimgs) {
+          setTimeout(() => {
+            this.root.getRect().then(rect => {
+              this.root.$emit('ready', rect)
+            }).catch(() => {
+              this.root.$emit('ready', {})
+            })
+          }, 350)
+        }
+      }
+    },
+
+    /**
+     * @description 链接点击事件
+     * @param {Event} e
+     */
+    linkTap (e) {
+      const node = e.currentTarget ? this.childs[e.currentTarget.dataset.i] : {}
+      const attrs = node.attrs || e
+      const href = attrs.href
+      this.root.$emit('linktap', Object.assign({
+        innerText: this.root.getText(node.children || []) // 链接内的文本内容
+      }, attrs))
+      if (href) {
+        if (href[0] === '#') {
+          // 跳转锚点
+          this.root.navigateTo(href.substring(1)).catch(() => { })
+        } else if (href.split('?')[0].includes('://')) {
+          // 复制外部链接
+          if (this.root.copyLink) {
+            // #ifdef H5
+            window.open(href)
+            // #endif
+            // #ifdef MP
+            uni.setClipboardData({
+              data: href,
+              success: () =>
+                uni.showToast({
+                  title: '链接已复制'
+                })
+            })
+            // #endif
+            // #ifdef APP-PLUS
+            plus.runtime.openWeb(href)
+            // #endif
+          }
+        } else {
+          // 跳转页面
+          uni.navigateTo({
+            url: href,
+            fail () {
+              uni.switchTab({
+                url: href,
+                fail () { }
+              })
+            }
+          })
+        }
+      }
+    },
+
+    /**
+     * @description 错误事件
+     * @param {Event} e
+     */
+    mediaError (e) {
+      const i = e.currentTarget.dataset.i
+      const node = this.childs[i]
+      // 加载其他源
+      if (node.name === 'video' || node.name === 'audio') {
+        let index = (this.ctrl[i] || 0) + 1
+        if (index > node.src.length) {
+          index = 0
+        }
+        if (index < node.src.length) {
+          this.$set(this.ctrl, i, index)
+          return
+        }
+      } else if (node.name === 'img') {
+        // #ifdef H5 && VUE3
+        if (this.opts[0] && !this.ctrl.load) return
+        // #endif
+        // 显示错误占位图
+        if (this.opts[2]) {
+          this.$set(this.ctrl, i, -1)
+        }
+        this.checkReady()
+      }
+      if (this.root) {
+        this.root.$emit('error', {
+          source: node.name,
+          attrs: node.attrs,
+          // #ifndef H5 && VUE3
+          errMsg: e.detail.errMsg
+          // #endif
+        })
+      }
+    }
+  }
+}
+</script>
+<style>
+/* a 标签默认效果 */
+._a {
+  padding: 1.5px 0 1.5px 0;
+  color: #366092;
+  word-break: break-all;
+}
+
+/* a 标签点击态效果 */
+._hover {
+  text-decoration: underline;
+  opacity: 0.7;
+}
+
+/* 图片默认效果 */
+._img {
+  max-width: 100%;
+  -webkit-touch-callout: none;
+}
+
+/* 内部样式 */
+
+._block {
+  display: block;
+}
+
+._b,
+._strong {
+  font-weight: bold;
+}
+
+._code {
+  font-family: monospace;
+}
+
+._del {
+  text-decoration: line-through;
+}
+
+._em,
+._i {
+  font-style: italic;
+}
+
+._h1 {
+  font-size: 2em;
+}
+
+._h2 {
+  font-size: 1.5em;
+}
+
+._h3 {
+  font-size: 1.17em;
+}
+
+._h5 {
+  font-size: 0.83em;
+}
+
+._h6 {
+  font-size: 0.67em;
+}
+
+._h1,
+._h2,
+._h3,
+._h4,
+._h5,
+._h6 {
+  display: block;
+  font-weight: bold;
+}
+
+._image {
+  height: 1px;
+}
+
+._ins {
+  text-decoration: underline;
+}
+
+._li {
+  display: list-item;
+}
+
+._ol {
+  list-style-type: decimal;
+}
+
+._ol,
+._ul {
+  display: block;
+  padding-left: 40px;
+  margin: 1em 0;
+}
+
+._q::before {
+  content: '"';
+}
+
+._q::after {
+  content: '"';
+}
+
+._sub {
+  font-size: smaller;
+  vertical-align: sub;
+}
+
+._sup {
+  font-size: smaller;
+  vertical-align: super;
+}
+
+._thead,
+._tbody,
+._tfoot {
+  display: table-row-group;
+}
+
+._tr {
+  display: table-row;
+}
+
+._td,
+._th {
+  display: table-cell;
+  vertical-align: middle;
+}
+
+._th {
+  font-weight: bold;
+  text-align: center;
+}
+
+._ul {
+  list-style-type: disc;
+}
+
+._ul ._ul {
+  margin: 0;
+  list-style-type: circle;
+}
+
+._ul ._ul ._ul {
+  list-style-type: square;
+}
+
+._abbr,
+._b,
+._code,
+._del,
+._em,
+._i,
+._ins,
+._label,
+._q,
+._span,
+._strong,
+._sub,
+._sup {
+  display: inline;
+}
+
+/* #ifdef APP-PLUS */
+._video {
+  width: 300px;
+  height: 225px;
+}
+/* #endif */
+</style>

File diff suppressed because it is too large
+ 1335 - 0
uni_modules/mp-html/components/mp-html/parser.js


+ 76 - 0
uni_modules/mp-html/package.json

@@ -0,0 +1,76 @@
+{
+    "id": "mp-html",
+    "displayName": "mp-html 富文本组件【全端支持,支持编辑、latex等扩展】",
+    "version": "v2.4.2",
+    "description": "一个强大的富文本组件,高效轻量,功能丰富",
+    "keywords": [
+        "富文本",
+        "编辑器",
+        "html",
+        "rich-text",
+        "editor"
+    ],
+    "repository": "https://github.com/jin-yufeng/mp-html",
+    "dcloudext": {
+        "sale": {
+            "regular": {
+                "price": "0.00"
+            },
+            "sourcecode": {
+                "price": "0.00"
+            }
+        },
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "无",
+            "permissions": "无"
+        },
+        "npmurl": "https://www.npmjs.com/package/mp-html",
+        "type": "component-vue"
+    },
+    "uni_modules": {
+        "platforms": {
+            "cloud": {
+                "tcb": "y",
+                "aliyun": "y"
+            },
+            "client": {
+                "App": {
+                    "app-vue": "y",
+                    "app-nvue": "y"
+                },
+                "H5-mobile": {
+                    "Safari": "y",
+                    "Android Browser": "y",
+                    "微信浏览器(Android)": "y",
+                    "QQ浏览器(Android)": "y"
+                },
+                "H5-pc": {
+                    "Chrome": "y",
+                    "IE": "u",
+                    "Edge": "y",
+                    "Firefox": "y",
+                    "Safari": "y"
+                },
+                "小程序": {
+                    "微信": "y",
+                    "阿里": "y",
+                    "百度": "y",
+                    "字节跳动": "y",
+                    "QQ": "y"
+                },
+                "快应用": {
+                    "华为": "y",
+                    "联盟": "y"
+                },
+                "Vue": {
+                    "vue2": "y",
+                    "vue3": "y"
+                }
+            }
+        }
+    }
+}

File diff suppressed because it is too large
+ 1 - 0
uni_modules/mp-html/static/app-plus/mp-html/js/handler.js


File diff suppressed because it is too large
+ 1 - 0
uni_modules/mp-html/static/app-plus/mp-html/js/uni.webview.min.js


File diff suppressed because it is too large
+ 1 - 0
uni_modules/mp-html/static/app-plus/mp-html/local.html


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/circlePages/addShare.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/circlePages/circle.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/components/w-select/w-select.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/minePages/set.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/comm/comm.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/comm/search.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/home.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/info.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/login.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/about.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/addFeed.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/coll.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/feedback.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/mine.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/need.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/share.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-badge/tn-badge.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-button/tn-button.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-checkbox/tn-checkbox.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-empty/tn-empty.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-grid-item/tn-grid-item.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-grid/tn-grid.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-list-cell/tn-list-cell.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-load-more/tn-load-more.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-loading/tn-loading.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-modal/tn-modal.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-nav-bar/tn-nav-bar.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-popup/tn-popup.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/tuniao-ui/components/tn-tag/tn-tag.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-badge/components/uni-badge/uni-badge.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-card/components/uni-card/uni-card.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-forms/components/uni-forms/uni-forms.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-list/components/uni-list-item/uni-list-item.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-list/components/uni-list/uni-list.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.js.map


File diff suppressed because it is too large
+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-sticky/components/uv-sticky/uv-sticky.js.map


+ 5 - 5
unpackage/dist/dev/mp-weixin/circlePages/addShare.js

@@ -104,7 +104,7 @@ try {
       return Promise.all(/*! import() | tuniao-ui/components/tn-nav-bar/tn-nav-bar */[__webpack_require__.e("common/vendor"), __webpack_require__.e("tuniao-ui/components/tn-nav-bar/tn-nav-bar")]).then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-nav-bar/tn-nav-bar.vue */ 250))
     },
     uniDataCheckbox: function () {
-      return Promise.all(/*! import() | uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue */ 424))
+      return Promise.all(/*! import() | uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue */ 425))
     },
     uniForms: function () {
       return Promise.all(/*! import() | uni_modules/uni-forms/components/uni-forms/uni-forms */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-forms/components/uni-forms/uni-forms")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-forms/components/uni-forms/uni-forms.vue */ 393))
@@ -116,19 +116,19 @@ try {
       return __webpack_require__.e(/*! import() | uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput */ "uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue */ 386))
     },
     wSelect: function () {
-      return __webpack_require__.e(/*! import() | components/w-select/w-select */ "components/w-select/w-select").then(__webpack_require__.bind(null, /*! @/components/w-select/w-select.vue */ 417))
+      return __webpack_require__.e(/*! import() | components/w-select/w-select */ "components/w-select/w-select").then(__webpack_require__.bind(null, /*! @/components/w-select/w-select.vue */ 418))
     },
     uniDataSelect: function () {
       return Promise.all(/*! import() | uni_modules/uni-data-select/components/uni-data-select/uni-data-select */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-data-select/components/uni-data-select/uni-data-select")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue */ 361))
     },
     uniCard: function () {
-      return __webpack_require__.e(/*! import() | uni_modules/uni-card/components/uni-card/uni-card */ "uni_modules/uni-card/components/uni-card/uni-card").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-card/components/uni-card/uni-card.vue */ 431))
+      return __webpack_require__.e(/*! import() | uni_modules/uni-card/components/uni-card/uni-card */ "uni_modules/uni-card/components/uni-card/uni-card").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-card/components/uni-card/uni-card.vue */ 432))
     },
     uniList: function () {
-      return __webpack_require__.e(/*! import() | uni_modules/uni-list/components/uni-list/uni-list */ "uni_modules/uni-list/components/uni-list/uni-list").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-list/components/uni-list/uni-list.vue */ 438))
+      return __webpack_require__.e(/*! import() | uni_modules/uni-list/components/uni-list/uni-list */ "uni_modules/uni-list/components/uni-list/uni-list").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-list/components/uni-list/uni-list.vue */ 439))
     },
     uniListItem: function () {
-      return __webpack_require__.e(/*! import() | uni_modules/uni-list/components/uni-list-item/uni-list-item */ "uni_modules/uni-list/components/uni-list-item/uni-list-item").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue */ 445))
+      return __webpack_require__.e(/*! import() | uni_modules/uni-list/components/uni-list-item/uni-list-item */ "uni_modules/uni-list/components/uni-list-item/uni-list-item").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue */ 446))
     },
     uniFilePicker: function () {
       return Promise.all(/*! import() | uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue */ 377))

+ 1 - 1
unpackage/dist/dev/mp-weixin/circlePages/circle.js

@@ -113,7 +113,7 @@ try {
       return Promise.all(/*! import() | uni_modules/uni-forms/components/uni-forms/uni-forms */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-forms/components/uni-forms/uni-forms")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-forms/components/uni-forms/uni-forms.vue */ 393))
     },
     wSelect: function () {
-      return __webpack_require__.e(/*! import() | components/w-select/w-select */ "components/w-select/w-select").then(__webpack_require__.bind(null, /*! @/components/w-select/w-select.vue */ 417))
+      return __webpack_require__.e(/*! import() | components/w-select/w-select */ "components/w-select/w-select").then(__webpack_require__.bind(null, /*! @/components/w-select/w-select.vue */ 418))
     },
     uniFormsItem: function () {
       return __webpack_require__.e(/*! import() | uni_modules/uni-forms/components/uni-forms-item/uni-forms-item */ "uni_modules/uni-forms/components/uni-forms-item/uni-forms-item").then(__webpack_require__.bind(null, /*! @/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue */ 402))

+ 0 - 1
unpackage/dist/dev/mp-weixin/common/main.js

@@ -130,7 +130,6 @@ var _default = {
       wx.cloud.init({
         env: 'cloud1-6g83nk504b196aa9'
       });
-      console.log(111);
     }
     uni.getSystemInfo({
       success: function success(e) {

File diff suppressed because it is too large
+ 2 - 2
unpackage/dist/dev/mp-weixin/common/runtime.js


File diff suppressed because it is too large
+ 1365 - 27
unpackage/dist/dev/mp-weixin/common/vendor.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/components/w-select/w-select.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-badge/tn-badge.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-loading/tn-loading.js


+ 1 - 1
unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-modal/tn-modal.js

@@ -80,7 +80,7 @@ var components
 try {
   components = {
     tnPopup: function () {
-      return __webpack_require__.e(/*! import() | tuniao-ui/components/tn-popup/tn-popup */ "tuniao-ui/components/tn-popup/tn-popup").then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-popup/tn-popup.vue */ 474))
+      return __webpack_require__.e(/*! import() | tuniao-ui/components/tn-popup/tn-popup */ "tuniao-ui/components/tn-popup/tn-popup").then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-popup/tn-popup.vue */ 475))
     },
     tnButton: function () {
       return Promise.all(/*! import() | tuniao-ui/components/tn-button/tn-button */[__webpack_require__.e("common/vendor"), __webpack_require__.e("tuniao-ui/components/tn-button/tn-button")]).then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-button/tn-button.vue */ 333))

File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-popup/tn-popup.js


+ 1 - 1
unpackage/dist/dev/mp-weixin/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.js

@@ -80,7 +80,7 @@ var components
 try {
   components = {
     tnBadge: function () {
-      return __webpack_require__.e(/*! import() | tuniao-ui/components/tn-badge/tn-badge */ "tuniao-ui/components/tn-badge/tn-badge").then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-badge/tn-badge.vue */ 467))
+      return __webpack_require__.e(/*! import() | tuniao-ui/components/tn-badge/tn-badge */ "tuniao-ui/components/tn-badge/tn-badge").then(__webpack_require__.bind(null, /*! @/tuniao-ui/components/tn-badge/tn-badge.vue */ 468))
     },
   }
 } catch (e) {

File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/uni_modules/uni-badge/components/uni-badge/uni-badge.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/uni_modules/uni-card/components/uni-card/uni-card.js


File diff suppressed because it is too large
+ 15 - 15
unpackage/dist/dev/mp-weixin/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.js


+ 1 - 1
unpackage/dist/dev/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js

@@ -80,7 +80,7 @@ var components
 try {
   components = {
     uniIcons: function () {
-      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 452))
+      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 453))
     },
   }
 } catch (e) {

+ 1 - 1
unpackage/dist/dev/mp-weixin/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.js

@@ -80,7 +80,7 @@ var components
 try {
   components = {
     uniIcons: function () {
-      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 452))
+      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 453))
     },
   }
 } catch (e) {

File diff suppressed because it is too large
+ 2 - 2
unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js


File diff suppressed because it is too large
+ 15 - 15
unpackage/dist/dev/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js


File diff suppressed because it is too large
+ 16 - 16
unpackage/dist/dev/mp-weixin/uni_modules/uni-list/components/uni-list-item/uni-list-item.js


File diff suppressed because it is too large
+ 14 - 14
unpackage/dist/dev/mp-weixin/uni_modules/uni-list/components/uni-list/uni-list.js


File diff suppressed because it is too large
+ 15 - 15
unpackage/dist/dev/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js


+ 1 - 1
unpackage/dist/dev/mp-weixin/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.js

@@ -80,7 +80,7 @@ var components
 try {
   components = {
     uniIcons: function () {
-      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 452))
+      return Promise.all(/*! import() | uni_modules/uni-icons/components/uni-icons/uni-icons */[__webpack_require__.e("common/vendor"), __webpack_require__.e("uni_modules/uni-icons/components/uni-icons/uni-icons")]).then(__webpack_require__.bind(null, /*! @/uni_modules/uni-icons/components/uni-icons/uni-icons.vue */ 453))
     },
   }
 } catch (e) {