From 448d9ff1f8b8a63f04935e28be92b5e498718af6 Mon Sep 17 00:00:00 2001 From: yxh Date: Tue, 22 Oct 2024 11:50:30 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90-?= =?UTF-8?q?=E7=88=B6=E7=BA=A7=E8=8F=9C=E5=8D=95=E9=80=89=E6=8B=A9=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0ueditor-plus=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/js/ueditor/dialogs/anchor/anchor.html | 94 +- .../ueditor/dialogs/attachment/attachment.css | 99 +- .../dialogs/attachment/attachment.html | 85 +- .../ueditor/dialogs/attachment/attachment.js | 147 +- .../attachment/fileTypeImages/icon_chm.gif | Bin 923 -> 0 bytes .../fileTypeImages/icon_default.png | Bin 841 -> 0 bytes .../attachment/fileTypeImages/icon_doc.gif | Bin 1012 -> 0 bytes .../attachment/fileTypeImages/icon_exe.gif | Bin 949 -> 0 bytes .../attachment/fileTypeImages/icon_jpg.gif | Bin 950 -> 0 bytes .../attachment/fileTypeImages/icon_mp3.gif | Bin 986 -> 0 bytes .../attachment/fileTypeImages/icon_mv.gif | Bin 1001 -> 0 bytes .../attachment/fileTypeImages/icon_pdf.gif | Bin 996 -> 0 bytes .../attachment/fileTypeImages/icon_ppt.gif | Bin 1001 -> 0 bytes .../attachment/fileTypeImages/icon_psd.gif | Bin 1009 -> 0 bytes .../attachment/fileTypeImages/icon_rar.gif | Bin 1007 -> 0 bytes .../attachment/fileTypeImages/icon_txt.gif | Bin 970 -> 0 bytes .../attachment/fileTypeImages/icon_xls.gif | Bin 1005 -> 0 bytes public/js/ueditor/dialogs/audio/audio.css | 818 + public/js/ueditor/dialogs/audio/audio.html | 83 + public/js/ueditor/dialogs/audio/audio.js | 805 + public/js/ueditor/dialogs/audio/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/audio/images/center_focus.jpg | Bin 0 -> 11795 bytes .../dialogs/audio/images/file-icons.gif | Bin 0 -> 20097 bytes .../dialogs/audio/images/file-icons.png | Bin 0 -> 44070 bytes .../js/ueditor/dialogs/audio/images/icons.gif | Bin 0 -> 453 bytes .../js/ueditor/dialogs/audio/images/icons.png | Bin 0 -> 2678 bytes .../js/ueditor/dialogs/audio/images/image.png | Bin 0 -> 1672 bytes .../dialogs/audio/images/left_focus.jpg | Bin 0 -> 11423 bytes .../dialogs/audio/images/none_focus.jpg | Bin 0 -> 11546 bytes .../ueditor/dialogs/audio/images/progress.png | Bin 0 -> 1269 bytes .../dialogs/audio/images/right_focus.jpg | Bin 0 -> 11334 bytes .../ueditor/dialogs/audio/images/success.gif | Bin 0 -> 445 bytes .../ueditor/dialogs/audio/images/success.png | Bin 0 -> 1621 bytes .../ueditor/dialogs/background/background.css | 149 +- .../dialogs/background/background.html | 87 +- .../ueditor/dialogs/background/background.js | 80 +- .../dialogs/contentimport/contentimport.html | 176 + .../dialogs/contentimport/contentimport.js | 91 + .../contentimport/mammoth.browser.min.js | 21 + .../dialogs/contentimport/showdown.min.js | 3 + public/js/ueditor/dialogs/emotion/emotion.css | 166 +- .../js/ueditor/dialogs/emotion/emotion.html | 48 +- public/js/ueditor/dialogs/emotion/emotion.js | 140 +- .../js/ueditor/dialogs/formula/formula.html | 144 +- public/js/ueditor/dialogs/formula/formula.js | 206 +- public/js/ueditor/dialogs/help/help.css | 44 +- public/js/ueditor/dialogs/help/help.html | 8 +- public/js/ueditor/dialogs/help/help.js | 27 +- public/js/ueditor/dialogs/image/image.css | 168 +- public/js/ueditor/dialogs/image/image.html | 200 +- public/js/ueditor/dialogs/image/image.js | 342 +- .../dialogs/insertframe/insertframe.html | 158 +- public/js/ueditor/dialogs/internal.js | 62 +- public/js/ueditor/dialogs/link/link.html | 133 +- .../js/ueditor/dialogs/preview/preview.html | 75 +- public/js/ueditor/dialogs/scrawl/scrawl.css | 356 +- public/js/ueditor/dialogs/scrawl/scrawl.html | 18 +- public/js/ueditor/dialogs/scrawl/scrawl.js | 143 +- .../dialogs/searchreplace/searchreplace.html | 111 +- .../dialogs/searchreplace/searchreplace.js | 72 +- .../js/ueditor/dialogs/spechars/spechars.html | 41 +- .../js/ueditor/dialogs/spechars/spechars.js | 49 +- public/js/ueditor/dialogs/table/edittable.css | 5 +- .../js/ueditor/dialogs/table/edittable.html | 23 +- public/js/ueditor/dialogs/table/edittable.js | 74 +- public/js/ueditor/dialogs/table/edittd.html | 29 +- public/js/ueditor/dialogs/table/edittip.html | 2 +- public/js/ueditor/dialogs/template/config.js | 42 +- .../js/ueditor/dialogs/template/template.css | 117 +- .../js/ueditor/dialogs/template/template.html | 30 +- .../js/ueditor/dialogs/template/template.js | 40 +- public/js/ueditor/dialogs/video/video.css | 306 +- public/js/ueditor/dialogs/video/video.html | 78 +- public/js/ueditor/dialogs/video/video.js | 438 +- .../ueditor/dialogs/wordimage/wordimage.html | 380 +- .../js/ueditor/dialogs/wordimage/wordimage.js | 129 +- public/js/ueditor/index.html | 152 +- public/js/ueditor/lang/en/en.js | 1099 +- public/js/ueditor/lang/zh-cn/zh-cn.js | 1143 +- .../js/ueditor/themes/default/css/ueditor.css | 806 +- public/js/ueditor/themes/default/dialog.css | 17 + public/js/ueditor/themes/default/exts/ai.svg | 12 + public/js/ueditor/themes/default/exts/apk.svg | 12 + public/js/ueditor/themes/default/exts/chm.svg | 12 + public/js/ueditor/themes/default/exts/css.svg | 12 + public/js/ueditor/themes/default/exts/doc.svg | 22 + .../js/ueditor/themes/default/exts/docx.svg | 22 + public/js/ueditor/themes/default/exts/dwg.svg | 16 + .../js/ueditor/themes/default/exts/folder.svg | 3 + public/js/ueditor/themes/default/exts/gif.svg | 14 + .../js/ueditor/themes/default/exts/html.svg | 12 + .../js/ueditor/themes/default/exts/jpeg.svg | 14 + public/js/ueditor/themes/default/exts/jpg.svg | 14 + public/js/ueditor/themes/default/exts/log.svg | 12 + public/js/ueditor/themes/default/exts/mp3.svg | 14 + public/js/ueditor/themes/default/exts/mp4.svg | 12 + public/js/ueditor/themes/default/exts/pdf.svg | 14 + public/js/ueditor/themes/default/exts/png.svg | 14 + public/js/ueditor/themes/default/exts/ppt.svg | 24 + .../js/ueditor/themes/default/exts/pptx.svg | 24 + public/js/ueditor/themes/default/exts/psd.svg | 12 + public/js/ueditor/themes/default/exts/rar.svg | 12 + public/js/ueditor/themes/default/exts/svg.svg | 12 + .../ueditor/themes/default/exts/torrent.svg | 14 + public/js/ueditor/themes/default/exts/txt.svg | 14 + .../ueditor/themes/default/exts/unknown.svg | 12 + public/js/ueditor/themes/default/exts/xls.svg | 25 + .../js/ueditor/themes/default/exts/xlsx.svg | 25 + public/js/ueditor/themes/default/exts/zip.svg | 12 + .../ueditor/themes/default/font/iconfont.ttf | Bin 25388 -> 0 bytes .../ueditor/themes/default/font/iconfont.woff | Bin 13976 -> 0 bytes .../themes/default/font/iconfont.woff2 | Bin 11756 -> 0 bytes public/js/ueditor/themes/iframe.css | 57 +- .../third-party/codemirror/codemirror.css | 2 + .../third-party/webuploader/webuploader.css | 92 +- .../webuploader/webuploader.custom.js | 5670 -- .../webuploader/webuploader.flashonly.js | 4176 -- .../webuploader/webuploader.html5only.js | 5559 -- .../third-party/webuploader/webuploader.js | 4913 +- .../webuploader/webuploader.withoutimage.js | 4593 -- public/js/ueditor/ueditor.all.js | 54699 +++++++++------- public/js/ueditor/ueditor.config.js | 1242 +- public/js/ueditor/ueditor.parse.js | 1763 +- src/components/ueditor/index.vue | 3 +- src/components/ueditor/model/index.ts | 1 + src/theme/element.scss | 5 - src/views/system/role/component/editRole.vue | 2 +- src/views/system/tools/gen/component/edit.vue | 6 +- .../tools/gen/component/genInfoForm.vue | 29 +- src/views/system/tools/gen/component/model.ts | 5 +- 130 files changed, 42779 insertions(+), 50814 deletions(-) delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif delete mode 100644 public/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif create mode 100644 public/js/ueditor/dialogs/audio/audio.css create mode 100644 public/js/ueditor/dialogs/audio/audio.html create mode 100644 public/js/ueditor/dialogs/audio/audio.js create mode 100644 public/js/ueditor/dialogs/audio/images/bg.png create mode 100644 public/js/ueditor/dialogs/audio/images/center_focus.jpg create mode 100644 public/js/ueditor/dialogs/audio/images/file-icons.gif create mode 100644 public/js/ueditor/dialogs/audio/images/file-icons.png create mode 100644 public/js/ueditor/dialogs/audio/images/icons.gif create mode 100644 public/js/ueditor/dialogs/audio/images/icons.png create mode 100644 public/js/ueditor/dialogs/audio/images/image.png create mode 100644 public/js/ueditor/dialogs/audio/images/left_focus.jpg create mode 100644 public/js/ueditor/dialogs/audio/images/none_focus.jpg create mode 100644 public/js/ueditor/dialogs/audio/images/progress.png create mode 100644 public/js/ueditor/dialogs/audio/images/right_focus.jpg create mode 100644 public/js/ueditor/dialogs/audio/images/success.gif create mode 100644 public/js/ueditor/dialogs/audio/images/success.png create mode 100644 public/js/ueditor/dialogs/contentimport/contentimport.html create mode 100644 public/js/ueditor/dialogs/contentimport/contentimport.js create mode 100644 public/js/ueditor/dialogs/contentimport/mammoth.browser.min.js create mode 100644 public/js/ueditor/dialogs/contentimport/showdown.min.js create mode 100644 public/js/ueditor/themes/default/dialog.css create mode 100644 public/js/ueditor/themes/default/exts/ai.svg create mode 100644 public/js/ueditor/themes/default/exts/apk.svg create mode 100644 public/js/ueditor/themes/default/exts/chm.svg create mode 100644 public/js/ueditor/themes/default/exts/css.svg create mode 100644 public/js/ueditor/themes/default/exts/doc.svg create mode 100644 public/js/ueditor/themes/default/exts/docx.svg create mode 100644 public/js/ueditor/themes/default/exts/dwg.svg create mode 100644 public/js/ueditor/themes/default/exts/folder.svg create mode 100644 public/js/ueditor/themes/default/exts/gif.svg create mode 100644 public/js/ueditor/themes/default/exts/html.svg create mode 100644 public/js/ueditor/themes/default/exts/jpeg.svg create mode 100644 public/js/ueditor/themes/default/exts/jpg.svg create mode 100644 public/js/ueditor/themes/default/exts/log.svg create mode 100644 public/js/ueditor/themes/default/exts/mp3.svg create mode 100644 public/js/ueditor/themes/default/exts/mp4.svg create mode 100644 public/js/ueditor/themes/default/exts/pdf.svg create mode 100644 public/js/ueditor/themes/default/exts/png.svg create mode 100644 public/js/ueditor/themes/default/exts/ppt.svg create mode 100644 public/js/ueditor/themes/default/exts/pptx.svg create mode 100644 public/js/ueditor/themes/default/exts/psd.svg create mode 100644 public/js/ueditor/themes/default/exts/rar.svg create mode 100644 public/js/ueditor/themes/default/exts/svg.svg create mode 100644 public/js/ueditor/themes/default/exts/torrent.svg create mode 100644 public/js/ueditor/themes/default/exts/txt.svg create mode 100644 public/js/ueditor/themes/default/exts/unknown.svg create mode 100644 public/js/ueditor/themes/default/exts/xls.svg create mode 100644 public/js/ueditor/themes/default/exts/xlsx.svg create mode 100644 public/js/ueditor/themes/default/exts/zip.svg delete mode 100644 public/js/ueditor/themes/default/font/iconfont.ttf delete mode 100644 public/js/ueditor/themes/default/font/iconfont.woff delete mode 100644 public/js/ueditor/themes/default/font/iconfont.woff2 delete mode 100644 public/js/ueditor/third-party/webuploader/webuploader.custom.js delete mode 100644 public/js/ueditor/third-party/webuploader/webuploader.flashonly.js delete mode 100644 public/js/ueditor/third-party/webuploader/webuploader.html5only.js delete mode 100644 public/js/ueditor/third-party/webuploader/webuploader.withoutimage.js diff --git a/public/js/ueditor/dialogs/anchor/anchor.html b/public/js/ueditor/dialogs/anchor/anchor.html index 01fe929..c7f389f 100644 --- a/public/js/ueditor/dialogs/anchor/anchor.html +++ b/public/js/ueditor/dialogs/anchor/anchor.html @@ -1,40 +1,62 @@ - - - - - - -
- -
- - - + + + + + + +
+ +
+ + + diff --git a/public/js/ueditor/dialogs/attachment/attachment.css b/public/js/ueditor/dialogs/attachment/attachment.css index 9c61716..cbfc872 100644 --- a/public/js/ueditor/dialogs/attachment/attachment.css +++ b/public/js/ueditor/dialogs/attachment/attachment.css @@ -13,8 +13,9 @@ /*tab样式框大小*/ .tabhead { - float:left; + float: left; } + .tabbody { width: 100%; height: 346px; @@ -89,7 +90,7 @@ color: #cccccc; font-size: 18px; position: relative; - top:0; + top: 0; *top: 10px; } @@ -273,12 +274,14 @@ -ms-transition: 200ms ease-out; transition: 200ms ease-out; } + #upload .filelist li p.imgWrap.notimage { margin-top: 0; width: 111px; height: 111px; border: 1px #eeeeee solid; } + #upload .filelist li p.imgWrap.notimage i.file-preview { margin-top: 15px; } @@ -297,7 +300,7 @@ line-height: 28px; width: 100%; z-index: 100; - display:none; + display: none; } #upload .filelist li .success { @@ -319,7 +322,8 @@ border: 1px solid #eeeeee; border-radius: 0; } -#upload .filelist li.filePickerBlock div.webuploader-pick { + +#upload .filelist li.filePickerBlock div.webuploader-pick { width: 100%; height: 100%; margin: 0; @@ -352,7 +356,7 @@ background: url(./images/icons.gif) no-repeat \9; margin: 5px 1px 1px; cursor: pointer; - -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; @@ -360,7 +364,7 @@ } #upload .filelist div.file-panel span.rotateLeft { - display:none; + display: none; background-position: 0 -24px; } @@ -369,7 +373,7 @@ } #upload .filelist div.file-panel span.rotateRight { - display:none; + display: none; background-position: -24px -24px; } @@ -408,6 +412,7 @@ color: #6dbfff; margin: 0 10px 0 0; } + #upload .statusBar .progress span.percentage { width: 0; height: 100%; @@ -416,6 +421,7 @@ background: #1483d8; position: absolute; } + #upload .statusBar .progress span.text { position: relative; z-index: 10; @@ -438,6 +444,7 @@ display: inline-block; float: left; } + #upload .statusBar .btns .webuploader-pick, #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-uploading, @@ -457,6 +464,7 @@ -ms-user-select: none; user-select: none; } + #upload .statusBar .btns .webuploader-pick-hover, #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-uploading:hover, @@ -465,45 +473,48 @@ } #upload .statusBar .btns .uploadBtn, -#upload .statusBar .btns .uploadBtn.state-paused{ +#upload .statusBar .btns .uploadBtn.state-paused { background: #00b7ee; color: #fff; border-color: transparent; } + #upload .statusBar .btns .uploadBtn:hover, -#upload .statusBar .btns .uploadBtn.state-paused:hover{ +#upload .statusBar .btns .uploadBtn.state-paused:hover { background: #00a2d4; } #upload .statusBar .btns .uploadBtn.disabled { pointer-events: none; - filter:alpha(opacity=60); - -moz-opacity:0.6; + filter: alpha(opacity=60); + -moz-opacity: 0.6; -khtml-opacity: 0.6; opacity: 0.6; } - /* 图片管理样式 */ #online { width: 100%; height: 336px; padding: 10px 0 0 0; } -#online #fileList{ + +#online #fileList { width: 100%; height: 100%; overflow-x: hidden; overflow-y: auto; position: relative; } + #online ul { display: block; list-style: none; margin: 0; padding: 0; } + #online li { float: left; display: block; @@ -518,18 +529,21 @@ cursor: pointer; position: relative; } + #online li.clearFloat { float: none; clear: both; display: block; - width:0; - height:0; + width: 0; + height: 0; margin: 0; padding: 0; } + #online li img { cursor: pointer; } + #online li div.file-wrapper { cursor: pointer; position: absolute; @@ -539,7 +553,8 @@ border: 1px solid #eee; background: url("./images/bg.png") repeat; } -#online li div span.file-title{ + +#online li div span.file-title { display: block; padding: 0 3px; margin: 3px 0 0 0; @@ -553,6 +568,7 @@ overflow: hidden; text-overflow: ellipsis; } + #online li .icon { cursor: pointer; width: 113px; @@ -564,16 +580,19 @@ border: 0; background-repeat: no-repeat; } + #online li .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; } + #online li.selected .icon { background-image: url(images/success.png); background-image: url(images/success.gif) \9; background-position: 75px 75px; } + #online li.selected .icon:hover { width: 107px; height: 107px; @@ -593,41 +612,51 @@ i.file-preview { background-position: -140px center; background-repeat: no-repeat; } -i.file-preview.file-type-dir{ + +i.file-preview.file-type-dir { background-position: 0 center; } -i.file-preview.file-type-file{ + +i.file-preview.file-type-file { background-position: -140px center; } -i.file-preview.file-type-filelist{ + +i.file-preview.file-type-filelist { background-position: -210px center; } + i.file-preview.file-type-zip, i.file-preview.file-type-rar, i.file-preview.file-type-7z, i.file-preview.file-type-tar, i.file-preview.file-type-gz, -i.file-preview.file-type-bz2{ +i.file-preview.file-type-bz2 { background-position: -280px center; } + i.file-preview.file-type-xls, -i.file-preview.file-type-xlsx{ +i.file-preview.file-type-xlsx { background-position: -350px center; } + i.file-preview.file-type-doc, -i.file-preview.file-type-docx{ +i.file-preview.file-type-docx { background-position: -420px center; } + i.file-preview.file-type-ppt, -i.file-preview.file-type-pptx{ +i.file-preview.file-type-pptx { background-position: -490px center; } -i.file-preview.file-type-vsd{ + +i.file-preview.file-type-vsd { background-position: -560px center; } -i.file-preview.file-type-pdf{ + +i.file-preview.file-type-pdf { background-position: -630px center; } + i.file-preview.file-type-txt, i.file-preview.file-type-md, i.file-preview.file-type-json, @@ -638,18 +667,22 @@ i.file-preview.file-type-js, i.file-preview.file-type-css, i.file-preview.file-type-php, i.file-preview.file-type-jsp, -i.file-preview.file-type-asp{ +i.file-preview.file-type-asp { background-position: -700px center; } -i.file-preview.file-type-apk{ + +i.file-preview.file-type-apk { background-position: -770px center; } -i.file-preview.file-type-exe{ + +i.file-preview.file-type-exe { background-position: -840px center; } -i.file-preview.file-type-ipa{ + +i.file-preview.file-type-ipa { background-position: -910px center; } + i.file-preview.file-type-mp4, i.file-preview.file-type-swf, i.file-preview.file-type-mkv, @@ -661,21 +694,23 @@ i.file-preview.file-type-mpeg, i.file-preview.file-type-ogv, i.file-preview.file-type-webm, i.file-preview.file-type-rm, -i.file-preview.file-type-rmvb{ +i.file-preview.file-type-rmvb { background-position: -980px center; } + i.file-preview.file-type-ogg, i.file-preview.file-type-wav, i.file-preview.file-type-wmv, i.file-preview.file-type-mid, -i.file-preview.file-type-mp3{ +i.file-preview.file-type-mp3 { background-position: -1050px center; } + i.file-preview.file-type-jpg, i.file-preview.file-type-jpeg, i.file-preview.file-type-gif, i.file-preview.file-type-bmp, i.file-preview.file-type-png, -i.file-preview.file-type-psd{ +i.file-preview.file-type-psd { background-position: -140px center; } diff --git a/public/js/ueditor/dialogs/attachment/attachment.html b/public/js/ueditor/dialogs/attachment/attachment.html index 071fe71..336940a 100644 --- a/public/js/ueditor/dialogs/attachment/attachment.html +++ b/public/js/ueditor/dialogs/attachment/attachment.html @@ -3,58 +3,59 @@ ueditor图片对话框 - + - + - - + + - + -
-
- - -
-
- -
-
-
-
- 0% - -
-
-
-
-
-
-
-
-
-
-
-
    -
  • -
-
-
- - -
-
-
- -
+
+
+ +
- +
+ +
+
+
+
+ 0% + +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • +
+
+
+ + +
+
+
+ +
+
+ diff --git a/public/js/ueditor/dialogs/attachment/attachment.js b/public/js/ueditor/dialogs/attachment/attachment.js index 5e73d5e..10d31be 100644 --- a/public/js/ueditor/dialogs/attachment/attachment.js +++ b/public/js/ueditor/dialogs/attachment/attachment.js @@ -30,7 +30,7 @@ /* 初始化tabbody */ function setTabFocus(id) { - if(!id) return; + if (!id) return; var i, bodyId, tabs = $G('tabhead').children; for (i = 0; i < tabs.length; i++) { bodyId = tabs[i].getAttribute('data-content-id') @@ -88,6 +88,7 @@ this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } + UploadFile.prototype = { init: function () { this.fileList = []; @@ -102,34 +103,34 @@ var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, - // 图片容器 + // 图片容器 $queue = $wrap.find('.filelist'), - // 状态栏,包括进度和控制按钮 + // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), - // 文件总体选择信息。 + // 文件总体选择信息。 $info = $statusBar.find('.info'), - // 上传按钮 + // 上传按钮 $upload = $wrap.find('.uploadBtn'), - // 上传按钮 + // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), - // 上传按钮 + // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), - // 没选择文件之前的内容。 + // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), - // 总体进度条 + // 总体进度条 $progress = $statusBar.find('.progress').hide(), - // 添加的文件数量 + // 添加的文件数量 fileCount = 0, - // 添加的文件总大小 + // 添加的文件总大小 fileSize = 0, - // 优化retina, 在retina下这个值是2 + // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, - // 缩略图大小 + // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, - // 可能有pedding, ready, uploading, confirm, done. + // 可能有pedding, ready, uploading, confirm, done. state = '', - // 所有文件的进度信息,key为file id + // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, @@ -141,11 +142,12 @@ s = null; return r; })(), - // WebUploader实例 + // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')), fileMaxSize = editor.getOpt('fileMaxSize'), - acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''); + ; if (!WebUploader.Uploader.support()) { $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide(); @@ -155,7 +157,7 @@ return; } - uploader = _this.uploader = WebUploader.create({ + var uploaderOption = { pick: { id: '#filePickerReady', label: lang.uploadSelectFile @@ -165,8 +167,29 @@ fileVal: editor.getOpt('fileFieldName'), duplicate: true, fileSingleSizeLimit: fileMaxSize, + headers: editor.getOpt('serverHeaders') || {}, compress: false - }); + }; + if(editor.getOpt('uploadServiceEnable')) { + uploaderOption.customUpload = function (file, callback) { + editor.getOpt('uploadServiceUpload')('attachment', file, { + success: function( res ) { + callback.onSuccess(file, {_raw:JSON.stringify(res)}); + }, + error: function( err ) { + callback.onError(file, err); + }, + progress: function( percent ) { + callback.onProgress(file, percent); + } + }, { + from: 'attachment' + }); + }; + } + + + uploader = _this.uploader = WebUploader.create(uploaderOption); uploader.addButton({ id: '#filePickerBlock' }); @@ -218,9 +241,9 @@ showError(file.statusText); } else { $wrap.text(lang.uploadPreview); - if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) { $wrap.empty().addClass('notimage').append('' + - '' + file.name + ''); + '' + file.name + ''); } else { if (browser.ie && browser.version <= 7) { $wrap.text(lang.uploadNoPreview); @@ -238,7 +261,7 @@ }, thumbnailWidth, thumbnailHeight); } } - percentages[ file.id ] = [ file.size, 0 ]; + percentages[file.id] = [file.size, 0]; file.rotation = 0; /* 检查文件格式 */ @@ -258,11 +281,11 @@ // 成功 if (cur === 'error' || cur === 'invalid') { showError(file.statusText); - percentages[ file.id ][ 1 ] = 1; + percentages[file.id][1] = 1; } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { - percentages[ file.id ][ 1 ] = 0; + percentages[file.id][1] = 0; } else if (cur === 'progress') { $info.hide(); $prgress.css('display', 'block'); @@ -315,7 +338,7 @@ // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); - delete percentages[ file.id ]; + delete percentages[file.id]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } @@ -327,8 +350,8 @@ percent; $.each(percentages, function (k, v) { - total += v[ 0 ]; - loaded += v[ 0 ] * v[ 1 ]; + total += v[0]; + loaded += v[0] * v[1]; }); percent = total ? loaded / total : 0; @@ -354,7 +377,8 @@ $queue.addClass('element-invisible'); $statusBar.addClass('element-invisible'); $placeHolder.removeClass('element-invisible'); - $progress.hide(); $info.hide(); + $progress.hide(); + $info.hide(); uploader.refresh(); break; @@ -363,25 +387,29 @@ $placeHolder.addClass('element-invisible'); $queue.removeClass('element-invisible'); $statusBar.removeClass('element-invisible'); - $progress.hide(); $info.show(); + $progress.hide(); + $info.show(); $upload.text(lang.uploadStart); uploader.refresh(); break; /* 上传中 */ case 'uploading': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadPause); break; /* 暂停上传 */ case 'paused': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadContinue); break; case 'confirm': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadStart); stats = uploader.getStats(); @@ -392,7 +420,8 @@ break; case 'finish': - $progress.hide(); $info.show(); + $progress.hide(); + $info.show(); if (stats.uploadFailNum) { $upload.text(lang.uploadRetry); } else { @@ -426,9 +455,7 @@ } } else { stats = uploader.getStats(); - text = lang.updateStatusFinish.replace('_', fileCount). - replace('_KB', WebUploader.formatSize(fileSize)). - replace('_', stats.successNum); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); if (stats.uploadFailNum) { text += lang.updateStatusError.replace('_', stats.uploadFailNum); @@ -477,7 +504,7 @@ case 'startUpload': /* 添加额外的GET参数 */ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', - url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); uploader.option('server', url); setState('uploading', files); break; @@ -499,7 +526,7 @@ $percent = $li.find('.progress span'); $percent.css('width', percentage * 100 + '%'); - percentages[ file.id ][ 1 ] = percentage; + percentages[file.id][1] = percentage; updateTotalProgress(); }); @@ -508,9 +535,15 @@ try { var responseText = (ret._raw || ret), json = utils.str2json(responseText); + json = editor.getOpt('serverResponsePrepare')(json); if (json.state == 'SUCCESS') { _this.fileList.push(json); $file.append(''); + // 触发上传附件事件 + editor.fireEvent("uploadsuccess", { + res: json, + type: 'file' + }); } else { $file.find('.error').text(json.state).show(); } @@ -521,9 +554,11 @@ uploader.on('uploadError', function (file, code) { }); - uploader.on('error', function (code, file) { - if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { - addFile(file); + uploader.on('error', function (code, param1, param2) { + if (code === 'F_EXCEED_SIZE') { + editor.getOpt('tipError')(lang.errorExceedSize + ' ' + (param1 / 1024 / 1024).toFixed(1) + 'MB'); + } else { + console.log('error', code, param1, param2); } }); uploader.on('uploadComplete', function (file, ret) { @@ -548,7 +583,7 @@ }, getQueueCount: function () { var file, i, status, readyFile = 0, files = this.uploader.getFiles(); - for (i = 0; file = files[i++]; ) { + for (i = 0; file = files[i++];) { status = file.getStatus(); if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; } @@ -575,6 +610,7 @@ this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } + OnlineFile.prototype = { init: function () { this.initContainer(); @@ -598,7 +634,7 @@ var _this = this; /* 滚动拉取图片 */ - domUtils.on($G('fileList'), 'scroll', function(e){ + domUtils.on($G('fileList'), 'scroll', function (e) { var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getFileData(); @@ -634,14 +670,15 @@ getFileData: function () { var _this = this; - if(!_this.listEnd && !this.isLoadingData) { + if (!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { timeout: 100000, data: utils.extend({ - start: this.listIndex, - size: this.listSize - }, editor.queryCommandValue('serverparam')), + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + headers: editor.options.serverHeaders || {}, method: 'get', onsuccess: function (r) { try { @@ -649,13 +686,13 @@ if (json.state == 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); - if(_this.listIndex >= json.total) { + if (_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); @@ -675,24 +712,24 @@ var i, item, img, filetype, preview, icon, _this = this, urlPrefix = editor.getOpt('fileManagerUrlPrefix'); for (i = 0; i < list.length; i++) { - if(list[i] && list[i].url) { + if (list[i] && list[i].url) { item = document.createElement('li'); icon = document.createElement('span'); filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); - if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) { + if ("png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1) { preview = document.createElement('img'); - domUtils.on(preview, 'load', (function(image){ - return function(){ + domUtils.on(preview, 'load', (function (image) { + return function () { _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); }; })(preview)); preview.width = 113; - preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); } else { var ic = document.createElement('i'), textSpan = document.createElement('span'); - textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + textSpan.innerHTML = list[i].original || list[i].url.substr(list[i].url.lastIndexOf('/') + 1); preview = document.createElement('div'); preview.appendChild(ic); preview.appendChild(textSpan); diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif deleted file mode 100644 index 9ca4fb6a23c7ed528374426575c3e7f67730cfb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 923 zcmcJOy=xR;49270U`4Q~ICz36hzbru@Ut$0C6w

O|E|nVb+VhLPxFEtyI^j`FqLyNd0EWpleq^){o+_2ylTHaqGF zO<^H5(sh%@qktPU&w(pp9-3Gs((CnPZEbBZ81Rip*?#=*AAA0G)`@(VL$#^?6S8qi z-Vg0MaQMyXC!K9~zh3K)&rGar-!b{?e)rh3&E1`oQ)AtaFLu8>vh-!*#^>7|90SDQAhmyv(gsfKv~ diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png deleted file mode 100644 index 50ac1cb1654c147225f6c99f98fa820d8b1d47d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 zcmV-P1GfB$P)co5FHFQKPb3$yKB3yz3uJ2{(i*w{Y&32Y&5pHX#fNS%^lB?7Jx7e!!R@$ zW0V*MWri^ri!cCJuK&9D^Ig~)02-}VrVlRsat{^*C5gDx3qnV6$+=~+!PF21FkmZ@ z8b~H%=~Nv3aQ@;fylx>sluRWqyg8GMN5*##@7VOdNHQ%N3Cf&vJG&}(BO_ z0GI~5dh^d~zu)gPH#)1!5T+sR()iww-#)pz`cI)Sn%1`>N($3(G-m*$wuS~`$(U{O z3G;I( z%j~rr>P1P%W??GsP=NTpKmX&MwYt}DZ~eRS;O_04GsmW;j~~@ibUGeLsHM{BJj|YC8%N`o7<+Z@C+_!oGc#1Cx`LO0hUGI$B7llhKIN?RNhM@52iI TG@H!B00000NkvXXu0mjfSaX$T diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif deleted file mode 100644 index 206fede4ee7495c3d4fa8dbbb76425e23566e9cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcmW+#T};hk7=Mn8YGYk-BW7+*XP!uF(_J6BXv?Neo2k~53o+@FE|ATt^)Y4hQe0@P zSYMk?afGon-bF^G(&-43w{{O_}gnhA@5fnj7M8-aCj50=y zVPnWvS{tp57Ngl{vQ4FpQbvhUY!um9(MFUJF~Ua3uCg|)42xklOh7WE4Jkunhz+3t zHlTrpWlWRhu}^6&TC>(YQGFd~m#uKGjDYE`Ri%LWZD&tI*hU=i4-s$()c}KNsKh9AfEd_-1{T@mY#TKmi;xWx{y>Y0S(uP3>_P>aLM((F zku(B;E{r2+xJ8u612VCVIG_oJ;Sj0;2GQ7rEa(6+umMf>M0Of&)Odu8AxQWGEh;Aa zaoAj)d)uaSLL0Ml6+7z$ZBuu$v#U-V_6Uwci{yy5H*s`WUt=M+p zn)~SevRiXicW3`B{d+b3x9iEs+fRYf&nr{kgLA)De=Y{eT~yySb+dP(rDxFpb)})X z_j>E&!pg?wKmecq_T{xM7^R)ifIlLFD0GNA!!9O99O)|$T@5?_qRt;vFf&kn_)FW? z_`GnRYjoh$4o~IE$IRoKH*V=YJ>#wBrOt`{dF~IT+>(|Pf8s;e(6dXaz8IS9e|j*t z=3Q*=kAlHxo(+-b@~2-GW_ZFWttoKza)`U8q34AEw<{?<%ICf3>%N_l-tOzE_U8}Q z7oYS!sEM2(ic1;U<#{}~=FT^Xy5lXG?+$z3UwdQvQQ7pP6mQ9-w=|Y>&o0$8Wu0G{ isn`^mx;yvvmFWdDjr#c zLa{?BIQR=Hso)@-gFi5$h(?e?1}9O3!1?a`KX}6zj=OvJ-n-BDNC6L6Km!tBLTo}4 zi^J?j?#VEBbr*N!T4rW$>LzYT7A&f{s;jsnNwHVVMP0-N6NB+4N|K{}~ZKoJoX!9fm} zBM(~o#KEm(O)!!sOVVPE zi-}EWVsRKLD07CIi5XHK*D_Nz6;q^KvS3lvL`*>SB*k8X8pJ?(^n)}xO*^QcB&d+A z2}aUn$yV~Ua!;X@Eadx`Qv~8*!H*R z1Jb}XTM)URaq3M_BZ+<>;dB>fia`oDqncq{}&s`b$QtO-@+w}C? z;Nq!~gPU6~Dz(9{-TvCj!(Htg`{x(uCg+CR6V+R1T7A<43$vfP-MtrguipE)w!F3Z LqusxL9gh72jO~@^ diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif deleted file mode 100644 index b351a1f2a294cd0f8e145e20c2c455a38cad2001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmW+#OGuPa6h7I6wK1usMoI`3X2DsMWI-EEY2_v@7Zr3CQ7Q#xDA5CHkz|Fbmn^6$ zdu+7Vn5dzZIN3$9%xdyg;HxyPQD@YdxqbJ)yTdu>d!7H!$V}gndN`J1DL`cG)5a)c z#27Y)Y^Al)%4ji~jV9Yv+9+j|7{x}BofU0F84)9FgzPG7!^*H2X2S#|L)wrsB!<`! z3Sa{oSXjn1Sswe8)}l3QO_mmwQd)^ttQA=mXo}JzT38ENQJ7_=Sv0d|f<~-rQkp~) zYXU1&0}P^}60*<(F|Yv*EG&~XWNSQ8ij^Yk545O6l&})AcA)}I7R9WX;2xqdt4I{F zBG^M7kcn-?0sjyIhfobLh=xjxLI;R}4QODIP0qGaFXe8ekBOO~`@{5Ca>~WKU$L(MF9&xEO+jKhUCL zvLA=d)w#EAIw!O-J6Ex@PS7@WCp)|9#9@!%IJ8KPXnPY!hXr<^@j2j12oIh>6$*ux zmKHCUe`={p) zzwLH7IG43C5ubkIf@>L!QZh8)kBB8&*+5TM#qX_8Xe$_MO>#wd-P&_}=vih>^_H5o zg)25>S3JtEd6gfXvF(myC5ih_CjpcNI+~ z1pOIXrw&{QB)mA-kn*SH)JW$*yOgGMLYik+JFZE diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif deleted file mode 100644 index 26019b099d96b382a549fa383bd81315cd6d295c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmW+#TS!$=5S_p%q=$ihRGNrTSo%=|Wl4e&+5@B?2{ojLOjtg`N-j#~hfj#Gq+|;c z1QiB~BHGowB$g7jg(4^`Me}B48Di?a>h-!?`^?{*nOU>entf7Fq$C_VA4Xy1Co(p) zG0GS*hK(VcX>GJJT8w6+$rhD1N*N_au~B4uMH^8@#0VQ9JIdOyGAxGKFagPsHlz%R zAvS~r*nkEWhS5!Sj}4`@Xw6!aU5iX9twbx?{nprb}BStkT zO`?f4VJlbz45Yylv{1uhU;`Rh7$z&o<_J-Wl_IMTYmtd4VI^ecf(42!idiv1JxHNf zktkwCkOx0N6VtE*`auE;!5Uy74VGvH4=e^Ypn*l!Ia@}KU=gxLLLb&5V-_a(3b|l` zq7VzgM>q`wzzgj#8fsxB`~Xc%!wztQU?>D@fPpk7K?^*v7}$U&dm`J7GI9jrVlWc= zuofAUeH_+T=iavHoY30rT*dY}MqAe%@9d~!hdqL$&>}gc?M)mW7TAHtbHJ5g9yDRq z>S{0;TyY}M*Vot6)8lr#T`pI4`I8-K72A??<5Dl2EUe#KI(V?&yF0V`db_uxXX^Rz z{QI%#(Z9>f%S*wPz|x|BVSa9Ic6KEYSoHh-KA&&Fe)u^#IX*TvFficpcse>dT3TA_ z>guYhs_^uqmqOM+D8+#T{)jN5^@G%z>rH7pmwaOa4-`fm zE=u|sx$)W6D9^QNYQOk2Ei$$y(D*5)bJOYc8&k)--#thlPjXH4*Z#?Ajc?BX_V%)O z-Hhrk`u?>s=KkG>N6UP#n-Uv}+Y;`Tt<9{xw0UQ5$-=Lp($B3;TPuST`-(SY?4K+P X4d%*-doJfz=*#Bpp_0z7a!ULUk{Ai+ diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif deleted file mode 100644 index bbb65c837dea9a6c28d6209ca1b1140a37988423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcmW+#OGuPa6h47kZE6CejXiWDMGNUrrnSm4q(vaKDU@n)7n&%QMHv`Ts}dJNaY1Jm z1%)xttY%cue2lg@;j0pL1`5YVHoj^e%{0#KyZ>4JhjY$%zVAEtzgSgyy6lFFT$Cg- zHpCchj53CeA)AR9(MFUJHbSmT8mbqSu|M|C@L*ViDFS?Nuiguuo7lr0!NGr zX(1)VLf8t{00U{T1TECC7}$UY7KX_RvN=L&&03SyhqcI*(u%brD;F$KWTlxk6V!tg zdNnCctO@eq2WVm%c0fN!Kp|KI45Yylt>A&hzy>t1$U0}s$Pug*StFqjYmqT4Cin`u zV1c3{Rs;3ry4U%$;nF- zrBbn2EEn{ief)z6-Jp;EBfd`ky_8jVeTK&hz2O8aFtv^S73*9B2zWtF;HMPE?f}2k=uA(oM PSLc_Xzst?bp)>yhr3M#0 diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif deleted file mode 100644 index ccb26fbebdff5521eab7418d22e99fbae6c1d08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmW+#TS$~q5FViig{X~sv5e>~C`M52PqY*C`39biRR&OdL%%zX2G-<*@4v2#=EF&o(^Or%XH zt)_scWI{;6Qjn1g7AUfi%#sP} zK?=Q+gd~;(dGG@?F%3JQA0(gc0k$hWT1#y8Q>U^EiJ(_cNaAO=Ed9XQ}e*ob1A$rqR0<`46gx0%!XIm#cEx9b24x9#1v-6J4L2;{%(Yx0E;vP_|dsDD=Bqr6K zlHm7+$8t;U2TSW-{OnCS>CRfYv7yHk`q$jys&5*5AI!X%Ro!^Ls4C>TvM3?g5=?S; dtLf~)4_`YgyED9bxo14v@(;Dvr3@ER+J8}<4t)Rs diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif deleted file mode 100644 index 2e8743a2705b98b9c546c28c97fe724dd4668b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmW+#T}V|y5FX8kBEk#Si<*%J5ovK9!7{1n!IT1pEV7cg5JRb%rl^$FgQNr{MG-7& zA`xU1A_`tmEGaW%)l9|mH^r2+ydDOkN^7H)(PA_kO}44DQOYPWij5*WE82)MB1YH<*;Uqtm0>Z=h6zZ9v>|0k46z{; zzy>t1u#9Q4JoYKAMQhfYEG;Ufv=XgYE3zuk6s1M9uokkSFw07_XlBg>jab#BG>InG z1Xid97(_!QWT6LQU;`RhSSD-8)_9^6D@E2HXiU9wr2Ei%NyMkpF_J&`0YLK7n!ypd%%@ko>=}l@3A-fW=Hs`+liI4{u!_R zJ@o-MCR`=o!|wiwC~n{V@aK+;)v;~|ifp4t6BC)6X zNY-$)^uNy?@fJ-lrA;-xIvblk5|a^9wr8sK+EnAE)Y`6)xT`ZQ_lBpVDtf99_0~L{ z=}wQmmDtrA(ebGEQ;{!hVQw(_Nqo)eoe7sa%4^;g4K8%`{k=aLSLzy1U$>H7*_tKo z?hDH)jF-g$H!2(mEu+l^ml1h9)R3{_R zN+{4&BvL7dheA~CWs)UwOqF5B!RW`y}SP8Q*0ZGURX(1)VLMVU@ zXkcL((`0$<)5a)c*ch_3sI)d(8O=tMRe`3`Mk%A%D6*n3%i6Fq%!UaXv1&*gQij+N zSfLtV5Dk@(g&v534QOCtnXDmO<0-9KYqI`8i%Kc2SSzx2p#n`-nprc!Jw#zvlhVYR zU=MjfCbkg={6hpBLN&l38Y(dg9Uulapn*j;Ion2!$4Ze668=DoidiusSJ;ILG!?NT z`cdZNvdhFbs!K4KRqtCS*Yeh=C1gvL~|BXrsm>Tns_NA81iA z*^k5K>fGBlofF!aovYYcCup0xlbv04;;=_>99kqtw7rR=!vZ_d_#AL0ga=QcT3T8< z<=R-i>3I9ihKoM2lSwUuoqZ$2BQrmK#>X8XzYq$FpIcabGw!|J+&@0~jgD6Rn*IHD zYU*J_gIA>EUC-4U*8(b%5;IQ(N3L1D-lx5b+S*z!r;vBaQ?%dj<&*o3m6bEy-Cgzd z%gf7Nuh;E%eU|NsNa*$rtBcF| zyk*2Qx4ovf+`S`nruXcsh=cR3xoPb?(_#u%q!dP%WtCUfMD^y5?XF6Her}@Ud*@JN zR#JAj$JM;zL)wdit+9jteY2rawR5d!2K?9E8$Mq`ciulptVrE=A*%YMZ*gr`TuJ|{ z(z2$eFL}wMSGG+Dq$lSUuPlpR9NA3ywWC9IrH}KT<}duqn4ccJzBi_D;`Bu5K&ybF0xCVru0xy zLa>Ldm34nuFN?9hw?M?7)Rv5bKzH}sb=_Uxp7)#Ed^7XR^E~r@SFc?;bGE0MnyE}= zT^MWCTCtX`C6^gvjanntur=h0YOJbNvC3A-^@_2gR>TThAvem#vRW3)Y?**$$yicL zVu>vw0XCq4g<*7)+v7rw5o6dGa%+*P8Wp2#lpG5bMU99NHbRaRdRYyNVKz+Qh*3jo zNDQ$dYz1q8fizfx7HU`wY(N7G!{h|H93iT#N=_fvA`?+z6>@UH0!0>ORwk$iDfB9d z5-UL-`~Xc%!w%>N2`B_>fPpkvq7^)_7}$UY7CGl!899PQ$QcQJSc{BVnBXhqf(42~ zECe6nGz zR(E#l^?I#Vt4>c($K&x>EH*eeSSXZoxnJ}13)SlO_I9OSt5&wk<&sy(Z+eA7F`uuY zP^nb5w(z-JDwRCXD;765Hda?wve|4VlS!x3sZ=VNOePYEXf!%8F%gMG!r^c*7{t>* zQrW!=Lg@rJ;E!k~Y8)rqpWD-SyM1VBq23t_FUFtz{Mx?sD0C|jZ2C9Sbm)4^Oz+y? z)NEU5?fiq>-2Lw#Pj*iB{YZA*d>J~N?LXc*G#V&$2YN3)-Dis(c-P&AvG|vcl}Pm7 ha8EkcUOioGJ2wXc!R{Rj722e<$L diff --git a/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/public/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif deleted file mode 100644 index e86c1c6631b34ecd605b655baf3d7b1ae643d014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmW+#Sx8n<5S~OS9}KaFd{U%W$zY07N%BQgM2kWK39;Zvw5XMcSs{ptw3ukd!DvAW zOUSa^MRP$(k0NGD>TjW9qHS6!zy3LW=bpD=X1;Cijg5;r5T52w{na(1=w-+K@8DhQJEd z0E1|#ge>$x3~WFH3(I5;*&0u2&03T72U=80X~kNRwF?z!veL|&3GN{ZvznA9)&zUV z12VCVIN%>5;1H?-2GLN7QRo0MumKG$vdP&tYCKkoY>@B=T2#!63Aw^9RG_Jd6(L6? zjR2qv;|LmV5he0~Ol%_#Xo6ulgld36G&Ug%IzS9;K$AU@okklq9^qmL68=DoiphQ) zHdp7~w&|SE#_U|h&N@Nc)Sc|?suPDjg5%I4Iil@N932+efyU>6D&6#&)VjN>|V zv-8~R>nCf{GTvkb-3s1$HZb}{bVgT3@w?(fB~dl5>apdK*}q@9UF`{1qs)Bgsw~gR z=r5V~h#Q}Nh}(M$j8Z5x;E(Vp+SX66eUHZ;aWxlg`{dh`oKe|bG})HBk$k7J>&nXF znW?~}na0bDp}hrOKKbvIaHygA>osR74c^g{8LV9&?8bPWVl?=6FUHC(Dw~C1%a`M-0X^ zUTDZ(=qbF}x@WkhBY(X3Lqp?a*Tv5PRVfK4D#P2o2A&MKE9$~CZ}>dh(HH(8{nF#G b^xlfyQ$tzRM+;I8wp1>Sze?TeO_BcrMy(F| diff --git a/public/js/ueditor/dialogs/audio/audio.css b/public/js/ueditor/dialogs/audio/audio.css new file mode 100644 index 0000000..fe64ce7 --- /dev/null +++ b/public/js/ueditor/dialogs/audio/audio.css @@ -0,0 +1,818 @@ +@charset "utf-8"; +.wrapper { + width: 570px; + _width: 575px; + margin: 10px auto; + zoom: 1; + position: relative +} + +.tabbody { + height: 355px; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 355px; + display: block; +} + +.tabbody .panel table td { + vertical-align: middle; +} + +#audioUrl { + width: 380px; + height: 26px; + line-height: 26px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; + outline: none; + border-radius: 3px; + padding: 0 5px; +} + +#audioSelect { + width: 100px; + display: inline-block; + background: #FFF; + border: 1px solid #EEE; + line-height: 26px; + text-align: center; + color: #333; + text-decoration: none; + border-radius: 3px; + vertical-align: middle; +} + +#audioSearchTxt { + margin-left: 15px; + background: #FFF; + width: 200px; + height: 21px; + line-height: 21px; + border: 1px solid #d7d7d7; +} + +#searchList { + width: 570px; + overflow: auto; + zoom: 1; + height: 270px; +} + +#searchList div { + float: left; + width: 120px; + height: 135px; + margin: 5px 15px; +} + +#searchList img { + margin: 2px 8px; + cursor: pointer; + border: 2px solid #fff +} + +/*不用缩略图*/ +#searchList p { + margin-left: 10px; +} + +#audioType { + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} + +#audioSearchBtn, #audioSearchReset { + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + +#preview { + position: relative; + width: 420px; + padding: 0; + overflow: hidden; + margin-left: 10px; + _margin-left: 5px; + height: 280px; + background-color: #ddd; + float: left +} + +#preview .previewMsg { + position: absolute; + top: 0; + margin: 0; + padding: 0; + height: 280px; + width: 100%; + background-color: #666; +} + +#preview .previewMsg span { + display: block; + margin: 125px auto 0 auto; + text-align: center; + font-size: 18px; + color: #fff; +} + +#preview .previewaudio { + position: absolute; + top: 0; + margin: 0; + padding: 0; + height: 280px; + width: 100%; +} + +.edui-audio-wrapper fieldset { + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} + +#audioInfo { + width: 120px; + float: left; + margin-left: 10px; + _margin-left: 7px; +} + +fieldset { + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} + +fieldset legend { + font-weight: bold; +} + +fieldset p { + line-height: 30px; +} + +fieldset input.txt { + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} + +label.url { + font-weight: bold; + margin-left: 5px; +} + +#audioFloat div { + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + margin: 9px; + _margin: 5px; + width: 38px; + height: 36px; + float: left; +} + +#audioFloat .focus { + opacity: 1; + filter: alpha(opacity=100) +} + +span.view { + display: inline-block; + width: 30px; + float: right; + cursor: pointer; + color: blue +} + + +/* upload audio */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 335px; + display: block; + clip: auto; +} + +#upload_alignment div { + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + margin: 9px; + _margin: 5px; + width: 38px; + height: 36px; + float: left; +} + +#upload_alignment .focus { + opacity: 1; + filter: alpha(opacity=100) +} + +#upload_left { + width: 427px; + float: left; +} + +#upload_left .controller { + height: 30px; + clear: both; +} + +#uploadaudioInfo { + margin-top: 10px; + float: right; + padding-right: 8px; +} + +#upload .queueList { + margin: 0; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + margin-right: 0; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 161px; + padding-top: 150px; + text-align: center; + width: 97%; + float: left; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top: 0; + *margin-left: 0; + *left: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 285px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 15px 0 0 20px; + *margin: 15px 0 0 15px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} + +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display: none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} + +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display: none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display: none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} + +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} + +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} + +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #00b7ee; + color: #fff; + border-color: transparent; +} + +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter: alpha(opacity=60); + -moz-opacity: 0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + +/* 在线文件的文件预览图标 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} + +i.file-preview.file-type-dir { + background-position: 0 center; +} + +i.file-preview.file-type-file { + background-position: -140px center; +} + +i.file-preview.file-type-filelist { + background-position: -210px center; +} + +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2 { + background-position: -280px center; +} + +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx { + background-position: -350px center; +} + +i.file-preview.file-type-doc, +i.file-preview.file-type-docx { + background-position: -420px center; +} + +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx { + background-position: -490px center; +} + +i.file-preview.file-type-vsd { + background-position: -560px center; +} + +i.file-preview.file-type-pdf { + background-position: -630px center; +} + +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp { + background-position: -700px center; +} + +i.file-preview.file-type-apk { + background-position: -770px center; +} + +i.file-preview.file-type-exe { + background-position: -840px center; +} + +i.file-preview.file-type-ipa { + background-position: -910px center; +} + +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb { + background-position: -980px center; +} + +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3 { + background-position: -1050px center; +} + +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd { + background-position: -140px center; +} diff --git a/public/js/ueditor/dialogs/audio/audio.html b/public/js/ueditor/dialogs/audio/audio.html new file mode 100644 index 0000000..61fc7cf --- /dev/null +++ b/public/js/ueditor/dialogs/audio/audio.html @@ -0,0 +1,83 @@ + + + + + + + + + +

+
+
+ + +
+
+
+ + + + + +
+
+ 外链音频支持MP3格式 +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ 0% + +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • +
+
+
+
+
+ +
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/public/js/ueditor/dialogs/audio/audio.js b/public/js/ueditor/dialogs/audio/audio.js new file mode 100644 index 0000000..07edcf9 --- /dev/null +++ b/public/js/ueditor/dialogs/audio/audio.js @@ -0,0 +1,805 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 上午11:19 + * To change this template use File | Settings | File Templates. + */ + +(function () { + + var audio = {}, + uploadaudioList = [], + isModifyUploadaudio = false, + uploadFile; + var editorOpt = {}; + + window.onload = function () { + editorOpt = editor.getOpt('audioConfig'); + $focus($G("audioUrl")); + initTabs(); + initAudio(); + initUpload(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var j, bodyId, target = e.target || e.srcElement; + for (j = 0; j < tabs.length; j++) { + bodyId = tabs[j].getAttribute('data-content-id'); + if (tabs[j] == target) { + domUtils.addClass(tabs[j], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[j], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + }); + } + if (!editorOpt.disableUpload) { + $G('tabHeads').querySelector('[data-content-id="upload"]').style.display = 'inline-block'; + } + if (!!editorOpt.selectCallback) { + $G('audioSelect').style.display = 'inline-block'; + domUtils.on($G('audioSelect'), "click", function (e) { + editorOpt.selectCallback(editor, function (info) { + if (info) { + $G('audioUrl').value = info.path; + createPreview(info.path); + } + }); + }); + } + } + + function initAudio() { + createAlignButton(["audioFloat", "upload_alignment"]); + addUrlChangeListener($G("audioUrl")); + addOkListener(); + + //编辑视频时初始化相关信息 + (function () { + var img = editor.selection.getRange().getClosedNode(), url; + if (img && img.className) { + var hasFakedClass = (img.className == "edui-faked-audio"), + hasUploadClass = img.className.indexOf("edui-upload-audio") != -1; + if (hasFakedClass || hasUploadClass) { + $G("audioUrl").value = url = img.getAttribute("_url"); + var align = domUtils.getComputedStyle(img, "float"), + parentAlign = domUtils.getComputedStyle(img.parentNode, "text-align"); + updateAlignButton(parentAlign === "center" ? "center" : align); + } + if (hasUploadClass) { + isModifyUploadaudio = true; + } + } + createPreview(url); + })(); + } + + /** + * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 + */ + function addOkListener() { + dialog.onok = function () { + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads", "tabSrc"); + switch (currentTab) { + case "audio": + return insertSingle(); + break; + // case "audioSearch": + // return insertSearch("searchList"); + // break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function () { + $G("preview").innerHTML = ""; + }; + } + + /** + * 依据传入的align值更新按钮信息 + * @param align + */ + function updateAlignButton(align) { + var aligns = $G("audioFloat").children; + for (var i = 0, ci; ci = aligns[i++];) { + if (ci.getAttribute("name") == align) { + if (ci.className != "focus") { + ci.className = "focus"; + } + } else { + if (ci.className == "focus") { + ci.className = ""; + } + } + } + } + + /** + * 将单个视频信息插入编辑器中 + */ + function insertSingle() { + var url = $G('audioUrl').value, + align = findFocus("audioFloat", "name"); + if (!url) return false; + editor.execCommand('insertaudio', { + url: url, + }, isModifyUploadaudio ? 'upload' : null); + } + + /** + * 将元素id下的所有代表视频的图片插入编辑器中 + * @param id + */ + function insertSearch(id) { + var imgs = domUtils.getElementsByTagName($G(id), "img"), + audioObjs = []; + for (var i = 0, img; img = imgs[i++];) { + if (img.getAttribute("selected")) { + audioObjs.push({ + url: img.getAttribute("ue_audio_url"), + width: 420, + height: 280, + align: "none" + }); + } + } + editor.execCommand('insertaudio', audioObjs); + } + + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + function findFocus(id, returnProperty) { + var tabs = $G(id).children, + property; + for (var i = 0, ci; ci = tabs[i++];) { + if (ci.className == "focus") { + property = ci.getAttribute(returnProperty); + break; + } + } + return property; + } + + /** + * 数字判断 + * @param value + */ + function isNumber(value) { + return /(0|^[1-9]\d*$)/.test(value); + } + + /** + * 创建图片浮动选择按钮 + * @param ids + */ + function createAlignButton(ids) { + for (var i = 0, ci; ci = ids[i++];) { + var floatContainer = $G(ci), + nameMaps = { + "none": lang['default'], + "left": lang.floatLeft, + "right": lang.floatRight, + "center": lang.block + }; + for (var j in nameMaps) { + var div = document.createElement("div"); + div.setAttribute("name", j); + if (j == "none") div.className = "focus"; + div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; + div.setAttribute("title", nameMaps[j]); + floatContainer.appendChild(div); + } + switchSelect(ci); + } + } + + /** + * 选择切换 + * @param selectParentId + */ + function switchSelect(selectParentId) { + var selects = $G(selectParentId).children; + for (var i = 0, ci; ci = selects[i++];) { + domUtils.on(ci, "click", function () { + for (var j = 0, cj; cj = selects[j++];) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute("class"); + } + this.className = "focus"; + }) + } + } + + /** + * 监听url改变事件 + * @param url + */ + function addUrlChangeListener(url) { + if (browser.ie) { + url.onpropertychange = function () { + createPreview(this.value); + } + } else { + url.addEventListener("input", function () { + createPreview(this.value); + }, false); + } + } + + function createAudioHtml(url, param) { + param = param || {}; + var str = [ + "', + '', + '', + ]; + return str.join(''); + } + + /** + * 根据url生成视频预览 + * @param url + */ + function createPreview(url) { + if (!url) { + return; + } + + $G("preview").innerHTML = '
' + lang.urlError + '
' + + '
' + + '
' + createAudioHtml(url) + '
' + + '
'; + } + + + /* 插入上传视频 */ + function insertUpload() { + var audioObjs = [], + uploadDir = editor.getOpt('audioUrlPrefix'), + align = findFocus("upload_alignment", "name") || 'none'; + for (var key in uploadaudioList) { + var file = uploadaudioList[key]; + audioObjs.push({ + url: uploadDir + file.url, + align: align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertaudio', audioObjs, 'upload'); + } + } + + /*初始化上传标签*/ + function initUpload() { + uploadFile = new UploadFile('queueList'); + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('audioActionName')), + fileMaxSize = editor.getOpt('audioMaxSize'), + acceptExtensions = (editor.getOpt('audioAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''); + ; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('audioActionName')) { + $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide(); + return; + } + + var uploaderOption = { + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('audioFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + headers: editor.getOpt('serverHeaders') || {}, + compress: false + }; + + if(editor.getOpt('uploadServiceEnable')) { + uploaderOption.customUpload = function (file, callback) { + editor.getOpt('uploadServiceUpload')('audio', file, { + success: function( res ) { + callback.onSuccess(file, {_raw:JSON.stringify(res)}); + }, + error: function( err ) { + callback.onError(file, err); + }, + progress: function( percent ) { + callback.onProgress(file, percent); + } + }, { + from: 'audio' + }); + }; + } + + uploader = _this.uploader = WebUploader.create(uploaderOption); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[file.id] = [file.size, 0]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[file.id][1] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[file.id][1] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[file.id]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[0]; + loaded += v[0] * v[1]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); + $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); + $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); + $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + if (actionUrl.toLowerCase().indexOf('jsp') != -1) { + header['X_Requested_With'] = 'XMLHttpRequest'; + } + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[file.id][1] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + json = editor.getOpt('serverResponsePrepare')(json); + if (json.state == 'SUCCESS') { + uploadaudioList.push({ + 'url': json.url, + 'type': json.type, + 'original': json.original + }); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, param1, param2) { + if (code === 'F_EXCEED_SIZE') { + editor.getOpt('tipError')(lang.errorExceedSize + ' ' + (param1 / 1024 / 1024).toFixed(1) + 'MB'); + } else { + console.log('error', code, param1, param2); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++];) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + refresh: function () { + this.uploader.refresh(); + } + }; + +})(); diff --git a/public/js/ueditor/dialogs/audio/images/bg.png b/public/js/ueditor/dialogs/audio/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 Bm*4;Z literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/file-icons.gif b/public/js/ueditor/dialogs/audio/images/file-icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8c02c27e242f0584fc6b214f35b4f6d8caec332 GIT binary patch literal 20097 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 literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/file-icons.png b/public/js/ueditor/dialogs/audio/images/file-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff82c8c488f53a7aff67fbe39742e3321183eca GIT binary patch literal 44070 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

    *vGSxI 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 literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/icons.gif b/public/js/ueditor/dialogs/audio/images/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..78459dea7b12ccbeec81d19ecdab22b1658e93b4 GIT binary patch literal 453 zcmZ?wbhEHbbY#$A*vtR||Ns9FJNP^N(4UCIf1{56|NHmvpFe+o|NadW2g{=nia%Kx z85lSjbU>mYGZarn*x(aH@fLZq!wgUiaA+%BrQuMGlI(3v}$4ket=c%G-JG_a6@d zUMtW1Dv_dMk(#;&JDULU);6IIt*+RD80Beh(v#{r8-@JE7rOMyrKZ@`PM+5- zK4PEn@UifH&1a7opNKNDvAy~H((Lt@PiCLrh`sqL^yyzFM}*_N9gV+*y1bvCcd{tw zP+atQ`ojjtR_?nOH&4iCw(0v^v}@~SfpwBi-JHA%0-p_?kEd#ga=ENn_|&M5?L?$c z!i1+jT>6R+ul!uQ+^$n$Hm~o7%Nb0wJ#GK7NE~>4aE?#6+>{R=oUZeJnouMg`B^J) rUi3;Xl^IQMkE|4#X6EZ{`gBG$ultcLuMHMNRKNMR>qv$%6N5DXx{1lO literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/icons.png b/public/js/ueditor/dialogs/audio/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..12e4700163ac87fa38ae3d92a2c39d0fb4690fed GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/left_focus.jpg b/public/js/ueditor/dialogs/audio/images/left_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7886d276dda2e0aecdae22393eac534ed507babf GIT binary patch literal 11423 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 T+mF>-Zi@@LHB9%bmHhD^k7NPf literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/none_focus.jpg b/public/js/ueditor/dialogs/audio/images/none_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c768dcb47aaa289135afd2bd0e8eb0b6ecb7536 GIT binary patch literal 11546 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 C61Fb@ literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/right_focus.jpg b/public/js/ueditor/dialogs/audio/images/right_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..173e10d2d91026c7283566993afb2f3a0267ea40 GIT binary patch literal 11334 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 literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/success.gif b/public/js/ueditor/dialogs/audio/images/success.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d4f3112b9d1df2147ed3b67d9736163dedd11e1 GIT binary patch literal 445 zcmZ?wbhEHb)L_tHxXJ(m|NsC0{`>#WKmY&!`~ULm|4%>v3rzVXIOUh{)L$ageu+>2 zB{Acd%*pZwE#>TlQSztb-KopJH+%!_|l-~7Ag*59?a z{_c7B@6_{ur(gU#_wwKE_y6vG`1j=VzZYNsfBgCX$DjXizW@L859r4KV8@~pia%Kx z85k@WbU+dyKQXY~a+p)#p(E9QVoA}-BeJtDJbfs+R&065YSGzOop#2q7tzUUTK@E- z1Qpqe*fm*b*T-Fam_8!ZPiJg?eRTb9ku+5;xVnw>Wr$>Ce}(b zvq{bgY~#~oR8Cparp&0%zbdUw!o*Z6ds70hP&$teqekA&7*16-748@%Mnl0vSqU6+ zOpICr!NSHY@7SLk+rBLP3&#jWP!Xxbb jiN%_{Rv%uKKTTNF#>acL^G5)OtDBg<-IWs>91PX~W`xy? literal 0 HcmV?d00001 diff --git a/public/js/ueditor/dialogs/audio/images/success.png b/public/js/ueditor/dialogs/audio/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d GIT binary patch literal 1621 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#?>2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u(vXbonl~MI_~M>7*cWT z%njcRVMh`65C6~Q2yI{K`NBQQh9heAinXE1(JfB=Ul%M;Ke#x6g%L8^f5l4Te zj&BcK1znDIyZS2~eC7F3K+}tVTa$=u*HTU0W4>0#`+Qf%|GkyBERBs#$Y}P@k7@U2 zd#*XsYr~WGeCA1uSK>2HTD)g9mP}Xrpg$+`K&8dx2JS~bjCx(hj5}1;-8qn2_>|?> zp{d+2q{I0hbQS!U-jOut`kSEi+IhQJGmBl4O%se*W?OGKZ0Mp?XmGnRgezL^8vCJ4 z#-ek9(R&%4!h+;oXA~Mtbyie=u#0PDiI#!iX`%2?^@kRL8ma*r6?+*}W4e|_8~J&& z+-+*Ub3{dDcAIF|!MTDz0#78qKYeaeVU$wDOOs3cR=e5FZ*O2e-6xc{Uu=$;!s>*M z>nZ|V>zUp8-oE6^wXjV+_UOvuE&SORr`;3hnBKu~e3rzlY@NRjD|5Ui2t>^@Ve7jy z)2vT>u1vesjJgG`f;l_n`FmbR~b^~{VzXB}7CdU_pt>lO9l=E;X#4<2bZu32r~J^e^%TSISQ_Qm$= z7d{rOo2%^RUGseJkpn9(MWszUQdl(i&RN5PBgZ0d#S7ZipShU3W`>Nsy6C#pCD*KW zyxHW%b?m|pr;dF;L$saa#oaeO`u=>jkXTjl9*cLEvOD!Jdr4ooKJW9gY7?D{e?uM^ z`_}E4`0yR0boA=9>3>WXzUH{&pDfpZ;_2xb=j*pKsk#WyD%J#5t{1#azeB z4SJq8H2*dJVX$xugZHVh{7U`u4@oM|quz5j-hRJi{qwh1k5uNqu`W>3HJG&Y^R}6R z$Gq-HPue$sd${oT*XKO8zN>Oe_%K^bZNm3^-vf7@5X# - - + + -

    - +
    + diff --git a/public/js/ueditor/dialogs/background/background.js b/public/js/ueditor/dialogs/background/background.js index 09c4d9a..d40a252 100644 --- a/public/js/ueditor/dialogs/background/background.js +++ b/public/js/ueditor/dialogs/background/background.js @@ -9,17 +9,17 @@ }; /* 初始化tab标签 */ - function initTabs(){ + function initTabs() { var tabs = $G('tabHeads').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var target = e.target || e.srcElement; for (var j = 0; j < tabs.length; j++) { - if(tabs[j] == target){ + if (tabs[j] == target) { tabs[j].className = "focus"; var contentId = tabs[j].getAttribute('data-content-id'); $G(contentId).style.display = "block"; - }else { + } else { tabs[j].className = ""; $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; } @@ -29,7 +29,7 @@ } /* 初始化颜色设置 */ - function initColorSelector () { + function initColorSelector() { var obj = editor.queryCommandValue('background'); if (obj) { var color = obj['background-color'], @@ -40,10 +40,10 @@ x = parseInt(pos[0]) || 0, y = parseInt(pos[1]) || 0; - if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; + if (repeat == 'no-repeat' && (x || y)) repeat = 'self'; image = image.match(/url[\s]*\(([^\)]*)\)/); - image = image ? image[1]:''; + image = image ? image[1] : ''; updateFormState('colored', color, image, repeat, x, y); } else { updateFormState(); @@ -55,10 +55,10 @@ } domUtils.on($G('nocolorRadio'), 'click', updateBackground); domUtils.on($G('coloredRadio'), 'click', updateHandler); - domUtils.on($G('url'), 'keyup', function(){ - if($G('url').value && $G('alignment').style.display == "none") { - utils.each($G('repeatType').children, function(item){ - item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); + domUtils.on($G('url'), 'keyup', function () { + if ($G('url').value && $G('alignment').style.display == "none") { + utils.each($G('repeatType').children, function (item) { + item.selected = ('repeat' == item.getAttribute('value') ? 'selected' : false); }); } updateHandler(); @@ -110,44 +110,44 @@ } /* 更新背景色设置面板 */ - function updateFormState (radio, color, url, align, x, y) { + function updateFormState(radio, color, url, align, x, y) { var nocolorRadio = $G('nocolorRadio'), coloredRadio = $G('coloredRadio'); - if(radio) { - nocolorRadio.checked = (radio == 'colored' ? false:'checked'); - coloredRadio.checked = (radio == 'colored' ? 'checked':false); + if (radio) { + nocolorRadio.checked = (radio == 'colored' ? false : 'checked'); + coloredRadio.checked = (radio == 'colored' ? 'checked' : false); } - if(color) { + if (color) { domUtils.setStyle($G("colorPicker"), "background-color", color); } - if(url && /^\//.test(url)) { + if (url && /^\//.test(url)) { var a = document.createElement('a'); a.href = url; browser.ie && (a.href = a.href); - url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); + url = browser.ie ? a.href : (a.protocol + '//' + a.host + a.pathname + a.search + a.hash); } - if(url || url === '') { + if (url || url === '') { $G('url').value = url; } - if(align) { - utils.each($G('repeatType').children, function(item){ - item.selected = (align == item.getAttribute('value') ? 'selected':false); + if (align) { + utils.each($G('repeatType').children, function (item) { + item.selected = (align == item.getAttribute('value') ? 'selected' : false); }); } - if(x || y) { + if (x || y) { $G('x').value = parseInt(x) || 0; $G('y').value = parseInt(y) || 0; } - $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; - $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; + $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '' : 'none'; + $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '' : 'none'; } /* 更新背景颜色 */ - function updateBackground () { + function updateBackground() { if ($G('coloredRadio').checked) { var color = domUtils.getStyle($G("colorPicker"), "background-color"), bgimg = $G("url").value, @@ -177,6 +177,7 @@ this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } + OnlineImage.prototype = { init: function () { this.reset(); @@ -200,7 +201,7 @@ var _this = this; /* 滚动拉取图片 */ - domUtils.on($G('imageList'), 'scroll', function(e){ + domUtils.on($G('imageList'), 'scroll', function (e) { var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getImageData(); @@ -239,7 +240,7 @@ this.getImageData(); }, /* 重置界面 */ - reset: function() { + reset: function () { this.initContainer(); this.initData(); }, @@ -247,31 +248,32 @@ getImageData: function () { var _this = this; - if(!_this.listEnd && !this.isLoadingData) { + if (!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), isJsonp = utils.isCrossDomainUrl(url); ajax.request(url, { 'timeout': 100000, - 'dataType': isJsonp ? 'jsonp':'', + 'dataType': isJsonp ? 'jsonp' : '', 'data': utils.extend({ - start: this.listIndex, - size: this.listSize - }, editor.queryCommandValue('serverparam')), + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'headers': editor.options.serverHeaders || {}, 'method': 'get', 'onsuccess': function (r) { try { - var json = isJsonp ? r:eval('(' + r.responseText + ')'); + var json = isJsonp ? r : eval('(' + r.responseText + ')'); if (json.state == 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); - if(_this.listIndex >= json.total) { + if (_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); @@ -291,18 +293,18 @@ var i, item, img, icon, _this = this, urlPrefix = editor.getOpt('imageManagerUrlPrefix'); for (i = 0; i < list.length; i++) { - if(list[i] && list[i].url) { + if (list[i] && list[i].url) { item = document.createElement('li'); img = document.createElement('img'); icon = document.createElement('span'); - domUtils.on(img, 'load', (function(image){ - return function(){ + domUtils.on(img, 'load', (function (image) { + return function () { _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); } })(img)); img.width = 113; - img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); img.setAttribute('_src', urlPrefix + list[i].url); domUtils.addClass(icon, 'icon'); diff --git a/public/js/ueditor/dialogs/contentimport/contentimport.html b/public/js/ueditor/dialogs/contentimport/contentimport.html new file mode 100644 index 0000000..5205cd2 --- /dev/null +++ b/public/js/ueditor/dialogs/contentimport/contentimport.html @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/dialogs/contentimport/contentimport.js b/public/js/ueditor/dialogs/contentimport/contentimport.js new file mode 100644 index 0000000..aaa28f0 --- /dev/null +++ b/public/js/ueditor/dialogs/contentimport/contentimport.js @@ -0,0 +1,91 @@ +var contentImport = {}; +var g = $G; + +contentImport.data = { + result: null, +}; +contentImport.init = function (opt, callbacks) { + addUploadButtonListener(); + addOkListener(); +}; + +function processWord(file) { + $('.file-tip').html('正在转换Word文件,请稍后...'); + $('.file-result').html('').hide(); + var reader = new FileReader(); + reader.onload = function (loadEvent) { + mammoth.convertToHtml({ + arrayBuffer: loadEvent.target.result + }) + .then(function displayResult(result) { + $('.file-tip').html('转换成功'); + contentImport.data.result = result.value; + $('.file-result').html(result.value).show(); + }, function (error) { + $('.file-tip').html('Word文件转换失败:' + error); + }); + }; + reader.onerror = function (loadEvent) { + $('.file-tip').html('Word文件转换失败:' + loadEvent); + }; + reader.readAsArrayBuffer(file); +} + +function processMarkdown( markdown ){ + var converter = new showdown.Converter(); + var html = converter.makeHtml(markdown); + $('.file-tip').html('转换成功'); + contentImport.data.result = html; + $('.file-result').html(html).show(); +} + +function processMarkdownFile(file) { + $('.file-tip').html('正在转换Markdown文件,请稍后...'); + $('.file-result').html('').hide(); + var reader = new FileReader(); + reader.onload = function (loadEvent) { + processMarkdown( loadEvent.target.result ); + }; + reader.onerror = function (loadEvent) { + $('.file-tip').html('Markdown文件转换失败:' + loadEvent); + }; + reader.readAsText(file, "UTF-8"); +} + +function addUploadButtonListener() { + g('contentImport').addEventListener('change', function () { + const file = this.files[0]; + const fileName = file.name; + const fileExt = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase(); + switch (fileExt) { + case 'docx': + case 'doc': + processWord(file); + break; + case 'md': + processMarkdownFile(file); + break; + default: + $('.file-tip').html('不支持的文件格式:' + fileExt); + break; + } + }); + g('fileInputConfirm').addEventListener('click', function () { + processMarkdown( g('fileInputContent').value ); + $('.file-input').hide(); + }); +} + +function addOkListener() { + dialog.onok = function () { + if (!contentImport.data.result) { + alert('请先上传文件识别内容'); + return false; + } + editor.fireEvent('saveScene'); + editor.execCommand("inserthtml", contentImport.data.result); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + }; +} diff --git a/public/js/ueditor/dialogs/contentimport/mammoth.browser.min.js b/public/js/ueditor/dialogs/contentimport/mammoth.browser.min.js new file mode 100644 index 0000000..cc8a19b --- /dev/null +++ b/public/js/ueditor/dialogs/contentimport/mammoth.browser.min.js @@ -0,0 +1,21 @@ +!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.mammoth=f()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o0&&(childrenXml=deletedParagraphContents.concat(childrenXml),deletedParagraphContents=[]),ReadResult.map(readParagraphProperties(paragraphPropertiesElement),readXmlElements(childrenXml),function(properties,children){return new documents.Paragraph(children,properties)}).insertExtra()},"w:r":function(element){return ReadResult.map(readRunProperties(element.firstOrEmpty("w:rPr")),readXmlElements(element.children),function(properties,children){var hyperlinkOptions=currentHyperlinkOptions();return null!==hyperlinkOptions&&(children=[new documents.Hyperlink(children,hyperlinkOptions)]),new documents.Run(children,properties)})},"w:fldChar":readFldChar,"w:instrText":readInstrText,"w:t":function(element){return elementResult(new documents.Text(element.text()))},"w:tab":function(element){return elementResult(new documents.Tab)},"w:noBreakHyphen":function(){return elementResult(new documents.Text("‑"))},"w:softHyphen":function(element){return elementResult(new documents.Text("­"))},"w:sym":readSymbol,"w:hyperlink":function(element){var relationshipId=element.attributes["r:id"],anchor=element.attributes["w:anchor"];return readXmlElements(element.children).map(function(children){function create(options){var targetFrame=element.attributes["w:tgtFrame"]||null;return new documents.Hyperlink(children,_.extend({targetFrame:targetFrame},options))}if(relationshipId){var href=relationships.findTargetByRelationshipId(relationshipId);return anchor&&(href=uris.replaceFragment(href,anchor)),create({href:href})}return anchor?create({anchor:anchor}):children})},"w:tbl":readTable,"w:tr":readTableRow,"w:tc":readTableCell,"w:footnoteReference":noteReferenceReader("footnote"),"w:endnoteReference":noteReferenceReader("endnote"),"w:commentReference":readCommentReference,"w:br":function(element){var breakType=element.attributes["w:type"];return null==breakType||"textWrapping"===breakType?elementResult(documents.lineBreak):"page"===breakType?elementResult(documents.pageBreak):"column"===breakType?elementResult(documents.columnBreak):emptyResultWithMessages([warning("Unsupported break type: "+breakType)])},"w:bookmarkStart":function(element){var name=element.attributes["w:name"];return"_GoBack"===name?emptyResult():elementResult(new documents.BookmarkStart({name:name}))},"mc:AlternateContent":function(element){return readChildElements(element.first("mc:Fallback"))},"w:sdt":function(element){return readXmlElements(element.firstOrEmpty("w:sdtContent").children)},"w:ins":readChildElements,"w:object":readChildElements,"w:smartTag":readChildElements,"w:drawing":readChildElements,"w:pict":function(element){return readChildElements(element).toExtra()},"v:roundrect":readChildElements,"v:shape":readChildElements,"v:textbox":readChildElements,"w:txbxContent":readChildElements,"wp:inline":readDrawingElement,"wp:anchor":readDrawingElement,"v:imagedata":readImageData,"v:group":readChildElements,"v:rect":readChildElements};return{readXmlElement:readXmlElement,readXmlElements:readXmlElements}}function readNumberingProperties(styleId,element,numbering){if(null!=styleId){var levelByStyleId=numbering.findLevelByParagraphStyleId(styleId);if(null!=levelByStyleId)return levelByStyleId}var level=element.firstOrEmpty("w:ilvl").attributes["w:val"],numId=element.firstOrEmpty("w:numId").attributes["w:val"];return void 0===level||void 0===numId?null:numbering.findLevel(numId,level)}function emptyResultWithMessages(messages){return new ReadResult(null,null,messages)}function emptyResult(){return new ReadResult(null)}function elementResult(element){return new ReadResult(element)}function elementResultWithMessages(element,messages){return new ReadResult(element,null,messages)}function ReadResult(element,extra,messages){this.value=element||[],this.extra=extra||[],this._result=new Result({element:this.value,extra:extra},messages),this.messages=this._result.messages}function combineResults(results){var result=Result.combine(_.pluck(results,"_result"));return new ReadResult(_.flatten(_.pluck(result.value,"element")),_.filter(_.flatten(_.pluck(result.value,"extra")),identity),result.messages)}function joinElements(first,second){return _.flatten([first,second])}function identity(value){return value}exports.createBodyReader=createBodyReader,exports._readNumberingProperties=readNumberingProperties;var dingbatToUnicode=require("dingbat-to-unicode"),_=require("underscore"),documents=require("../documents"),Result=require("../results").Result,warning=require("../results").warning,uris=require("./uris"),supportedImageTypes={"image/png":!0,"image/gif":!0,"image/jpeg":!0,"image/svg+xml":!0,"image/tiff":!0},ignoreElements={"office-word:wrap":!0,"v:shadow":!0,"v:shapetype":!0,"w:annotationRef":!0,"w:bookmarkEnd":!0,"w:sectPr":!0,"w:proofErr":!0,"w:lastRenderedPageBreak":!0,"w:commentRangeStart":!0,"w:commentRangeEnd":!0,"w:del":!0,"w:footnoteRef":!0,"w:endnoteRef":!0,"w:pPr":!0,"w:rPr":!0,"w:tblPr":!0,"w:tblGrid":!0,"w:trPr":!0,"w:tcPr":!0};ReadResult.prototype.toExtra=function(){return new ReadResult(null,joinElements(this.extra,this.value),this.messages)},ReadResult.prototype.insertExtra=function(){var extra=this.extra;return extra&&extra.length?new ReadResult(joinElements(this.value,extra),null,this.messages):this},ReadResult.prototype.map=function(func){var result=this._result.map(function(value){return func(value.element)});return new ReadResult(result.value,this.extra,result.messages)},ReadResult.prototype.flatMap=function(func){var result=this._result.flatMap(function(value){return func(value.element)._result});return new ReadResult(result.value.element,joinElements(this.extra,result.value.extra),result.messages)},ReadResult.map=function(first,second,func){return new ReadResult(func(first.value,second.value),joinElements(first.extra,second.extra),first.messages.concat(second.messages))}},{"../documents":4,"../results":25,"./uris":16,"dingbat-to-unicode":85,underscore:103}],6:[function(require,module,exports){function createCommentsReader(bodyReader){function readCommentsXml(element){ +return Result.combine(element.getElementsByTagName("w:comment").map(readCommentElement))}function readCommentElement(element){function readOptionalAttribute(name){return(element.attributes[name]||"").trim()||null}var id=element.attributes["w:id"];return bodyReader.readXmlElements(element.children).map(function(body){return documents.comment({commentId:id,body:body,authorName:readOptionalAttribute("w:author"),authorInitials:readOptionalAttribute("w:initials")})})}return readCommentsXml}var documents=require("../documents"),Result=require("../results").Result;exports.createCommentsReader=createCommentsReader},{"../documents":4,"../results":25}],7:[function(require,module,exports){function readContentTypesFromXml(element){var extensionDefaults={},overrides={};return element.children.forEach(function(child){if("content-types:Default"===child.name&&(extensionDefaults[child.attributes.Extension]=child.attributes.ContentType),"content-types:Override"===child.name){var name=child.attributes.PartName;"/"===name.charAt(0)&&(name=name.substring(1)),overrides[name]=child.attributes.ContentType}}),contentTypes(overrides,extensionDefaults)}function contentTypes(overrides,extensionDefaults){return{findContentType:function(path){var overrideContentType=overrides[path];if(overrideContentType)return overrideContentType;var pathParts=path.split("."),extension=pathParts[pathParts.length-1];if(extensionDefaults.hasOwnProperty(extension))return extensionDefaults[extension];var fallback=fallbackContentTypes[extension.toLowerCase()];return fallback?"image/"+fallback:null}}}exports.readContentTypesFromXml=readContentTypesFromXml;var fallbackContentTypes={png:"png",gif:"gif",jpeg:"jpeg",jpg:"jpeg",tif:"tiff",tiff:"tiff",bmp:"bmp"};exports.defaultContentTypes=contentTypes({},{})},{}],8:[function(require,module,exports){function DocumentXmlReader(options){function convertXmlToDocument(element){var body=element.first("w:body"),result=bodyReader.readXmlElements(body.children).map(function(children){return new documents.Document(children,{notes:options.notes,comments:options.comments})});return new Result(result.value,result.messages)}var bodyReader=options.bodyReader;return{convertXmlToDocument:convertXmlToDocument}}exports.DocumentXmlReader=DocumentXmlReader;var documents=require("../documents"),Result=require("../results").Result},{"../documents":4,"../results":25}],9:[function(require,module,exports){function read(docxFile,input){return input=input||{},promises.props({contentTypes:readContentTypesFromZipFile(docxFile),partPaths:findPartPaths(docxFile),docxFile:docxFile,files:new Files(input.path?path.dirname(input.path):null)}).also(function(result){return{styles:readStylesFromZipFile(docxFile,result.partPaths.styles)}}).also(function(result){return{numbering:readNumberingFromZipFile(docxFile,result.partPaths.numbering,result.styles)}}).also(function(result){return{footnotes:readXmlFileWithBody(result.partPaths.footnotes,result,function(bodyReader,xml){return xml?notesReader.createFootnotesReader(bodyReader)(xml):new Result([])}),endnotes:readXmlFileWithBody(result.partPaths.endnotes,result,function(bodyReader,xml){return xml?notesReader.createEndnotesReader(bodyReader)(xml):new Result([])}),comments:readXmlFileWithBody(result.partPaths.comments,result,function(bodyReader,xml){return xml?commentsReader.createCommentsReader(bodyReader)(xml):new Result([])})}}).also(function(result){return{notes:result.footnotes.flatMap(function(footnotes){return result.endnotes.map(function(endnotes){return new documents.Notes(footnotes.concat(endnotes))})})}}).then(function(result){return readXmlFileWithBody(result.partPaths.mainDocument,result,function(bodyReader,xml){return result.notes.flatMap(function(notes){return result.comments.flatMap(function(comments){var reader=new DocumentXmlReader({bodyReader:bodyReader,notes:notes,comments:comments});return reader.convertXmlToDocument(xml)})})})})}function findPartPaths(docxFile){return readPackageRelationships(docxFile).then(function(packageRelationships){var mainDocumentPath=findPartPath({docxFile:docxFile,relationships:packageRelationships,relationshipType:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",basePath:"",fallbackPath:"word/document.xml"});if(!docxFile.exists(mainDocumentPath))throw new Error("Could not find main document part. Are you sure this is a valid .docx file?");return xmlFileReader({filename:relationshipsFilename(mainDocumentPath),readElement:relationshipsReader.readRelationships,defaultValue:relationshipsReader.defaultValue})(docxFile).then(function(documentRelationships){function findPartRelatedToMainDocument(name){return findPartPath({docxFile:docxFile,relationships:documentRelationships,relationshipType:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/"+name,basePath:zipfile.splitPath(mainDocumentPath).dirname,fallbackPath:"word/"+name+".xml"})}return{mainDocument:mainDocumentPath,comments:findPartRelatedToMainDocument("comments"),endnotes:findPartRelatedToMainDocument("endnotes"),footnotes:findPartRelatedToMainDocument("footnotes"),numbering:findPartRelatedToMainDocument("numbering"),styles:findPartRelatedToMainDocument("styles")}})})}function findPartPath(options){var docxFile=options.docxFile,relationships=options.relationships,relationshipType=options.relationshipType,basePath=options.basePath,fallbackPath=options.fallbackPath,targets=relationships.findTargetsByType(relationshipType),normalisedTargets=targets.map(function(target){return stripPrefix(zipfile.joinPath(basePath,target),"/")}),validTargets=normalisedTargets.filter(function(target){return docxFile.exists(target)});return 0===validTargets.length?fallbackPath:validTargets[0]}function stripPrefix(value,prefix){return value.substring(0,prefix.length)===prefix?value.substring(prefix.length):value}function xmlFileReader(options){return function(zipFile){return readXmlFromZipFile(zipFile,options.filename).then(function(element){return element?options.readElement(element):options.defaultValue})}}function readXmlFileWithBody(filename,options,func){var readRelationshipsFromZipFile=xmlFileReader({filename:relationshipsFilename(filename),readElement:relationshipsReader.readRelationships,defaultValue:relationshipsReader.defaultValue});return readRelationshipsFromZipFile(options.docxFile).then(function(relationships){var bodyReader=new createBodyReader({relationships:relationships,contentTypes:options.contentTypes,docxFile:options.docxFile,numbering:options.numbering,styles:options.styles,files:options.files});return readXmlFromZipFile(options.docxFile,filename).then(function(xml){return func(bodyReader,xml)})})}function relationshipsFilename(filename){var split=zipfile.splitPath(filename);return zipfile.joinPath(split.dirname,"_rels",split.basename+".rels")}function readNumberingFromZipFile(zipFile,path,styles){return xmlFileReader({filename:path,readElement:function(element){return numberingXml.readNumberingXml(element,{styles:styles})},defaultValue:numberingXml.defaultNumbering})(zipFile)}function readStylesFromZipFile(zipFile,path){return xmlFileReader({filename:path,readElement:stylesReader.readStylesXml,defaultValue:stylesReader.defaultStyles})(zipFile)}exports.read=read,exports._findPartPaths=findPartPaths;var path=require("path"),promises=require("../promises"),documents=require("../documents"),Result=require("../results").Result,zipfile=require("../zipfile"),readXmlFromZipFile=require("./office-xml-reader").readXmlFromZipFile,createBodyReader=require("./body-reader").createBodyReader,DocumentXmlReader=require("./document-xml-reader").DocumentXmlReader,relationshipsReader=require("./relationships-reader"),contentTypesReader=require("./content-types-reader"),numberingXml=require("./numbering-xml"),stylesReader=require("./styles-reader"),notesReader=require("./notes-reader"),commentsReader=require("./comments-reader"),Files=require("./files").Files,readContentTypesFromZipFile=xmlFileReader({filename:"[Content_Types].xml",readElement:contentTypesReader.readContentTypesFromXml,defaultValue:contentTypesReader.defaultContentTypes}),readPackageRelationships=xmlFileReader({filename:"_rels/.rels",readElement:relationshipsReader.readRelationships,defaultValue:relationshipsReader.defaultValue})},{"../documents":4,"../promises":23,"../results":25,"../zipfile":40,"./body-reader":5,"./comments-reader":6,"./content-types-reader":7,"./document-xml-reader":8,"./files":1,"./notes-reader":10,"./numbering-xml":11,"./office-xml-reader":12,"./relationships-reader":13,"./styles-reader":15,path:101}],10:[function(require,module,exports){function createReader(noteType,bodyReader){function readNotesXml(element){return Result.combine(element.getElementsByTagName("w:"+noteType).filter(isFootnoteElement).map(readFootnoteElement))}function isFootnoteElement(element){var type=element.attributes["w:type"];return"continuationSeparator"!==type&&"separator"!==type}function readFootnoteElement(footnoteElement){var id=footnoteElement.attributes["w:id"];return bodyReader.readXmlElements(footnoteElement.children).map(function(body){return documents.Note({noteType:noteType,noteId:id,body:body})})}return readNotesXml}var documents=require("../documents"),Result=require("../results").Result;exports.createFootnotesReader=createReader.bind(this,"footnote"),exports.createEndnotesReader=createReader.bind(this,"endnote")},{"../documents":4,"../results":25}],11:[function(require,module,exports){function Numbering(nums,abstractNums,styles){function findLevel(numId,level){var num=nums[numId];if(num){var abstractNum=abstractNums[num.abstractNumId];if(abstractNum){if(null==abstractNum.numStyleLink)return abstractNums[num.abstractNumId].levels[level];var style=styles.findNumberingStyleById(abstractNum.numStyleLink);return findLevel(style.numId,level)}return null}return null}function findLevelByParagraphStyleId(styleId){return levelsByParagraphStyleId[styleId]||null}var allLevels=_.flatten(_.values(abstractNums).map(function(abstractNum){return _.values(abstractNum.levels)})),levelsByParagraphStyleId=_.indexBy(allLevels.filter(function(level){return null!=level.paragraphStyleId}),"paragraphStyleId");return{findLevel:findLevel,findLevelByParagraphStyleId:findLevelByParagraphStyleId}}function readNumberingXml(root,options){if(!options||!options.styles)throw new Error("styles is missing");var abstractNums=readAbstractNums(root),nums=readNums(root,abstractNums);return new Numbering(nums,abstractNums,options.styles)}function readAbstractNums(root){var abstractNums={};return root.getElementsByTagName("w:abstractNum").forEach(function(element){var id=element.attributes["w:abstractNumId"];abstractNums[id]=readAbstractNum(element)}),abstractNums}function readAbstractNum(element){var levels={};element.getElementsByTagName("w:lvl").forEach(function(levelElement){var levelIndex=levelElement.attributes["w:ilvl"],numFmt=levelElement.first("w:numFmt").attributes["w:val"],paragraphStyleId=levelElement.firstOrEmpty("w:pStyle").attributes["w:val"];levels[levelIndex]={isOrdered:"bullet"!==numFmt,level:levelIndex,paragraphStyleId:paragraphStyleId}});var numStyleLink=element.firstOrEmpty("w:numStyleLink").attributes["w:val"];return{levels:levels,numStyleLink:numStyleLink}}function readNums(root){var nums={};return root.getElementsByTagName("w:num").forEach(function(element){var numId=element.attributes["w:numId"],abstractNumId=element.first("w:abstractNumId").attributes["w:val"];nums[numId]={abstractNumId:abstractNumId}}),nums}var _=require("underscore");exports.readNumberingXml=readNumberingXml,exports.Numbering=Numbering,exports.defaultNumbering=new Numbering({},{})},{underscore:103}],12:[function(require,module,exports){function read(xmlString){return xml.readString(xmlString,xmlNamespaceMap).then(function(document){return collapseAlternateContent(document)[0]})}function readXmlFromZipFile(docxFile,path){return docxFile.exists(path)?docxFile.read(path,"utf-8").then(stripUtf8Bom).then(read):promises.resolve(null)}function stripUtf8Bom(xmlString){return xmlString.replace(/^\uFEFF/g,"")}function collapseAlternateContent(node){return"element"===node.type?"mc:AlternateContent"===node.name?node.first("mc:Fallback").children:(node.children=_.flatten(node.children.map(collapseAlternateContent,!0)),[node]):[node]}var _=require("underscore"),promises=require("../promises"),xml=require("../xml");exports.read=read,exports.readXmlFromZipFile=readXmlFromZipFile;var xmlNamespaceMap={"http://schemas.openxmlformats.org/wordprocessingml/2006/main":"w","http://schemas.openxmlformats.org/officeDocument/2006/relationships":"r","http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing":"wp","http://schemas.openxmlformats.org/drawingml/2006/main":"a","http://schemas.openxmlformats.org/drawingml/2006/picture":"pic","http://schemas.openxmlformats.org/package/2006/content-types":"content-types","urn:schemas-microsoft-com:vml":"v","http://schemas.openxmlformats.org/markup-compatibility/2006":"mc","urn:schemas-microsoft-com:office:word":"office-word"}},{"../promises":23,"../xml":35,underscore:103}],13:[function(require,module,exports){function readRelationships(element){var relationships=[];return element.children.forEach(function(child){if("{http://schemas.openxmlformats.org/package/2006/relationships}Relationship"===child.name){var relationship={relationshipId:child.attributes.Id,target:child.attributes.Target,type:child.attributes.Type};relationships.push(relationship)}}),new Relationships(relationships)}function Relationships(relationships){var targetsByRelationshipId={};relationships.forEach(function(relationship){targetsByRelationshipId[relationship.relationshipId]=relationship.target});var targetsByType={};return relationships.forEach(function(relationship){targetsByType[relationship.type]||(targetsByType[relationship.type]=[]),targetsByType[relationship.type].push(relationship.target)}),{findTargetByRelationshipId:function(relationshipId){return targetsByRelationshipId[relationshipId]},findTargetsByType:function(type){return targetsByType[type]||[]}}}exports.readRelationships=readRelationships,exports.defaultValue=new Relationships([]),exports.Relationships=Relationships},{}],14:[function(require,module,exports){function writeStyleMap(docxFile,styleMap){return docxFile.write(styleMapPath,styleMap),updateRelationships(docxFile).then(function(){return updateContentTypes(docxFile)})}function updateRelationships(docxFile){var path="word/_rels/document.xml.rels",relationshipsUri="http://schemas.openxmlformats.org/package/2006/relationships",relationshipElementName="{"+relationshipsUri+"}Relationship";return docxFile.read(path,"utf8").then(xml.readString).then(function(relationshipsContainer){var relationships=relationshipsContainer.children;addOrUpdateElement(relationships,relationshipElementName,"Id",{Id:"rMammothStyleMap",Type:schema,Target:styleMapAbsolutePath});var namespaces={"":relationshipsUri};return docxFile.write(path,xml.writeString(relationshipsContainer,namespaces))})}function updateContentTypes(docxFile){var path="[Content_Types].xml",contentTypesUri="http://schemas.openxmlformats.org/package/2006/content-types",overrideName="{"+contentTypesUri+"}Override";return docxFile.read(path,"utf8").then(xml.readString).then(function(typesElement){var children=typesElement.children;addOrUpdateElement(children,overrideName,"PartName",{PartName:styleMapAbsolutePath,ContentType:"text/prs.mammoth.style-map"});var namespaces={"":contentTypesUri};return docxFile.write(path,xml.writeString(typesElement,namespaces))})}function addOrUpdateElement(elements,name,identifyingAttribute,attributes){var existingElement=_.find(elements,function(element){return element.name===name&&element.attributes[identifyingAttribute]===attributes[identifyingAttribute]});existingElement?existingElement.attributes=attributes:elements.push(xml.element(name,attributes))}function readStyleMap(docxFile){return docxFile.exists(styleMapPath)?docxFile.read(styleMapPath,"utf8"):promises.resolve(null)}var _=require("underscore"),promises=require("../promises"),xml=require("../xml");exports.writeStyleMap=writeStyleMap,exports.readStyleMap=readStyleMap;var schema="http://schemas.zwobble.org/mammoth/style-map",styleMapPath="mammoth/style-map",styleMapAbsolutePath="/"+styleMapPath},{"../promises":23,"../xml":35,underscore:103}],15:[function(require,module,exports){function Styles(paragraphStyles,characterStyles,tableStyles,numberingStyles){return{findParagraphStyleById:function(styleId){return paragraphStyles[styleId]},findCharacterStyleById:function(styleId){return characterStyles[styleId]},findTableStyleById:function(styleId){return tableStyles[styleId]},findNumberingStyleById:function(styleId){return numberingStyles[styleId]}}}function readStylesXml(root){var paragraphStyles={},characterStyles={},tableStyles={},numberingStyles={},styles={paragraph:paragraphStyles,character:characterStyles,table:tableStyles};return root.getElementsByTagName("w:style").forEach(function(styleElement){var style=readStyleElement(styleElement);if("numbering"===style.type)numberingStyles[style.styleId]=readNumberingStyleElement(styleElement);else{var styleSet=styles[style.type];styleSet&&(styleSet[style.styleId]=style)}}),new Styles(paragraphStyles,characterStyles,tableStyles,numberingStyles)}function readStyleElement(styleElement){var type=styleElement.attributes["w:type"],styleId=styleElement.attributes["w:styleId"],name=styleName(styleElement);return{type:type,styleId:styleId,name:name}}function styleName(styleElement){var nameElement=styleElement.first("w:name");return nameElement?nameElement.attributes["w:val"]:null}function readNumberingStyleElement(styleElement){var numId=styleElement.firstOrEmpty("w:pPr").firstOrEmpty("w:numPr").firstOrEmpty("w:numId").attributes["w:val"];return{numId:numId}}exports.readStylesXml=readStylesXml,exports.Styles=Styles,exports.defaultStyles=new Styles({},{}),Styles.EMPTY=new Styles({},{},{},{})},{}],16:[function(require,module,exports){function uriToZipEntryName(base,uri){return"/"===uri.charAt(0)?uri.substr(1):base+"/"+uri}function replaceFragment(uri,fragment){var hashIndex=uri.indexOf("#");return-1!==hashIndex&&(uri=uri.substring(0,hashIndex)),uri+"#"+fragment}exports.uriToZipEntryName=uriToZipEntryName,exports.replaceFragment=replaceFragment},{}],17:[function(require,module,exports){function nonFreshElement(tagName,attributes,children){return elementWithTag(htmlPaths.element(tagName,attributes,{fresh:!1}),children)}function freshElement(tagName,attributes,children){var tag=htmlPaths.element(tagName,attributes,{fresh:!0});return elementWithTag(tag,children)}function elementWithTag(tag,children){return{type:"element",tag:tag,children:children||[]}}function text(value){return{type:"text",value:value}}function isVoidElement(node){return 0===node.children.length&&voidTagNames[node.tag.tagName]}var htmlPaths=require("../styles/html-paths"),forceWrite={type:"forceWrite"};exports.freshElement=freshElement,exports.nonFreshElement=nonFreshElement,exports.elementWithTag=elementWithTag,exports.text=text,exports.forceWrite=forceWrite;var voidTagNames={br:!0,hr:!0,img:!0};exports.isVoidElement=isVoidElement},{"../styles/html-paths":28}],18:[function(require,module,exports){function write(writer,nodes){nodes.forEach(function(node){writeNode(writer,node)})}function writeNode(writer,node){toStrings[node.type](writer,node)}function generateElementString(writer,node){ast.isVoidElement(node)?writer.selfClosing(node.tag.tagName,node.tag.attributes):(writer.open(node.tag.tagName,node.tag.attributes),write(writer,node.children),writer.close(node.tag.tagName))}function generateTextString(writer,node){writer.text(node.value)}var ast=require("./ast");exports.freshElement=ast.freshElement,exports.nonFreshElement=ast.nonFreshElement,exports.elementWithTag=ast.elementWithTag,exports.text=ast.text,exports.forceWrite=ast.forceWrite,exports.simplify=require("./simplify");var toStrings={element:generateElementString,text:generateTextString,forceWrite:function(){}};exports.write=write},{"./ast":17,"./simplify":19}],19:[function(require,module,exports){function simplify(nodes){return collapse(removeEmpty(nodes))}function collapse(nodes){var children=[];return nodes.map(collapseNode).forEach(function(child){appendChild(children,child)}),children}function collapseNode(node){return collapsers[node.type](node)}function collapseElement(node){return ast.elementWithTag(node.tag,collapse(node.children))}function identity(value){return value}function appendChild(children,child){var lastChild=children[children.length-1];"element"===child.type&&!child.tag.fresh&&lastChild&&"element"===lastChild.type&&child.tag.matchesElement(lastChild.tag)?(child.tag.separator&&appendChild(lastChild.children,ast.text(child.tag.separator)),child.children.forEach(function(grandChild){appendChild(lastChild.children,grandChild)})):children.push(child)}function removeEmpty(nodes){return flatMap(nodes,function(node){return emptiers[node.type](node)})}function flatMap(values,func){return _.flatten(_.map(values,func),!0)}function neverEmpty(node){return[node]}function elementEmptier(element){var children=removeEmpty(element.children);return 0!==children.length||ast.isVoidElement(element)?[ast.elementWithTag(element.tag,children)]:[]}function textEmptier(node){return 0===node.value.length?[]:[node]}var _=require("underscore"),ast=require("./ast"),collapsers={element:collapseElement,text:identity,forceWrite:identity},emptiers={element:elementEmptier,text:textEmptier,forceWrite:neverEmpty};module.exports=simplify},{"./ast":17,underscore:103}],20:[function(require,module,exports){function imgElement(func){return function(element,messages){return promises.when(func(element)).then(function(result){var attributes={};return element.altText&&(attributes.alt=element.altText),_.extend(attributes,result),[Html.freshElement("img",attributes)]})}}var _=require("underscore"),promises=require("./promises"),Html=require("./html");exports.imgElement=imgElement,exports.inline=exports.imgElement,exports.dataUri=imgElement(function(element){return element.readAsBase64String().then(function(imageBuffer){return{src:"data:"+element.contentType+";base64,"+imageBuffer}})})},{"./html":18,"./promises":23,underscore:103}],21:[function(require,module,exports){(function(Buffer){function convertToHtml(input,options){return convert(input,options)}function convertToMarkdown(input,options){var markdownOptions=Object.create(options||{});return markdownOptions.outputFormat="markdown",convert(input,markdownOptions)}function convert(input,options){return options=readOptions(options),unzip.openZip(input).tap(function(docxFile){return docxStyleMap.readStyleMap(docxFile).then(function(styleMap){options.embeddedStyleMap=styleMap})}).then(function(docxFile){return docxReader.read(docxFile,input).then(function(documentResult){return documentResult.map(options.transformDocument)}).then(function(documentResult){return convertDocumentToHtml(documentResult,options)})})}function readEmbeddedStyleMap(input){return unzip.openZip(input).then(docxStyleMap.readStyleMap)}function convertDocumentToHtml(documentResult,options){var styleMapResult=parseStyleMap(options.readStyleMap()),parsedOptions=_.extend({},options,{styleMap:styleMapResult.value}),documentConverter=new DocumentConverter(parsedOptions);return documentResult.flatMapThen(function(document){return styleMapResult.flatMapThen(function(styleMap){return documentConverter.convertToHtml(document)})})}function parseStyleMap(styleMap){return Result.combine((styleMap||[]).map(readStyle)).map(function(styleMap){return styleMap.filter(function(styleMapping){return!!styleMapping})})}function extractRawText(input){return unzip.openZip(input).then(docxReader.read).then(function(documentResult){return documentResult.map(convertElementToRawText)})}function embedStyleMap(input,styleMap){return unzip.openZip(input).tap(function(docxFile){return docxStyleMap.writeStyleMap(docxFile,styleMap)}).then(function(docxFile){return docxFile.toArrayBuffer()}).then(function(arrayBuffer){return{toArrayBuffer:function(){return arrayBuffer},toBuffer:function(){return Buffer.from(arrayBuffer)}}})}var _=require("underscore"),docxReader=require("./docx/docx-reader"),docxStyleMap=require("./docx/style-map"),DocumentConverter=require("./document-to-html").DocumentConverter,convertElementToRawText=require("./raw-text").convertElementToRawText,readStyle=require("./style-reader").readStyle,readOptions=require("./options-reader").readOptions,unzip=require("./unzip"),Result=require("./results").Result;exports.convertToHtml=convertToHtml,exports.convertToMarkdown=convertToMarkdown,exports.convert=convert,exports.extractRawText=extractRawText,exports.images=require("./images"),exports.transforms=require("./transforms"),exports.underline=require("./underline"),exports.embedStyleMap=embedStyleMap,exports.readEmbeddedStyleMap=readEmbeddedStyleMap,exports.styleMapping=function(){throw new Error("Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name='Title'] => h1\" instead of mammoth.styleMapping(\"p[style-name='Title'] => h1\")")}}).call(this,require("buffer").Buffer)},{"./document-to-html":3,"./docx/docx-reader":9,"./docx/style-map":14,"./images":20,"./options-reader":22,"./raw-text":24,"./results":25,"./style-reader":26,"./transforms":30,"./underline":31,"./unzip":2,buffer:83,underscore:103}],22:[function(require,module,exports){function readOptions(options){return options=options||{},_.extend({},standardOptions,options,{customStyleMap:readStyleMap(options.styleMap),readStyleMap:function(){var styleMap=this.customStyleMap;return this.includeEmbeddedStyleMap&&(styleMap=styleMap.concat(readStyleMap(this.embeddedStyleMap))),this.includeDefaultStyleMap&&(styleMap=styleMap.concat(defaultStyleMap)),styleMap}})}function readStyleMap(styleMap){return styleMap?_.isString(styleMap)?styleMap.split("\n").map(function(line){return line.trim()}).filter(function(line){return""!==line&&"#"!==line.charAt(0)}):styleMap:[]}function identity(value){return value}exports.readOptions=readOptions;var _=require("underscore"),defaultStyleMap=exports._defaultStyleMap=["p.Heading1 => h1:fresh","p.Heading2 => h2:fresh","p.Heading3 => h3:fresh","p.Heading4 => h4:fresh","p.Heading5 => h5:fresh","p.Heading6 => h6:fresh","p[style-name='Heading 1'] => h1:fresh","p[style-name='Heading 2'] => h2:fresh","p[style-name='Heading 3'] => h3:fresh","p[style-name='Heading 4'] => h4:fresh","p[style-name='Heading 5'] => h5:fresh","p[style-name='Heading 6'] => h6:fresh","p[style-name='heading 1'] => h1:fresh","p[style-name='heading 2'] => h2:fresh","p[style-name='heading 3'] => h3:fresh","p[style-name='heading 4'] => h4:fresh","p[style-name='heading 5'] => h5:fresh","p[style-name='heading 6'] => h6:fresh","r[style-name='Strong'] => strong","p[style-name='footnote text'] => p:fresh","r[style-name='footnote reference'] =>","p[style-name='endnote text'] => p:fresh","r[style-name='endnote reference'] =>","p[style-name='annotation text'] => p:fresh","r[style-name='annotation reference'] =>","p[style-name='Footnote'] => p:fresh","r[style-name='Footnote anchor'] =>","p[style-name='Endnote'] => p:fresh","r[style-name='Endnote anchor'] =>","p:unordered-list(1) => ul > li:fresh","p:unordered-list(2) => ul|ol > li > ul > li:fresh","p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh","p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh","p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh","p:ordered-list(1) => ol > li:fresh","p:ordered-list(2) => ul|ol > li > ol > li:fresh","p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh","p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh","p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh","r[style-name='Hyperlink'] =>","p[style-name='Normal'] => p:fresh"],standardOptions=exports._standardOptions={transformDocument:identity,includeDefaultStyleMap:!0,includeEmbeddedStyleMap:!0}},{underscore:103}],23:[function(require,module,exports){function defer(){var resolve,reject,promise=new bluebird.Promise(function(resolveArg,rejectArg){resolve=resolveArg,reject=rejectArg});return{resolve:resolve,reject:reject,promise:promise}}var _=require("underscore"),bluebird=require("bluebird/js/release/promise")();exports.defer=defer,exports.when=bluebird.resolve,exports.resolve=bluebird.resolve,exports.all=bluebird.all,exports.props=bluebird.props,exports.reject=bluebird.reject,exports.promisify=bluebird.promisify,exports.mapSeries=bluebird.mapSeries,exports.attempt=bluebird.attempt,exports.nfcall=function(func){var args=Array.prototype.slice.call(arguments,1),promisedFunc=bluebird.promisify(func);return promisedFunc.apply(null,args)},bluebird.prototype.fail=bluebird.prototype.caught,bluebird.prototype.also=function(func){return this.then(function(value){var returnValue=_.extend({},value,func(value));return bluebird.props(returnValue)})}},{"bluebird/js/release/promise":68,underscore:103}],24:[function(require,module,exports){function convertElementToRawText(element){if("text"===element.type)return element.value;if(element.type===documents.types.tab)return" ";var tail="paragraph"===element.type?"\n\n":"";return(element.children||[]).map(convertElementToRawText).join("")+tail}var documents=require("./documents");exports.convertElementToRawText=convertElementToRawText},{"./documents":4}],25:[function(require,module,exports){function Result(value,messages){this.value=value,this.messages=messages||[]}function success(value){return new Result(value,[])}function warning(message){return{type:"warning",message:message}}function error(exception){return{type:"error",message:exception.message,error:exception}}function combineMessages(results){var messages=[];return _.flatten(_.pluck(results,"messages"),!0).forEach(function(message){containsMessage(messages,message)||messages.push(message)}),messages}function containsMessage(messages,message){return void 0!==_.find(messages,isSameMessage.bind(null,message))}function isSameMessage(first,second){return first.type===second.type&&first.message===second.message}var _=require("underscore");exports.Result=Result,exports.success=success,exports.warning=warning,exports.error=error,Result.prototype.map=function(func){return new Result(func(this.value),this.messages)},Result.prototype.flatMap=function(func){var funcResult=func(this.value);return new Result(funcResult.value,combineMessages([this,funcResult]))},Result.prototype.flatMapThen=function(func){var that=this;return func(this.value).then(function(otherResult){return new Result(otherResult.value,combineMessages([that,otherResult]))})},Result.combine=function(results){var values=_.flatten(_.pluck(results,"value")),messages=combineMessages(results);return new Result(values,messages)}},{underscore:103}],26:[function(require,module,exports){function readStyle(string){return parseString(styleRule,string)}function createStyleRule(){return lop.rules.sequence(lop.rules.sequence.capture(documentMatcherRule()),lop.rules.tokenOfType("whitespace"),lop.rules.tokenOfType("arrow"),lop.rules.sequence.capture(lop.rules.optional(lop.rules.sequence(lop.rules.tokenOfType("whitespace"),lop.rules.sequence.capture(htmlPathRule())).head())),lop.rules.tokenOfType("end")).map(function(documentMatcher,htmlPath){return{from:documentMatcher,to:htmlPath.valueOrElse(htmlPaths.empty)}})}function readDocumentMatcher(string){return parseString(documentMatcherRule(),string)}function documentMatcherRule(){function createMatcherSuffixesRule(rules){var matcherSuffix=lop.rules.firstOf.apply(lop.rules.firstOf,["matcher suffix"].concat(rules)),matcherSuffixes=lop.rules.zeroOrMore(matcherSuffix);return lop.rules.then(matcherSuffixes,function(suffixes){var matcherOptions={};return suffixes.forEach(function(suffix){_.extend(matcherOptions,suffix)}),matcherOptions})}var sequence=lop.rules.sequence,identifierToConstant=function(identifier,constant){ +return lop.rules.then(lop.rules.token("identifier",identifier),function(){return constant})},paragraphRule=identifierToConstant("p",documentMatchers.paragraph),runRule=identifierToConstant("r",documentMatchers.run),elementTypeRule=lop.rules.firstOf("p or r or table",paragraphRule,runRule),styleIdRule=lop.rules.then(classRule,function(styleId){return{styleId:styleId}}),styleNameMatcherRule=lop.rules.firstOf("style name matcher",lop.rules.then(lop.rules.sequence(lop.rules.tokenOfType("equals"),lop.rules.sequence.cut(),lop.rules.sequence.capture(stringRule)).head(),function(styleName){return{styleName:documentMatchers.equalTo(styleName)}}),lop.rules.then(lop.rules.sequence(lop.rules.tokenOfType("startsWith"),lop.rules.sequence.cut(),lop.rules.sequence.capture(stringRule)).head(),function(styleName){return{styleName:documentMatchers.startsWith(styleName)}})),styleNameRule=lop.rules.sequence(lop.rules.tokenOfType("open-square-bracket"),lop.rules.sequence.cut(),lop.rules.token("identifier","style-name"),lop.rules.sequence.capture(styleNameMatcherRule),lop.rules.tokenOfType("close-square-bracket")).head(),listTypeRule=lop.rules.firstOf("list type",identifierToConstant("ordered-list",{isOrdered:!0}),identifierToConstant("unordered-list",{isOrdered:!1})),listRule=sequence(lop.rules.tokenOfType("colon"),sequence.capture(listTypeRule),sequence.cut(),lop.rules.tokenOfType("open-paren"),sequence.capture(integerRule),lop.rules.tokenOfType("close-paren")).map(function(listType,levelNumber){return{list:{isOrdered:listType.isOrdered,levelIndex:levelNumber-1}}}),paragraphOrRun=sequence(sequence.capture(elementTypeRule),sequence.capture(createMatcherSuffixesRule([styleIdRule,styleNameRule,listRule]))).map(function(createMatcher,matcherOptions){return createMatcher(matcherOptions)}),table=sequence(lop.rules.token("identifier","table"),sequence.capture(createMatcherSuffixesRule([styleIdRule,styleNameRule]))).map(function(options){return documentMatchers.table(options)}),bold=identifierToConstant("b",documentMatchers.bold),italic=identifierToConstant("i",documentMatchers.italic),underline=identifierToConstant("u",documentMatchers.underline),strikethrough=identifierToConstant("strike",documentMatchers.strikethrough),allCaps=identifierToConstant("all-caps",documentMatchers.allCaps),smallCaps=identifierToConstant("small-caps",documentMatchers.smallCaps),commentReference=identifierToConstant("comment-reference",documentMatchers.commentReference),breakMatcher=sequence(lop.rules.token("identifier","br"),sequence.cut(),lop.rules.tokenOfType("open-square-bracket"),lop.rules.token("identifier","type"),lop.rules.tokenOfType("equals"),sequence.capture(stringRule),lop.rules.tokenOfType("close-square-bracket")).map(function(breakType){switch(breakType){case"line":return documentMatchers.lineBreak;case"page":return documentMatchers.pageBreak;case"column":return documentMatchers.columnBreak}});return lop.rules.firstOf("element type",paragraphOrRun,table,bold,italic,underline,strikethrough,allCaps,smallCaps,commentReference,breakMatcher)}function readHtmlPath(string){return parseString(htmlPathRule(),string)}function htmlPathRule(){var capture=lop.rules.sequence.capture,whitespaceRule=lop.rules.tokenOfType("whitespace"),freshRule=lop.rules.then(lop.rules.optional(lop.rules.sequence(lop.rules.tokenOfType("colon"),lop.rules.token("identifier","fresh"))),function(option){return option.map(function(){return!0}).valueOrElse(!1)}),separatorRule=lop.rules.then(lop.rules.optional(lop.rules.sequence(lop.rules.tokenOfType("colon"),lop.rules.token("identifier","separator"),lop.rules.tokenOfType("open-paren"),capture(stringRule),lop.rules.tokenOfType("close-paren")).head()),function(option){return option.valueOrElse("")}),tagNamesRule=lop.rules.oneOrMoreWithSeparator(identifierRule,lop.rules.tokenOfType("choice")),styleElementRule=lop.rules.sequence(capture(tagNamesRule),capture(lop.rules.zeroOrMore(classRule)),capture(freshRule),capture(separatorRule)).map(function(tagName,classNames,fresh,separator){var attributes={},options={};return classNames.length>0&&(attributes["class"]=classNames.join(" ")),fresh&&(options.fresh=!0),separator&&(options.separator=separator),htmlPaths.element(tagName,attributes,options)});return lop.rules.firstOf("html path",lop.rules.then(lop.rules.tokenOfType("bang"),function(){return htmlPaths.ignore}),lop.rules.then(lop.rules.zeroOrMoreWithSeparator(styleElementRule,lop.rules.sequence(whitespaceRule,lop.rules.tokenOfType("gt"),whitespaceRule)),htmlPaths.elements))}function decodeEscapeSequences(value){return value.replace(/\\(.)/g,function(match,code){return escapeSequences[code]||code})}function parseString(rule,string){var tokens=tokenise(string),parser=lop.Parser(),parseResult=parser.parseTokens(rule,tokens);return parseResult.isSuccess()?results.success(parseResult.value()):new results.Result(null,[results.warning(describeFailure(string,parseResult))])}function describeFailure(input,parseResult){return"Did not understand this style mapping, so ignored it: "+input+"\n"+parseResult.errors().map(describeError).join("\n")}function describeError(error){return"Error was at character number "+error.characterNumber()+": Expected "+error.expected+" but got "+error.actual}var _=require("underscore"),lop=require("lop"),documentMatchers=require("./styles/document-matchers"),htmlPaths=require("./styles/html-paths"),tokenise=require("./styles/parser/tokeniser").tokenise,results=require("./results");exports.readHtmlPath=readHtmlPath,exports.readDocumentMatcher=readDocumentMatcher,exports.readStyle=readStyle;var identifierRule=lop.rules.then(lop.rules.tokenOfType("identifier"),decodeEscapeSequences),integerRule=lop.rules.tokenOfType("integer"),stringRule=lop.rules.then(lop.rules.tokenOfType("string"),decodeEscapeSequences),escapeSequences={n:"\n",r:"\r",t:" "},classRule=lop.rules.sequence(lop.rules.tokenOfType("dot"),lop.rules.sequence.cut(),lop.rules.sequence.capture(identifierRule)).head(),styleRule=createStyleRule()},{"./results":25,"./styles/document-matchers":27,"./styles/html-paths":28,"./styles/parser/tokeniser":29,lop:89,underscore:103}],27:[function(require,module,exports){function paragraph(options){return new Matcher("paragraph",options)}function run(options){return new Matcher("run",options)}function table(options){return new Matcher("table",options)}function Matcher(elementType,options){options=options||{},this._elementType=elementType,this._styleId=options.styleId,this._styleName=options.styleName,options.list&&(this._listIndex=options.list.levelIndex,this._listIsOrdered=options.list.isOrdered)}function isList(element,levelIndex,isOrdered){return element.numbering&&element.numbering.level==levelIndex&&element.numbering.isOrdered==isOrdered}function equalTo(value){return{operator:operatorEqualTo,operand:value}}function startsWith(value){return{operator:operatorStartsWith,operand:value}}function operatorEqualTo(first,second){return first.toUpperCase()===second.toUpperCase()}function operatorStartsWith(first,second){return 0===second.toUpperCase().indexOf(first.toUpperCase())}exports.paragraph=paragraph,exports.run=run,exports.table=table,exports.bold=new Matcher("bold"),exports.italic=new Matcher("italic"),exports.underline=new Matcher("underline"),exports.strikethrough=new Matcher("strikethrough"),exports.allCaps=new Matcher("allCaps"),exports.smallCaps=new Matcher("smallCaps"),exports.commentReference=new Matcher("commentReference"),exports.lineBreak=new Matcher("break",{breakType:"line"}),exports.pageBreak=new Matcher("break",{breakType:"page"}),exports.columnBreak=new Matcher("break",{breakType:"column"}),exports.equalTo=equalTo,exports.startsWith=startsWith,Matcher.prototype.matches=function(element){return element.type===this._elementType&&(void 0===this._styleId||element.styleId===this._styleId)&&(void 0===this._styleName||element.styleName&&this._styleName.operator(this._styleName.operand,element.styleName))&&(void 0===this._listIndex||isList(element,this._listIndex,this._listIsOrdered))&&(void 0===this._breakType||this._breakType===element.breakType)}},{}],28:[function(require,module,exports){function topLevelElement(tagName,attributes){return elements([element(tagName,attributes,{fresh:!0})])}function elements(elementStyles){return new HtmlPath(elementStyles.map(function(elementStyle){return _.isString(elementStyle)?element(elementStyle):elementStyle}))}function HtmlPath(elements){this._elements=elements}function element(tagName,attributes,options){return options=options||{},new Element(tagName,attributes,options)}function Element(tagName,attributes,options){var tagNames={};_.isArray(tagName)?(tagName.forEach(function(tagName){tagNames[tagName]=!0}),tagName=tagName[0]):tagNames[tagName]=!0,this.tagName=tagName,this.tagNames=tagNames,this.attributes=attributes||{},this.fresh=options.fresh,this.separator=options.separator}var _=require("underscore"),html=require("../html");exports.topLevelElement=topLevelElement,exports.elements=elements,exports.element=element,HtmlPath.prototype.wrap=function(children){for(var result=children(),index=this._elements.length-1;index>=0;index--)result=this._elements[index].wrapNodes(result);return result},Element.prototype.matchesElement=function(element){return this.tagNames[element.tagName]&&_.isEqual(this.attributes||{},element.attributes||{})},Element.prototype.wrap=function(generateNodes){return this.wrapNodes(generateNodes())},Element.prototype.wrapNodes=function(nodes){return[html.elementWithTag(this,nodes)]},exports.empty=elements([]),exports.ignore={wrap:function(){return[]}}},{"../html":18,underscore:103}],29:[function(require,module,exports){function tokenise(string){var identifierCharacter="(?:[a-zA-Z\\-_]|\\\\.)",tokeniser=new RegexTokeniser([{name:"identifier",regex:new RegExp("("+identifierCharacter+"(?:"+identifierCharacter+"|[0-9])*)")},{name:"dot",regex:/\./},{name:"colon",regex:/:/},{name:"gt",regex:/>/},{name:"whitespace",regex:/\s+/},{name:"arrow",regex:/=>/},{name:"equals",regex:/=/},{name:"startsWith",regex:/\^=/},{name:"open-paren",regex:/\(/},{name:"close-paren",regex:/\)/},{name:"open-square-bracket",regex:/\[/},{name:"close-square-bracket",regex:/\]/},{name:"string",regex:new RegExp(stringPrefix+"'")},{name:"unterminated-string",regex:new RegExp(stringPrefix)},{name:"integer",regex:/([0-9]+)/},{name:"choice",regex:/\|/},{name:"bang",regex:/(!)/}]);return tokeniser.tokenise(string)}var lop=require("lop"),RegexTokeniser=lop.RegexTokeniser;exports.tokenise=tokenise;var stringPrefix="'((?:\\\\.|[^'])*)"},{lop:89}],30:[function(require,module,exports){function paragraph(transform){return elementsOfType("paragraph",transform)}function run(transform){return elementsOfType("run",transform)}function elementsOfType(elementType,transform){return elements(function(element){return element.type===elementType?transform(element):element})}function elements(transform){return function transformElement(element){if(element.children){var children=_.map(element.children,transformElement);element=_.extend(element,{children:children})}return transform(element)}}function getDescendantsOfType(element,type){return getDescendants(element).filter(function(descendant){return descendant.type===type})}function getDescendants(element){var descendants=[];return visitDescendants(element,function(descendant){descendants.push(descendant)}),descendants}function visitDescendants(element,visit){element.children&&element.children.forEach(function(child){visitDescendants(child,visit),visit(child)})}var _=require("underscore");exports.paragraph=paragraph,exports.run=run,exports._elements=elements,exports.getDescendantsOfType=getDescendantsOfType,exports.getDescendants=getDescendants},{underscore:103}],31:[function(require,module,exports){function element(name){return function(html){return Html.elementWithTag(htmlPaths.element(name),[html])}}var htmlPaths=require("./styles/html-paths"),Html=require("./html");exports.element=element},{"./html":18,"./styles/html-paths":28}],32:[function(require,module,exports){function writer(options){return options=options||{},options.prettyPrint?prettyWriter():simpleWriter()}function prettyWriter(){function open(tagName,attributes){indentedElements[tagName]&&indent(),stack.push(tagName),writer.open(tagName,attributes),indentedElements[tagName]&&indentationLevel++,start=!1}function close(tagName){indentedElements[tagName]&&(indentationLevel--,indent()),stack.pop(),writer.close(tagName)}function text(value){startText();var text=isInPre()?value:value.replace("\n","\n"+indentation);writer.text(text)}function selfClosing(tagName,attributes){indent(),writer.selfClosing(tagName,attributes)}function insideIndentedElement(){return 0===stack.length||indentedElements[stack[stack.length-1]]}function startText(){inText||(indent(),inText=!0)}function indent(){if(inText=!1,!start&&insideIndentedElement()&&!isInPre()){writer._append("\n");for(var i=0;indentationLevel>i;i++)writer._append(indentation)}}function isInPre(){return _.some(stack,function(tagName){return"pre"===tagName})}var indentationLevel=0,indentation=" ",stack=[],start=!0,inText=!1,writer=simpleWriter();return{asString:writer.asString,open:open,close:close,text:text,selfClosing:selfClosing}}function simpleWriter(){function open(tagName,attributes){var attributeString=generateAttributeString(attributes);fragments.push("<"+tagName+attributeString+">")}function close(tagName){fragments.push("")}function selfClosing(tagName,attributes){var attributeString=generateAttributeString(attributes);fragments.push("<"+tagName+attributeString+" />")}function generateAttributeString(attributes){return _.map(attributes,function(value,key){return" "+key+'="'+escapeHtmlAttribute(value)+'"'}).join("")}function text(value){fragments.push(escapeHtmlText(value))}function append(html){fragments.push(html)}function asString(){return fragments.join("")}var fragments=[];return{asString:asString,open:open,close:close,text:text,selfClosing:selfClosing,_append:append}}function escapeHtmlText(value){return value.replace(/&/g,"&").replace(//g,">")}function escapeHtmlAttribute(value){return value.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}var _=require("underscore");exports.writer=writer;var indentedElements={div:!0,p:!0,ul:!0,li:!0}},{underscore:103}],33:[function(require,module,exports){function writer(options){return options=options||{},"markdown"===options.outputFormat?markdownWriter.writer():htmlWriter.writer(options)}var htmlWriter=require("./html-writer"),markdownWriter=require("./markdown-writer");exports.writer=writer},{"./html-writer":32,"./markdown-writer":34}],34:[function(require,module,exports){function symmetricMarkdownElement(end){return markdownElement(end,end)}function markdownElement(start,end){return function(){return{start:start,end:end}}}function markdownLink(attributes){var href=attributes.href||"";return href?{start:"[",end:"]("+href+")",anchorPosition:"before"}:{}}function markdownImage(attributes){var src=attributes.src||"",altText=attributes.alt||"";return src||altText?{start:"!["+altText+"]("+src+")"}:{}}function markdownList(options){return function(attributes,list){return{start:list?"\n":"",end:list?"":"\n",list:{isOrdered:options.isOrdered,indent:list?list.indent+1:0,count:0}}}}function markdownListItem(attributes,list,listItem){list=list||{indent:0,isOrdered:!1,count:0},list.count++,listItem.hasClosed=!1;var bullet=list.isOrdered?list.count+".":"-",start=repeatString(" ",list.indent)+bullet+" ";return{start:start,end:function(){return listItem.hasClosed?void 0:(listItem.hasClosed=!0,"\n")}}}function repeatString(value,count){return new Array(count+1).join(value)}function markdownWriter(){function open(tagName,attributes){attributes=attributes||{};var createElement=htmlToMarkdown[tagName]||function(){return{}},element=createElement(attributes,list,listItem);elementStack.push({end:element.end,list:list}),element.list&&(list=element.list);var anchorBeforeStart="before"===element.anchorPosition;anchorBeforeStart&&writeAnchor(attributes),fragments.push(element.start||""),anchorBeforeStart||writeAnchor(attributes)}function writeAnchor(attributes){attributes.id&&fragments.push('')}function close(tagName){var element=elementStack.pop();list=element.list;var end=_.isFunction(element.end)?element.end():element.end;fragments.push(end||"")}function selfClosing(tagName,attributes){open(tagName,attributes),close(tagName)}function text(value){fragments.push(escapeMarkdown(value))}function asString(){return fragments.join("")}var fragments=[],elementStack=[],list=null,listItem={};return{asString:asString,open:open,close:close,text:text,selfClosing:selfClosing}}function escapeMarkdown(value){return value.replace(/\\/g,"\\\\").replace(/([\`\*_\{\}\[\]\(\)\#\+\-\.\!])/g,"\\$1")}var _=require("underscore"),htmlToMarkdown={p:markdownElement("","\n\n"),br:markdownElement(""," \n"),ul:markdownList({isOrdered:!1}),ol:markdownList({isOrdered:!0}),li:markdownListItem,strong:symmetricMarkdownElement("__"),em:symmetricMarkdownElement("*"),a:markdownLink,img:markdownImage};!function(){for(var i=1;6>=i;i++)htmlToMarkdown["h"+i]=markdownElement(repeatString("#",i)+" ","\n\n")}(),exports.writer=markdownWriter},{underscore:103}],35:[function(require,module,exports){var nodes=require("./nodes");exports.Element=nodes.Element,exports.element=nodes.element,exports.text=nodes.text,exports.readString=require("./reader").readString,exports.writeString=require("./writer").writeString},{"./nodes":36,"./reader":37,"./writer":38}],36:[function(require,module,exports){function Element(name,attributes,children){this.type="element",this.name=name,this.attributes=attributes||{},this.children=children||[]}function toElementList(array){return _.extend(array,elementListPrototype)}var _=require("underscore");exports.Element=Element,exports.element=function(name,attributes,children){return new Element(name,attributes,children)},exports.text=function(value){return{type:"text",value:value}};var emptyElement={first:function(){return null},firstOrEmpty:function(){return emptyElement},attributes:{}};Element.prototype.first=function(name){return _.find(this.children,function(child){return child.name===name})},Element.prototype.firstOrEmpty=function(name){return this.first(name)||emptyElement},Element.prototype.getElementsByTagName=function(name){var elements=_.filter(this.children,function(child){return child.name===name});return toElementList(elements)},Element.prototype.text=function(){if(0===this.children.length)return"";if(1!==this.children.length||"text"!==this.children[0].type)throw new Error("Not implemented");return this.children[0].value};var elementListPrototype={getElementsByTagName:function(name){return toElementList(_.flatten(this.map(function(element){return element.getElementsByTagName(name)},!0)))}}},{underscore:103}],37:[function(require,module,exports){function readString(xmlString,namespaceMap){function convertNode(node){switch(node.nodeType){case Node.ELEMENT_NODE:return convertElement(node);case Node.TEXT_NODE:return nodes.text(node.nodeValue)}}function convertElement(element){var convertedName=convertName(element),convertedChildren=[];_.forEach(element.childNodes,function(childNode){var convertedNode=convertNode(childNode);convertedNode&&convertedChildren.push(convertedNode)});var convertedAttributes={};return _.forEach(element.attributes,function(attribute){convertedAttributes[convertName(attribute)]=attribute.value}),new Element(convertedName,convertedAttributes,convertedChildren)}function convertName(node){if(node.namespaceURI){var prefix,mappedPrefix=namespaceMap[node.namespaceURI];return prefix=mappedPrefix?mappedPrefix+":":"{"+node.namespaceURI+"}",prefix+node.localName}return node.localName}namespaceMap=namespaceMap||{};try{var document=xmldom.parseFromString(xmlString,"text/xml")}catch(error){return promises.reject(error)}return"parsererror"===document.documentElement.tagName?promises.resolve(new Error(document.documentElement.textContent)):promises.resolve(convertNode(document.documentElement))}var promises=require("../promises"),_=require("underscore"),xmldom=require("./xmldom"),nodes=require("./nodes"),Element=nodes.Element;exports.readString=readString;var Node=xmldom.Node},{"../promises":23,"./nodes":36,"./xmldom":39,underscore:103}],38:[function(require,module,exports){function writeString(root,namespaces){function writeNode(builder,node){return nodeWriters[node.type](builder,node)}function writeElement(builder,element){var elementBuilder=builder.element(mapElementName(element.name),element.attributes);element.children.forEach(function(child){writeNode(elementBuilder,child)})}function mapElementName(name){var longFormMatch=/^\{(.*)\}(.*)$/.exec(name);if(longFormMatch){var prefix=uriToPrefix[longFormMatch[1]];return prefix+(""===prefix?"":":")+longFormMatch[2]}return name}function writeDocument(root){var builder=xmlbuilder.create(mapElementName(root.name),{version:"1.0",encoding:"UTF-8",standalone:!0});return _.forEach(namespaces,function(uri,prefix){var key="xmlns"+(""===prefix?"":":"+prefix);builder.attribute(key,uri)}),root.children.forEach(function(child){writeNode(builder,child)}),builder.end()}var uriToPrefix=_.invert(namespaces),nodeWriters={element:writeElement,text:writeTextNode};return writeDocument(root)}function writeTextNode(builder,node){builder.text(node.value)}var _=require("underscore"),xmlbuilder=require("xmlbuilder");exports.writeString=writeString},{underscore:103,xmlbuilder:128}],39:[function(require,module,exports){function parseFromString(string){var error=null,domParser=new xmldom.DOMParser({errorHandler:function(level,message){error={level:level,message:message}}}),document=domParser.parseFromString(string);if(null===error)return document;throw new Error(error.level+": "+error.message)}var xmldom=require("@xmldom/xmldom"),dom=require("@xmldom/xmldom/lib/dom");exports.parseFromString=parseFromString,exports.Node=dom.Node},{"@xmldom/xmldom":45,"@xmldom/xmldom/lib/dom":43}],40:[function(require,module,exports){function openArrayBuffer(arrayBuffer){return JSZip.loadAsync(arrayBuffer).then(function(zipFile){function exists(name){return null!==zipFile.file(name)}function read(name,encoding){return zipFile.file(name).async("uint8array").then(function(array){if("base64"===encoding)return base64js.fromByteArray(array);if(encoding){var decoder=new TextDecoder(encoding);return decoder.decode(array)}return array})}function write(name,contents){zipFile.file(name,contents)}function toArrayBuffer(){return zipFile.generateAsync({type:"arraybuffer"})}return{exists:exists,read:read,write:write,toArrayBuffer:toArrayBuffer}})}function splitPath(path){var lastIndex=path.lastIndexOf("/");return-1===lastIndex?{dirname:"",basename:path}:{dirname:path.substring(0,lastIndex),basename:path.substring(lastIndex+1)}}function joinPath(){var nonEmptyPaths=Array.prototype.filter.call(arguments,function(path){return path}),relevantPaths=[];return nonEmptyPaths.forEach(function(path){/^\//.test(path)?relevantPaths=[path]:relevantPaths.push(path)}),relevantPaths.join("/")}var base64js=require("base64-js"),JSZip=require("jszip");exports.openArrayBuffer=openArrayBuffer,exports.splitPath=splitPath,exports.joinPath=joinPath},{"base64-js":47,jszip:88}],41:[function(require,module,exports){"use strict";function find(list,predicate,ac){if(void 0===ac&&(ac=Array.prototype),list&&"function"==typeof ac.find)return ac.find.call(list,predicate);for(var i=0;i=start+length||start?new java.lang.String(chars,start,length)+"":chars}function appendElement(hander,node){hander.currentElement?hander.currentElement.appendChild(node):hander.doc.appendChild(node)}var conventions=require("./conventions"),dom=require("./dom"),entities=require("./entities"),sax=require("./sax"),DOMImplementation=dom.DOMImplementation,NAMESPACE=conventions.NAMESPACE,ParseError=sax.ParseError,XMLReader=sax.XMLReader;DOMParser.prototype.parseFromString=function(source,mimeType){var options=this.options,sax=new XMLReader,domBuilder=options.domBuilder||new DOMHandler,errorHandler=options.errorHandler,locator=options.locator,defaultNSMap=options.xmlns||{},isHTML=/\/x?html?$/.test(mimeType),entityMap=isHTML?entities.HTML_ENTITIES:entities.XML_ENTITIES;locator&&domBuilder.setDocumentLocator(locator),sax.errorHandler=buildErrorHandler(errorHandler,domBuilder,locator),sax.domBuilder=options.domBuilder||domBuilder,isHTML&&(defaultNSMap[""]=NAMESPACE.HTML),defaultNSMap.xml=defaultNSMap.xml||NAMESPACE.XML;var normalize=options.normalizeLineEndings||normalizeLineEndings;return source&&"string"==typeof source?sax.parse(normalize(source),defaultNSMap,entityMap):sax.errorHandler.error("invalid doc source"),domBuilder.doc},DOMHandler.prototype={startDocument:function(){this.doc=(new DOMImplementation).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(namespaceURI,localName,qName,attrs){var doc=this.doc,el=doc.createElementNS(namespaceURI,qName||localName),len=attrs.length;appendElement(this,el),this.currentElement=el,this.locator&&position(this.locator,el);for(var i=0;len>i;i++){var namespaceURI=attrs.getURI(i),value=attrs.getValue(i),qName=attrs.getQName(i),attr=doc.createAttributeNS(namespaceURI,qName);this.locator&&position(attrs.getLocator(i),attr),attr.value=attr.nodeValue=value,el.setAttributeNode(attr)}},endElement:function(namespaceURI,localName,qName){var current=this.currentElement;current.tagName;this.currentElement=current.parentNode},startPrefixMapping:function(prefix,uri){},endPrefixMapping:function(prefix){},processingInstruction:function(target,data){var ins=this.doc.createProcessingInstruction(target,data);this.locator&&position(this.locator,ins),appendElement(this,ins)},ignorableWhitespace:function(ch,start,length){},characters:function(chars,start,length){if(chars=_toString.apply(this,arguments)){if(this.cdata)var charNode=this.doc.createCDATASection(chars);else var charNode=this.doc.createTextNode(chars);this.currentElement?this.currentElement.appendChild(charNode):/^\s*$/.test(chars)&&this.doc.appendChild(charNode),this.locator&&position(this.locator,charNode)}},skippedEntity:function(name){},endDocument:function(){this.doc.normalize()},setDocumentLocator:function(locator){(this.locator=locator)&&(locator.lineNumber=0)},comment:function(chars,start,length){chars=_toString.apply(this,arguments);var comm=this.doc.createComment(chars);this.locator&&position(this.locator,comm),appendElement(this,comm)},startCDATA:function(){this.cdata=!0},endCDATA:function(){this.cdata=!1},startDTD:function(name,publicId,systemId){var impl=this.doc.implementation;if(impl&&impl.createDocumentType){var dt=impl.createDocumentType(name,publicId,systemId);this.locator&&position(this.locator,dt),appendElement(this,dt),this.doc.doctype=dt}},warning:function(error){console.warn("[xmldom warning] "+error,_locator(this.locator))},error:function(error){console.error("[xmldom error] "+error,_locator(this.locator))},fatalError:function(error){throw new ParseError(error,this.locator)}},"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){DOMHandler.prototype[key]=function(){return null}}),exports.__DOMHandler=DOMHandler,exports.normalizeLineEndings=normalizeLineEndings,exports.DOMParser=DOMParser},{"./conventions":41,"./dom":43,"./entities":44,"./sax":46}],43:[function(require,module,exports){function notEmptyString(input){return""!==input}function splitOnASCIIWhitespace(input){return input?input.split(/[\t\n\f\r ]+/).filter(notEmptyString):[]}function orderedSetReducer(current,element){return current.hasOwnProperty(element)||(current[element]=!0),current}function toOrderedSet(input){if(!input)return[];var list=splitOnASCIIWhitespace(input);return Object.keys(list.reduce(orderedSetReducer,{}))}function arrayIncludes(list){return function(element){return list&&-1!==list.indexOf(element)}}function copy(src,dest){for(var p in src)Object.prototype.hasOwnProperty.call(src,p)&&(dest[p]=src[p])}function _extends(Class,Super){function t(){}var pt=Class.prototype;pt instanceof Super||(t.prototype=Super.prototype,t=new t,copy(pt,t),Class.prototype=pt=t),pt.constructor!=Class&&("function"!=typeof Class&&console.error("unknown Class:"+Class),pt.constructor=Class)}function DOMException(code,message){if(message instanceof Error)var error=message;else error=this,Error.call(this,ExceptionMessage[code]),this.message=ExceptionMessage[code],Error.captureStackTrace&&Error.captureStackTrace(this,DOMException);return error.code=code,message&&(this.message=this.message+": "+message),error}function NodeList(){}function LiveNodeList(node,refresh){this._node=node,this._refresh=refresh,_updateLiveList(this)}function _updateLiveList(list){var inc=list._node._inc||list._node.ownerDocument._inc;if(list._inc!=inc){var ls=list._refresh(list._node);__set__(list,"length",ls.length),copy(ls,list),list._inc=inc}}function NamedNodeMap(){}function _findNodeIndex(list,node){for(var i=list.length;i--;)if(list[i]===node)return i}function _addNamedNode(el,list,newAttr,oldAttr){if(oldAttr?list[_findNodeIndex(list,oldAttr)]=newAttr:list[list.length++]=newAttr,el){newAttr.ownerElement=el;var doc=el.ownerDocument;doc&&(oldAttr&&_onRemoveAttribute(doc,el,oldAttr),_onAddAttribute(doc,el,newAttr))}}function _removeNamedNode(el,list,attr){var i=_findNodeIndex(list,attr);if(!(i>=0))throw new DOMException(NOT_FOUND_ERR,new Error(el.tagName+"@"+attr));for(var lastIndex=list.length-1;lastIndex>i;)list[i]=list[++i];if(list.length=lastIndex,el){var doc=el.ownerDocument;doc&&(_onRemoveAttribute(doc,el,attr),attr.ownerElement=null)}}function DOMImplementation(){} +function Node(){}function _xmlEncoder(c){return"<"==c&&"<"||">"==c&&">"||"&"==c&&"&"||'"'==c&&"""||"&#"+c.charCodeAt()+";"}function _visitNode(node,callback){if(callback(node))return!0;if(node=node.firstChild)do if(_visitNode(node,callback))return!0;while(node=node.nextSibling)}function Document(){this.ownerDocument=this}function _onAddAttribute(doc,el,newAttr){doc&&doc._inc++;var ns=newAttr.namespaceURI;ns===NAMESPACE.XMLNS&&(el._nsMap[newAttr.prefix?newAttr.localName:""]=newAttr.value)}function _onRemoveAttribute(doc,el,newAttr,remove){doc&&doc._inc++;var ns=newAttr.namespaceURI;ns===NAMESPACE.XMLNS&&delete el._nsMap[newAttr.prefix?newAttr.localName:""]}function _onUpdateChild(doc,el,newChild){if(doc&&doc._inc){doc._inc++;var cs=el.childNodes;if(newChild)cs[cs.length++]=newChild;else{for(var child=el.firstChild,i=0;child;)cs[i++]=child,child=child.nextSibling;cs.length=i,delete cs[cs.length]}}}function _removeChild(parentNode,child){var previous=child.previousSibling,next=child.nextSibling;return previous?previous.nextSibling=next:parentNode.firstChild=next,next?next.previousSibling=previous:parentNode.lastChild=previous,child.parentNode=null,child.previousSibling=null,child.nextSibling=null,_onUpdateChild(parentNode.ownerDocument,parentNode),child}function hasValidParentNodeType(node){return node&&(node.nodeType===Node.DOCUMENT_NODE||node.nodeType===Node.DOCUMENT_FRAGMENT_NODE||node.nodeType===Node.ELEMENT_NODE)}function hasInsertableNodeType(node){return node&&(isElementNode(node)||isTextNode(node)||isDocTypeNode(node)||node.nodeType===Node.DOCUMENT_FRAGMENT_NODE||node.nodeType===Node.COMMENT_NODE||node.nodeType===Node.PROCESSING_INSTRUCTION_NODE)}function isDocTypeNode(node){return node&&node.nodeType===Node.DOCUMENT_TYPE_NODE}function isElementNode(node){return node&&node.nodeType===Node.ELEMENT_NODE}function isTextNode(node){return node&&node.nodeType===Node.TEXT_NODE}function isElementInsertionPossible(doc,child){var parentChildNodes=doc.childNodes||[];if(find(parentChildNodes,isElementNode)||isDocTypeNode(child))return!1;var docTypeNode=find(parentChildNodes,isDocTypeNode);return!(child&&docTypeNode&&parentChildNodes.indexOf(docTypeNode)>parentChildNodes.indexOf(child))}function isElementReplacementPossible(doc,child){function hasElementChildThatIsNotChild(node){return isElementNode(node)&&node!==child}var parentChildNodes=doc.childNodes||[];if(find(parentChildNodes,hasElementChildThatIsNotChild))return!1;var docTypeNode=find(parentChildNodes,isDocTypeNode);return!(child&&docTypeNode&&parentChildNodes.indexOf(docTypeNode)>parentChildNodes.indexOf(child))}function assertPreInsertionValidity1to5(parent,node,child){if(!hasValidParentNodeType(parent))throw new DOMException(HIERARCHY_REQUEST_ERR,"Unexpected parent node type "+parent.nodeType);if(child&&child.parentNode!==parent)throw new DOMException(NOT_FOUND_ERR,"child not in parent");if(!hasInsertableNodeType(node)||isDocTypeNode(node)&&parent.nodeType!==Node.DOCUMENT_NODE)throw new DOMException(HIERARCHY_REQUEST_ERR,"Unexpected node type "+node.nodeType+" for parent node type "+parent.nodeType)}function assertPreInsertionValidityInDocument(parent,node,child){var parentChildNodes=parent.childNodes||[],nodeChildNodes=node.childNodes||[];if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var nodeChildElements=nodeChildNodes.filter(isElementNode);if(nodeChildElements.length>1||find(nodeChildNodes,isTextNode))throw new DOMException(HIERARCHY_REQUEST_ERR,"More than one element or text in fragment");if(1===nodeChildElements.length&&!isElementInsertionPossible(parent,child))throw new DOMException(HIERARCHY_REQUEST_ERR,"Element in fragment can not be inserted before doctype")}if(isElementNode(node)&&!isElementInsertionPossible(parent,child))throw new DOMException(HIERARCHY_REQUEST_ERR,"Only one element can be added and only after doctype");if(isDocTypeNode(node)){if(find(parentChildNodes,isDocTypeNode))throw new DOMException(HIERARCHY_REQUEST_ERR,"Only one doctype is allowed");var parentElementChild=find(parentChildNodes,isElementNode);if(child&&parentChildNodes.indexOf(parentElementChild)1||find(nodeChildNodes,isTextNode))throw new DOMException(HIERARCHY_REQUEST_ERR,"More than one element or text in fragment");if(1===nodeChildElements.length&&!isElementReplacementPossible(parent,child))throw new DOMException(HIERARCHY_REQUEST_ERR,"Element in fragment can not be inserted before doctype")}if(isElementNode(node)&&!isElementReplacementPossible(parent,child))throw new DOMException(HIERARCHY_REQUEST_ERR,"Only one element can be added and only after doctype");if(isDocTypeNode(node)){if(find(parentChildNodes,hasDoctypeChildThatIsNotChild))throw new DOMException(HIERARCHY_REQUEST_ERR,"Only one doctype is allowed");var parentElementChild=find(parentChildNodes,isElementNode);if(child&&parentChildNodes.indexOf(parentElementChild)=0;nsi--){var namespace=visibleNamespaces[nsi];if(""===namespace.prefix&&namespace.namespace===node.namespaceURI){defaultNS=namespace.namespace;break}}if(defaultNS!==node.namespaceURI)for(var nsi=visibleNamespaces.length-1;nsi>=0;nsi--){var namespace=visibleNamespaces[nsi];if(namespace.namespace===node.namespaceURI){namespace.prefix&&(prefixedNodeName=namespace.prefix+":"+nodeName);break}}}buf.push("<",prefixedNodeName);for(var i=0;len>i;i++){var attr=attrs.item(i);"xmlns"==attr.prefix?visibleNamespaces.push({prefix:attr.localName,namespace:attr.value}):"xmlns"==attr.nodeName&&visibleNamespaces.push({prefix:"",namespace:attr.value})}for(var i=0;len>i;i++){var attr=attrs.item(i);if(needNamespaceDefine(attr,isHTML,visibleNamespaces)){var prefix=attr.prefix||"",uri=attr.namespaceURI;addSerializedAttribute(buf,prefix?"xmlns:"+prefix:"xmlns",uri),visibleNamespaces.push({prefix:prefix,namespace:uri})}serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces)}if(nodeName===prefixedNodeName&&needNamespaceDefine(node,isHTML,visibleNamespaces)){var prefix=node.prefix||"",uri=node.namespaceURI;addSerializedAttribute(buf,prefix?"xmlns:"+prefix:"xmlns",uri),visibleNamespaces.push({prefix:prefix,namespace:uri})}if(child||isHTML&&!/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){if(buf.push(">"),isHTML&&/^script$/i.test(nodeName))for(;child;)child.data?buf.push(child.data):serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces.slice()),child=child.nextSibling;else for(;child;)serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces.slice()),child=child.nextSibling;buf.push("")}else buf.push("/>");return;case DOCUMENT_NODE:case DOCUMENT_FRAGMENT_NODE:for(var child=node.firstChild;child;)serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces.slice()),child=child.nextSibling;return;case ATTRIBUTE_NODE:return addSerializedAttribute(buf,node.name,node.value);case TEXT_NODE:return buf.push(node.data.replace(/[<&>]/g,_xmlEncoder));case CDATA_SECTION_NODE:return buf.push("");case COMMENT_NODE:return buf.push("");case DOCUMENT_TYPE_NODE:var pubid=node.publicId,sysid=node.systemId;if(buf.push("");else if(sysid&&"."!=sysid)buf.push(" SYSTEM ",sysid,">");else{var sub=node.internalSubset;sub&&buf.push(" [",sub,"]"),buf.push(">")}return;case PROCESSING_INSTRUCTION_NODE:return buf.push("");case ENTITY_REFERENCE_NODE:return buf.push("&",node.nodeName,";");default:buf.push("??",node.nodeName)}}function importNode(doc,node,deep){var node2;switch(node.nodeType){case ELEMENT_NODE:node2=node.cloneNode(!1),node2.ownerDocument=doc;case DOCUMENT_FRAGMENT_NODE:break;case ATTRIBUTE_NODE:deep=!0}if(node2||(node2=node.cloneNode(!1)),node2.ownerDocument=doc,node2.parentNode=null,deep)for(var child=node.firstChild;child;)node2.appendChild(importNode(doc,child,deep)),child=child.nextSibling;return node2}function cloneNode(doc,node,deep){var node2=new node.constructor;for(var n in node)if(Object.prototype.hasOwnProperty.call(node,n)){var v=node[n];"object"!=typeof v&&v!=node2[n]&&(node2[n]=v)}switch(node.childNodes&&(node2.childNodes=new NodeList),node2.ownerDocument=doc,node2.nodeType){case ELEMENT_NODE:var attrs=node.attributes,attrs2=node2.attributes=new NamedNodeMap,len=attrs.length;attrs2._ownerElement=node2;for(var i=0;len>i;i++)node2.setAttributeNode(cloneNode(doc,attrs.item(i),!0));break;case ATTRIBUTE_NODE:deep=!0}if(deep)for(var child=node.firstChild;child;)node2.appendChild(cloneNode(doc,child,deep)),child=child.nextSibling;return node2}function __set__(object,key,value){object[key]=value}function getTextContent(node){switch(node.nodeType){case ELEMENT_NODE:case DOCUMENT_FRAGMENT_NODE:var buf=[];for(node=node.firstChild;node;)7!==node.nodeType&&8!==node.nodeType&&buf.push(getTextContent(node)),node=node.nextSibling;return buf.join("");default:return node.nodeValue}}var conventions=require("./conventions"),find=conventions.find,NAMESPACE=conventions.NAMESPACE,NodeType={},ELEMENT_NODE=NodeType.ELEMENT_NODE=1,ATTRIBUTE_NODE=NodeType.ATTRIBUTE_NODE=2,TEXT_NODE=NodeType.TEXT_NODE=3,CDATA_SECTION_NODE=NodeType.CDATA_SECTION_NODE=4,ENTITY_REFERENCE_NODE=NodeType.ENTITY_REFERENCE_NODE=5,ENTITY_NODE=NodeType.ENTITY_NODE=6,PROCESSING_INSTRUCTION_NODE=NodeType.PROCESSING_INSTRUCTION_NODE=7,COMMENT_NODE=NodeType.COMMENT_NODE=8,DOCUMENT_NODE=NodeType.DOCUMENT_NODE=9,DOCUMENT_TYPE_NODE=NodeType.DOCUMENT_TYPE_NODE=10,DOCUMENT_FRAGMENT_NODE=NodeType.DOCUMENT_FRAGMENT_NODE=11,NOTATION_NODE=NodeType.NOTATION_NODE=12,ExceptionCode={},ExceptionMessage={},HIERARCHY_REQUEST_ERR=(ExceptionCode.INDEX_SIZE_ERR=(ExceptionMessage[1]="Index size error",1),ExceptionCode.DOMSTRING_SIZE_ERR=(ExceptionMessage[2]="DOMString size error",2),ExceptionCode.HIERARCHY_REQUEST_ERR=(ExceptionMessage[3]="Hierarchy request error",3)),NOT_FOUND_ERR=(ExceptionCode.WRONG_DOCUMENT_ERR=(ExceptionMessage[4]="Wrong document",4),ExceptionCode.INVALID_CHARACTER_ERR=(ExceptionMessage[5]="Invalid character",5),ExceptionCode.NO_DATA_ALLOWED_ERR=(ExceptionMessage[6]="No data allowed",6),ExceptionCode.NO_MODIFICATION_ALLOWED_ERR=(ExceptionMessage[7]="No modification allowed",7),ExceptionCode.NOT_FOUND_ERR=(ExceptionMessage[8]="Not found",8)),INUSE_ATTRIBUTE_ERR=(ExceptionCode.NOT_SUPPORTED_ERR=(ExceptionMessage[9]="Not supported",9),ExceptionCode.INUSE_ATTRIBUTE_ERR=(ExceptionMessage[10]="Attribute in use",10));ExceptionCode.INVALID_STATE_ERR=(ExceptionMessage[11]="Invalid state",11),ExceptionCode.SYNTAX_ERR=(ExceptionMessage[12]="Syntax error",12),ExceptionCode.INVALID_MODIFICATION_ERR=(ExceptionMessage[13]="Invalid modification",13),ExceptionCode.NAMESPACE_ERR=(ExceptionMessage[14]="Invalid namespace",14),ExceptionCode.INVALID_ACCESS_ERR=(ExceptionMessage[15]="Invalid access",15);DOMException.prototype=Error.prototype,copy(ExceptionCode,DOMException),NodeList.prototype={length:0,item:function(index){return this[index]||null},toString:function(isHTML,nodeFilter){for(var buf=[],i=0;i0},lookupPrefix:function(namespaceURI){for(var el=this;el;){var map=el._nsMap;if(map)for(var n in map)if(Object.prototype.hasOwnProperty.call(map,n)&&map[n]===namespaceURI)return n;el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},lookupNamespaceURI:function(prefix){for(var el=this;el;){var map=el._nsMap;if(map&&Object.prototype.hasOwnProperty.call(map,prefix))return map[prefix];el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},isDefaultNamespace:function(namespaceURI){var prefix=this.lookupPrefix(namespaceURI);return null==prefix}},copy(NodeType,Node),copy(NodeType,Node.prototype),Document.prototype={nodeName:"#document",nodeType:DOCUMENT_NODE,doctype:null,documentElement:null,_inc:1,insertBefore:function(newChild,refChild){if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){for(var child=newChild.firstChild;child;){var next=child.nextSibling;this.insertBefore(child,refChild),child=next}return newChild}return _insertBefore(this,newChild,refChild),newChild.ownerDocument=this,null===this.documentElement&&newChild.nodeType===ELEMENT_NODE&&(this.documentElement=newChild),newChild},removeChild:function(oldChild){return this.documentElement==oldChild&&(this.documentElement=null),_removeChild(this,oldChild)},replaceChild:function(newChild,oldChild){_insertBefore(this,newChild,oldChild,assertPreReplacementValidityInDocument),newChild.ownerDocument=this,oldChild&&this.removeChild(oldChild),isElementNode(newChild)&&(this.documentElement=newChild)},importNode:function(importedNode,deep){return importNode(this,importedNode,deep)},getElementById:function(id){var rtv=null;return _visitNode(this.documentElement,function(node){return node.nodeType==ELEMENT_NODE&&node.getAttribute("id")==id?(rtv=node,!0):void 0}),rtv},getElementsByClassName:function(classNames){var classNamesSet=toOrderedSet(classNames);return new LiveNodeList(this,function(base){var ls=[];return classNamesSet.length>0&&_visitNode(base.documentElement,function(node){if(node!==base&&node.nodeType===ELEMENT_NODE){var nodeClassNames=node.getAttribute("class");if(nodeClassNames){var matches=classNames===nodeClassNames;if(!matches){var nodeClassNamesSet=toOrderedSet(nodeClassNames);matches=classNamesSet.every(arrayIncludes(nodeClassNamesSet))}matches&&ls.push(node)}}}),ls})},createElement:function(tagName){var node=new Element;node.ownerDocument=this,node.nodeName=tagName,node.tagName=tagName,node.localName=tagName,node.childNodes=new NodeList;var attrs=node.attributes=new NamedNodeMap;return attrs._ownerElement=node,node},createDocumentFragment:function(){var node=new DocumentFragment;return node.ownerDocument=this,node.childNodes=new NodeList,node},createTextNode:function(data){var node=new Text;return node.ownerDocument=this,node.appendData(data),node},createComment:function(data){var node=new Comment;return node.ownerDocument=this,node.appendData(data),node},createCDATASection:function(data){var node=new CDATASection;return node.ownerDocument=this,node.appendData(data),node},createProcessingInstruction:function(target,data){var node=new ProcessingInstruction;return node.ownerDocument=this,node.tagName=node.target=target,node.nodeValue=node.data=data,node},createAttribute:function(name){var node=new Attr;return node.ownerDocument=this,node.name=name,node.nodeName=name,node.localName=name,node.specified=!0,node},createEntityReference:function(name){var node=new EntityReference;return node.ownerDocument=this,node.nodeName=name,node},createElementNS:function(namespaceURI,qualifiedName){var node=new Element,pl=qualifiedName.split(":"),attrs=node.attributes=new NamedNodeMap;return node.childNodes=new NodeList,node.ownerDocument=this,node.nodeName=qualifiedName,node.tagName=qualifiedName,node.namespaceURI=namespaceURI,2==pl.length?(node.prefix=pl[0],node.localName=pl[1]):node.localName=qualifiedName,attrs._ownerElement=node,node},createAttributeNS:function(namespaceURI,qualifiedName){var node=new Attr,pl=qualifiedName.split(":");return node.ownerDocument=this,node.nodeName=qualifiedName,node.name=qualifiedName,node.namespaceURI=namespaceURI,node.specified=!0,2==pl.length?(node.prefix=pl[0],node.localName=pl[1]):node.localName=qualifiedName,node}},_extends(Document,Node),Element.prototype={nodeType:ELEMENT_NODE,hasAttribute:function(name){return null!=this.getAttributeNode(name)},getAttribute:function(name){var attr=this.getAttributeNode(name);return attr&&attr.value||""},getAttributeNode:function(name){return this.attributes.getNamedItem(name)},setAttribute:function(name,value){var attr=this.ownerDocument.createAttribute(name);attr.value=attr.nodeValue=""+value,this.setAttributeNode(attr)},removeAttribute:function(name){var attr=this.getAttributeNode(name);attr&&this.removeAttributeNode(attr)},appendChild:function(newChild){return newChild.nodeType===DOCUMENT_FRAGMENT_NODE?this.insertBefore(newChild,null):_appendSingleChild(this,newChild)},setAttributeNode:function(newAttr){return this.attributes.setNamedItem(newAttr)},setAttributeNodeNS:function(newAttr){return this.attributes.setNamedItemNS(newAttr)},removeAttributeNode:function(oldAttr){return this.attributes.removeNamedItem(oldAttr.nodeName)},removeAttributeNS:function(namespaceURI,localName){var old=this.getAttributeNodeNS(namespaceURI,localName);old&&this.removeAttributeNode(old)},hasAttributeNS:function(namespaceURI,localName){return null!=this.getAttributeNodeNS(namespaceURI,localName)},getAttributeNS:function(namespaceURI,localName){var attr=this.getAttributeNodeNS(namespaceURI,localName);return attr&&attr.value||""},setAttributeNS:function(namespaceURI,qualifiedName,value){var attr=this.ownerDocument.createAttributeNS(namespaceURI,qualifiedName);attr.value=attr.nodeValue=""+value,this.setAttributeNode(attr)},getAttributeNodeNS:function(namespaceURI,localName){return this.attributes.getNamedItemNS(namespaceURI,localName)},getElementsByTagName:function(tagName){return new LiveNodeList(this,function(base){var ls=[];return _visitNode(base,function(node){node===base||node.nodeType!=ELEMENT_NODE||"*"!==tagName&&node.tagName!=tagName||ls.push(node)}),ls})},getElementsByTagNameNS:function(namespaceURI,localName){return new LiveNodeList(this,function(base){var ls=[];return _visitNode(base,function(node){node===base||node.nodeType!==ELEMENT_NODE||"*"!==namespaceURI&&node.namespaceURI!==namespaceURI||"*"!==localName&&node.localName!=localName||ls.push(node)}),ls})}},Document.prototype.getElementsByTagName=Element.prototype.getElementsByTagName,Document.prototype.getElementsByTagNameNS=Element.prototype.getElementsByTagNameNS,_extends(Element,Node),Attr.prototype.nodeType=ATTRIBUTE_NODE,_extends(Attr,Node),CharacterData.prototype={data:"",substringData:function(offset,count){return this.data.substring(offset,offset+count)},appendData:function(text){text=this.data+text,this.nodeValue=this.data=text,this.length=text.length},insertData:function(offset,text){this.replaceData(offset,0,text)},appendChild:function(newChild){throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])},deleteData:function(offset,count){this.replaceData(offset,count,"")},replaceData:function(offset,count,text){var start=this.data.substring(0,offset),end=this.data.substring(offset+count);text=start+text+end,this.nodeValue=this.data=text,this.length=text.length}},_extends(CharacterData,Node),Text.prototype={nodeName:"#text",nodeType:TEXT_NODE,splitText:function(offset){var text=this.data,newText=text.substring(offset);text=text.substring(0,offset),this.data=this.nodeValue=text,this.length=text.length;var newNode=this.ownerDocument.createTextNode(newText);return this.parentNode&&this.parentNode.insertBefore(newNode,this.nextSibling),newNode}},_extends(Text,CharacterData),Comment.prototype={nodeName:"#comment",nodeType:COMMENT_NODE},_extends(Comment,CharacterData),CDATASection.prototype={nodeName:"#cdata-section",nodeType:CDATA_SECTION_NODE},_extends(CDATASection,CharacterData),DocumentType.prototype.nodeType=DOCUMENT_TYPE_NODE,_extends(DocumentType,Node),Notation.prototype.nodeType=NOTATION_NODE,_extends(Notation,Node),Entity.prototype.nodeType=ENTITY_NODE,_extends(Entity,Node),EntityReference.prototype.nodeType=ENTITY_REFERENCE_NODE,_extends(EntityReference,Node),DocumentFragment.prototype.nodeName="#document-fragment",DocumentFragment.prototype.nodeType=DOCUMENT_FRAGMENT_NODE,_extends(DocumentFragment,Node),ProcessingInstruction.prototype.nodeType=PROCESSING_INSTRUCTION_NODE,_extends(ProcessingInstruction,Node),XMLSerializer.prototype.serializeToString=function(node,isHtml,nodeFilter){return nodeSerializeToString.call(node,isHtml,nodeFilter)},Node.prototype.toString=nodeSerializeToString;try{Object.defineProperty&&(Object.defineProperty(LiveNodeList.prototype,"length",{get:function(){return _updateLiveList(this),this.$$length}}),Object.defineProperty(Node.prototype,"textContent",{get:function(){return getTextContent(this)},set:function(data){switch(this.nodeType){case ELEMENT_NODE:case DOCUMENT_FRAGMENT_NODE:for(;this.firstChild;)this.removeChild(this.firstChild);(data||String(data))&&this.appendChild(this.ownerDocument.createTextNode(data));break;default:this.data=data,this.value=data,this.nodeValue=data}}}),__set__=function(object,key,value){object["$$"+key]=value})}catch(e){}exports.DocumentType=DocumentType,exports.DOMException=DOMException,exports.DOMImplementation=DOMImplementation,exports.Element=Element,exports.Node=Node,exports.NodeList=NodeList,exports.XMLSerializer=XMLSerializer},{"./conventions":41}],44:[function(require,module,exports){var freeze=require("./conventions").freeze;exports.XML_ENTITIES=freeze({amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}),exports.HTML_ENTITIES=freeze({lt:"<",gt:">",amp:"&",quot:'"',apos:"'",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",times:"×",divide:"÷",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪","int":"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",euro:"€",trade:"™",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"}),exports.entityMap=exports.HTML_ENTITIES},{"./conventions":41}],45:[function(require,module,exports){var dom=require("./dom");exports.DOMImplementation=dom.DOMImplementation,exports.XMLSerializer=dom.XMLSerializer,exports.DOMParser=require("./dom-parser").DOMParser},{"./dom":43,"./dom-parser":42}],46:[function(require,module,exports){function ParseError(message,locator){this.message=message,this.locator=locator,Error.captureStackTrace&&Error.captureStackTrace(this,ParseError)}function XMLReader(){}function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){function fixedFromCharCode(code){if(code>65535){code-=65536;var surrogate1=55296+(code>>10),surrogate2=56320+(1023&code);return String.fromCharCode(surrogate1,surrogate2)}return String.fromCharCode(code)}function entityReplacer(a){var k=a.slice(1,-1);return Object.hasOwnProperty.call(entityMap,k)?entityMap[k]:"#"===k.charAt(0)?fixedFromCharCode(parseInt(k.substr(1).replace("x","0x"))):(errorHandler.error("entity not found:"+a),a)}function appendText(end){if(end>start){var xt=source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);locator&&position(start),domBuilder.characters(xt,0,end-start),start=end}}function position(p,m){for(;p>=lineEnd&&(m=linePattern.exec(source));)lineStart=m.index,lineEnd=lineStart+m[0].length,locator.lineNumber++;locator.columnNumber=p-lineStart+1}for(var lineStart=0,lineEnd=0,linePattern=/.*(?:\r\n?|\n)|.*$/g,locator=domBuilder.locator,parseStack=[{currentNSMap:defaultNSMapCopy}],closeMap={},start=0;;){try{var tagStart=source.indexOf("<",start);if(0>tagStart){if(!source.substr(start).match(/^\s*$/)){var doc=domBuilder.doc,text=doc.createTextNode(source.substr(start));doc.appendChild(text),domBuilder.currentElement=text}return}switch(tagStart>start&&appendText(tagStart),source.charAt(tagStart+1)){case"/":var end=source.indexOf(">",tagStart+3),tagName=source.substring(tagStart+2,end).replace(/[ \t\n\r]+$/g,""),config=parseStack.pop(); +0>end?(tagName=source.substring(tagStart+2).replace(/[\s<].*/,""),errorHandler.error("end tag name: "+tagName+" is not complete:"+config.tagName),end=tagStart+1+tagName.length):tagName.match(/\si;i++){var a=el[i];position(a.offset),a.locator=copyLocator(locator,{})}domBuilder.locator=locator2,appendElement(el,domBuilder,currentNSMap)&&parseStack.push(el),domBuilder.locator=locator}else appendElement(el,domBuilder,currentNSMap)&&parseStack.push(el);NAMESPACE.isHTML(el.uri)&&!el.closed?end=parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder):end++}}catch(e){if(e instanceof ParseError)throw e;errorHandler.error("element parse error: "+e),end=-1}end>start?start=end:appendText(Math.max(tagStart,start)+1)}}function copyLocator(f,t){return t.lineNumber=f.lineNumber,t.columnNumber=f.columnNumber,t}function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){function addAttribute(qname,value,startIndex){el.attributeNames.hasOwnProperty(qname)&&errorHandler.fatalError("Attribute "+qname+" redefined"),el.addValue(qname,value.replace(/[\t\n\r]/g," ").replace(/&#?\w+;/g,entityReplacer),startIndex)}for(var attrName,value,p=++start,s=S_TAG;;){var c=source.charAt(p);switch(c){case"=":if(s===S_ATTR)attrName=source.slice(start,p),s=S_EQ;else{if(s!==S_ATTR_SPACE)throw new Error("attribute equal must after attrName");s=S_EQ}break;case"'":case'"':if(s===S_EQ||s===S_ATTR){if(s===S_ATTR&&(errorHandler.warning('attribute value must after "="'),attrName=source.slice(start,p)),start=p+1,p=source.indexOf(c,start),!(p>0))throw new Error("attribute value no end '"+c+"' match");value=source.slice(start,p),addAttribute(attrName,value,start-1),s=S_ATTR_END}else{if(s!=S_ATTR_NOQUOT_VALUE)throw new Error('attribute value must after "="');value=source.slice(start,p),addAttribute(attrName,value,start),errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+")!!"),start=p+1,s=S_ATTR_END}break;case"/":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:s=S_TAG_CLOSE,el.closed=!0;case S_ATTR_NOQUOT_VALUE:case S_ATTR:case S_ATTR_SPACE:break;default:throw new Error("attribute invalid close char('/')")}break;case"":return errorHandler.error("unexpected end of input"),s==S_TAG&&el.setTagName(source.slice(start,p)),p;case">":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:break;case S_ATTR_NOQUOT_VALUE:case S_ATTR:value=source.slice(start,p),"/"===value.slice(-1)&&(el.closed=!0,value=value.slice(0,-1));case S_ATTR_SPACE:s===S_ATTR_SPACE&&(value=attrName),s==S_ATTR_NOQUOT_VALUE?(errorHandler.warning('attribute "'+value+'" missed quot(")!'),addAttribute(attrName,value,start)):(NAMESPACE.isHTML(currentNSMap[""])&&value.match(/^(?:disabled|checked|selected)$/i)||errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!'),addAttribute(value,value,start));break;case S_EQ:throw new Error("attribute value missed!!")}return p;case"€":c=" ";default:if(" ">=c)switch(s){case S_TAG:el.setTagName(source.slice(start,p)),s=S_TAG_SPACE;break;case S_ATTR:attrName=source.slice(start,p),s=S_ATTR_SPACE;break;case S_ATTR_NOQUOT_VALUE:var value=source.slice(start,p);errorHandler.warning('attribute "'+value+'" missed quot(")!!'),addAttribute(attrName,value,start);case S_ATTR_END:s=S_TAG_SPACE}else switch(s){case S_ATTR_SPACE:el.tagName;NAMESPACE.isHTML(currentNSMap[""])&&attrName.match(/^(?:disabled|checked|selected)$/i)||errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!'),addAttribute(attrName,attrName,start),start=p,s=S_ATTR;break;case S_ATTR_END:errorHandler.warning('attribute space is required"'+attrName+'"!!');case S_TAG_SPACE:s=S_ATTR,start=p;break;case S_EQ:s=S_ATTR_NOQUOT_VALUE,start=p;break;case S_TAG_CLOSE:throw new Error("elements closed character '/' and '>' must be connected to")}}p++}}function appendElement(el,domBuilder,currentNSMap){for(var tagName=el.tagName,localNSMap=null,i=el.length;i--;){var a=el[i],qName=a.qName,value=a.value,nsp=qName.indexOf(":");if(nsp>0)var prefix=a.prefix=qName.slice(0,nsp),localName=qName.slice(nsp+1),nsPrefix="xmlns"===prefix&&localName;else localName=qName,prefix=null,nsPrefix="xmlns"===qName&&"";a.localName=localName,nsPrefix!==!1&&(null==localNSMap&&(localNSMap={},_copy(currentNSMap,currentNSMap={})),currentNSMap[nsPrefix]=localNSMap[nsPrefix]=value,a.uri=NAMESPACE.XMLNS,domBuilder.startPrefixMapping(nsPrefix,value))}for(var i=el.length;i--;){a=el[i];var prefix=a.prefix;prefix&&("xml"===prefix&&(a.uri=NAMESPACE.XML),"xmlns"!==prefix&&(a.uri=currentNSMap[prefix||""]))}var nsp=tagName.indexOf(":");nsp>0?(prefix=el.prefix=tagName.slice(0,nsp),localName=el.localName=tagName.slice(nsp+1)):(prefix=null,localName=el.localName=tagName);var ns=el.uri=currentNSMap[prefix||""];if(domBuilder.startElement(ns,localName,tagName,el),!el.closed)return el.currentNSMap=currentNSMap,el.localNSMap=localNSMap,!0;if(domBuilder.endElement(ns,localName,tagName),localNSMap)for(prefix in localNSMap)Object.prototype.hasOwnProperty.call(localNSMap,prefix)&&domBuilder.endPrefixMapping(prefix)}function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){if(/^(?:script|textarea)$/i.test(tagName)){var elEndStart=source.indexOf("",elStartEnd),text=source.substring(elStartEnd+1,elEndStart);if(/[&<]/.test(text))return/^script$/i.test(tagName)?(domBuilder.characters(text,0,text.length),elEndStart):(text=text.replace(/&#?\w+;/g,entityReplacer),domBuilder.characters(text,0,text.length),elEndStart)}return elStartEnd+1}function fixSelfClosed(source,elStartEnd,tagName,closeMap){var pos=closeMap[tagName];return null==pos&&(pos=source.lastIndexOf(""),elStartEnd>pos&&(pos=source.lastIndexOf("pos}function _copy(source,target){for(var n in source)Object.prototype.hasOwnProperty.call(source,n)&&(target[n]=source[n])}function parseDCC(source,start,domBuilder,errorHandler){var next=source.charAt(start+2);switch(next){case"-":if("-"===source.charAt(start+3)){var end=source.indexOf("-->",start+4);return end>start?(domBuilder.comment(source,start+4,end-start-4),end+3):(errorHandler.error("Unclosed comment"),-1)}return-1;default:if("CDATA["==source.substr(start+3,6)){var end=source.indexOf("]]>",start+9);return domBuilder.startCDATA(),domBuilder.characters(source,start+9,end-start-9),domBuilder.endCDATA(),end+3}var matchs=split(source,start),len=matchs.length;if(len>1&&/!doctype/i.test(matchs[0][0])){var name=matchs[1][0],pubid=!1,sysid=!1;len>3&&(/^public$/i.test(matchs[2][0])?(pubid=matchs[3][0],sysid=len>4&&matchs[4][0]):/^system$/i.test(matchs[2][0])&&(sysid=matchs[3][0]));var lastMatch=matchs[len-1];return domBuilder.startDTD(name,pubid,sysid),domBuilder.endDTD(),lastMatch.index+lastMatch[0].length}}return-1}function parseInstruction(source,start,domBuilder){var end=source.indexOf("?>",start);if(end){var match=source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(match){match[0].length;return domBuilder.processingInstruction(match[1],match[2]),end+2}return-1}return-1}function ElementAttributes(){this.attributeNames={}}function split(source,start){var match,buf=[],reg=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;for(reg.lastIndex=start,reg.exec(source);match=reg.exec(source);)if(buf.push(match),match[1])return buf}var NAMESPACE=require("./conventions").NAMESPACE,nameStartChar=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,nameChar=new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),tagNamePattern=new RegExp("^"+nameStartChar.source+nameChar.source+"*(?::"+nameStartChar.source+nameChar.source+"*)?$"),S_TAG=0,S_ATTR=1,S_ATTR_SPACE=2,S_EQ=3,S_ATTR_NOQUOT_VALUE=4,S_ATTR_END=5,S_TAG_SPACE=6,S_TAG_CLOSE=7;ParseError.prototype=new Error,ParseError.prototype.name=ParseError.name,XMLReader.prototype={parse:function(source,defaultNSMap,entityMap){var domBuilder=this.domBuilder;domBuilder.startDocument(),_copy(defaultNSMap,defaultNSMap={}),parse(source,defaultNSMap,entityMap,domBuilder,this.errorHandler),domBuilder.endDocument()}},ElementAttributes.prototype={setTagName:function(tagName){if(!tagNamePattern.test(tagName))throw new Error("invalid tagName:"+tagName);this.tagName=tagName},addValue:function(qName,value,offset){if(!tagNamePattern.test(qName))throw new Error("invalid attribute:"+qName);this.attributeNames[qName]=this.length,this[this.length++]={qName:qName,value:value,offset:offset}},length:0,getLocalName:function(i){return this[i].localName},getLocator:function(i){return this[i].locator},getQName:function(i){return this[i].qName},getURI:function(i){return this[i].uri},getValue:function(i){return this[i].value}},exports.XMLReader=XMLReader,exports.ParseError=ParseError},{"./conventions":41}],47:[function(require,module,exports){"use strict";function getLens(b64){var len=b64.length;if(len%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var validLen=b64.indexOf("=");-1===validLen&&(validLen=len);var placeHoldersLen=validLen===len?0:4-validLen%4;return[validLen,placeHoldersLen]}function byteLength(b64){var lens=getLens(b64),validLen=lens[0],placeHoldersLen=lens[1];return 3*(validLen+placeHoldersLen)/4-placeHoldersLen}function _byteLength(b64,validLen,placeHoldersLen){return 3*(validLen+placeHoldersLen)/4-placeHoldersLen}function toByteArray(b64){var tmp,i,lens=getLens(b64),validLen=lens[0],placeHoldersLen=lens[1],arr=new Arr(_byteLength(b64,validLen,placeHoldersLen)),curByte=0,len=placeHoldersLen>0?validLen-4:validLen;for(i=0;len>i;i+=4)tmp=revLookup[b64.charCodeAt(i)]<<18|revLookup[b64.charCodeAt(i+1)]<<12|revLookup[b64.charCodeAt(i+2)]<<6|revLookup[b64.charCodeAt(i+3)],arr[curByte++]=tmp>>16&255,arr[curByte++]=tmp>>8&255,arr[curByte++]=255&tmp;return 2===placeHoldersLen&&(tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4,arr[curByte++]=255&tmp),1===placeHoldersLen&&(tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2,arr[curByte++]=tmp>>8&255,arr[curByte++]=255&tmp),arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[63&num]}function encodeChunk(uint8,start,end){for(var tmp,output=[],i=start;end>i;i+=3)tmp=(uint8[i]<<16&16711680)+(uint8[i+1]<<8&65280)+(255&uint8[i+2]),output.push(tripletToBase64(tmp));return output.join("")}function fromByteArray(uint8){for(var tmp,len=uint8.length,extraBytes=len%3,parts=[],maxChunkLength=16383,i=0,len2=len-extraBytes;len2>i;i+=maxChunkLength)parts.push(encodeChunk(uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));return 1===extraBytes?(tmp=uint8[len-1],parts.push(lookup[tmp>>2]+lookup[tmp<<4&63]+"==")):2===extraBytes&&(tmp=(uint8[len-2]<<8)+uint8[len-1],parts.push(lookup[tmp>>10]+lookup[tmp>>4&63]+lookup[tmp<<2&63]+"=")),parts.join("")}exports.byteLength=byteLength,exports.toByteArray=toByteArray,exports.fromByteArray=fromByteArray;for(var lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,len=code.length;len>i;++i)lookup[i]=code[i],revLookup[code.charCodeAt(i)]=i;revLookup["-".charCodeAt(0)]=62,revLookup["_".charCodeAt(0)]=63},{}],48:[function(require,module,exports){"use strict";module.exports=function(Promise){function any(promises){var ret=new SomePromiseArray(promises),promise=ret.promise();return ret.setHowMany(1),ret.setUnwrap(),ret.init(),promise}var SomePromiseArray=Promise._SomePromiseArray;Promise.any=function(promises){return any(promises)},Promise.prototype.any=function(){return any(this)}}},{}],49:[function(require,module,exports){(function(process){"use strict";function Async(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new Queue(16),this._normalQueue=new Queue(16),this._haveDrainedQueues=!1,this._trampolineEnabled=!0;var self=this;this.drainQueues=function(){self._drainQueues()},this._schedule=schedule}function AsyncInvokeLater(fn,receiver,arg){this._lateQueue.push(fn,receiver,arg),this._queueTick()}function AsyncInvoke(fn,receiver,arg){this._normalQueue.push(fn,receiver,arg),this._queueTick()}function AsyncSettlePromises(promise){this._normalQueue._pushOne(promise),this._queueTick()}var firstLineError;try{throw new Error}catch(e){firstLineError=e}var schedule=require("./schedule"),Queue=require("./queue"),util=require("./util");Async.prototype.setScheduler=function(fn){var prev=this._schedule;return this._schedule=fn,this._customScheduler=!0,prev},Async.prototype.hasCustomScheduler=function(){return this._customScheduler},Async.prototype.enableTrampoline=function(){this._trampolineEnabled=!0},Async.prototype.disableTrampolineIfNecessary=function(){util.hasDevTools&&(this._trampolineEnabled=!1)},Async.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},Async.prototype.fatalError=function(e,isNode){isNode?(process.stderr.write("Fatal "+(e instanceof Error?e.stack:e)+"\n"),process.exit(2)):this.throwLater(e)},Async.prototype.throwLater=function(fn,arg){if(1===arguments.length&&(arg=fn,fn=function(){throw arg}),"undefined"!=typeof setTimeout)setTimeout(function(){fn(arg)},0);else try{this._schedule(function(){fn(arg)})}catch(e){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},util.hasDevTools?(Async.prototype.invokeLater=function(fn,receiver,arg){this._trampolineEnabled?AsyncInvokeLater.call(this,fn,receiver,arg):this._schedule(function(){setTimeout(function(){fn.call(receiver,arg)},100)})},Async.prototype.invoke=function(fn,receiver,arg){this._trampolineEnabled?AsyncInvoke.call(this,fn,receiver,arg):this._schedule(function(){fn.call(receiver,arg)})},Async.prototype.settlePromises=function(promise){this._trampolineEnabled?AsyncSettlePromises.call(this,promise):this._schedule(function(){promise._settlePromises()})}):(Async.prototype.invokeLater=AsyncInvokeLater,Async.prototype.invoke=AsyncInvoke,Async.prototype.settlePromises=AsyncSettlePromises),Async.prototype._drainQueue=function(queue){for(;queue.length()>0;){var fn=queue.shift();if("function"==typeof fn){var receiver=queue.shift(),arg=queue.shift();fn.call(receiver,arg)}else fn._settlePromises()}},Async.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},Async.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},Async.prototype._reset=function(){this._isTickUsed=!1},module.exports=Async,module.exports.firstLineError=firstLineError}).call(this,require("_process"))},{"./queue":72,"./schedule":75,"./util":82,_process:102}],50:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL,tryConvertToPromise,debug){var calledBind=!1,rejectThis=function(_,e){this._reject(e)},targetRejected=function(e,context){context.promiseRejectionQueued=!0,context.bindingPromise._then(rejectThis,rejectThis,null,this,e)},bindingResolved=function(thisArg,context){0===(50397184&this._bitField)&&this._resolveCallback(context.target)},bindingRejected=function(e,context){context.promiseRejectionQueued||this._reject(e)};Promise.prototype.bind=function(thisArg){calledBind||(calledBind=!0,Promise.prototype._propagateFrom=debug.propagateFromFunction(),Promise.prototype._boundValue=debug.boundValueFunction());var maybePromise=tryConvertToPromise(thisArg),ret=new Promise(INTERNAL);ret._propagateFrom(this,1);var target=this._target();if(ret._setBoundTo(maybePromise),maybePromise instanceof Promise){var context={promiseRejectionQueued:!1,promise:ret,target:target,bindingPromise:maybePromise};target._then(INTERNAL,targetRejected,void 0,ret,context),maybePromise._then(bindingResolved,bindingRejected,void 0,ret,context),ret._setOnCancel(maybePromise)}else ret._resolveCallback(target);return ret},Promise.prototype._setBoundTo=function(obj){void 0!==obj?(this._bitField=2097152|this._bitField,this._boundTo=obj):this._bitField=-2097153&this._bitField},Promise.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},Promise.bind=function(thisArg,value){return Promise.resolve(value).bind(thisArg)}}},{}],51:[function(require,module,exports){"use strict";var cr=Object.create;if(cr){var callerCache=cr(null),getterCache=cr(null);callerCache[" size"]=getterCache[" size"]=0}module.exports=function(Promise){function ensureMethod(obj,methodName){var fn;if(null!=obj&&(fn=obj[methodName]),"function"!=typeof fn){var message="Object "+util.classString(obj)+" has no method '"+util.toString(methodName)+"'";throw new Promise.TypeError(message)}return fn}function caller(obj){var methodName=this.pop(),fn=ensureMethod(obj,methodName);return fn.apply(obj,this)}function namedGetter(obj){return obj[this]}function indexedGetter(obj){var index=+this;return 0>index&&(index=Math.max(0,index+obj.length)),obj[index]}var getMethodCaller,getGetter,util=require("./util"),canEvaluate=util.canEvaluate,isIdentifier=util.isIdentifier,makeMethodCaller=function(methodName){return new Function("ensureMethod"," \n return function(obj) { \n 'use strict' \n var len = this.length; \n ensureMethod(obj, 'methodName'); \n switch(len) { \n case 1: return obj.methodName(this[0]); \n case 2: return obj.methodName(this[0], this[1]); \n case 3: return obj.methodName(this[0], this[1], this[2]); \n case 0: return obj.methodName(); \n default: \n return obj.methodName.apply(obj, this); \n } \n }; \n ".replace(/methodName/g,methodName))(ensureMethod)},makeGetter=function(propertyName){return new Function("obj"," \n 'use strict'; \n return obj.propertyName; \n ".replace("propertyName",propertyName))},getCompiled=function(name,compiler,cache){var ret=cache[name];if("function"!=typeof ret){if(!isIdentifier(name))return null;if(ret=compiler(name),cache[name]=ret,cache[" size"]++,cache[" size"]>512){for(var keys=Object.keys(cache),i=0;256>i;++i)delete cache[keys[i]];cache[" size"]=keys.length-256}}return ret};getMethodCaller=function(name){return getCompiled(name,makeMethodCaller,callerCache)},getGetter=function(name){return getCompiled(name,makeGetter,getterCache)},Promise.prototype.call=function(methodName){for(var $_len=arguments.length,args=new Array(Math.max($_len-1,0)),$_i=1;$_len>$_i;++$_i)args[$_i-1]=arguments[$_i];if(canEvaluate){var maybeCaller=getMethodCaller(methodName);if(null!==maybeCaller)return this._then(maybeCaller,void 0,void 0,args,void 0)}return args.push(methodName),this._then(caller,void 0,void 0,args,void 0)},Promise.prototype.get=function(propertyName){var getter,isIndex="number"==typeof propertyName;if(isIndex)getter=indexedGetter;else if(canEvaluate){var maybeGetter=getGetter(propertyName);getter=null!==maybeGetter?maybeGetter:namedGetter}else getter=namedGetter;return this._then(getter,void 0,void 0,propertyName,void 0)}}},{"./util":82}],52:[function(require,module,exports){"use strict";module.exports=function(Promise,PromiseArray,apiRejection,debug){var util=require("./util"),tryCatch=util.tryCatch,errorObj=util.errorObj,async=Promise._async;Promise.prototype["break"]=Promise.prototype.cancel=function(){if(!debug.cancellation())return this._warn("cancellation is disabled");for(var promise=this,child=promise;promise._isCancellable();){if(!promise._cancelBy(child)){child._isFollowing()?child._followee().cancel():child._cancelBranched();break}var parent=promise._cancellationParent;if(null==parent||!parent._isCancellable()){promise._isFollowing()?promise._followee().cancel():promise._cancelBranched();break}promise._isFollowing()&&promise._followee().cancel(),promise._setWillBeCancelled(),child=promise,promise=parent}},Promise.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},Promise.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},Promise.prototype._cancelBy=function(canceller){return canceller===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},Promise.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},Promise.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),async.invoke(this._cancelPromises,this,void 0))},Promise.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},Promise.prototype._unsetOnCancel=function(){this._onCancelField=void 0},Promise.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},Promise.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},Promise.prototype._doInvokeOnCancel=function(onCancelCallback,internalOnly){if(util.isArray(onCancelCallback))for(var i=0;i=0?contextStack[lastIndex]:void 0}var longStackTraces=!1,contextStack=[];return Promise.prototype._promiseCreated=function(){},Promise.prototype._pushContext=function(){},Promise.prototype._popContext=function(){return null},Promise._peekContext=Promise.prototype._peekContext=function(){},Context.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,contextStack.push(this._trace))},Context.prototype._popContext=function(){if(void 0!==this._trace){var trace=contextStack.pop(),ret=trace._promiseCreated;return trace._promiseCreated=null,ret}return null},Context.CapturedTrace=null,Context.create=createContext,Context.deactivateLongStackTraces=function(){},Context.activateLongStackTraces=function(){var Promise_pushContext=Promise.prototype._pushContext,Promise_popContext=Promise.prototype._popContext,Promise_PeekContext=Promise._peekContext,Promise_peekContext=Promise.prototype._peekContext,Promise_promiseCreated=Promise.prototype._promiseCreated;Context.deactivateLongStackTraces=function(){Promise.prototype._pushContext=Promise_pushContext,Promise.prototype._popContext=Promise_popContext,Promise._peekContext=Promise_PeekContext,Promise.prototype._peekContext=Promise_peekContext,Promise.prototype._promiseCreated=Promise_promiseCreated,longStackTraces=!1},longStackTraces=!0,Promise.prototype._pushContext=Context.prototype._pushContext,Promise.prototype._popContext=Context.prototype._popContext,Promise._peekContext=Promise.prototype._peekContext=peekContext,Promise.prototype._promiseCreated=function(){var ctx=this._peekContext();ctx&&null==ctx._promiseCreated&&(ctx._promiseCreated=this)}},Context}},{}],55:[function(require,module,exports){(function(process){"use strict";module.exports=function(Promise,Context){function generatePromiseLifecycleEventObject(name,promise){return{promise:promise}}function defaultFireEvent(){return!1}function cancellationExecute(executor,resolve,reject){var promise=this;try{executor(resolve,reject,function(onCancel){if("function"!=typeof onCancel)throw new TypeError("onCancel must be a function, got: "+util.toString(onCancel));promise._attachCancellationCallback(onCancel)})}catch(e){return e}}function cancellationAttachCancellationCallback(onCancel){if(!this._isCancellable())return this;var previousOnCancel=this._onCancel();void 0!==previousOnCancel?util.isArray(previousOnCancel)?previousOnCancel.push(onCancel):this._setOnCancel([previousOnCancel,onCancel]):this._setOnCancel(onCancel)}function cancellationOnCancel(){return this._onCancelField}function cancellationSetOnCancel(onCancel){this._onCancelField=onCancel}function cancellationClearCancellationData(){this._cancellationParent=void 0,this._onCancelField=void 0}function cancellationPropagateFrom(parent,flags){if(0!==(1&flags)){this._cancellationParent=parent;var branchesRemainingToCancel=parent._branchesRemainingToCancel;void 0===branchesRemainingToCancel&&(branchesRemainingToCancel=0),parent._branchesRemainingToCancel=branchesRemainingToCancel+1}0!==(2&flags)&&parent._isBound()&&this._setBoundTo(parent._boundTo)}function bindingPropagateFrom(parent,flags){0!==(2&flags)&&parent._isBound()&&this._setBoundTo(parent._boundTo)}function boundValueFunction(){var ret=this._boundTo;return void 0!==ret&&ret instanceof Promise?ret.isFulfilled()?ret.value():void 0:ret}function longStackTracesCaptureStackTrace(){this._trace=new CapturedTrace(this._peekContext())}function longStackTracesAttachExtraTrace(error,ignoreSelf){if(canAttachTrace(error)){var trace=this._trace;if(void 0!==trace&&ignoreSelf&&(trace=trace._parent),void 0!==trace)trace.attachExtraTrace(error);else if(!error.__stackCleaned__){var parsed=parseStackAndMessage(error);util.notEnumerableProp(error,"stack",parsed.message+"\n"+parsed.stack.join("\n")),util.notEnumerableProp(error,"__stackCleaned__",!0)}}}function checkForgottenReturns(returnValue,promiseCreated,name,promise,parent){if(void 0===returnValue&&null!==promiseCreated&&wForgottenReturn){if(void 0!==parent&&parent._returnedNonUndefined())return;if(0===(65535&promise._bitField))return;name&&(name+=" ");var handlerLine="",creatorLine="";if(promiseCreated._trace){for(var traceLines=promiseCreated._trace.stack.split("\n"),stack=cleanStack(traceLines),i=stack.length-1;i>=0;--i){var line=stack[i];if(!nodeFramePattern.test(line)){var lineMatches=line.match(parseLinePattern);lineMatches&&(handlerLine="at "+lineMatches[1]+":"+lineMatches[2]+":"+lineMatches[3]+" ");break}}if(stack.length>0)for(var firstUserLine=stack[0],i=0;i0&&(creatorLine="\n"+traceLines[i-1]);break}}var msg="a promise was created in a "+name+"handler "+handlerLine+"but was not returned from it, see http://goo.gl/rRqMUw"+creatorLine;promise._warn(msg,!0,promiseCreated)}}function deprecated(name,replacement){var message=name+" is deprecated and will be removed in a future version.";return replacement&&(message+=" Use "+replacement+" instead."),warn(message)}function warn(message,shouldUseOwnTrace,promise){if(config.warnings){var ctx,warning=new Warning(message);if(shouldUseOwnTrace)promise._attachExtraTrace(warning);else if(config.longStackTraces&&(ctx=Promise._peekContext()))ctx.attachExtraTrace(warning);else{var parsed=parseStackAndMessage(warning);warning.stack=parsed.message+"\n"+parsed.stack.join("\n")}activeFireEvent("warning",warning)||formatAndLogError(warning,"",!0)}}function reconstructStack(message,stacks){for(var i=0;i=0;--j)if(prev[j]===currentLastLine){commonRootMeetPoint=j;break}for(var j=commonRootMeetPoint;j>=0;--j){var line=prev[j];if(current[currentLastIndex]!==line)break;current.pop(),currentLastIndex--}current=prev}}function cleanStack(stack){for(var ret=[],i=0;i0&&"SyntaxError"!=error.name&&(stack=stack.slice(i)),stack}function parseStackAndMessage(error){ +var stack=error.stack,message=error.toString();return stack="string"==typeof stack&&stack.length>0?stackFramesAsArray(error):[" (No stack trace)"],{message:message,stack:"SyntaxError"==error.name?stack:cleanStack(stack)}}function formatAndLogError(error,title,isSoft){if("undefined"!=typeof console){var message;if(util.isObject(error)){var stack=error.stack;message=title+formatStack(stack,error)}else message=title+String(error);"function"==typeof printWarning?printWarning(message,isSoft):("function"==typeof console.log||"object"==typeof console.log)&&console.log(message)}}function fireRejectionEvent(name,localHandler,reason,promise){var localEventFired=!1;try{"function"==typeof localHandler&&(localEventFired=!0,"rejectionHandled"===name?localHandler(promise):localHandler(reason,promise))}catch(e){async.throwLater(e)}"unhandledRejection"===name?activeFireEvent(name,reason,promise)||localEventFired||formatAndLogError(reason,"Unhandled rejection "):activeFireEvent(name,promise)}function formatNonError(obj){var str;if("function"==typeof obj)str="[function "+(obj.name||"anonymous")+"]";else{str=obj&&"function"==typeof obj.toString?obj.toString():util.toString(obj);var ruselessToString=/\[object [a-zA-Z0-9$_]+\]/;if(ruselessToString.test(str))try{var newStr=JSON.stringify(obj);str=newStr}catch(e){}0===str.length&&(str="(empty array)")}return"(<"+snip(str)+">, no stack trace)"}function snip(str){var maxChars=41;return str.lengthfirstIndex||0>lastIndex||!firstFileName||!lastFileName||firstFileName!==lastFileName||firstIndex>=lastIndex||(shouldIgnore=function(line){if(bluebirdFramePattern.test(line))return!0;var info=parseLineInfo(line);return info&&info.fileName===firstFileName&&firstIndex<=info.line&&info.line<=lastIndex?!0:!1})}}function CapturedTrace(parent){this._parent=parent,this._promisesCreated=0;var length=this._length=1+(void 0===parent?0:parent._length);captureStackTrace(this,CapturedTrace),length>32&&this.uncycle()}var unhandledRejectionHandled,possiblyUnhandledRejection,printWarning,getDomain=Promise._getDomain,async=Promise._async,Warning=require("./errors").Warning,util=require("./util"),canAttachTrace=util.canAttachTrace,bluebirdFramePattern=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,nodeFramePattern=/\((?:timers\.js):\d+:\d+\)/,parseLinePattern=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,stackFramePattern=null,formatStack=null,indentStackFrames=!1,debugging=!(0==util.env("BLUEBIRD_DEBUG")||!util.env("BLUEBIRD_DEBUG")&&"development"!==util.env("NODE_ENV")),warnings=!(0==util.env("BLUEBIRD_WARNINGS")||!debugging&&!util.env("BLUEBIRD_WARNINGS")),longStackTraces=!(0==util.env("BLUEBIRD_LONG_STACK_TRACES")||!debugging&&!util.env("BLUEBIRD_LONG_STACK_TRACES")),wForgottenReturn=0!=util.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(warnings||!!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));Promise.prototype.suppressUnhandledRejections=function(){var target=this._target();target._bitField=-1048577&target._bitField|524288},Promise.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),async.invokeLater(this._notifyUnhandledRejection,this,void 0))},Promise.prototype._notifyUnhandledRejectionIsHandled=function(){fireRejectionEvent("rejectionHandled",unhandledRejectionHandled,void 0,this)},Promise.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},Promise.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},Promise.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var reason=this._settledValue();this._setUnhandledRejectionIsNotified(),fireRejectionEvent("unhandledRejection",possiblyUnhandledRejection,reason,this)}},Promise.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},Promise.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},Promise.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},Promise.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},Promise.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},Promise.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},Promise.prototype._warn=function(message,shouldUseOwnTrace,promise){return warn(message,shouldUseOwnTrace,promise||this)},Promise.onPossiblyUnhandledRejection=function(fn){var domain=getDomain();possiblyUnhandledRejection="function"==typeof fn?null===domain?fn:util.domainBind(domain,fn):void 0},Promise.onUnhandledRejectionHandled=function(fn){var domain=getDomain();unhandledRejectionHandled="function"==typeof fn?null===domain?fn:util.domainBind(domain,fn):void 0};var disableLongStackTraces=function(){};Promise.longStackTraces=function(){if(async.haveItemsQueued()&&!config.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!config.longStackTraces&&longStackTracesIsSupported()){var Promise_captureStackTrace=Promise.prototype._captureStackTrace,Promise_attachExtraTrace=Promise.prototype._attachExtraTrace;config.longStackTraces=!0,disableLongStackTraces=function(){if(async.haveItemsQueued()&&!config.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");Promise.prototype._captureStackTrace=Promise_captureStackTrace,Promise.prototype._attachExtraTrace=Promise_attachExtraTrace,Context.deactivateLongStackTraces(),async.enableTrampoline(),config.longStackTraces=!1},Promise.prototype._captureStackTrace=longStackTracesCaptureStackTrace,Promise.prototype._attachExtraTrace=longStackTracesAttachExtraTrace,Context.activateLongStackTraces(),async.disableTrampolineIfNecessary()}},Promise.hasLongStackTraces=function(){return config.longStackTraces&&longStackTracesIsSupported()};var fireDomEvent=function(){try{if("function"==typeof CustomEvent){var event=new CustomEvent("CustomEvent");return util.global.dispatchEvent(event),function(name,event){var domEvent=new CustomEvent(name.toLowerCase(),{detail:event,cancelable:!0});return!util.global.dispatchEvent(domEvent)}}if("function"==typeof Event){var event=new Event("CustomEvent");return util.global.dispatchEvent(event),function(name,event){var domEvent=new Event(name.toLowerCase(),{cancelable:!0});return domEvent.detail=event,!util.global.dispatchEvent(domEvent)}}var event=document.createEvent("CustomEvent");return event.initCustomEvent("testingtheevent",!1,!0,{}),util.global.dispatchEvent(event),function(name,event){var domEvent=document.createEvent("CustomEvent");return domEvent.initCustomEvent(name.toLowerCase(),!1,!0,event),!util.global.dispatchEvent(domEvent)}}catch(e){}return function(){return!1}}(),fireGlobalEvent=function(){return util.isNode?function(){return process.emit.apply(process,arguments)}:util.global?function(name){var methodName="on"+name.toLowerCase(),method=util.global[methodName];return method?(method.apply(util.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),eventToObjectGenerator={promiseCreated:generatePromiseLifecycleEventObject,promiseFulfilled:generatePromiseLifecycleEventObject,promiseRejected:generatePromiseLifecycleEventObject,promiseResolved:generatePromiseLifecycleEventObject,promiseCancelled:generatePromiseLifecycleEventObject,promiseChained:function(name,promise,child){return{promise:promise,child:child}},warning:function(name,warning){return{warning:warning}},unhandledRejection:function(name,reason,promise){return{reason:reason,promise:promise}},rejectionHandled:generatePromiseLifecycleEventObject},activeFireEvent=function(name){var globalEventFired=!1;try{globalEventFired=fireGlobalEvent.apply(null,arguments)}catch(e){async.throwLater(e),globalEventFired=!0}var domEventFired=!1;try{domEventFired=fireDomEvent(name,eventToObjectGenerator[name].apply(null,arguments))}catch(e){async.throwLater(e),domEventFired=!0}return domEventFired||globalEventFired};Promise.config=function(opts){if(opts=Object(opts),"longStackTraces"in opts&&(opts.longStackTraces?Promise.longStackTraces():!opts.longStackTraces&&Promise.hasLongStackTraces()&&disableLongStackTraces()),"warnings"in opts){var warningsOption=opts.warnings;config.warnings=!!warningsOption,wForgottenReturn=config.warnings,util.isObject(warningsOption)&&"wForgottenReturn"in warningsOption&&(wForgottenReturn=!!warningsOption.wForgottenReturn)}if("cancellation"in opts&&opts.cancellation&&!config.cancellation){if(async.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");Promise.prototype._clearCancellationData=cancellationClearCancellationData,Promise.prototype._propagateFrom=cancellationPropagateFrom,Promise.prototype._onCancel=cancellationOnCancel,Promise.prototype._setOnCancel=cancellationSetOnCancel,Promise.prototype._attachCancellationCallback=cancellationAttachCancellationCallback,Promise.prototype._execute=cancellationExecute,propagateFromFunction=cancellationPropagateFrom,config.cancellation=!0}return"monitoring"in opts&&(opts.monitoring&&!config.monitoring?(config.monitoring=!0,Promise.prototype._fireEvent=activeFireEvent):!opts.monitoring&&config.monitoring&&(config.monitoring=!1,Promise.prototype._fireEvent=defaultFireEvent)),Promise},Promise.prototype._fireEvent=defaultFireEvent,Promise.prototype._execute=function(executor,resolve,reject){try{executor(resolve,reject)}catch(e){return e}},Promise.prototype._onCancel=function(){},Promise.prototype._setOnCancel=function(handler){},Promise.prototype._attachCancellationCallback=function(onCancel){},Promise.prototype._captureStackTrace=function(){},Promise.prototype._attachExtraTrace=function(){},Promise.prototype._clearCancellationData=function(){},Promise.prototype._propagateFrom=function(parent,flags){};var propagateFromFunction=bindingPropagateFrom,shouldIgnore=function(){return!1},parseLineInfoRegex=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;util.inherits(CapturedTrace,Error),Context.CapturedTrace=CapturedTrace,CapturedTrace.prototype.uncycle=function(){var length=this._length;if(!(2>length)){for(var nodes=[],stackToIndex={},i=0,node=this;void 0!==node;++i)nodes.push(node),node=node._parent;length=this._length=i;for(var i=length-1;i>=0;--i){var stack=nodes[i].stack;void 0===stackToIndex[stack]&&(stackToIndex[stack]=i)}for(var i=0;length>i;++i){var currentStack=nodes[i].stack,index=stackToIndex[currentStack];if(void 0!==index&&index!==i){index>0&&(nodes[index-1]._parent=void 0,nodes[index-1]._length=1),nodes[i]._parent=void 0,nodes[i]._length=1;var cycleEdgeNode=i>0?nodes[i-1]:this;length-1>index?(cycleEdgeNode._parent=nodes[index+1],cycleEdgeNode._parent.uncycle(),cycleEdgeNode._length=cycleEdgeNode._parent._length+1):(cycleEdgeNode._parent=void 0,cycleEdgeNode._length=1);for(var currentChildLength=cycleEdgeNode._length+1,j=i-2;j>=0;--j)nodes[j]._length=currentChildLength,currentChildLength++;return}}}},CapturedTrace.prototype.attachExtraTrace=function(error){if(!error.__stackCleaned__){this.uncycle();for(var parsed=parseStackAndMessage(error),message=parsed.message,stacks=[parsed.stack],trace=this;void 0!==trace;)stacks.push(cleanStack(trace.stack.split("\n"))),trace=trace._parent;removeCommonRoots(stacks),removeDuplicateOrEmptyJumps(stacks),util.notEnumerableProp(error,"stack",reconstructStack(message,stacks)),util.notEnumerableProp(error,"__stackCleaned__",!0)}};var captureStackTrace=function(){var v8stackFramePattern=/^\s*at\s*/,v8stackFormatter=function(stack,error){return"string"==typeof stack?stack:void 0!==error.name&&void 0!==error.message?error.toString():formatNonError(error)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,stackFramePattern=v8stackFramePattern,formatStack=v8stackFormatter;var captureStackTrace=Error.captureStackTrace;return shouldIgnore=function(line){return bluebirdFramePattern.test(line)},function(receiver,ignoreUntil){Error.stackTraceLimit+=6,captureStackTrace(receiver,ignoreUntil),Error.stackTraceLimit-=6}}var err=new Error;if("string"==typeof err.stack&&err.stack.split("\n")[0].indexOf("stackDetection@")>=0)return stackFramePattern=/@/,formatStack=v8stackFormatter,indentStackFrames=!0,function(o){o.stack=(new Error).stack};var hasStackAfterThrow;try{throw new Error}catch(e){hasStackAfterThrow="stack"in e}return"stack"in err||!hasStackAfterThrow||"number"!=typeof Error.stackTraceLimit?(formatStack=function(stack,error){return"string"==typeof stack?stack:"object"!=typeof error&&"function"!=typeof error||void 0===error.name||void 0===error.message?formatNonError(error):error.toString()},null):(stackFramePattern=v8stackFramePattern,formatStack=v8stackFormatter,function(o){Error.stackTraceLimit+=6;try{throw new Error}catch(e){o.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(printWarning=function(message){console.warn(message)},util.isNode&&process.stderr.isTTY?printWarning=function(message,isSoft){var color=isSoft?"":"";console.warn(color+message+"\n")}:util.isNode||"string"!=typeof(new Error).stack||(printWarning=function(message,isSoft){console.warn("%c"+message,isSoft?"color: darkorange":"color: red")}));var config={warnings:warnings,longStackTraces:!1,cancellation:!1,monitoring:!1};return longStackTraces&&Promise.longStackTraces(),{longStackTraces:function(){return config.longStackTraces},warnings:function(){return config.warnings},cancellation:function(){return config.cancellation},monitoring:function(){return config.monitoring},propagateFromFunction:function(){return propagateFromFunction},boundValueFunction:function(){return boundValueFunction},checkForgottenReturns:checkForgottenReturns,setBounds:setBounds,warn:warn,deprecated:deprecated,CapturedTrace:CapturedTrace,fireDomEvent:fireDomEvent,fireGlobalEvent:fireGlobalEvent}}}).call(this,require("_process"))},{"./errors":58,"./util":82,_process:102}],56:[function(require,module,exports){"use strict";module.exports=function(Promise){function returner(){return this.value}function thrower(){throw this.reason}Promise.prototype["return"]=Promise.prototype.thenReturn=function(value){return value instanceof Promise&&value.suppressUnhandledRejections(),this._then(returner,void 0,void 0,{value:value},void 0)},Promise.prototype["throw"]=Promise.prototype.thenThrow=function(reason){return this._then(thrower,void 0,void 0,{reason:reason},void 0)},Promise.prototype.catchThrow=function(reason){if(arguments.length<=1)return this._then(void 0,thrower,void 0,{reason:reason},void 0);var _reason=arguments[1],handler=function(){throw _reason};return this.caught(reason,handler)},Promise.prototype.catchReturn=function(value){if(arguments.length<=1)return value instanceof Promise&&value.suppressUnhandledRejections(),this._then(void 0,returner,void 0,{value:value},void 0);var _value=arguments[1];_value instanceof Promise&&_value.suppressUnhandledRejections();var handler=function(){return _value};return this.caught(value,handler)}}},{}],57:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL){function promiseAllThis(){return PromiseAll(this)}function PromiseMapSeries(promises,fn){return PromiseReduce(promises,fn,INTERNAL,INTERNAL)}var PromiseReduce=Promise.reduce,PromiseAll=Promise.all;Promise.prototype.each=function(fn){return PromiseReduce(this,fn,INTERNAL,0)._then(promiseAllThis,void 0,void 0,this,void 0)},Promise.prototype.mapSeries=function(fn){return PromiseReduce(this,fn,INTERNAL,INTERNAL)},Promise.each=function(promises,fn){return PromiseReduce(promises,fn,INTERNAL,0)._then(promiseAllThis,void 0,void 0,promises,void 0)},Promise.mapSeries=PromiseMapSeries}},{}],58:[function(require,module,exports){"use strict";function subError(nameProperty,defaultMessage){function SubError(message){return this instanceof SubError?(notEnumerableProp(this,"message","string"==typeof message?message:defaultMessage),notEnumerableProp(this,"name",nameProperty),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new SubError(message)}return inherits(SubError,Error),SubError}function OperationalError(message){return this instanceof OperationalError?(notEnumerableProp(this,"name","OperationalError"),notEnumerableProp(this,"message",message),this.cause=message,this.isOperational=!0,void(message instanceof Error?(notEnumerableProp(this,"message",message.message),notEnumerableProp(this,"stack",message.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new OperationalError(message)}var _TypeError,_RangeError,es5=require("./es5"),Objectfreeze=es5.freeze,util=require("./util"),inherits=util.inherits,notEnumerableProp=util.notEnumerableProp,Warning=subError("Warning","warning"),CancellationError=subError("CancellationError","cancellation error"),TimeoutError=subError("TimeoutError","timeout error"),AggregateError=subError("AggregateError","aggregate error");try{_TypeError=TypeError,_RangeError=RangeError}catch(e){_TypeError=subError("TypeError","type error"),_RangeError=subError("RangeError","range error")}for(var methods="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),i=0;i1?ctx.cancelPromise._reject(reason):ctx.cancelPromise._cancel(),ctx.cancelPromise=null,!0):!1}function succeed(){return finallyHandler.call(this,this.promise._target()._settledValue())}function fail(reason){return checkCancel(this,reason)?void 0:(errorObj.e=reason,errorObj)}function finallyHandler(reasonOrValue){var promise=this.promise,handler=this.handler;if(!this.called){this.called=!0;var ret=this.isFinallyHandler()?handler.call(promise._boundValue()):handler.call(promise._boundValue(),reasonOrValue);if(void 0!==ret){promise._setReturnedNonUndefined();var maybePromise=tryConvertToPromise(ret,promise);if(maybePromise instanceof Promise){if(null!=this.cancelPromise){if(maybePromise._isCancelled()){var reason=new CancellationError("late cancellation observer");return promise._attachExtraTrace(reason),errorObj.e=reason,errorObj}maybePromise.isPending()&&maybePromise._attachCancellationCallback(new FinallyHandlerCancelReaction(this))}return maybePromise._then(succeed,fail,void 0,this,void 0)}}}return promise.isRejected()?(checkCancel(this),errorObj.e=reasonOrValue,errorObj):(checkCancel(this),reasonOrValue)}var util=require("./util"),CancellationError=Promise.CancellationError,errorObj=util.errorObj;return PassThroughHandlerContext.prototype.isFinallyHandler=function(){return 0===this.type},FinallyHandlerCancelReaction.prototype._resultCancelled=function(){checkCancel(this.finallyHandler)},Promise.prototype._passThrough=function(handler,type,success,fail){return"function"!=typeof handler?this.then():this._then(success,fail,void 0,new PassThroughHandlerContext(this,type,handler),void 0)},Promise.prototype.lastly=Promise.prototype["finally"]=function(handler){return this._passThrough(handler,0,finallyHandler,finallyHandler)},Promise.prototype.tap=function(handler){return this._passThrough(handler,1,finallyHandler)},PassThroughHandlerContext}},{"./util":82}],62:[function(require,module,exports){"use strict";module.exports=function(Promise,apiRejection,INTERNAL,tryConvertToPromise,Proxyable,debug){function promiseFromYieldHandler(value,yieldHandlers,traceParent){for(var i=0;ii;++i)holderClasses.push(generateHolderClass(i+1)),thenCallbacks.push(thenCallback(i+1)),promiseSetters.push(promiseSetter(i+1));reject=function(reason){this._reject(reason)}}Promise.join=function(){var fn,last=arguments.length-1;if(last>0&&"function"==typeof arguments[last]&&(fn=arguments[last],8>=last&&canEvaluate)){var ret=new Promise(INTERNAL);ret._captureStackTrace();for(var HolderClass=holderClasses[last-1],holder=new HolderClass(fn),callbacks=thenCallbacks,i=0;last>i;++i){var maybePromise=tryConvertToPromise(arguments[i],ret);if(maybePromise instanceof Promise){maybePromise=maybePromise._target();var bitField=maybePromise._bitField;0===(50397184&bitField)?(maybePromise._then(callbacks[i],reject,void 0,ret,holder),promiseSetters[i](maybePromise,holder),holder.asyncNeeded=!1):0!==(33554432&bitField)?callbacks[i].call(ret,maybePromise._value(),holder):0!==(16777216&bitField)?ret._reject(maybePromise._reason()):ret._cancel()}else callbacks[i].call(ret,maybePromise,holder)}if(!ret._isFateSealed()){if(holder.asyncNeeded){var domain=getDomain();null!==domain&&(holder.fn=util.domainBind(domain,holder.fn))}ret._setAsyncGuaranteed(),ret._setOnCancel(holder)}return ret}for(var $_len=arguments.length,args=new Array($_len),$_i=0;$_len>$_i;++$_i)args[$_i]=arguments[$_i];fn&&args.pop();var ret=new PromiseArray(args).promise();return void 0!==fn?ret.spread(fn):ret}}},{"./util":82}],64:[function(require,module,exports){"use strict";module.exports=function(Promise,PromiseArray,apiRejection,tryConvertToPromise,INTERNAL,debug){function MappingPromiseArray(promises,fn,limit,_filter){this.constructor$(promises),this._promise._captureStackTrace();var domain=getDomain();this._callback=null===domain?fn:util.domainBind(domain,fn),this._preservedValues=_filter===INTERNAL?new Array(this.length()):null,this._limit=limit,this._inFlight=0,this._queue=[],async.invoke(this._asyncInit,this,void 0)}function map(promises,fn,options,_filter){if("function"!=typeof fn)return apiRejection("expecting a function but got "+util.classString(fn));var limit=0;if(void 0!==options){if("object"!=typeof options||null===options)return Promise.reject(new TypeError("options argument must be an object but it is "+util.classString(options)));if("number"!=typeof options.concurrency)return Promise.reject(new TypeError("'concurrency' must be a number but it is "+util.classString(options.concurrency)));limit=options.concurrency}return limit="number"==typeof limit&&isFinite(limit)&&limit>=1?limit:0,new MappingPromiseArray(promises,fn,limit,_filter).promise()}var getDomain=Promise._getDomain,util=require("./util"),tryCatch=util.tryCatch,errorObj=util.errorObj,async=Promise._async;util.inherits(MappingPromiseArray,PromiseArray),MappingPromiseArray.prototype._asyncInit=function(){this._init$(void 0,-2)},MappingPromiseArray.prototype._init=function(){},MappingPromiseArray.prototype._promiseFulfilled=function(value,index){var values=this._values,length=this.length(),preservedValues=this._preservedValues,limit=this._limit;if(0>index){if(index=-1*index-1,values[index]=value,limit>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(limit>=1&&this._inFlight>=limit)return values[index]=value,this._queue.push(index),!1;null!==preservedValues&&(preservedValues[index]=value);var promise=this._promise,callback=this._callback,receiver=promise._boundValue();promise._pushContext();var ret=tryCatch(callback).call(receiver,value,index,length),promiseCreated=promise._popContext();if(debug.checkForgottenReturns(ret,promiseCreated,null!==preservedValues?"Promise.filter":"Promise.map",promise),ret===errorObj)return this._reject(ret.e),!0;var maybePromise=tryConvertToPromise(ret,this._promise);if(maybePromise instanceof Promise){maybePromise=maybePromise._target();var bitField=maybePromise._bitField;if(0===(50397184&bitField))return limit>=1&&this._inFlight++,values[index]=maybePromise,maybePromise._proxy(this,-1*(index+1)),!1;if(0===(33554432&bitField))return 0!==(16777216&bitField)?(this._reject(maybePromise._reason()),!0):(this._cancel(),!0);ret=maybePromise._value()}values[index]=ret}var totalResolved=++this._totalResolved;return totalResolved>=length?(null!==preservedValues?this._filter(values,preservedValues):this._resolve(values),!0):!1},MappingPromiseArray.prototype._drainQueue=function(){for(var queue=this._queue,limit=this._limit,values=this._values;queue.length>0&&this._inFlighti;++i)booleans[i]&&(ret[j++]=values[i]);ret.length=j,this._resolve(ret)},MappingPromiseArray.prototype.preservedValues=function(){return this._preservedValues},Promise.prototype.map=function(fn,options){return map(this,fn,options,null)},Promise.map=function(promises,fn,options,_filter){return map(promises,fn,options,_filter)}}},{"./util":82}],65:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL,tryConvertToPromise,apiRejection,debug){var util=require("./util"),tryCatch=util.tryCatch;Promise.method=function(fn){if("function"!=typeof fn)throw new Promise.TypeError("expecting a function but got "+util.classString(fn));return function(){var ret=new Promise(INTERNAL);ret._captureStackTrace(),ret._pushContext();var value=tryCatch(fn).apply(this,arguments),promiseCreated=ret._popContext();return debug.checkForgottenReturns(value,promiseCreated,"Promise.method",ret),ret._resolveFromSyncValue(value),ret}},Promise.attempt=Promise["try"]=function(fn){if("function"!=typeof fn)return apiRejection("expecting a function but got "+util.classString(fn));var ret=new Promise(INTERNAL);ret._captureStackTrace(),ret._pushContext();var value;if(arguments.length>1){debug.deprecated("calling Promise.try with more than 1 argument");var arg=arguments[1],ctx=arguments[2];value=util.isArray(arg)?tryCatch(fn).apply(ctx,arg):tryCatch(fn).call(ctx,arg)}else value=tryCatch(fn)();var promiseCreated=ret._popContext();return debug.checkForgottenReturns(value,promiseCreated,"Promise.try",ret),ret._resolveFromSyncValue(value),ret},Promise.prototype._resolveFromSyncValue=function(value){value===util.errorObj?this._rejectCallback(value.e,!1):this._resolveCallback(value,!0)}}},{"./util":82}],66:[function(require,module,exports){"use strict";function isUntypedError(obj){return obj instanceof Error&&es5.getPrototypeOf(obj)===Error.prototype}function wrapAsOperationalError(obj){var ret;if(isUntypedError(obj)){ret=new OperationalError(obj),ret.name=obj.name,ret.message=obj.message,ret.stack=obj.stack;for(var keys=es5.keys(obj),i=0;i$_i;++$_i)args[$_i-1]=arguments[$_i];promise._fulfill(args)}else promise._fulfill(value);promise=null}}}var util=require("./util"),maybeWrapAsError=util.maybeWrapAsError,errors=require("./errors"),OperationalError=errors.OperationalError,es5=require("./es5"),rErrorKey=/^(?:name|message|stack|cause)$/;module.exports=nodebackForPromise},{"./errors":58,"./es5":59,"./util":82}],67:[function(require,module,exports){"use strict";module.exports=function(Promise){function spreadAdapter(val,nodeback){var promise=this;if(!util.isArray(val))return successAdapter.call(promise,val,nodeback);var ret=tryCatch(nodeback).apply(promise._boundValue(),[null].concat(val));ret===errorObj&&async.throwLater(ret.e)}function successAdapter(val,nodeback){var promise=this,receiver=promise._boundValue(),ret=void 0===val?tryCatch(nodeback).call(receiver,null):tryCatch(nodeback).call(receiver,null,val);ret===errorObj&&async.throwLater(ret.e)}function errorAdapter(reason,nodeback){var promise=this;if(!reason){var newReason=new Error(reason+"");newReason.cause=reason,reason=newReason}var ret=tryCatch(nodeback).call(promise._boundValue(),reason);ret===errorObj&&async.throwLater(ret.e)}var util=require("./util"),async=Promise._async,tryCatch=util.tryCatch,errorObj=util.errorObj;Promise.prototype.asCallback=Promise.prototype.nodeify=function(nodeback,options){if("function"==typeof nodeback){var adapter=successAdapter;void 0!==options&&Object(options).spread&&(adapter=spreadAdapter),this._then(adapter,errorAdapter,void 0,this,nodeback)}return this}}},{"./util":82}],68:[function(require,module,exports){(function(process){"use strict";module.exports=function(){function Proxyable(){}function check(self,executor){if("function"!=typeof executor)throw new TypeError("expecting a function but got "+util.classString(executor));if(self.constructor!==Promise)throw new TypeError("the promise constructor cannot be invoked directly\n\n See http://goo.gl/MqrFmX\n")}function Promise(executor){this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,executor!==INTERNAL&&(check(this,executor),this._resolveFromExecutor(executor)),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function deferResolve(v){this.promise._resolveCallback(v)}function deferReject(v){this.promise._rejectCallback(v,!1)}function fillTypes(value){var p=new Promise(INTERNAL);p._fulfillmentHandler0=value,p._rejectionHandler0=value,p._promise0=value,p._receiver0=value}var getDomain,makeSelfResolutionError=function(){return new TypeError("circular promise resolution chain\n\n See http://goo.gl/MqrFmX\n")},reflectHandler=function(){return new Promise.PromiseInspection(this._target())},apiRejection=function(msg){return Promise.reject(new TypeError(msg))},UNDEFINED_BINDING={},util=require("./util");getDomain=util.isNode?function(){var ret=process.domain;return void 0===ret&&(ret=null),ret}:function(){return null},util.notEnumerableProp(Promise,"_getDomain",getDomain);var es5=require("./es5"),Async=require("./async"),async=new Async;es5.defineProperty(Promise,"_async",{value:async});var errors=require("./errors"),TypeError=Promise.TypeError=errors.TypeError;Promise.RangeError=errors.RangeError;var CancellationError=Promise.CancellationError=errors.CancellationError;Promise.TimeoutError=errors.TimeoutError,Promise.OperationalError=errors.OperationalError,Promise.RejectionError=errors.OperationalError,Promise.AggregateError=errors.AggregateError;var INTERNAL=function(){},APPLY={},NEXT_FILTER={},tryConvertToPromise=require("./thenables")(Promise,INTERNAL),PromiseArray=require("./promise_array")(Promise,INTERNAL,tryConvertToPromise,apiRejection,Proxyable),Context=require("./context")(Promise),createContext=Context.create,debug=require("./debuggability")(Promise,Context),PassThroughHandlerContext=(debug.CapturedTrace,require("./finally")(Promise,tryConvertToPromise)),catchFilter=require("./catch_filter")(NEXT_FILTER),nodebackForPromise=require("./nodeback"),errorObj=util.errorObj,tryCatch=util.tryCatch;return Promise.prototype.toString=function(){return"[object Promise]"},Promise.prototype.caught=Promise.prototype["catch"]=function(fn){var len=arguments.length;if(len>1){var i,catchInstances=new Array(len-1),j=0;for(i=0;len-1>i;++i){var item=arguments[i];if(!util.isObject(item))return apiRejection("expecting an object but got A catch statement predicate "+util.classString(item));catchInstances[j++]=item}return catchInstances.length=j,fn=arguments[i],this.then(void 0,catchFilter(catchInstances,fn,this))}return this.then(void 0,fn)},Promise.prototype.reflect=function(){return this._then(reflectHandler,reflectHandler,void 0,this,void 0)},Promise.prototype.then=function(didFulfill,didReject){if(debug.warnings()&&arguments.length>0&&"function"!=typeof didFulfill&&"function"!=typeof didReject){var msg=".then() only accepts functions but was passed: "+util.classString(didFulfill);arguments.length>1&&(msg+=", "+util.classString(didReject)),this._warn(msg)}return this._then(didFulfill,didReject,void 0,void 0,void 0)},Promise.prototype.done=function(didFulfill,didReject){var promise=this._then(didFulfill,didReject,void 0,void 0,void 0);promise._setIsFinal()},Promise.prototype.spread=function(fn){return"function"!=typeof fn?apiRejection("expecting a function but got "+util.classString(fn)):this.all()._then(fn,void 0,void 0,APPLY,void 0)},Promise.prototype.toJSON=function(){var ret={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(ret.fulfillmentValue=this.value(),ret.isFulfilled=!0):this.isRejected()&&(ret.rejectionReason=this.reason(),ret.isRejected=!0),ret},Promise.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new PromiseArray(this).promise()},Promise.prototype.error=function(fn){return this.caught(util.originatesFromRejection,fn)},Promise.getNewLibraryCopy=module.exports,Promise.is=function(val){return val instanceof Promise},Promise.fromNode=Promise.fromCallback=function(fn){var ret=new Promise(INTERNAL);ret._captureStackTrace();var multiArgs=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,result=tryCatch(fn)(nodebackForPromise(ret,multiArgs));return result===errorObj&&ret._rejectCallback(result.e,!0),ret._isFateSealed()||ret._setAsyncGuaranteed(),ret},Promise.all=function(promises){return new PromiseArray(promises).promise()},Promise.cast=function(obj){var ret=tryConvertToPromise(obj);return ret instanceof Promise||(ret=new Promise(INTERNAL),ret._captureStackTrace(),ret._setFulfilled(),ret._rejectionHandler0=obj),ret},Promise.resolve=Promise.fulfilled=Promise.cast,Promise.reject=Promise.rejected=function(reason){var ret=new Promise(INTERNAL);return ret._captureStackTrace(),ret._rejectCallback(reason,!0),ret},Promise.setScheduler=function(fn){if("function"!=typeof fn)throw new TypeError("expecting a function but got "+util.classString(fn));return async.setScheduler(fn)},Promise.prototype._then=function(didFulfill,didReject,_,receiver,internalData){var haveInternalData=void 0!==internalData,promise=haveInternalData?internalData:new Promise(INTERNAL),target=this._target(),bitField=target._bitField;haveInternalData||(promise._propagateFrom(this,3),promise._captureStackTrace(),void 0===receiver&&0!==(2097152&this._bitField)&&(receiver=0!==(50397184&bitField)?this._boundValue():target===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,promise));var domain=getDomain();if(0!==(50397184&bitField)){var handler,value,settler=target._settlePromiseCtx;0!==(33554432&bitField)?(value=target._rejectionHandler0,handler=didFulfill):0!==(16777216&bitField)?(value=target._fulfillmentHandler0,handler=didReject,target._unsetRejectionIsUnhandled()):(settler=target._settlePromiseLateCancellationObserver,value=new CancellationError("late cancellation observer"),target._attachExtraTrace(value),handler=didReject),async.invoke(settler,target,{handler:null===domain?handler:"function"==typeof handler&&util.domainBind(domain,handler),promise:promise,receiver:receiver,value:value})}else target._addCallbacks(didFulfill,didReject,promise,receiver,domain);return promise},Promise.prototype._length=function(){return 65535&this._bitField},Promise.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},Promise.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},Promise.prototype._setLength=function(len){this._bitField=-65536&this._bitField|65535&len},Promise.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},Promise.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},Promise.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},Promise.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},Promise.prototype._isFinal=function(){return(4194304&this._bitField)>0},Promise.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},Promise.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},Promise.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},Promise.prototype._setAsyncGuaranteed=function(){async.hasCustomScheduler()||(this._bitField=134217728|this._bitField)},Promise.prototype._receiverAt=function(index){var ret=0===index?this._receiver0:this[4*index-4+3];return ret===UNDEFINED_BINDING?void 0:void 0===ret&&this._isBound()?this._boundValue():ret},Promise.prototype._promiseAt=function(index){return this[4*index-4+2]},Promise.prototype._fulfillmentHandlerAt=function(index){return this[4*index-4+0]},Promise.prototype._rejectionHandlerAt=function(index){return this[4*index-4+1]},Promise.prototype._boundValue=function(){},Promise.prototype._migrateCallback0=function(follower){var fulfill=(follower._bitField,follower._fulfillmentHandler0),reject=follower._rejectionHandler0,promise=follower._promise0,receiver=follower._receiverAt(0);void 0===receiver&&(receiver=UNDEFINED_BINDING),this._addCallbacks(fulfill,reject,promise,receiver,null)},Promise.prototype._migrateCallbackAt=function(follower,index){var fulfill=follower._fulfillmentHandlerAt(index),reject=follower._rejectionHandlerAt(index),promise=follower._promiseAt(index),receiver=follower._receiverAt(index);void 0===receiver&&(receiver=UNDEFINED_BINDING),this._addCallbacks(fulfill,reject,promise,receiver,null)},Promise.prototype._addCallbacks=function(fulfill,reject,promise,receiver,domain){var index=this._length();if(index>=65531&&(index=0,this._setLength(0)),0===index)this._promise0=promise,this._receiver0=receiver,"function"==typeof fulfill&&(this._fulfillmentHandler0=null===domain?fulfill:util.domainBind(domain,fulfill)),"function"==typeof reject&&(this._rejectionHandler0=null===domain?reject:util.domainBind(domain,reject));else{var base=4*index-4;this[base+2]=promise,this[base+3]=receiver,"function"==typeof fulfill&&(this[base+0]=null===domain?fulfill:util.domainBind(domain,fulfill)),"function"==typeof reject&&(this[base+1]=null===domain?reject:util.domainBind(domain,reject))}return this._setLength(index+1),index},Promise.prototype._proxy=function(proxyable,arg){this._addCallbacks(void 0,void 0,arg,proxyable,null)},Promise.prototype._resolveCallback=function(value,shouldBind){if(0===(117506048&this._bitField)){if(value===this)return this._rejectCallback(makeSelfResolutionError(),!1);var maybePromise=tryConvertToPromise(value,this);if(!(maybePromise instanceof Promise))return this._fulfill(value);shouldBind&&this._propagateFrom(maybePromise,2);var promise=maybePromise._target();if(promise===this)return void this._reject(makeSelfResolutionError());var bitField=promise._bitField;if(0===(50397184&bitField)){var len=this._length();len>0&&promise._migrateCallback0(this);for(var i=1;len>i;++i)promise._migrateCallbackAt(this,i);this._setFollowing(),this._setLength(0),this._setFollowee(promise)}else if(0!==(33554432&bitField))this._fulfill(promise._value());else if(0!==(16777216&bitField))this._reject(promise._reason());else{var reason=new CancellationError("late cancellation observer");promise._attachExtraTrace(reason),this._reject(reason)}}},Promise.prototype._rejectCallback=function(reason,synchronous,ignoreNonErrorWarnings){var trace=util.ensureErrorObject(reason),hasStack=trace===reason;if(!hasStack&&!ignoreNonErrorWarnings&&debug.warnings()){var message="a promise was rejected with a non-error: "+util.classString(reason);this._warn(message,!0)}this._attachExtraTrace(trace,synchronous?hasStack:!1),this._reject(reason)},Promise.prototype._resolveFromExecutor=function(executor){var promise=this;this._captureStackTrace(),this._pushContext();var synchronous=!0,r=this._execute(executor,function(value){promise._resolveCallback(value)},function(reason){promise._rejectCallback(reason,synchronous)});synchronous=!1,this._popContext(),void 0!==r&&promise._rejectCallback(r,!0)},Promise.prototype._settlePromiseFromHandler=function(handler,receiver,value,promise){var bitField=promise._bitField;if(0===(65536&bitField)){promise._pushContext();var x;receiver===APPLY?value&&"number"==typeof value.length?x=tryCatch(handler).apply(this._boundValue(),value):(x=errorObj,x.e=new TypeError("cannot .spread() a non-array: "+util.classString(value))):x=tryCatch(handler).call(receiver,value);var promiseCreated=promise._popContext();bitField=promise._bitField,0===(65536&bitField)&&(x===NEXT_FILTER?promise._reject(value):x===errorObj?promise._rejectCallback(x.e,!1):(debug.checkForgottenReturns(x,promiseCreated,"",promise,this),promise._resolveCallback(x)))}},Promise.prototype._target=function(){for(var ret=this;ret._isFollowing();)ret=ret._followee();return ret},Promise.prototype._followee=function(){return this._rejectionHandler0},Promise.prototype._setFollowee=function(promise){this._rejectionHandler0=promise},Promise.prototype._settlePromise=function(promise,handler,receiver,value){var isPromise=promise instanceof Promise,bitField=this._bitField,asyncGuaranteed=0!==(134217728&bitField);0!==(65536&bitField)?(isPromise&&promise._invokeInternalOnCancel(),receiver instanceof PassThroughHandlerContext&&receiver.isFinallyHandler()?(receiver.cancelPromise=promise,tryCatch(handler).call(receiver,value)===errorObj&&promise._reject(errorObj.e)):handler===reflectHandler?promise._fulfill(reflectHandler.call(receiver)):receiver instanceof Proxyable?receiver._promiseCancelled(promise):isPromise||promise instanceof PromiseArray?promise._cancel():receiver.cancel()):"function"==typeof handler?isPromise?(asyncGuaranteed&&promise._setAsyncGuaranteed(),this._settlePromiseFromHandler(handler,receiver,value,promise)):handler.call(receiver,value,promise):receiver instanceof Proxyable?receiver._isResolved()||(0!==(33554432&bitField)?receiver._promiseFulfilled(value,promise):receiver._promiseRejected(value,promise)):isPromise&&(asyncGuaranteed&&promise._setAsyncGuaranteed(),0!==(33554432&bitField)?promise._fulfill(value):promise._reject(value))},Promise.prototype._settlePromiseLateCancellationObserver=function(ctx){var handler=ctx.handler,promise=ctx.promise,receiver=ctx.receiver,value=ctx.value;"function"==typeof handler?promise instanceof Promise?this._settlePromiseFromHandler(handler,receiver,value,promise):handler.call(receiver,value,promise):promise instanceof Promise&&promise._reject(value)},Promise.prototype._settlePromiseCtx=function(ctx){this._settlePromise(ctx.promise,ctx.handler,ctx.receiver,ctx.value)},Promise.prototype._settlePromise0=function(handler,value,bitField){var promise=this._promise0,receiver=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(promise,handler,receiver,value)},Promise.prototype._clearCallbackDataAtIndex=function(index){var base=4*index-4;this[base+2]=this[base+3]=this[base+0]=this[base+1]=void 0},Promise.prototype._fulfill=function(value){var bitField=this._bitField;if(!((117506048&bitField)>>>16)){if(value===this){var err=makeSelfResolutionError();return this._attachExtraTrace(err),this._reject(err)}this._setFulfilled(),this._rejectionHandler0=value,(65535&bitField)>0&&(0!==(134217728&bitField)?this._settlePromises():async.settlePromises(this))}},Promise.prototype._reject=function(reason){var bitField=this._bitField;if(!((117506048&bitField)>>>16))return this._setRejected(),this._fulfillmentHandler0=reason,this._isFinal()?async.fatalError(reason,util.isNode):void((65535&bitField)>0?async.settlePromises(this):this._ensurePossibleRejectionHandled())},Promise.prototype._fulfillPromises=function(len,value){for(var i=1;len>i;i++){var handler=this._fulfillmentHandlerAt(i),promise=this._promiseAt(i),receiver=this._receiverAt(i);this._clearCallbackDataAtIndex(i),this._settlePromise(promise,handler,receiver,value)}},Promise.prototype._rejectPromises=function(len,reason){for(var i=1;len>i;i++){var handler=this._rejectionHandlerAt(i),promise=this._promiseAt(i),receiver=this._receiverAt(i);this._clearCallbackDataAtIndex(i),this._settlePromise(promise,handler,receiver,reason)}},Promise.prototype._settlePromises=function(){var bitField=this._bitField,len=65535&bitField;if(len>0){if(0!==(16842752&bitField)){var reason=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,reason,bitField),this._rejectPromises(len,reason)}else{var value=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,value,bitField),this._fulfillPromises(len,value)}this._setLength(0)}this._clearCancellationData()},Promise.prototype._settledValue=function(){var bitField=this._bitField;return 0!==(33554432&bitField)?this._rejectionHandler0:0!==(16777216&bitField)?this._fulfillmentHandler0:void 0},Promise.defer=Promise.pending=function(){debug.deprecated("Promise.defer","new Promise");var promise=new Promise(INTERNAL);return{promise:promise,resolve:deferResolve,reject:deferReject}},util.notEnumerableProp(Promise,"_makeSelfResolutionError",makeSelfResolutionError),require("./method")(Promise,INTERNAL,tryConvertToPromise,apiRejection,debug),require("./bind")(Promise,INTERNAL,tryConvertToPromise,debug),require("./cancel")(Promise,PromiseArray,apiRejection,debug),require("./direct_resolve")(Promise),require("./synchronous_inspection")(Promise),require("./join")(Promise,PromiseArray,tryConvertToPromise,INTERNAL,async,getDomain),Promise.Promise=Promise,Promise.version="3.4.7",require("./map.js")(Promise,PromiseArray,apiRejection,tryConvertToPromise,INTERNAL,debug),require("./call_get.js")(Promise),require("./using.js")(Promise,apiRejection,tryConvertToPromise,createContext,INTERNAL,debug),require("./timers.js")(Promise,INTERNAL,debug),require("./generators.js")(Promise,apiRejection,INTERNAL,tryConvertToPromise,Proxyable,debug),require("./nodeify.js")(Promise),require("./promisify.js")(Promise,INTERNAL),require("./props.js")(Promise,PromiseArray,tryConvertToPromise,apiRejection),require("./race.js")(Promise,INTERNAL,tryConvertToPromise,apiRejection),require("./reduce.js")(Promise,PromiseArray,apiRejection,tryConvertToPromise,INTERNAL,debug),require("./settle.js")(Promise,PromiseArray,debug),require("./some.js")(Promise,PromiseArray,apiRejection),require("./filter.js")(Promise,INTERNAL),require("./each.js")(Promise,INTERNAL),require("./any.js")(Promise),util.toFastProperties(Promise),util.toFastProperties(Promise.prototype),fillTypes({a:1}),fillTypes({b:2}),fillTypes({c:3}),fillTypes(1),fillTypes(function(){}),fillTypes(void 0),fillTypes(!1),fillTypes(new Promise(INTERNAL)),debug.setBounds(Async.firstLineError,util.lastLineError),Promise}}).call(this,require("_process"))},{"./any.js":48,"./async":49,"./bind":50,"./call_get.js":51,"./cancel":52,"./catch_filter":53,"./context":54,"./debuggability":55,"./direct_resolve":56,"./each.js":57,"./errors":58,"./es5":59,"./filter.js":60,"./finally":61,"./generators.js":62,"./join":63,"./map.js":64,"./method":65,"./nodeback":66,"./nodeify.js":67,"./promise_array":69,"./promisify.js":70,"./props.js":71,"./race.js":73,"./reduce.js":74,"./settle.js":76,"./some.js":77,"./synchronous_inspection":78,"./thenables":79,"./timers.js":80,"./using.js":81,"./util":82,_process:102}],69:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL,tryConvertToPromise,apiRejection,Proxyable){function toResolutionValue(val){switch(val){case-2:return[];case-3:return{}}}function PromiseArray(values){var promise=this._promise=new Promise(INTERNAL);values instanceof Promise&&promise._propagateFrom(values,3),promise._setOnCancel(this),this._values=values,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var util=require("./util");util.isArray;return util.inherits(PromiseArray,Proxyable),PromiseArray.prototype.length=function(){return this._length},PromiseArray.prototype.promise=function(){return this._promise},PromiseArray.prototype._init=function init(_,resolveValueIfEmpty){var values=tryConvertToPromise(this._values,this._promise);if(values instanceof Promise){values=values._target();var bitField=values._bitField;if(this._values=values,0===(50397184&bitField))return this._promise._setAsyncGuaranteed(),values._then(init,this._reject,void 0,this,resolveValueIfEmpty);if(0===(33554432&bitField))return 0!==(16777216&bitField)?this._reject(values._reason()):this._cancel();values=values._value()}if(values=util.asArray(values),null===values){var err=apiRejection("expecting an array or an iterable object but got "+util.classString(values)).reason();return void this._promise._rejectCallback(err,!1)}return 0===values.length?void(-5===resolveValueIfEmpty?this._resolveEmptyArray():this._resolve(toResolutionValue(resolveValueIfEmpty))):void this._iterate(values)},PromiseArray.prototype._iterate=function(values){var len=this.getActualLength(values.length);this._length=len,this._values=this.shouldCopyValues()?new Array(len):this._values;for(var result=this._promise,isResolved=!1,bitField=null,i=0;len>i;++i){var maybePromise=tryConvertToPromise(values[i],result);maybePromise instanceof Promise?(maybePromise=maybePromise._target(),bitField=maybePromise._bitField):bitField=null,isResolved?null!==bitField&&maybePromise.suppressUnhandledRejections():null!==bitField?0===(50397184&bitField)?(maybePromise._proxy(this,i),this._values[i]=maybePromise):isResolved=0!==(33554432&bitField)?this._promiseFulfilled(maybePromise._value(),i):0!==(16777216&bitField)?this._promiseRejected(maybePromise._reason(),i):this._promiseCancelled(i):isResolved=this._promiseFulfilled(maybePromise,i)}isResolved||result._setAsyncGuaranteed()},PromiseArray.prototype._isResolved=function(){return null===this._values},PromiseArray.prototype._resolve=function(value){this._values=null,this._promise._fulfill(value)},PromiseArray.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},PromiseArray.prototype._reject=function(reason){this._values=null,this._promise._rejectCallback(reason,!1)},PromiseArray.prototype._promiseFulfilled=function(value,index){this._values[index]=value;var totalResolved=++this._totalResolved;return totalResolved>=this._length?(this._resolve(this._values),!0):!1},PromiseArray.prototype._promiseCancelled=function(){return this._cancel(),!0},PromiseArray.prototype._promiseRejected=function(reason){return this._totalResolved++,this._reject(reason),!0},PromiseArray.prototype._resultCancelled=function(){if(!this._isResolved()){var values=this._values;if(this._cancel(),values instanceof Promise)values.cancel();else for(var i=0;ii;i+=2){var key=methods[i],fn=methods[i+1],promisifiedKey=key+suffix;if(promisifier===makeNodePromisified)obj[promisifiedKey]=makeNodePromisified(key,THIS,key,fn,suffix,multiArgs);else{var promisified=promisifier(fn,function(){return makeNodePromisified(key,THIS,key,fn,suffix,multiArgs)});util.notEnumerableProp(promisified,"__isPromisified__",!0),obj[promisifiedKey]=promisified}}return util.toFastProperties(obj),obj}function promisify(callback,receiver,multiArgs){return makeNodePromisified(callback,receiver,void 0,callback,null,multiArgs)}var makeNodePromisifiedEval,THIS={},util=require("./util"),nodebackForPromise=require("./nodeback"),withAppended=util.withAppended,maybeWrapAsError=util.maybeWrapAsError,canEvaluate=util.canEvaluate,TypeError=require("./errors").TypeError,defaultSuffix="Async",defaultPromisified={__isPromisified__:!0},noCopyProps=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],noCopyPropsPattern=new RegExp("^(?:"+noCopyProps.join("|")+")$"),defaultFilter=function(name){return util.isIdentifier(name)&&"_"!==name.charAt(0)&&"constructor"!==name},escapeIdentRegex=function(str){return str.replace(/([$])/,"\\$")},switchCaseArgumentOrder=function(likelyArgumentCount){for(var ret=[likelyArgumentCount],min=Math.max(0,likelyArgumentCount-1-3),i=likelyArgumentCount-1;i>=min;--i)ret.push(i);for(var i=likelyArgumentCount+1;3>=i;++i)ret.push(i);return ret},argumentSequence=function(argumentCount){return util.filledRange(argumentCount,"_arg","")},parameterDeclaration=function(parameterCount){return util.filledRange(Math.max(parameterCount,3),"_arg","")},parameterCount=function(fn){return"number"==typeof fn.length?Math.max(Math.min(fn.length,1024),0):0};makeNodePromisifiedEval=function(callback,receiver,originalName,fn,_,multiArgs){function generateCallForArgumentCount(count){var ret,args=argumentSequence(count).join(", "),comma=count>0?", ":"";return ret=shouldProxyThis?"ret = callback.call(this, {{args}}, nodeback); break;\n":void 0===receiver?"ret = callback({{args}}, nodeback); break;\n":"ret = callback.call(receiver, {{args}}, nodeback); break;\n",ret.replace("{{args}}",args).replace(", ",comma)}function generateArgumentSwitchCase(){for(var ret="",i=0;ii;++i){var key=keys[i];entries[i]=obj[key],entries[i+len]=key}}this.constructor$(entries),this._isMap=isMap,this._init$(void 0,-3)}function props(promises){var ret,castValue=tryConvertToPromise(promises);return isObject(castValue)?(ret=castValue instanceof Promise?castValue._then(Promise.props,void 0,void 0,void 0,void 0):new PropertiesPromiseArray(castValue).promise(),castValue instanceof Promise&&ret._propagateFrom(castValue,2),ret):apiRejection("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n")}var Es6Map,util=require("./util"),isObject=util.isObject,es5=require("./es5");"function"==typeof Map&&(Es6Map=Map);var mapToEntries=function(){function extractEntry(value,key){this[index]=value,this[index+size]=key,index++}var index=0,size=0;return function(map){size=map.size,index=0;var ret=new Array(2*map.size);return map.forEach(extractEntry,ret),ret}}(),entriesToMap=function(entries){for(var ret=new Es6Map,length=entries.length/2|0,i=0;length>i;++i){var key=entries[length+i],value=entries[i];ret.set(key,value)}return ret};util.inherits(PropertiesPromiseArray,PromiseArray),PropertiesPromiseArray.prototype._init=function(){},PropertiesPromiseArray.prototype._promiseFulfilled=function(value,index){this._values[index]=value;var totalResolved=++this._totalResolved;if(totalResolved>=this._length){var val;if(this._isMap)val=entriesToMap(this._values);else{val={};for(var keyOffset=this.length(),i=0,len=this.length();len>i;++i)val[this._values[i+keyOffset]]=this._values[i]}return this._resolve(val),!0}return!1},PropertiesPromiseArray.prototype.shouldCopyValues=function(){return!1},PropertiesPromiseArray.prototype.getActualLength=function(len){return len>>1},Promise.prototype.props=function(){return props(this)},Promise.props=function(promises){return props(promises)}}},{"./es5":59,"./util":82}],72:[function(require,module,exports){"use strict";function arrayMove(src,srcIndex,dst,dstIndex,len){for(var j=0;len>j;++j)dst[j+dstIndex]=src[j+srcIndex],src[j+srcIndex]=void 0}function Queue(capacity){this._capacity=capacity,this._length=0,this._front=0}Queue.prototype._willBeOverCapacity=function(size){return this._capacityi;++i){var val=promises[i];(void 0!==val||i in promises)&&Promise.cast(val)._then(fulfill,reject,void 0,ret,null)}return ret}var util=require("./util"),raceLater=function(promise){return promise.then(function(array){return race(array,promise)})};Promise.race=function(promises){return race(promises,void 0)},Promise.prototype.race=function(){return race(this,void 0)}}},{"./util":82}],74:[function(require,module,exports){"use strict";module.exports=function(Promise,PromiseArray,apiRejection,tryConvertToPromise,INTERNAL,debug){function ReductionPromiseArray(promises,fn,initialValue,_each){this.constructor$(promises);var domain=getDomain();this._fn=null===domain?fn:util.domainBind(domain,fn),void 0!==initialValue&&(initialValue=Promise.resolve(initialValue),initialValue._attachCancellationCallback(this)),this._initialValue=initialValue,this._currentCancellable=null,_each===INTERNAL?this._eachValues=Array(this._length):0===_each?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function completed(valueOrReason,array){this.isFulfilled()?array._resolve(valueOrReason):array._reject(valueOrReason)}function reduce(promises,fn,initialValue,_each){if("function"!=typeof fn)return apiRejection("expecting a function but got "+util.classString(fn));var array=new ReductionPromiseArray(promises,fn,initialValue,_each);return array.promise()}function gotAccum(accum){this.accum=accum,this.array._gotAccum(accum);var value=tryConvertToPromise(this.value,this.array._promise);return value instanceof Promise?(this.array._currentCancellable=value,value._then(gotValue,void 0,void 0,this,void 0)):gotValue.call(this,value)}function gotValue(value){var array=this.array,promise=array._promise,fn=tryCatch(array._fn);promise._pushContext();var ret;ret=void 0!==array._eachValues?fn.call(promise._boundValue(),value,this.index,this.length):fn.call(promise._boundValue(),this.accum,value,this.index,this.length),ret instanceof Promise&&(array._currentCancellable=ret);var promiseCreated=promise._popContext();return debug.checkForgottenReturns(ret,promiseCreated,void 0!==array._eachValues?"Promise.each":"Promise.reduce",promise),ret}var getDomain=Promise._getDomain,util=require("./util"),tryCatch=util.tryCatch;util.inherits(ReductionPromiseArray,PromiseArray),ReductionPromiseArray.prototype._gotAccum=function(accum){void 0!==this._eachValues&&null!==this._eachValues&&accum!==INTERNAL&&this._eachValues.push(accum)},ReductionPromiseArray.prototype._eachComplete=function(value){return null!==this._eachValues&&this._eachValues.push(value),this._eachValues},ReductionPromiseArray.prototype._init=function(){},ReductionPromiseArray.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},ReductionPromiseArray.prototype.shouldCopyValues=function(){return!1},ReductionPromiseArray.prototype._resolve=function(value){this._promise._resolveCallback(value),this._values=null},ReductionPromiseArray.prototype._resultCancelled=function(sender){return sender===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof Promise&&this._currentCancellable.cancel(),this._initialValue instanceof Promise&&this._initialValue.cancel()))},ReductionPromiseArray.prototype._iterate=function(values){this._values=values;var value,i,length=values.length;if(void 0!==this._initialValue?(value=this._initialValue,i=0):(value=Promise.resolve(values[0]),i=1),this._currentCancellable=value,!value.isRejected())for(;length>i;++i){var ctx={accum:null,value:values[i],index:i,length:length,array:this};value=value._then(gotAccum,void 0,void 0,ctx,void 0)}void 0!==this._eachValues&&(value=value._then(this._eachComplete,void 0,void 0,this,void 0)),value._then(completed,completed,void 0,value,this)},Promise.prototype.reduce=function(fn,initialValue){return reduce(this,fn,initialValue,null)},Promise.reduce=function(promises,fn,initialValue,_each){return reduce(promises,fn,initialValue,_each)}}},{"./util":82}],75:[function(require,module,exports){(function(process,global){"use strict";var schedule,util=require("./util"),noAsyncScheduler=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")},NativePromise=util.getNativePromise();if(util.isNode&&"undefined"==typeof MutationObserver){var GlobalSetImmediate=global.setImmediate,ProcessNextTick=process.nextTick;schedule=util.isRecentNode?function(fn){GlobalSetImmediate.call(global,fn)}:function(fn){ProcessNextTick.call(process,fn)}}else if("function"==typeof NativePromise&&"function"==typeof NativePromise.resolve){var nativePromise=NativePromise.resolve();schedule=function(fn){nativePromise.then(fn)}}else schedule="undefined"==typeof MutationObserver||"undefined"!=typeof window&&window.navigator&&(window.navigator.standalone||window.cordova)?"undefined"!=typeof setImmediate?function(fn){setImmediate(fn)}:"undefined"!=typeof setTimeout?function(fn){setTimeout(fn,0)}:noAsyncScheduler:function(){var div=document.createElement("div"),opts={attributes:!0},toggleScheduled=!1,div2=document.createElement("div"),o2=new MutationObserver(function(){div.classList.toggle("foo"),toggleScheduled=!1});o2.observe(div2,opts);var scheduleToggle=function(){toggleScheduled||(toggleScheduled=!0,div2.classList.toggle("foo"))};return function(fn){var o=new MutationObserver(function(){o.disconnect(),fn()});o.observe(div,opts),scheduleToggle()}}();module.exports=schedule}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./util":82,_process:102}],76:[function(require,module,exports){"use strict";module.exports=function(Promise,PromiseArray,debug){function SettledPromiseArray(values){this.constructor$(values)}var PromiseInspection=Promise.PromiseInspection,util=require("./util");util.inherits(SettledPromiseArray,PromiseArray),SettledPromiseArray.prototype._promiseResolved=function(index,inspection){this._values[index]=inspection;var totalResolved=++this._totalResolved;return totalResolved>=this._length?(this._resolve(this._values),!0):!1},SettledPromiseArray.prototype._promiseFulfilled=function(value,index){var ret=new PromiseInspection;return ret._bitField=33554432,ret._settledValueField=value,this._promiseResolved(index,ret)},SettledPromiseArray.prototype._promiseRejected=function(reason,index){var ret=new PromiseInspection;return ret._bitField=16777216,ret._settledValueField=reason,this._promiseResolved(index,ret)},Promise.settle=function(promises){return debug.deprecated(".settle()",".reflect()"),new SettledPromiseArray(promises).promise()},Promise.prototype.settle=function(){return Promise.settle(this)}}},{"./util":82}],77:[function(require,module,exports){"use strict";module.exports=function(Promise,PromiseArray,apiRejection){function SomePromiseArray(values){this.constructor$(values),this._howMany=0,this._unwrap=!1,this._initialized=!1}function some(promises,howMany){if((0|howMany)!==howMany||0>howMany)return apiRejection("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var ret=new SomePromiseArray(promises),promise=ret.promise();return ret.setHowMany(howMany),ret.init(),promise}var util=require("./util"),RangeError=require("./errors").RangeError,AggregateError=require("./errors").AggregateError,isArray=util.isArray,CANCELLATION={};util.inherits(SomePromiseArray,PromiseArray),SomePromiseArray.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var isArrayResolved=isArray(this._values);!this._isResolved()&&isArrayResolved&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},SomePromiseArray.prototype.init=function(){this._initialized=!0,this._init()},SomePromiseArray.prototype.setUnwrap=function(){this._unwrap=!0},SomePromiseArray.prototype.howMany=function(){return this._howMany},SomePromiseArray.prototype.setHowMany=function(count){this._howMany=count},SomePromiseArray.prototype._promiseFulfilled=function(value){return this._addFulfilled(value),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},SomePromiseArray.prototype._promiseRejected=function(reason){return this._addRejected(reason),this._checkOutcome()},SomePromiseArray.prototype._promiseCancelled=function(){return this._values instanceof Promise||null==this._values?this._cancel():(this._addRejected(CANCELLATION),this._checkOutcome())},SomePromiseArray.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var e=new AggregateError,i=this.length();i0?this._reject(e):this._cancel(),!0}return!1},SomePromiseArray.prototype._fulfilled=function(){return this._totalResolved},SomePromiseArray.prototype._rejected=function(){return this._values.length-this.length()},SomePromiseArray.prototype._addRejected=function(reason){this._values.push(reason)},SomePromiseArray.prototype._addFulfilled=function(value){this._values[this._totalResolved++]=value},SomePromiseArray.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},SomePromiseArray.prototype._getRangeError=function(count){var message="Input array must contain at least "+this._howMany+" items but contains only "+count+" items";return new RangeError(message)},SomePromiseArray.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},Promise.some=function(promises,howMany){return some(promises,howMany)},Promise.prototype.some=function(howMany){return some(this,howMany)},Promise._SomePromiseArray=SomePromiseArray}},{"./errors":58,"./util":82}],78:[function(require,module,exports){"use strict";module.exports=function(Promise){function PromiseInspection(promise){void 0!==promise?(promise=promise._target(),this._bitField=promise._bitField,this._settledValueField=promise._isFateSealed()?promise._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}PromiseInspection.prototype._settledValue=function(){return this._settledValueField};var value=PromiseInspection.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},reason=PromiseInspection.prototype.error=PromiseInspection.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},isFulfilled=PromiseInspection.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},isRejected=PromiseInspection.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},isPending=PromiseInspection.prototype.isPending=function(){return 0===(50397184&this._bitField)},isResolved=PromiseInspection.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};PromiseInspection.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},Promise.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},Promise.prototype._isCancelled=function(){return this._target().__isCancelled()},Promise.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},Promise.prototype.isPending=function(){return isPending.call(this._target())},Promise.prototype.isRejected=function(){return isRejected.call(this._target())},Promise.prototype.isFulfilled=function(){return isFulfilled.call(this._target())},Promise.prototype.isResolved=function(){return isResolved.call(this._target())},Promise.prototype.value=function(){return value.call(this._target())},Promise.prototype.reason=function(){var target=this._target();return target._unsetRejectionIsUnhandled(),reason.call(target)},Promise.prototype._value=function(){return this._settledValue()},Promise.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},Promise.PromiseInspection=PromiseInspection}},{}],79:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL){function tryConvertToPromise(obj,context){if(isObject(obj)){if(obj instanceof Promise)return obj;var then=getThen(obj);if(then===errorObj){context&&context._pushContext();var ret=Promise.reject(then.e);return context&&context._popContext(),ret}if("function"==typeof then){if(isAnyBluebirdPromise(obj)){var ret=new Promise(INTERNAL);return obj._then(ret._fulfill,ret._reject,void 0,ret,null),ret}return doThenable(obj,then,context)}}return obj}function doGetThen(obj){return obj.then}function getThen(obj){try{return doGetThen(obj)}catch(e){return errorObj.e=e,errorObj}}function isAnyBluebirdPromise(obj){try{return hasProp.call(obj,"_promise0")}catch(e){return!1}}function doThenable(x,then,context){function resolve(value){promise&&(promise._resolveCallback(value),promise=null)}function reject(reason){promise&&(promise._rejectCallback(reason,synchronous,!0),promise=null)}var promise=new Promise(INTERNAL),ret=promise;context&&context._pushContext(),promise._captureStackTrace(),context&&context._popContext();var synchronous=!0,result=util.tryCatch(then).call(x,resolve,reject);return synchronous=!1,promise&&result===errorObj&&(promise._rejectCallback(result.e,!0,!0),promise=null),ret}var util=require("./util"),errorObj=util.errorObj,isObject=util.isObject,hasProp={}.hasOwnProperty;return tryConvertToPromise}},{"./util":82}],80:[function(require,module,exports){"use strict";module.exports=function(Promise,INTERNAL,debug){function HandleWrapper(handle){this.handle=handle}function successClear(value){return clearTimeout(this.handle),value}function failureClear(reason){throw clearTimeout(this.handle),reason}var util=require("./util"),TimeoutError=Promise.TimeoutError;HandleWrapper.prototype._resultCancelled=function(){clearTimeout(this.handle)};var afterValue=function(value){return delay(+this).thenReturn(value)},delay=Promise.delay=function(ms,value){var ret,handle;return void 0!==value?(ret=Promise.resolve(value)._then(afterValue,null,null,ms,void 0),debug.cancellation()&&value instanceof Promise&&ret._setOnCancel(value)):(ret=new Promise(INTERNAL),handle=setTimeout(function(){ret._fulfill()},+ms),debug.cancellation()&&ret._setOnCancel(new HandleWrapper(handle)),ret._captureStackTrace()),ret._setAsyncGuaranteed(),ret};Promise.prototype.delay=function(ms){return delay(ms,this)};var afterTimeout=function(promise,message,parent){var err;err="string"!=typeof message?message instanceof Error?message:new TimeoutError("operation timed out"):new TimeoutError(message),util.markAsOriginatingFromRejection(err),promise._attachExtraTrace(err),promise._reject(err),null!=parent&&parent.cancel()};Promise.prototype.timeout=function(ms,message){ms=+ms;var ret,parent,handleWrapper=new HandleWrapper(setTimeout(function(){ret.isPending()&&afterTimeout(ret,message,parent)},ms));return debug.cancellation()?(parent=this.then(),ret=parent._then(successClear,failureClear,void 0,handleWrapper,void 0),ret._setOnCancel(handleWrapper)):ret=this._then(successClear,failureClear,void 0,handleWrapper,void 0),ret}}},{"./util":82}],81:[function(require,module,exports){"use strict";module.exports=function(Promise,apiRejection,tryConvertToPromise,createContext,INTERNAL,debug){function thrower(e){setTimeout(function(){throw e},0)}function castPreservingDisposable(thenable){var maybePromise=tryConvertToPromise(thenable);return maybePromise!==thenable&&"function"==typeof thenable._isDisposable&&"function"==typeof thenable._getDisposer&&thenable._isDisposable()&&maybePromise._setDisposable(thenable._getDisposer()),maybePromise}function dispose(resources,inspection){function iterator(){if(i>=len)return ret._fulfill();var maybePromise=castPreservingDisposable(resources[i++]);if(maybePromise instanceof Promise&&maybePromise._isDisposable()){try{maybePromise=tryConvertToPromise(maybePromise._getDisposer().tryDispose(inspection),resources.promise)}catch(e){return thrower(e)}if(maybePromise instanceof Promise)return maybePromise._then(iterator,thrower,null,null,null)}iterator()}var i=0,len=resources.length,ret=new Promise(INTERNAL);return iterator(),ret}function Disposer(data,promise,context){this._data=data,this._promise=promise,this._context=context}function FunctionDisposer(fn,promise,context){this.constructor$(fn,promise,context)}function maybeUnwrapDisposer(value){return Disposer.isDisposer(value)?(this.resources[this.index]._setDisposable(value),value.promise()):value}function ResourceList(length){this.length=length,this.promise=null,this[length-1]=null}var util=require("./util"),TypeError=require("./errors").TypeError,inherits=require("./util").inherits,errorObj=util.errorObj,tryCatch=util.tryCatch,NULL={};Disposer.prototype.data=function(){return this._data},Disposer.prototype.promise=function(){return this._promise},Disposer.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():NULL},Disposer.prototype.tryDispose=function(inspection){var resource=this.resource(),context=this._context;void 0!==context&&context._pushContext();var ret=resource!==NULL?this.doDispose(resource,inspection):null;return void 0!==context&&context._popContext(),this._promise._unsetDisposable(),this._data=null,ret},Disposer.isDisposer=function(d){return null!=d&&"function"==typeof d.resource&&"function"==typeof d.tryDispose},inherits(FunctionDisposer,Disposer),FunctionDisposer.prototype.doDispose=function(resource,inspection){var fn=this.data();return fn.call(resource,resource,inspection)},ResourceList.prototype._resultCancelled=function(){for(var len=this.length,i=0;len>i;++i){var item=this[i];item instanceof Promise&&item.cancel()}},Promise.using=function(){var len=arguments.length;if(2>len)return apiRejection("you must pass at least 2 arguments to Promise.using");var fn=arguments[len-1];if("function"!=typeof fn)return apiRejection("expecting a function but got "+util.classString(fn));var input,spreadArgs=!0;2===len&&Array.isArray(arguments[0])?(input=arguments[0],len=input.length,spreadArgs=!1):(input=arguments,len--);for(var resources=new ResourceList(len),i=0;len>i;++i){var resource=input[i];if(Disposer.isDisposer(resource)){var disposer=resource;resource=resource.promise(),resource._setDisposable(disposer)}else{var maybePromise=tryConvertToPromise(resource);maybePromise instanceof Promise&&(resource=maybePromise._then(maybeUnwrapDisposer,null,null,{resources:resources,index:i},void 0))}resources[i]=resource}for(var reflectedResources=new Array(resources.length),i=0;i0},Promise.prototype._getDisposer=function(){return this._disposer},Promise.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},Promise.prototype.disposer=function(fn){if("function"==typeof fn)return new FunctionDisposer(fn,this,createContext());throw new TypeError}}},{"./errors":58,"./util":82}],82:[function(require,module,exports){(function(process,global){"use strict";function tryCatcher(){try{var target=tryCatchTarget;return tryCatchTarget=null,target.apply(this,arguments)}catch(e){return errorObj.e=e,errorObj}}function tryCatch(fn){return tryCatchTarget=fn,tryCatcher}function isPrimitive(val){return null==val||val===!0||val===!1||"string"==typeof val||"number"==typeof val}function isObject(value){return"function"==typeof value||"object"==typeof value&&null!==value}function maybeWrapAsError(maybeError){return isPrimitive(maybeError)?new Error(safeToString(maybeError)):maybeError}function withAppended(target,appendee){var i,len=target.length,ret=new Array(len+1);for(i=0;len>i;++i)ret[i]=target[i];return ret[i]=appendee,ret}function getDataPropertyOrDefault(obj,key,defaultValue){if(!es5.isES5)return{}.hasOwnProperty.call(obj,key)?obj[key]:void 0;var desc=Object.getOwnPropertyDescriptor(obj,key);return null!=desc?null==desc.get&&null==desc.set?desc.value:defaultValue:void 0}function notEnumerableProp(obj,name,value){if(isPrimitive(obj))return obj;var descriptor={value:value,configurable:!0,enumerable:!1,writable:!0};return es5.defineProperty(obj,name,descriptor),obj}function thrower(r){throw r}function isClass(fn){try{if("function"==typeof fn){var keys=es5.names(fn.prototype),hasMethods=es5.isES5&&keys.length>1,hasMethodsOtherThanConstructor=keys.length>0&&!(1===keys.length&&"constructor"===keys[0]),hasThisAssignmentAndStaticMethods=thisAssignmentPattern.test(fn+"")&&es5.names(fn).length>0;if(hasMethods||hasMethodsOtherThanConstructor||hasThisAssignmentAndStaticMethods)return!0}return!1}catch(e){return!1}}function toFastProperties(obj){function FakeConstructor(){}FakeConstructor.prototype=obj;for(var l=8;l--;)new FakeConstructor;return obj}function isIdentifier(str){return rident.test(str)}function filledRange(count,prefix,suffix){for(var ret=new Array(count),i=0;count>i;++i)ret[i]=prefix+i+suffix;return ret}function safeToString(obj){try{return obj+""}catch(e){return"[no string representation]"}}function isError(obj){return null!==obj&&"object"==typeof obj&&"string"==typeof obj.message&&"string"==typeof obj.name}function markAsOriginatingFromRejection(e){try{notEnumerableProp(e,"isOperational",!0)}catch(ignore){}}function originatesFromRejection(e){return null==e?!1:e instanceof Error.__BluebirdErrorTypes__.OperationalError||e.isOperational===!0}function canAttachTrace(obj){return isError(obj)&&es5.propertyIsWritable(obj,"stack")}function classString(obj){return{}.toString.call(obj)}function copyDescriptors(from,to,filter){for(var keys=es5.names(from),i=0;i10||version[0]>0}(),ret.isNode&&ret.toFastProperties(process);try{throw new Error}catch(e){ret.lastLineError=e}module.exports=ret}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./es5":59,_process:102}],83:[function(require,module,exports){(function(global){"use strict";function typedArraySupport(){try{var arr=new Uint8Array(1);return arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===arr.foo()&&"function"==typeof arr.subarray&&0===arr.subarray(1,1).byteLength}catch(e){return!1}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()size)throw new RangeError('"size" argument must not be negative')}function alloc(that,size,fill,encoding){return assertSize(size),0>=size?createBuffer(that,size):void 0!==fill?"string"==typeof encoding?createBuffer(that,size).fill(fill,encoding):createBuffer(that,size).fill(fill):createBuffer(that,size)}function allocUnsafe(that,size){if(assertSize(size),that=createBuffer(that,0>size?0:0|checked(size)),!Buffer.TYPED_ARRAY_SUPPORT)for(var i=0;size>i;++i)that[i]=0;return that}function fromString(that,string,encoding){if(("string"!=typeof encoding||""===encoding)&&(encoding="utf8"),!Buffer.isEncoding(encoding))throw new TypeError('"encoding" must be a valid string encoding');var length=0|byteLength(string,encoding);that=createBuffer(that,length);var actual=that.write(string,encoding);return actual!==length&&(that=that.slice(0,actual)),that}function fromArrayLike(that,array){var length=array.length<0?0:0|checked(array.length);that=createBuffer(that,length);for(var i=0;length>i;i+=1)that[i]=255&array[i];return that}function fromArrayBuffer(that,array,byteOffset,length){if(array.byteLength,0>byteOffset||array.byteLength=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|length}function SlowBuffer(length){return+length!=length&&(length=0),Buffer.alloc(+length)}function byteLength(string,encoding){if(Buffer.isBuffer(string))return string.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(string)||string instanceof ArrayBuffer))return string.byteLength;"string"!=typeof string&&(string=""+string);var len=string.length;if(0===len)return 0;for(var loweredCase=!1;;)switch(encoding){case"ascii":case"latin1":case"binary":return len;case"utf8":case"utf-8":case void 0:return utf8ToBytes(string).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*len;case"hex":return len>>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase(),loweredCase=!0}}function slowToString(encoding,start,end){var loweredCase=!1;if((void 0===start||0>start)&&(start=0),start>this.length)return"";if((void 0===end||end>this.length)&&(end=this.length),0>=end)return"";if(end>>>=0,start>>>=0,start>=end)return"";for(encoding||(encoding="utf8");;)switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase(),loweredCase=!0}}function swap(b,n,m){var i=b[n];b[n]=b[m],b[m]=i}function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){if(0===buffer.length)return-1;if("string"==typeof byteOffset?(encoding=byteOffset,byteOffset=0):byteOffset>2147483647?byteOffset=2147483647:-2147483648>byteOffset&&(byteOffset=-2147483648),byteOffset=+byteOffset,isNaN(byteOffset)&&(byteOffset=dir?0:buffer.length-1),0>byteOffset&&(byteOffset=buffer.length+byteOffset),byteOffset>=buffer.length){if(dir)return-1;byteOffset=buffer.length-1}else if(0>byteOffset){if(!dir)return-1;byteOffset=0}if("string"==typeof val&&(val=Buffer.from(val,encoding)),Buffer.isBuffer(val))return 0===val.length?-1:arrayIndexOf(buffer,val,byteOffset,encoding,dir);if("number"==typeof val)return val=255&val,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?dir?Uint8Array.prototype.indexOf.call(buffer,val,byteOffset):Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset):arrayIndexOf(buffer,[val],byteOffset,encoding,dir);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){function read(buf,i){return 1===indexSize?buf[i]:buf.readUInt16BE(i*indexSize)}var indexSize=1,arrLength=arr.length,valLength=val.length;if(void 0!==encoding&&(encoding=String(encoding).toLowerCase(),"ucs2"===encoding||"ucs-2"===encoding||"utf16le"===encoding||"utf-16le"===encoding)){if(arr.length<2||val.length<2)return-1;indexSize=2,arrLength/=2,valLength/=2,byteOffset/=2}var i;if(dir){var foundIndex=-1;for(i=byteOffset;arrLength>i;i++)if(read(arr,i)===read(val,-1===foundIndex?0:i-foundIndex)){if(-1===foundIndex&&(foundIndex=i),i-foundIndex+1===valLength)return foundIndex*indexSize}else-1!==foundIndex&&(i-=i-foundIndex),foundIndex=-1}else for(byteOffset+valLength>arrLength&&(byteOffset=arrLength-valLength),i=byteOffset;i>=0;i--){for(var found=!0,j=0;valLength>j;j++)if(read(arr,i+j)!==read(val,j)){found=!1;break}if(found)return i}return-1}function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;length?(length=Number(length),length>remaining&&(length=remaining)):length=remaining;var strLen=string.length;if(strLen%2!==0)throw new TypeError("Invalid hex string");length>strLen/2&&(length=strLen/2);for(var i=0;length>i;++i){var parsed=parseInt(string.substr(2*i,2),16);if(isNaN(parsed))return i;buf[offset+i]=parsed}return i}function utf8Write(buf,string,offset,length){return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length)}function asciiWrite(buf,string,offset,length){return blitBuffer(asciiToBytes(string),buf,offset,length)}function latin1Write(buf,string,offset,length){return asciiWrite(buf,string,offset,length)}function base64Write(buf,string,offset,length){return blitBuffer(base64ToBytes(string),buf,offset,length)}function ucs2Write(buf,string,offset,length){return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length)}function base64Slice(buf,start,end){return 0===start&&end===buf.length?base64.fromByteArray(buf):base64.fromByteArray(buf.slice(start,end))}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);for(var res=[],i=start;end>i;){var firstByte=buf[i],codePoint=null,bytesPerSequence=firstByte>239?4:firstByte>223?3:firstByte>191?2:1;if(end>=i+bytesPerSequence){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:128>firstByte&&(codePoint=firstByte);break;case 2:secondByte=buf[i+1],128===(192&secondByte)&&(tempCodePoint=(31&firstByte)<<6|63&secondByte,tempCodePoint>127&&(codePoint=tempCodePoint));break;case 3:secondByte=buf[i+1],thirdByte=buf[i+2],128===(192&secondByte)&&128===(192&thirdByte)&&(tempCodePoint=(15&firstByte)<<12|(63&secondByte)<<6|63&thirdByte,tempCodePoint>2047&&(55296>tempCodePoint||tempCodePoint>57343)&&(codePoint=tempCodePoint));break;case 4:secondByte=buf[i+1],thirdByte=buf[i+2],fourthByte=buf[i+3],128===(192&secondByte)&&128===(192&thirdByte)&&128===(192&fourthByte)&&(tempCodePoint=(15&firstByte)<<18|(63&secondByte)<<12|(63&thirdByte)<<6|63&fourthByte,tempCodePoint>65535&&1114112>tempCodePoint&&(codePoint=tempCodePoint))}}null===codePoint?(codePoint=65533,bytesPerSequence=1):codePoint>65535&&(codePoint-=65536,res.push(codePoint>>>10&1023|55296),codePoint=56320|1023&codePoint),res.push(codePoint),i+=bytesPerSequence}return decodeCodePointsArray(res)}function decodeCodePointsArray(codePoints){var len=codePoints.length;if(MAX_ARGUMENTS_LENGTH>=len)return String.fromCharCode.apply(String,codePoints);for(var res="",i=0;len>i;)res+=String.fromCharCode.apply(String,codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));return res}function asciiSlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;end>i;++i)ret+=String.fromCharCode(127&buf[i]);return ret}function latin1Slice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;end>i;++i)ret+=String.fromCharCode(buf[i]);return ret}function hexSlice(buf,start,end){var len=buf.length;(!start||0>start)&&(start=0),(!end||0>end||end>len)&&(end=len);for(var out="",i=start;end>i;++i)out+=toHex(buf[i]);return out}function utf16leSlice(buf,start,end){for(var bytes=buf.slice(start,end),res="",i=0;ioffset)throw new RangeError("offset is not uint");if(offset+ext>length)throw new RangeError("Trying to access beyond buffer length")}function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||min>value)throw new RangeError('"value" argument is out of bounds');if(offset+ext>buf.length)throw new RangeError("Index out of range")}function objectWriteUInt16(buf,value,offset,littleEndian){0>value&&(value=65535+value+1);for(var i=0,j=Math.min(buf.length-offset,2);j>i;++i)buf[offset+i]=(value&255<<8*(littleEndian?i:1-i))>>>8*(littleEndian?i:1-i)}function objectWriteUInt32(buf,value,offset,littleEndian){0>value&&(value=4294967295+value+1);for(var i=0,j=Math.min(buf.length-offset,4);j>i;++i)buf[offset+i]=value>>>8*(littleEndian?i:3-i)&255}function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(0>offset)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(buf,value,offset,littleEndian,23,4),offset+4}function writeDouble(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(buf,value,offset,littleEndian,52,8),offset+8}function base64clean(str){if(str=stringtrim(str).replace(INVALID_BASE64_RE,""),str.length<2)return"";for(;str.length%4!==0;)str+="=";return str}function stringtrim(str){return str.trim?str.trim():str.replace(/^\s+|\s+$/g,"")}function toHex(n){return 16>n?"0"+n.toString(16):n.toString(16)}function utf8ToBytes(string,units){units=units||1/0;for(var codePoint,length=string.length,leadSurrogate=null,bytes=[],i=0;length>i;++i){if(codePoint=string.charCodeAt(i),codePoint>55295&&57344>codePoint){if(!leadSurrogate){if(codePoint>56319){(units-=3)>-1&&bytes.push(239,191,189);continue}if(i+1===length){(units-=3)>-1&&bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(56320>codePoint){(units-=3)>-1&&bytes.push(239,191,189),leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else leadSurrogate&&(units-=3)>-1&&bytes.push(239,191,189);if(leadSurrogate=null,128>codePoint){if((units-=1)<0)break;bytes.push(codePoint)}else if(2048>codePoint){if((units-=2)<0)break;bytes.push(codePoint>>6|192,63&codePoint|128)}else if(65536>codePoint){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,63&codePoint|128)}else{if(!(1114112>codePoint))throw new Error("Invalid code point");if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,63&codePoint|128)}}return bytes}function asciiToBytes(str){for(var byteArray=[],i=0;i>8,lo=c%256,byteArray.push(lo),byteArray.push(hi);return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;length>i&&!(i+offset>=dst.length||i>=src.length);++i)dst[i+offset]=src[i];return i}function isnan(val){return val!==val}var base64=require("base64-js"),ieee754=require("ieee754"),isArray=require("isarray");exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50,Buffer.TYPED_ARRAY_SUPPORT=void 0!==global.TYPED_ARRAY_SUPPORT?global.TYPED_ARRAY_SUPPORT:typedArraySupport(),exports.kMaxLength=kMaxLength(),Buffer.poolSize=8192,Buffer._augment=function(arr){return arr.__proto__=Buffer.prototype,arr},Buffer.from=function(value,encodingOrOffset,length){return from(null,value,encodingOrOffset,length)},Buffer.TYPED_ARRAY_SUPPORT&&(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&Buffer[Symbol.species]===Buffer&&Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:!0})),Buffer.alloc=function(size,fill,encoding){return alloc(null,size,fill,encoding)},Buffer.allocUnsafe=function(size){return allocUnsafe(null,size)},Buffer.allocUnsafeSlow=function(size){return allocUnsafe(null,size)},Buffer.isBuffer=function(b){return!(null==b||!b._isBuffer)},Buffer.compare=function(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var x=a.length,y=b.length,i=0,len=Math.min(x,y);len>i;++i)if(a[i]!==b[i]){x=a[i],y=b[i];break}return y>x?-1:x>y?1:0},Buffer.isEncoding=function(encoding){switch(String(encoding).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer.concat=function(list,length){if(!isArray(list))throw new TypeError('"list" argument must be an Array of Buffers');if(0===list.length)return Buffer.alloc(0);var i;if(void 0===length)for(length=0,i=0;ii;i+=2)swap(this,i,i+1);return this},Buffer.prototype.swap32=function(){var len=this.length;if(len%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var i=0;len>i;i+=4)swap(this,i,i+3),swap(this,i+1,i+2);return this},Buffer.prototype.swap64=function(){var len=this.length;if(len%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var i=0;len>i;i+=8)swap(this,i,i+7),swap(this,i+1,i+6),swap(this,i+2,i+5),swap(this,i+3,i+4);return this},Buffer.prototype.toString=function(){var length=0|this.length;return 0===length?"":0===arguments.length?utf8Slice(this,0,length):slowToString.apply(this,arguments)},Buffer.prototype.equals=function(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return this===b?!0:0===Buffer.compare(this,b)},Buffer.prototype.inspect=function(){var str="",max=exports.INSPECT_MAX_BYTES;return this.length>0&&(str=this.toString("hex",0,max).match(/.{2}/g).join(" "),this.length>max&&(str+=" ... ")),""},Buffer.prototype.compare=function(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target))throw new TypeError("Argument must be a Buffer");if(void 0===start&&(start=0),void 0===end&&(end=target?target.length:0),void 0===thisStart&&(thisStart=0),void 0===thisEnd&&(thisEnd=this.length),0>start||end>target.length||0>thisStart||thisEnd>this.length)throw new RangeError("out of range index");if(thisStart>=thisEnd&&start>=end)return 0;if(thisStart>=thisEnd)return-1;if(start>=end)return 1;if(start>>>=0,end>>>=0,thisStart>>>=0,thisEnd>>>=0,this===target)return 0;for(var x=thisEnd-thisStart,y=end-start,len=Math.min(x,y),thisCopy=this.slice(thisStart,thisEnd),targetCopy=target.slice(start,end),i=0;len>i;++i)if(thisCopy[i]!==targetCopy[i]){x=thisCopy[i],y=targetCopy[i];break}return y>x?-1:x>y?1:0},Buffer.prototype.includes=function(val,byteOffset,encoding){return-1!==this.indexOf(val,byteOffset,encoding)},Buffer.prototype.indexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!0)},Buffer.prototype.lastIndexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!1)},Buffer.prototype.write=function(string,offset,length,encoding){if(void 0===offset)encoding="utf8",length=this.length,offset=0;else if(void 0===length&&"string"==typeof offset)encoding=offset,length=this.length,offset=0;else{if(!isFinite(offset))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");offset=0|offset,isFinite(length)?(length=0|length,void 0===encoding&&(encoding="utf8")):(encoding=length,length=void 0)}var remaining=this.length-offset;if((void 0===length||length>remaining)&&(length=remaining),string.length>0&&(0>length||0>offset)||offset>this.length)throw new RangeError("Attempt to write outside buffer bounds");encoding||(encoding="utf8");for(var loweredCase=!1;;)switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase(),loweredCase=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;Buffer.prototype.slice=function(start,end){var len=this.length;start=~~start,end=void 0===end?len:~~end,0>start?(start+=len,0>start&&(start=0)):start>len&&(start=len),0>end?(end+=len,0>end&&(end=0)):end>len&&(end=len),start>end&&(end=start);var newBuf;if(Buffer.TYPED_ARRAY_SUPPORT)newBuf=this.subarray(start,end),newBuf.__proto__=Buffer.prototype;else{var sliceLen=end-start;newBuf=new Buffer(sliceLen,void 0);for(var i=0;sliceLen>i;++i)newBuf[i]=this[i+start]}return newBuf},Buffer.prototype.readUIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i0&&(mul*=256);)val+=this[offset+--byteLength]*mul;return val},Buffer.prototype.readUInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),this[offset]},Buffer.prototype.readUInt16LE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]|this[offset+1]<<8},Buffer.prototype.readUInt16BE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]<<8|this[offset+1]},Buffer.prototype.readUInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+16777216*this[offset+3]},Buffer.prototype.readUInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),16777216*this[offset]+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])},Buffer.prototype.readIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readIntBE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var i=byteLength,mul=1,val=this[offset+--i];i>0&&(mul*=256);)val+=this[offset+--i]*mul;return mul*=128,val>=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),128&this[offset]?-1*(255-this[offset]+1):this[offset]},Buffer.prototype.readInt16LE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt16BE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24},Buffer.prototype.readInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]},Buffer.prototype.readFloatLE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!0,23,4)},Buffer.prototype.readFloatBE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!1,23,4)},Buffer.prototype.readDoubleLE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!0,52,8)},Buffer.prototype.readDoubleBE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!1,52,8)},Buffer.prototype.writeUIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,byteLength=0|byteLength,!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1,i=0;for(this[offset]=255&value;++i=0&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUInt8=function(value,offset,noAssert){ +return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),this[offset]=255&value,offset+1},Buffer.prototype.writeUInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeUInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeUInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset+3]=value>>>24,this[offset+2]=value>>>16,this[offset+1]=value>>>8,this[offset]=255&value):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeUInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0,mul=1,sub=0;for(this[offset]=255&value;++ivalue&&0===sub&&0!==this[offset+i-1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeIntBE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1,mul=1,sub=0;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)0>value&&0===sub&&0!==this[offset+i+1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeInt8=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),0>value&&(value=255+value+1),this[offset]=255&value,offset+1},Buffer.prototype.writeInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8,this[offset+2]=value>>>16,this[offset+3]=value>>>24):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),0>value&&(value=4294967295+value+1),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeFloatLE=function(value,offset,noAssert){return writeFloat(this,value,offset,!0,noAssert)},Buffer.prototype.writeFloatBE=function(value,offset,noAssert){return writeFloat(this,value,offset,!1,noAssert)},Buffer.prototype.writeDoubleLE=function(value,offset,noAssert){return writeDouble(this,value,offset,!0,noAssert)},Buffer.prototype.writeDoubleBE=function(value,offset,noAssert){return writeDouble(this,value,offset,!1,noAssert)},Buffer.prototype.copy=function(target,targetStart,start,end){if(start||(start=0),end||0===end||(end=this.length),targetStart>=target.length&&(targetStart=target.length),targetStart||(targetStart=0),end>0&&start>end&&(end=start),end===start)return 0;if(0===target.length||0===this.length)return 0;if(0>targetStart)throw new RangeError("targetStart out of bounds");if(0>start||start>=this.length)throw new RangeError("sourceStart out of bounds");if(0>end)throw new RangeError("sourceEnd out of bounds");end>this.length&&(end=this.length),target.length-targetStartstart&&end>targetStart)for(i=len-1;i>=0;--i)target[i+targetStart]=this[i+start];else if(1e3>len||!Buffer.TYPED_ARRAY_SUPPORT)for(i=0;len>i;++i)target[i+targetStart]=this[i+start];else Uint8Array.prototype.set.call(target,this.subarray(start,start+len),targetStart);return len},Buffer.prototype.fill=function(val,start,end,encoding){if("string"==typeof val){if("string"==typeof start?(encoding=start,start=0,end=this.length):"string"==typeof end&&(encoding=end,end=this.length),1===val.length){var code=val.charCodeAt(0);256>code&&(val=code)}if(void 0!==encoding&&"string"!=typeof encoding)throw new TypeError("encoding must be a string");if("string"==typeof encoding&&!Buffer.isEncoding(encoding))throw new TypeError("Unknown encoding: "+encoding)}else"number"==typeof val&&(val=255&val);if(0>start||this.length=end)return this;start>>>=0,end=void 0===end?this.length:end>>>0,val||(val=0);var i;if("number"==typeof val)for(i=start;end>i;++i)this[i]=val;else{var bytes=Buffer.isBuffer(val)?val:utf8ToBytes(new Buffer(val,encoding).toString()),len=bytes.length;for(i=0;end-start>i;++i)this[i+start]=bytes[i%len]}return this};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":47,ieee754:86,isarray:87}],84:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var dingbats=[{"Typeface name":"Symbol","Dingbat dec":"32","Dingbat hex":"20","Unicode dec":"32","Unicode hex":"20"},{"Typeface name":"Symbol","Dingbat dec":"33","Dingbat hex":"21","Unicode dec":"33","Unicode hex":"21"},{"Typeface name":"Symbol","Dingbat dec":"34","Dingbat hex":"22","Unicode dec":"8704","Unicode hex":"2200"},{"Typeface name":"Symbol","Dingbat dec":"35","Dingbat hex":"23","Unicode dec":"35","Unicode hex":"23"},{"Typeface name":"Symbol","Dingbat dec":"36","Dingbat hex":"24","Unicode dec":"8707","Unicode hex":"2203"},{"Typeface name":"Symbol","Dingbat dec":"37","Dingbat hex":"25","Unicode dec":"37","Unicode hex":"25"},{"Typeface name":"Symbol","Dingbat dec":"38","Dingbat hex":"26","Unicode dec":"38","Unicode hex":"26"},{"Typeface name":"Symbol","Dingbat dec":"39","Dingbat hex":"27","Unicode dec":"8717","Unicode hex":"220D"},{"Typeface name":"Symbol","Dingbat dec":"40","Dingbat hex":"28","Unicode dec":"40","Unicode hex":"28"},{"Typeface name":"Symbol","Dingbat dec":"41","Dingbat hex":"29","Unicode dec":"41","Unicode hex":"29"},{"Typeface name":"Symbol","Dingbat dec":"42","Dingbat hex":"2A","Unicode dec":"42","Unicode hex":"2A"},{"Typeface name":"Symbol","Dingbat dec":"43","Dingbat hex":"2B","Unicode dec":"43","Unicode hex":"2B"},{"Typeface name":"Symbol","Dingbat dec":"44","Dingbat hex":"2C","Unicode dec":"44","Unicode hex":"2C"},{"Typeface name":"Symbol","Dingbat dec":"45","Dingbat hex":"2D","Unicode dec":"8722","Unicode hex":"2212"},{"Typeface name":"Symbol","Dingbat dec":"46","Dingbat hex":"2E","Unicode dec":"46","Unicode hex":"2E"},{"Typeface name":"Symbol","Dingbat dec":"47","Dingbat hex":"2F","Unicode dec":"47","Unicode hex":"2F"},{"Typeface name":"Symbol","Dingbat dec":"48","Dingbat hex":"30","Unicode dec":"48","Unicode hex":"30"},{"Typeface name":"Symbol","Dingbat dec":"49","Dingbat hex":"31","Unicode dec":"49","Unicode hex":"31"},{"Typeface name":"Symbol","Dingbat dec":"50","Dingbat hex":"32","Unicode dec":"50","Unicode hex":"32"},{"Typeface name":"Symbol","Dingbat dec":"51","Dingbat hex":"33","Unicode dec":"51","Unicode hex":"33"},{"Typeface name":"Symbol","Dingbat dec":"52","Dingbat hex":"34","Unicode dec":"52","Unicode hex":"34"},{"Typeface name":"Symbol","Dingbat dec":"53","Dingbat hex":"35","Unicode dec":"53","Unicode hex":"35"},{"Typeface name":"Symbol","Dingbat dec":"54","Dingbat hex":"36","Unicode dec":"54","Unicode hex":"36"},{"Typeface name":"Symbol","Dingbat dec":"55","Dingbat hex":"37","Unicode dec":"55","Unicode hex":"37"},{"Typeface name":"Symbol","Dingbat dec":"56","Dingbat hex":"38","Unicode dec":"56","Unicode hex":"38"},{"Typeface name":"Symbol","Dingbat dec":"57","Dingbat hex":"39","Unicode dec":"57","Unicode hex":"39"},{"Typeface name":"Symbol","Dingbat dec":"58","Dingbat hex":"3A","Unicode dec":"58","Unicode hex":"3A"},{"Typeface name":"Symbol","Dingbat dec":"59","Dingbat hex":"3B","Unicode dec":"59","Unicode hex":"3B"},{"Typeface name":"Symbol","Dingbat dec":"60","Dingbat hex":"3C","Unicode dec":"60","Unicode hex":"3C"},{"Typeface name":"Symbol","Dingbat dec":"61","Dingbat hex":"3D","Unicode dec":"61","Unicode hex":"3D"},{"Typeface name":"Symbol","Dingbat dec":"62","Dingbat hex":"3E","Unicode dec":"62","Unicode hex":"3E"},{"Typeface name":"Symbol","Dingbat dec":"63","Dingbat hex":"3F","Unicode dec":"63","Unicode hex":"3F"},{"Typeface name":"Symbol","Dingbat dec":"64","Dingbat hex":"40","Unicode dec":"8773","Unicode hex":"2245"},{"Typeface name":"Symbol","Dingbat dec":"65","Dingbat hex":"41","Unicode dec":"913","Unicode hex":"391"},{"Typeface name":"Symbol","Dingbat dec":"66","Dingbat hex":"42","Unicode dec":"914","Unicode hex":"392"},{"Typeface name":"Symbol","Dingbat dec":"67","Dingbat hex":"43","Unicode dec":"935","Unicode hex":"3A7"},{"Typeface name":"Symbol","Dingbat dec":"68","Dingbat hex":"44","Unicode dec":"916","Unicode hex":"394"},{"Typeface name":"Symbol","Dingbat dec":"69","Dingbat hex":"45","Unicode dec":"917","Unicode hex":"395"},{"Typeface name":"Symbol","Dingbat dec":"70","Dingbat hex":"46","Unicode dec":"934","Unicode hex":"3A6"},{"Typeface name":"Symbol","Dingbat dec":"71","Dingbat hex":"47","Unicode dec":"915","Unicode hex":"393"},{"Typeface name":"Symbol","Dingbat dec":"72","Dingbat hex":"48","Unicode dec":"919","Unicode hex":"397"},{"Typeface name":"Symbol","Dingbat dec":"73","Dingbat hex":"49","Unicode dec":"921","Unicode hex":"399"},{"Typeface name":"Symbol","Dingbat dec":"74","Dingbat hex":"4A","Unicode dec":"977","Unicode hex":"3D1"},{"Typeface name":"Symbol","Dingbat dec":"75","Dingbat hex":"4B","Unicode dec":"922","Unicode hex":"39A"},{"Typeface name":"Symbol","Dingbat dec":"76","Dingbat hex":"4C","Unicode dec":"923","Unicode hex":"39B"},{"Typeface name":"Symbol","Dingbat dec":"77","Dingbat hex":"4D","Unicode dec":"924","Unicode hex":"39C"},{"Typeface name":"Symbol","Dingbat dec":"78","Dingbat hex":"4E","Unicode dec":"925","Unicode hex":"39D"},{"Typeface name":"Symbol","Dingbat dec":"79","Dingbat hex":"4F","Unicode dec":"927","Unicode hex":"39F"},{"Typeface name":"Symbol","Dingbat dec":"80","Dingbat hex":"50","Unicode dec":"928","Unicode hex":"3A0"},{"Typeface name":"Symbol","Dingbat dec":"81","Dingbat hex":"51","Unicode dec":"920","Unicode hex":"398"},{"Typeface name":"Symbol","Dingbat dec":"82","Dingbat hex":"52","Unicode dec":"929","Unicode hex":"3A1"},{"Typeface name":"Symbol","Dingbat dec":"83","Dingbat hex":"53","Unicode dec":"931","Unicode hex":"3A3"},{"Typeface name":"Symbol","Dingbat dec":"84","Dingbat hex":"54","Unicode dec":"932","Unicode hex":"3A4"},{"Typeface name":"Symbol","Dingbat dec":"85","Dingbat hex":"55","Unicode dec":"933","Unicode hex":"3A5"},{"Typeface name":"Symbol","Dingbat dec":"86","Dingbat hex":"56","Unicode dec":"962","Unicode hex":"3C2"},{"Typeface name":"Symbol","Dingbat dec":"87","Dingbat hex":"57","Unicode dec":"937","Unicode hex":"3A9"},{"Typeface name":"Symbol","Dingbat dec":"88","Dingbat hex":"58","Unicode dec":"926","Unicode hex":"39E"},{"Typeface name":"Symbol","Dingbat dec":"89","Dingbat hex":"59","Unicode dec":"936","Unicode hex":"3A8"},{"Typeface name":"Symbol","Dingbat dec":"90","Dingbat hex":"5A","Unicode dec":"918","Unicode hex":"396"},{"Typeface name":"Symbol","Dingbat dec":"91","Dingbat hex":"5B","Unicode dec":"91","Unicode hex":"5B"},{"Typeface name":"Symbol","Dingbat dec":"92","Dingbat hex":"5C","Unicode dec":"8756","Unicode hex":"2234"},{"Typeface name":"Symbol","Dingbat dec":"93","Dingbat hex":"5D","Unicode dec":"93","Unicode hex":"5D"},{"Typeface name":"Symbol","Dingbat dec":"94","Dingbat hex":"5E","Unicode dec":"8869","Unicode hex":"22A5"},{"Typeface name":"Symbol","Dingbat dec":"95","Dingbat hex":"5F","Unicode dec":"95","Unicode hex":"5F"},{"Typeface name":"Symbol","Dingbat dec":"96","Dingbat hex":"60","Unicode dec":"8254","Unicode hex":"203E"},{"Typeface name":"Symbol","Dingbat dec":"97","Dingbat hex":"61","Unicode dec":"945","Unicode hex":"3B1"},{"Typeface name":"Symbol","Dingbat dec":"98","Dingbat hex":"62","Unicode dec":"946","Unicode hex":"3B2"},{"Typeface name":"Symbol","Dingbat dec":"99","Dingbat hex":"63","Unicode dec":"967","Unicode hex":"3C7"},{"Typeface name":"Symbol","Dingbat dec":"100","Dingbat hex":"64","Unicode dec":"948","Unicode hex":"3B4"},{"Typeface name":"Symbol","Dingbat dec":"101","Dingbat hex":"65","Unicode dec":"949","Unicode hex":"3B5"},{"Typeface name":"Symbol","Dingbat dec":"102","Dingbat hex":"66","Unicode dec":"966","Unicode hex":"3C6"},{"Typeface name":"Symbol","Dingbat dec":"103","Dingbat hex":"67","Unicode dec":"947","Unicode hex":"3B3"},{"Typeface name":"Symbol","Dingbat dec":"104","Dingbat hex":"68","Unicode dec":"951","Unicode hex":"3B7"},{"Typeface name":"Symbol","Dingbat dec":"105","Dingbat hex":"69","Unicode dec":"953","Unicode hex":"3B9"},{"Typeface name":"Symbol","Dingbat dec":"106","Dingbat hex":"6A","Unicode dec":"981","Unicode hex":"3D5"},{"Typeface name":"Symbol","Dingbat dec":"107","Dingbat hex":"6B","Unicode dec":"954","Unicode hex":"3BA"},{"Typeface name":"Symbol","Dingbat dec":"108","Dingbat hex":"6C","Unicode dec":"955","Unicode hex":"3BB"},{"Typeface name":"Symbol","Dingbat dec":"109","Dingbat hex":"6D","Unicode dec":"956","Unicode hex":"3BC"},{"Typeface name":"Symbol","Dingbat dec":"110","Dingbat hex":"6E","Unicode dec":"957","Unicode hex":"3BD"},{"Typeface name":"Symbol","Dingbat dec":"111","Dingbat hex":"6F","Unicode dec":"959","Unicode hex":"3BF"},{"Typeface name":"Symbol","Dingbat dec":"112","Dingbat hex":"70","Unicode dec":"960","Unicode hex":"3C0"},{"Typeface name":"Symbol","Dingbat dec":"113","Dingbat hex":"71","Unicode dec":"952","Unicode hex":"3B8"},{"Typeface name":"Symbol","Dingbat dec":"114","Dingbat hex":"72","Unicode dec":"961","Unicode hex":"3C1"},{"Typeface name":"Symbol","Dingbat dec":"115","Dingbat hex":"73","Unicode dec":"963","Unicode hex":"3C3"},{"Typeface name":"Symbol","Dingbat dec":"116","Dingbat hex":"74","Unicode dec":"964","Unicode hex":"3C4"},{"Typeface name":"Symbol","Dingbat dec":"117","Dingbat hex":"75","Unicode dec":"965","Unicode hex":"3C5"},{"Typeface name":"Symbol","Dingbat dec":"118","Dingbat hex":"76","Unicode dec":"982","Unicode hex":"3D6"},{"Typeface name":"Symbol","Dingbat dec":"119","Dingbat hex":"77","Unicode dec":"969","Unicode hex":"3C9"},{"Typeface name":"Symbol","Dingbat dec":"120","Dingbat hex":"78","Unicode dec":"958","Unicode hex":"3BE"},{"Typeface name":"Symbol","Dingbat dec":"121","Dingbat hex":"79","Unicode dec":"968","Unicode hex":"3C8"},{"Typeface name":"Symbol","Dingbat dec":"122","Dingbat hex":"7A","Unicode dec":"950","Unicode hex":"3B6"},{"Typeface name":"Symbol","Dingbat dec":"123","Dingbat hex":"7B","Unicode dec":"123","Unicode hex":"7B"},{"Typeface name":"Symbol","Dingbat dec":"124","Dingbat hex":"7C","Unicode dec":"124","Unicode hex":"7C"},{"Typeface name":"Symbol","Dingbat dec":"125","Dingbat hex":"7D","Unicode dec":"125","Unicode hex":"7D"},{"Typeface name":"Symbol","Dingbat dec":"126","Dingbat hex":"7E","Unicode dec":"126","Unicode hex":"7E"},{"Typeface name":"Symbol","Dingbat dec":"160","Dingbat hex":"A0","Unicode dec":"8364","Unicode hex":"20AC"},{"Typeface name":"Symbol","Dingbat dec":"161","Dingbat hex":"A1","Unicode dec":"978","Unicode hex":"3D2"},{"Typeface name":"Symbol","Dingbat dec":"162","Dingbat hex":"A2","Unicode dec":"8242","Unicode hex":"2032"},{"Typeface name":"Symbol","Dingbat dec":"163","Dingbat hex":"A3","Unicode dec":"8804","Unicode hex":"2264"},{"Typeface name":"Symbol","Dingbat dec":"164","Dingbat hex":"A4","Unicode dec":"8260","Unicode hex":"2044"},{"Typeface name":"Symbol","Dingbat dec":"165","Dingbat hex":"A5","Unicode dec":"8734","Unicode hex":"221E"},{"Typeface name":"Symbol","Dingbat dec":"166","Dingbat hex":"A6","Unicode dec":"402","Unicode hex":"192"},{"Typeface name":"Symbol","Dingbat dec":"167","Dingbat hex":"A7","Unicode dec":"9827","Unicode hex":"2663"},{"Typeface name":"Symbol","Dingbat dec":"168","Dingbat hex":"A8","Unicode dec":"9830","Unicode hex":"2666"},{"Typeface name":"Symbol","Dingbat dec":"169","Dingbat hex":"A9","Unicode dec":"9829","Unicode hex":"2665"},{"Typeface name":"Symbol","Dingbat dec":"170","Dingbat hex":"AA","Unicode dec":"9824","Unicode hex":"2660"},{"Typeface name":"Symbol","Dingbat dec":"171","Dingbat hex":"AB","Unicode dec":"8596","Unicode hex":"2194"},{"Typeface name":"Symbol","Dingbat dec":"172","Dingbat hex":"AC","Unicode dec":"8592","Unicode hex":"2190"},{"Typeface name":"Symbol","Dingbat dec":"173","Dingbat hex":"AD","Unicode dec":"8593","Unicode hex":"2191"},{"Typeface name":"Symbol","Dingbat dec":"174","Dingbat hex":"AE","Unicode dec":"8594","Unicode hex":"2192"},{"Typeface name":"Symbol","Dingbat dec":"175","Dingbat hex":"AF","Unicode dec":"8595","Unicode hex":"2193"},{"Typeface name":"Symbol","Dingbat dec":"176","Dingbat hex":"B0","Unicode dec":"176","Unicode hex":"B0"},{"Typeface name":"Symbol","Dingbat dec":"177","Dingbat hex":"B1","Unicode dec":"177","Unicode hex":"B1"},{"Typeface name":"Symbol","Dingbat dec":"178","Dingbat hex":"B2","Unicode dec":"8243","Unicode hex":"2033"},{"Typeface name":"Symbol","Dingbat dec":"179","Dingbat hex":"B3","Unicode dec":"8805","Unicode hex":"2265"},{"Typeface name":"Symbol","Dingbat dec":"180","Dingbat hex":"B4","Unicode dec":"215","Unicode hex":"D7"},{"Typeface name":"Symbol","Dingbat dec":"181","Dingbat hex":"B5","Unicode dec":"8733","Unicode hex":"221D"},{"Typeface name":"Symbol","Dingbat dec":"182","Dingbat hex":"B6","Unicode dec":"8706","Unicode hex":"2202"},{"Typeface name":"Symbol","Dingbat dec":"183","Dingbat hex":"B7","Unicode dec":"8226","Unicode hex":"2022"},{"Typeface name":"Symbol","Dingbat dec":"184","Dingbat hex":"B8","Unicode dec":"247","Unicode hex":"F7"},{"Typeface name":"Symbol","Dingbat dec":"185","Dingbat hex":"B9","Unicode dec":"8800","Unicode hex":"2260"},{"Typeface name":"Symbol","Dingbat dec":"186","Dingbat hex":"BA","Unicode dec":"8801","Unicode hex":"2261"},{"Typeface name":"Symbol","Dingbat dec":"187","Dingbat hex":"BB","Unicode dec":"8776","Unicode hex":"2248"},{"Typeface name":"Symbol","Dingbat dec":"188","Dingbat hex":"BC","Unicode dec":"8230","Unicode hex":"2026"},{"Typeface name":"Symbol","Dingbat dec":"189","Dingbat hex":"BD","Unicode dec":"9168","Unicode hex":"23D0"},{"Typeface name":"Symbol","Dingbat dec":"190","Dingbat hex":"BE","Unicode dec":"9135","Unicode hex":"23AF"},{"Typeface name":"Symbol","Dingbat dec":"191","Dingbat hex":"BF","Unicode dec":"8629","Unicode hex":"21B5"},{"Typeface name":"Symbol","Dingbat dec":"192","Dingbat hex":"C0","Unicode dec":"8501","Unicode hex":"2135"},{"Typeface name":"Symbol","Dingbat dec":"193","Dingbat hex":"C1","Unicode dec":"8465","Unicode hex":"2111"},{"Typeface name":"Symbol","Dingbat dec":"194","Dingbat hex":"C2","Unicode dec":"8476","Unicode hex":"211C"},{"Typeface name":"Symbol","Dingbat dec":"195","Dingbat hex":"C3","Unicode dec":"8472","Unicode hex":"2118"},{"Typeface name":"Symbol","Dingbat dec":"196","Dingbat hex":"C4","Unicode dec":"8855","Unicode hex":"2297"},{"Typeface name":"Symbol","Dingbat dec":"197","Dingbat hex":"C5","Unicode dec":"8853","Unicode hex":"2295"},{"Typeface name":"Symbol","Dingbat dec":"198","Dingbat hex":"C6","Unicode dec":"8709","Unicode hex":"2205"},{"Typeface name":"Symbol","Dingbat dec":"199","Dingbat hex":"C7","Unicode dec":"8745","Unicode hex":"2229"},{"Typeface name":"Symbol","Dingbat dec":"200","Dingbat hex":"C8","Unicode dec":"8746","Unicode hex":"222A"},{"Typeface name":"Symbol","Dingbat dec":"201","Dingbat hex":"C9","Unicode dec":"8835","Unicode hex":"2283"},{"Typeface name":"Symbol","Dingbat dec":"202","Dingbat hex":"CA","Unicode dec":"8839","Unicode hex":"2287"},{"Typeface name":"Symbol","Dingbat dec":"203","Dingbat hex":"CB","Unicode dec":"8836","Unicode hex":"2284"},{"Typeface name":"Symbol","Dingbat dec":"204","Dingbat hex":"CC","Unicode dec":"8834","Unicode hex":"2282"},{"Typeface name":"Symbol","Dingbat dec":"205","Dingbat hex":"CD","Unicode dec":"8838","Unicode hex":"2286"},{"Typeface name":"Symbol","Dingbat dec":"206","Dingbat hex":"CE","Unicode dec":"8712","Unicode hex":"2208"},{"Typeface name":"Symbol","Dingbat dec":"207","Dingbat hex":"CF","Unicode dec":"8713","Unicode hex":"2209"},{"Typeface name":"Symbol","Dingbat dec":"208","Dingbat hex":"D0","Unicode dec":"8736","Unicode hex":"2220"},{"Typeface name":"Symbol","Dingbat dec":"209","Dingbat hex":"D1","Unicode dec":"8711","Unicode hex":"2207"},{"Typeface name":"Symbol","Dingbat dec":"210","Dingbat hex":"D2","Unicode dec":"174","Unicode hex":"AE"},{"Typeface name":"Symbol","Dingbat dec":"211","Dingbat hex":"D3","Unicode dec":"169","Unicode hex":"A9"},{"Typeface name":"Symbol","Dingbat dec":"212","Dingbat hex":"D4","Unicode dec":"8482","Unicode hex":"2122"},{"Typeface name":"Symbol","Dingbat dec":"213","Dingbat hex":"D5","Unicode dec":"8719","Unicode hex":"220F"},{"Typeface name":"Symbol","Dingbat dec":"214","Dingbat hex":"D6","Unicode dec":"8730","Unicode hex":"221A"},{"Typeface name":"Symbol","Dingbat dec":"215","Dingbat hex":"D7","Unicode dec":"8901","Unicode hex":"22C5"},{"Typeface name":"Symbol","Dingbat dec":"216","Dingbat hex":"D8","Unicode dec":"172","Unicode hex":"AC"},{"Typeface name":"Symbol","Dingbat dec":"217","Dingbat hex":"D9","Unicode dec":"8743","Unicode hex":"2227"},{"Typeface name":"Symbol","Dingbat dec":"218","Dingbat hex":"DA","Unicode dec":"8744","Unicode hex":"2228"},{"Typeface name":"Symbol","Dingbat dec":"219","Dingbat hex":"DB","Unicode dec":"8660","Unicode hex":"21D4"},{"Typeface name":"Symbol","Dingbat dec":"220","Dingbat hex":"DC","Unicode dec":"8656","Unicode hex":"21D0"},{"Typeface name":"Symbol","Dingbat dec":"221","Dingbat hex":"DD","Unicode dec":"8657","Unicode hex":"21D1"},{"Typeface name":"Symbol","Dingbat dec":"222","Dingbat hex":"DE","Unicode dec":"8658","Unicode hex":"21D2"},{"Typeface name":"Symbol","Dingbat dec":"223","Dingbat hex":"DF","Unicode dec":"8659","Unicode hex":"21D3"},{"Typeface name":"Symbol","Dingbat dec":"224","Dingbat hex":"E0","Unicode dec":"9674","Unicode hex":"25CA"},{"Typeface name":"Symbol","Dingbat dec":"225","Dingbat hex":"E1","Unicode dec":"12296","Unicode hex":"3008"},{"Typeface name":"Symbol","Dingbat dec":"226","Dingbat hex":"E2","Unicode dec":"174","Unicode hex":"AE"},{"Typeface name":"Symbol","Dingbat dec":"227","Dingbat hex":"E3","Unicode dec":"169","Unicode hex":"A9"},{"Typeface name":"Symbol","Dingbat dec":"228","Dingbat hex":"E4","Unicode dec":"8482","Unicode hex":"2122"},{"Typeface name":"Symbol","Dingbat dec":"229","Dingbat hex":"E5","Unicode dec":"8721","Unicode hex":"2211"},{"Typeface name":"Symbol","Dingbat dec":"230","Dingbat hex":"E6","Unicode dec":"9115","Unicode hex":"239B"},{"Typeface name":"Symbol","Dingbat dec":"231","Dingbat hex":"E7","Unicode dec":"9116","Unicode hex":"239C"},{"Typeface name":"Symbol","Dingbat dec":"232","Dingbat hex":"E8","Unicode dec":"9117","Unicode hex":"239D"},{"Typeface name":"Symbol","Dingbat dec":"233","Dingbat hex":"E9","Unicode dec":"9121","Unicode hex":"23A1"},{"Typeface name":"Symbol","Dingbat dec":"234","Dingbat hex":"EA","Unicode dec":"9122","Unicode hex":"23A2"},{"Typeface name":"Symbol","Dingbat dec":"235","Dingbat hex":"EB","Unicode dec":"9123","Unicode hex":"23A3"},{"Typeface name":"Symbol","Dingbat dec":"236","Dingbat hex":"EC","Unicode dec":"9127","Unicode hex":"23A7"},{"Typeface name":"Symbol","Dingbat dec":"237","Dingbat hex":"ED","Unicode dec":"9128","Unicode hex":"23A8"},{"Typeface name":"Symbol","Dingbat dec":"238","Dingbat hex":"EE","Unicode dec":"9129","Unicode hex":"23A9"},{"Typeface name":"Symbol","Dingbat dec":"239","Dingbat hex":"EF","Unicode dec":"9130","Unicode hex":"23AA"},{"Typeface name":"Symbol","Dingbat dec":"240","Dingbat hex":"F0","Unicode dec":"63743","Unicode hex":"F8FF"},{"Typeface name":"Symbol","Dingbat dec":"241","Dingbat hex":"F1","Unicode dec":"12297","Unicode hex":"3009"},{"Typeface name":"Symbol","Dingbat dec":"242","Dingbat hex":"F2","Unicode dec":"8747","Unicode hex":"222B"},{"Typeface name":"Symbol","Dingbat dec":"243","Dingbat hex":"F3","Unicode dec":"8992","Unicode hex":"2320"},{"Typeface name":"Symbol","Dingbat dec":"244","Dingbat hex":"F4","Unicode dec":"9134","Unicode hex":"23AE"},{"Typeface name":"Symbol","Dingbat dec":"245","Dingbat hex":"F5","Unicode dec":"8993","Unicode hex":"2321"},{"Typeface name":"Symbol","Dingbat dec":"246","Dingbat hex":"F6","Unicode dec":"9118","Unicode hex":"239E"},{"Typeface name":"Symbol","Dingbat dec":"247","Dingbat hex":"F7","Unicode dec":"9119","Unicode hex":"239F"},{"Typeface name":"Symbol","Dingbat dec":"248","Dingbat hex":"F8","Unicode dec":"9120","Unicode hex":"23A0"},{"Typeface name":"Symbol","Dingbat dec":"249","Dingbat hex":"F9","Unicode dec":"9124","Unicode hex":"23A4"},{"Typeface name":"Symbol","Dingbat dec":"250","Dingbat hex":"FA","Unicode dec":"9125","Unicode hex":"23A5"},{"Typeface name":"Symbol","Dingbat dec":"251","Dingbat hex":"FB","Unicode dec":"9126","Unicode hex":"23A6"},{"Typeface name":"Symbol","Dingbat dec":"252","Dingbat hex":"FC","Unicode dec":"9131","Unicode hex":"23AB"},{"Typeface name":"Symbol","Dingbat dec":"253","Dingbat hex":"FD","Unicode dec":"9132","Unicode hex":"23AC"},{"Typeface name":"Symbol","Dingbat dec":"254","Dingbat hex":"FE","Unicode dec":"9133","Unicode hex":"23AD"},{"Typeface name":"Webdings","Dingbat dec":"32","Dingbat hex":"20","Unicode dec":"32","Unicode hex":"20"},{"Typeface name":"Webdings","Dingbat dec":"33","Dingbat hex":"21","Unicode dec":"128375","Unicode hex":"1F577"},{"Typeface name":"Webdings","Dingbat dec":"34","Dingbat hex":"22","Unicode dec":"128376","Unicode hex":"1F578"},{"Typeface name":"Webdings","Dingbat dec":"35","Dingbat hex":"23","Unicode dec":"128370","Unicode hex":"1F572"},{"Typeface name":"Webdings","Dingbat dec":"36","Dingbat hex":"24","Unicode dec":"128374","Unicode hex":"1F576"},{"Typeface name":"Webdings","Dingbat dec":"37","Dingbat hex":"25","Unicode dec":"127942","Unicode hex":"1F3C6"},{"Typeface name":"Webdings","Dingbat dec":"38","Dingbat hex":"26","Unicode dec":"127894","Unicode hex":"1F396"},{"Typeface name":"Webdings","Dingbat dec":"39","Dingbat hex":"27","Unicode dec":"128391","Unicode hex":"1F587"},{"Typeface name":"Webdings","Dingbat dec":"40","Dingbat hex":"28","Unicode dec":"128488","Unicode hex":"1F5E8"},{"Typeface name":"Webdings","Dingbat dec":"41","Dingbat hex":"29","Unicode dec":"128489","Unicode hex":"1F5E9"},{"Typeface name":"Webdings","Dingbat dec":"42","Dingbat hex":"2A","Unicode dec":"128496","Unicode hex":"1F5F0"},{"Typeface name":"Webdings","Dingbat dec":"43","Dingbat hex":"2B","Unicode dec":"128497","Unicode hex":"1F5F1"},{"Typeface name":"Webdings","Dingbat dec":"44","Dingbat hex":"2C","Unicode dec":"127798","Unicode hex":"1F336"},{"Typeface name":"Webdings","Dingbat dec":"45","Dingbat hex":"2D","Unicode dec":"127895","Unicode hex":"1F397"},{"Typeface name":"Webdings","Dingbat dec":"46","Dingbat hex":"2E","Unicode dec":"128638","Unicode hex":"1F67E"},{"Typeface name":"Webdings","Dingbat dec":"47","Dingbat hex":"2F","Unicode dec":"128636","Unicode hex":"1F67C"},{"Typeface name":"Webdings","Dingbat dec":"48","Dingbat hex":"30","Unicode dec":"128469","Unicode hex":"1F5D5"},{"Typeface name":"Webdings","Dingbat dec":"49","Dingbat hex":"31","Unicode dec":"128470","Unicode hex":"1F5D6"},{"Typeface name":"Webdings","Dingbat dec":"50","Dingbat hex":"32","Unicode dec":"128471","Unicode hex":"1F5D7"},{"Typeface name":"Webdings","Dingbat dec":"51","Dingbat hex":"33","Unicode dec":"9204","Unicode hex":"23F4"},{"Typeface name":"Webdings","Dingbat dec":"52","Dingbat hex":"34","Unicode dec":"9205","Unicode hex":"23F5"},{"Typeface name":"Webdings","Dingbat dec":"53","Dingbat hex":"35","Unicode dec":"9206","Unicode hex":"23F6"},{"Typeface name":"Webdings","Dingbat dec":"54","Dingbat hex":"36","Unicode dec":"9207","Unicode hex":"23F7"},{"Typeface name":"Webdings","Dingbat dec":"55","Dingbat hex":"37","Unicode dec":"9194","Unicode hex":"23EA"},{"Typeface name":"Webdings","Dingbat dec":"56","Dingbat hex":"38","Unicode dec":"9193","Unicode hex":"23E9"},{"Typeface name":"Webdings","Dingbat dec":"57","Dingbat hex":"39","Unicode dec":"9198","Unicode hex":"23EE"},{"Typeface name":"Webdings","Dingbat dec":"58","Dingbat hex":"3A","Unicode dec":"9197","Unicode hex":"23ED"},{"Typeface name":"Webdings","Dingbat dec":"59","Dingbat hex":"3B","Unicode dec":"9208","Unicode hex":"23F8"},{"Typeface name":"Webdings","Dingbat dec":"60","Dingbat hex":"3C","Unicode dec":"9209","Unicode hex":"23F9"},{"Typeface name":"Webdings","Dingbat dec":"61","Dingbat hex":"3D","Unicode dec":"9210","Unicode hex":"23FA"},{"Typeface name":"Webdings","Dingbat dec":"62","Dingbat hex":"3E","Unicode dec":"128474","Unicode hex":"1F5DA"},{"Typeface name":"Webdings","Dingbat dec":"63","Dingbat hex":"3F","Unicode dec":"128499","Unicode hex":"1F5F3"},{"Typeface name":"Webdings","Dingbat dec":"64","Dingbat hex":"40","Unicode dec":"128736","Unicode hex":"1F6E0"},{"Typeface name":"Webdings","Dingbat dec":"65","Dingbat hex":"41","Unicode dec":"127959","Unicode hex":"1F3D7"},{"Typeface name":"Webdings","Dingbat dec":"66","Dingbat hex":"42","Unicode dec":"127960","Unicode hex":"1F3D8"},{"Typeface name":"Webdings","Dingbat dec":"67","Dingbat hex":"43","Unicode dec":"127961","Unicode hex":"1F3D9"},{"Typeface name":"Webdings","Dingbat dec":"68","Dingbat hex":"44","Unicode dec":"127962","Unicode hex":"1F3DA"},{"Typeface name":"Webdings","Dingbat dec":"69","Dingbat hex":"45","Unicode dec":"127964","Unicode hex":"1F3DC"},{"Typeface name":"Webdings","Dingbat dec":"70","Dingbat hex":"46","Unicode dec":"127981","Unicode hex":"1F3ED"},{"Typeface name":"Webdings","Dingbat dec":"71","Dingbat hex":"47","Unicode dec":"127963","Unicode hex":"1F3DB"},{"Typeface name":"Webdings","Dingbat dec":"72","Dingbat hex":"48","Unicode dec":"127968","Unicode hex":"1F3E0"},{"Typeface name":"Webdings","Dingbat dec":"73","Dingbat hex":"49","Unicode dec":"127958","Unicode hex":"1F3D6"},{"Typeface name":"Webdings","Dingbat dec":"74","Dingbat hex":"4A","Unicode dec":"127965","Unicode hex":"1F3DD"},{"Typeface name":"Webdings","Dingbat dec":"75","Dingbat hex":"4B","Unicode dec":"128739","Unicode hex":"1F6E3"},{"Typeface name":"Webdings","Dingbat dec":"76","Dingbat hex":"4C","Unicode dec":"128269","Unicode hex":"1F50D"},{"Typeface name":"Webdings","Dingbat dec":"77","Dingbat hex":"4D","Unicode dec":"127956","Unicode hex":"1F3D4"},{"Typeface name":"Webdings","Dingbat dec":"78","Dingbat hex":"4E","Unicode dec":"128065","Unicode hex":"1F441"},{"Typeface name":"Webdings","Dingbat dec":"79","Dingbat hex":"4F","Unicode dec":"128066","Unicode hex":"1F442"},{"Typeface name":"Webdings","Dingbat dec":"80","Dingbat hex":"50","Unicode dec":"127966","Unicode hex":"1F3DE"},{"Typeface name":"Webdings","Dingbat dec":"81", +"Dingbat hex":"51","Unicode dec":"127957","Unicode hex":"1F3D5"},{"Typeface name":"Webdings","Dingbat dec":"82","Dingbat hex":"52","Unicode dec":"128740","Unicode hex":"1F6E4"},{"Typeface name":"Webdings","Dingbat dec":"83","Dingbat hex":"53","Unicode dec":"127967","Unicode hex":"1F3DF"},{"Typeface name":"Webdings","Dingbat dec":"84","Dingbat hex":"54","Unicode dec":"128755","Unicode hex":"1F6F3"},{"Typeface name":"Webdings","Dingbat dec":"85","Dingbat hex":"55","Unicode dec":"128364","Unicode hex":"1F56C"},{"Typeface name":"Webdings","Dingbat dec":"86","Dingbat hex":"56","Unicode dec":"128363","Unicode hex":"1F56B"},{"Typeface name":"Webdings","Dingbat dec":"87","Dingbat hex":"57","Unicode dec":"128360","Unicode hex":"1F568"},{"Typeface name":"Webdings","Dingbat dec":"88","Dingbat hex":"58","Unicode dec":"128264","Unicode hex":"1F508"},{"Typeface name":"Webdings","Dingbat dec":"89","Dingbat hex":"59","Unicode dec":"127892","Unicode hex":"1F394"},{"Typeface name":"Webdings","Dingbat dec":"90","Dingbat hex":"5A","Unicode dec":"127893","Unicode hex":"1F395"},{"Typeface name":"Webdings","Dingbat dec":"91","Dingbat hex":"5B","Unicode dec":"128492","Unicode hex":"1F5EC"},{"Typeface name":"Webdings","Dingbat dec":"92","Dingbat hex":"5C","Unicode dec":"128637","Unicode hex":"1F67D"},{"Typeface name":"Webdings","Dingbat dec":"93","Dingbat hex":"5D","Unicode dec":"128493","Unicode hex":"1F5ED"},{"Typeface name":"Webdings","Dingbat dec":"94","Dingbat hex":"5E","Unicode dec":"128490","Unicode hex":"1F5EA"},{"Typeface name":"Webdings","Dingbat dec":"95","Dingbat hex":"5F","Unicode dec":"128491","Unicode hex":"1F5EB"},{"Typeface name":"Webdings","Dingbat dec":"96","Dingbat hex":"60","Unicode dec":"11156","Unicode hex":"2B94"},{"Typeface name":"Webdings","Dingbat dec":"97","Dingbat hex":"61","Unicode dec":"10004","Unicode hex":"2714"},{"Typeface name":"Webdings","Dingbat dec":"98","Dingbat hex":"62","Unicode dec":"128690","Unicode hex":"1F6B2"},{"Typeface name":"Webdings","Dingbat dec":"99","Dingbat hex":"63","Unicode dec":"11036","Unicode hex":"2B1C"},{"Typeface name":"Webdings","Dingbat dec":"100","Dingbat hex":"64","Unicode dec":"128737","Unicode hex":"1F6E1"},{"Typeface name":"Webdings","Dingbat dec":"101","Dingbat hex":"65","Unicode dec":"128230","Unicode hex":"1F4E6"},{"Typeface name":"Webdings","Dingbat dec":"102","Dingbat hex":"66","Unicode dec":"128753","Unicode hex":"1F6F1"},{"Typeface name":"Webdings","Dingbat dec":"103","Dingbat hex":"67","Unicode dec":"11035","Unicode hex":"2B1B"},{"Typeface name":"Webdings","Dingbat dec":"104","Dingbat hex":"68","Unicode dec":"128657","Unicode hex":"1F691"},{"Typeface name":"Webdings","Dingbat dec":"105","Dingbat hex":"69","Unicode dec":"128712","Unicode hex":"1F6C8"},{"Typeface name":"Webdings","Dingbat dec":"106","Dingbat hex":"6A","Unicode dec":"128745","Unicode hex":"1F6E9"},{"Typeface name":"Webdings","Dingbat dec":"107","Dingbat hex":"6B","Unicode dec":"128752","Unicode hex":"1F6F0"},{"Typeface name":"Webdings","Dingbat dec":"108","Dingbat hex":"6C","Unicode dec":"128968","Unicode hex":"1F7C8"},{"Typeface name":"Webdings","Dingbat dec":"109","Dingbat hex":"6D","Unicode dec":"128372","Unicode hex":"1F574"},{"Typeface name":"Webdings","Dingbat dec":"110","Dingbat hex":"6E","Unicode dec":"11044","Unicode hex":"2B24"},{"Typeface name":"Webdings","Dingbat dec":"111","Dingbat hex":"6F","Unicode dec":"128741","Unicode hex":"1F6E5"},{"Typeface name":"Webdings","Dingbat dec":"112","Dingbat hex":"70","Unicode dec":"128660","Unicode hex":"1F694"},{"Typeface name":"Webdings","Dingbat dec":"113","Dingbat hex":"71","Unicode dec":"128472","Unicode hex":"1F5D8"},{"Typeface name":"Webdings","Dingbat dec":"114","Dingbat hex":"72","Unicode dec":"128473","Unicode hex":"1F5D9"},{"Typeface name":"Webdings","Dingbat dec":"115","Dingbat hex":"73","Unicode dec":"10067","Unicode hex":"2753"},{"Typeface name":"Webdings","Dingbat dec":"116","Dingbat hex":"74","Unicode dec":"128754","Unicode hex":"1F6F2"},{"Typeface name":"Webdings","Dingbat dec":"117","Dingbat hex":"75","Unicode dec":"128647","Unicode hex":"1F687"},{"Typeface name":"Webdings","Dingbat dec":"118","Dingbat hex":"76","Unicode dec":"128653","Unicode hex":"1F68D"},{"Typeface name":"Webdings","Dingbat dec":"119","Dingbat hex":"77","Unicode dec":"9971","Unicode hex":"26F3"},{"Typeface name":"Webdings","Dingbat dec":"120","Dingbat hex":"78","Unicode dec":"10680","Unicode hex":"29B8"},{"Typeface name":"Webdings","Dingbat dec":"121","Dingbat hex":"79","Unicode dec":"8854","Unicode hex":"2296"},{"Typeface name":"Webdings","Dingbat dec":"122","Dingbat hex":"7A","Unicode dec":"128685","Unicode hex":"1F6AD"},{"Typeface name":"Webdings","Dingbat dec":"123","Dingbat hex":"7B","Unicode dec":"128494","Unicode hex":"1F5EE"},{"Typeface name":"Webdings","Dingbat dec":"124","Dingbat hex":"7C","Unicode dec":"9168","Unicode hex":"23D0"},{"Typeface name":"Webdings","Dingbat dec":"125","Dingbat hex":"7D","Unicode dec":"128495","Unicode hex":"1F5EF"},{"Typeface name":"Webdings","Dingbat dec":"126","Dingbat hex":"7E","Unicode dec":"128498","Unicode hex":"1F5F2"},{"Typeface name":"Webdings","Dingbat dec":"128","Dingbat hex":"80","Unicode dec":"128697","Unicode hex":"1F6B9"},{"Typeface name":"Webdings","Dingbat dec":"129","Dingbat hex":"81","Unicode dec":"128698","Unicode hex":"1F6BA"},{"Typeface name":"Webdings","Dingbat dec":"130","Dingbat hex":"82","Unicode dec":"128713","Unicode hex":"1F6C9"},{"Typeface name":"Webdings","Dingbat dec":"131","Dingbat hex":"83","Unicode dec":"128714","Unicode hex":"1F6CA"},{"Typeface name":"Webdings","Dingbat dec":"132","Dingbat hex":"84","Unicode dec":"128700","Unicode hex":"1F6BC"},{"Typeface name":"Webdings","Dingbat dec":"133","Dingbat hex":"85","Unicode dec":"128125","Unicode hex":"1F47D"},{"Typeface name":"Webdings","Dingbat dec":"134","Dingbat hex":"86","Unicode dec":"127947","Unicode hex":"1F3CB"},{"Typeface name":"Webdings","Dingbat dec":"135","Dingbat hex":"87","Unicode dec":"9975","Unicode hex":"26F7"},{"Typeface name":"Webdings","Dingbat dec":"136","Dingbat hex":"88","Unicode dec":"127938","Unicode hex":"1F3C2"},{"Typeface name":"Webdings","Dingbat dec":"137","Dingbat hex":"89","Unicode dec":"127948","Unicode hex":"1F3CC"},{"Typeface name":"Webdings","Dingbat dec":"138","Dingbat hex":"8A","Unicode dec":"127946","Unicode hex":"1F3CA"},{"Typeface name":"Webdings","Dingbat dec":"139","Dingbat hex":"8B","Unicode dec":"127940","Unicode hex":"1F3C4"},{"Typeface name":"Webdings","Dingbat dec":"140","Dingbat hex":"8C","Unicode dec":"127949","Unicode hex":"1F3CD"},{"Typeface name":"Webdings","Dingbat dec":"141","Dingbat hex":"8D","Unicode dec":"127950","Unicode hex":"1F3CE"},{"Typeface name":"Webdings","Dingbat dec":"142","Dingbat hex":"8E","Unicode dec":"128664","Unicode hex":"1F698"},{"Typeface name":"Webdings","Dingbat dec":"143","Dingbat hex":"8F","Unicode dec":"128480","Unicode hex":"1F5E0"},{"Typeface name":"Webdings","Dingbat dec":"144","Dingbat hex":"90","Unicode dec":"128738","Unicode hex":"1F6E2"},{"Typeface name":"Webdings","Dingbat dec":"145","Dingbat hex":"91","Unicode dec":"128176","Unicode hex":"1F4B0"},{"Typeface name":"Webdings","Dingbat dec":"146","Dingbat hex":"92","Unicode dec":"127991","Unicode hex":"1F3F7"},{"Typeface name":"Webdings","Dingbat dec":"147","Dingbat hex":"93","Unicode dec":"128179","Unicode hex":"1F4B3"},{"Typeface name":"Webdings","Dingbat dec":"148","Dingbat hex":"94","Unicode dec":"128106","Unicode hex":"1F46A"},{"Typeface name":"Webdings","Dingbat dec":"149","Dingbat hex":"95","Unicode dec":"128481","Unicode hex":"1F5E1"},{"Typeface name":"Webdings","Dingbat dec":"150","Dingbat hex":"96","Unicode dec":"128482","Unicode hex":"1F5E2"},{"Typeface name":"Webdings","Dingbat dec":"151","Dingbat hex":"97","Unicode dec":"128483","Unicode hex":"1F5E3"},{"Typeface name":"Webdings","Dingbat dec":"152","Dingbat hex":"98","Unicode dec":"10031","Unicode hex":"272F"},{"Typeface name":"Webdings","Dingbat dec":"153","Dingbat hex":"99","Unicode dec":"128388","Unicode hex":"1F584"},{"Typeface name":"Webdings","Dingbat dec":"154","Dingbat hex":"9A","Unicode dec":"128389","Unicode hex":"1F585"},{"Typeface name":"Webdings","Dingbat dec":"155","Dingbat hex":"9B","Unicode dec":"128387","Unicode hex":"1F583"},{"Typeface name":"Webdings","Dingbat dec":"156","Dingbat hex":"9C","Unicode dec":"128390","Unicode hex":"1F586"},{"Typeface name":"Webdings","Dingbat dec":"157","Dingbat hex":"9D","Unicode dec":"128441","Unicode hex":"1F5B9"},{"Typeface name":"Webdings","Dingbat dec":"158","Dingbat hex":"9E","Unicode dec":"128442","Unicode hex":"1F5BA"},{"Typeface name":"Webdings","Dingbat dec":"159","Dingbat hex":"9F","Unicode dec":"128443","Unicode hex":"1F5BB"},{"Typeface name":"Webdings","Dingbat dec":"160","Dingbat hex":"A0","Unicode dec":"128373","Unicode hex":"1F575"},{"Typeface name":"Webdings","Dingbat dec":"161","Dingbat hex":"A1","Unicode dec":"128368","Unicode hex":"1F570"},{"Typeface name":"Webdings","Dingbat dec":"162","Dingbat hex":"A2","Unicode dec":"128445","Unicode hex":"1F5BD"},{"Typeface name":"Webdings","Dingbat dec":"163","Dingbat hex":"A3","Unicode dec":"128446","Unicode hex":"1F5BE"},{"Typeface name":"Webdings","Dingbat dec":"164","Dingbat hex":"A4","Unicode dec":"128203","Unicode hex":"1F4CB"},{"Typeface name":"Webdings","Dingbat dec":"165","Dingbat hex":"A5","Unicode dec":"128466","Unicode hex":"1F5D2"},{"Typeface name":"Webdings","Dingbat dec":"166","Dingbat hex":"A6","Unicode dec":"128467","Unicode hex":"1F5D3"},{"Typeface name":"Webdings","Dingbat dec":"167","Dingbat hex":"A7","Unicode dec":"128366","Unicode hex":"1F56E"},{"Typeface name":"Webdings","Dingbat dec":"168","Dingbat hex":"A8","Unicode dec":"128218","Unicode hex":"1F4DA"},{"Typeface name":"Webdings","Dingbat dec":"169","Dingbat hex":"A9","Unicode dec":"128478","Unicode hex":"1F5DE"},{"Typeface name":"Webdings","Dingbat dec":"170","Dingbat hex":"AA","Unicode dec":"128479","Unicode hex":"1F5DF"},{"Typeface name":"Webdings","Dingbat dec":"171","Dingbat hex":"AB","Unicode dec":"128451","Unicode hex":"1F5C3"},{"Typeface name":"Webdings","Dingbat dec":"172","Dingbat hex":"AC","Unicode dec":"128450","Unicode hex":"1F5C2"},{"Typeface name":"Webdings","Dingbat dec":"173","Dingbat hex":"AD","Unicode dec":"128444","Unicode hex":"1F5BC"},{"Typeface name":"Webdings","Dingbat dec":"174","Dingbat hex":"AE","Unicode dec":"127917","Unicode hex":"1F3AD"},{"Typeface name":"Webdings","Dingbat dec":"175","Dingbat hex":"AF","Unicode dec":"127900","Unicode hex":"1F39C"},{"Typeface name":"Webdings","Dingbat dec":"176","Dingbat hex":"B0","Unicode dec":"127896","Unicode hex":"1F398"},{"Typeface name":"Webdings","Dingbat dec":"177","Dingbat hex":"B1","Unicode dec":"127897","Unicode hex":"1F399"},{"Typeface name":"Webdings","Dingbat dec":"178","Dingbat hex":"B2","Unicode dec":"127911","Unicode hex":"1F3A7"},{"Typeface name":"Webdings","Dingbat dec":"179","Dingbat hex":"B3","Unicode dec":"128191","Unicode hex":"1F4BF"},{"Typeface name":"Webdings","Dingbat dec":"180","Dingbat hex":"B4","Unicode dec":"127902","Unicode hex":"1F39E"},{"Typeface name":"Webdings","Dingbat dec":"181","Dingbat hex":"B5","Unicode dec":"128247","Unicode hex":"1F4F7"},{"Typeface name":"Webdings","Dingbat dec":"182","Dingbat hex":"B6","Unicode dec":"127903","Unicode hex":"1F39F"},{"Typeface name":"Webdings","Dingbat dec":"183","Dingbat hex":"B7","Unicode dec":"127916","Unicode hex":"1F3AC"},{"Typeface name":"Webdings","Dingbat dec":"184","Dingbat hex":"B8","Unicode dec":"128253","Unicode hex":"1F4FD"},{"Typeface name":"Webdings","Dingbat dec":"185","Dingbat hex":"B9","Unicode dec":"128249","Unicode hex":"1F4F9"},{"Typeface name":"Webdings","Dingbat dec":"186","Dingbat hex":"BA","Unicode dec":"128254","Unicode hex":"1F4FE"},{"Typeface name":"Webdings","Dingbat dec":"187","Dingbat hex":"BB","Unicode dec":"128251","Unicode hex":"1F4FB"},{"Typeface name":"Webdings","Dingbat dec":"188","Dingbat hex":"BC","Unicode dec":"127898","Unicode hex":"1F39A"},{"Typeface name":"Webdings","Dingbat dec":"189","Dingbat hex":"BD","Unicode dec":"127899","Unicode hex":"1F39B"},{"Typeface name":"Webdings","Dingbat dec":"190","Dingbat hex":"BE","Unicode dec":"128250","Unicode hex":"1F4FA"},{"Typeface name":"Webdings","Dingbat dec":"191","Dingbat hex":"BF","Unicode dec":"128187","Unicode hex":"1F4BB"},{"Typeface name":"Webdings","Dingbat dec":"192","Dingbat hex":"C0","Unicode dec":"128421","Unicode hex":"1F5A5"},{"Typeface name":"Webdings","Dingbat dec":"193","Dingbat hex":"C1","Unicode dec":"128422","Unicode hex":"1F5A6"},{"Typeface name":"Webdings","Dingbat dec":"194","Dingbat hex":"C2","Unicode dec":"128423","Unicode hex":"1F5A7"},{"Typeface name":"Webdings","Dingbat dec":"195","Dingbat hex":"C3","Unicode dec":"128377","Unicode hex":"1F579"},{"Typeface name":"Webdings","Dingbat dec":"196","Dingbat hex":"C4","Unicode dec":"127918","Unicode hex":"1F3AE"},{"Typeface name":"Webdings","Dingbat dec":"197","Dingbat hex":"C5","Unicode dec":"128379","Unicode hex":"1F57B"},{"Typeface name":"Webdings","Dingbat dec":"198","Dingbat hex":"C6","Unicode dec":"128380","Unicode hex":"1F57C"},{"Typeface name":"Webdings","Dingbat dec":"199","Dingbat hex":"C7","Unicode dec":"128223","Unicode hex":"1F4DF"},{"Typeface name":"Webdings","Dingbat dec":"200","Dingbat hex":"C8","Unicode dec":"128385","Unicode hex":"1F581"},{"Typeface name":"Webdings","Dingbat dec":"201","Dingbat hex":"C9","Unicode dec":"128384","Unicode hex":"1F580"},{"Typeface name":"Webdings","Dingbat dec":"202","Dingbat hex":"CA","Unicode dec":"128424","Unicode hex":"1F5A8"},{"Typeface name":"Webdings","Dingbat dec":"203","Dingbat hex":"CB","Unicode dec":"128425","Unicode hex":"1F5A9"},{"Typeface name":"Webdings","Dingbat dec":"204","Dingbat hex":"CC","Unicode dec":"128447","Unicode hex":"1F5BF"},{"Typeface name":"Webdings","Dingbat dec":"205","Dingbat hex":"CD","Unicode dec":"128426","Unicode hex":"1F5AA"},{"Typeface name":"Webdings","Dingbat dec":"206","Dingbat hex":"CE","Unicode dec":"128476","Unicode hex":"1F5DC"},{"Typeface name":"Webdings","Dingbat dec":"207","Dingbat hex":"CF","Unicode dec":"128274","Unicode hex":"1F512"},{"Typeface name":"Webdings","Dingbat dec":"208","Dingbat hex":"D0","Unicode dec":"128275","Unicode hex":"1F513"},{"Typeface name":"Webdings","Dingbat dec":"209","Dingbat hex":"D1","Unicode dec":"128477","Unicode hex":"1F5DD"},{"Typeface name":"Webdings","Dingbat dec":"210","Dingbat hex":"D2","Unicode dec":"128229","Unicode hex":"1F4E5"},{"Typeface name":"Webdings","Dingbat dec":"211","Dingbat hex":"D3","Unicode dec":"128228","Unicode hex":"1F4E4"},{"Typeface name":"Webdings","Dingbat dec":"212","Dingbat hex":"D4","Unicode dec":"128371","Unicode hex":"1F573"},{"Typeface name":"Webdings","Dingbat dec":"213","Dingbat hex":"D5","Unicode dec":"127779","Unicode hex":"1F323"},{"Typeface name":"Webdings","Dingbat dec":"214","Dingbat hex":"D6","Unicode dec":"127780","Unicode hex":"1F324"},{"Typeface name":"Webdings","Dingbat dec":"215","Dingbat hex":"D7","Unicode dec":"127781","Unicode hex":"1F325"},{"Typeface name":"Webdings","Dingbat dec":"216","Dingbat hex":"D8","Unicode dec":"127782","Unicode hex":"1F326"},{"Typeface name":"Webdings","Dingbat dec":"217","Dingbat hex":"D9","Unicode dec":"9729","Unicode hex":"2601"},{"Typeface name":"Webdings","Dingbat dec":"218","Dingbat hex":"DA","Unicode dec":"127784","Unicode hex":"1F328"},{"Typeface name":"Webdings","Dingbat dec":"219","Dingbat hex":"DB","Unicode dec":"127783","Unicode hex":"1F327"},{"Typeface name":"Webdings","Dingbat dec":"220","Dingbat hex":"DC","Unicode dec":"127785","Unicode hex":"1F329"},{"Typeface name":"Webdings","Dingbat dec":"221","Dingbat hex":"DD","Unicode dec":"127786","Unicode hex":"1F32A"},{"Typeface name":"Webdings","Dingbat dec":"222","Dingbat hex":"DE","Unicode dec":"127788","Unicode hex":"1F32C"},{"Typeface name":"Webdings","Dingbat dec":"223","Dingbat hex":"DF","Unicode dec":"127787","Unicode hex":"1F32B"},{"Typeface name":"Webdings","Dingbat dec":"224","Dingbat hex":"E0","Unicode dec":"127772","Unicode hex":"1F31C"},{"Typeface name":"Webdings","Dingbat dec":"225","Dingbat hex":"E1","Unicode dec":"127777","Unicode hex":"1F321"},{"Typeface name":"Webdings","Dingbat dec":"226","Dingbat hex":"E2","Unicode dec":"128715","Unicode hex":"1F6CB"},{"Typeface name":"Webdings","Dingbat dec":"227","Dingbat hex":"E3","Unicode dec":"128719","Unicode hex":"1F6CF"},{"Typeface name":"Webdings","Dingbat dec":"228","Dingbat hex":"E4","Unicode dec":"127869","Unicode hex":"1F37D"},{"Typeface name":"Webdings","Dingbat dec":"229","Dingbat hex":"E5","Unicode dec":"127864","Unicode hex":"1F378"},{"Typeface name":"Webdings","Dingbat dec":"230","Dingbat hex":"E6","Unicode dec":"128718","Unicode hex":"1F6CE"},{"Typeface name":"Webdings","Dingbat dec":"231","Dingbat hex":"E7","Unicode dec":"128717","Unicode hex":"1F6CD"},{"Typeface name":"Webdings","Dingbat dec":"232","Dingbat hex":"E8","Unicode dec":"9413","Unicode hex":"24C5"},{"Typeface name":"Webdings","Dingbat dec":"233","Dingbat hex":"E9","Unicode dec":"9855","Unicode hex":"267F"},{"Typeface name":"Webdings","Dingbat dec":"234","Dingbat hex":"EA","Unicode dec":"128710","Unicode hex":"1F6C6"},{"Typeface name":"Webdings","Dingbat dec":"235","Dingbat hex":"EB","Unicode dec":"128392","Unicode hex":"1F588"},{"Typeface name":"Webdings","Dingbat dec":"236","Dingbat hex":"EC","Unicode dec":"127891","Unicode hex":"1F393"},{"Typeface name":"Webdings","Dingbat dec":"237","Dingbat hex":"ED","Unicode dec":"128484","Unicode hex":"1F5E4"},{"Typeface name":"Webdings","Dingbat dec":"238","Dingbat hex":"EE","Unicode dec":"128485","Unicode hex":"1F5E5"},{"Typeface name":"Webdings","Dingbat dec":"239","Dingbat hex":"EF","Unicode dec":"128486","Unicode hex":"1F5E6"},{"Typeface name":"Webdings","Dingbat dec":"240","Dingbat hex":"F0","Unicode dec":"128487","Unicode hex":"1F5E7"},{"Typeface name":"Webdings","Dingbat dec":"241","Dingbat hex":"F1","Unicode dec":"128746","Unicode hex":"1F6EA"},{"Typeface name":"Webdings","Dingbat dec":"242","Dingbat hex":"F2","Unicode dec":"128063","Unicode hex":"1F43F"},{"Typeface name":"Webdings","Dingbat dec":"243","Dingbat hex":"F3","Unicode dec":"128038","Unicode hex":"1F426"},{"Typeface name":"Webdings","Dingbat dec":"244","Dingbat hex":"F4","Unicode dec":"128031","Unicode hex":"1F41F"},{"Typeface name":"Webdings","Dingbat dec":"245","Dingbat hex":"F5","Unicode dec":"128021","Unicode hex":"1F415"},{"Typeface name":"Webdings","Dingbat dec":"246","Dingbat hex":"F6","Unicode dec":"128008","Unicode hex":"1F408"},{"Typeface name":"Webdings","Dingbat dec":"247","Dingbat hex":"F7","Unicode dec":"128620","Unicode hex":"1F66C"},{"Typeface name":"Webdings","Dingbat dec":"248","Dingbat hex":"F8","Unicode dec":"128622","Unicode hex":"1F66E"},{"Typeface name":"Webdings","Dingbat dec":"249","Dingbat hex":"F9","Unicode dec":"128621","Unicode hex":"1F66D"},{"Typeface name":"Webdings","Dingbat dec":"250","Dingbat hex":"FA","Unicode dec":"128623","Unicode hex":"1F66F"},{"Typeface name":"Webdings","Dingbat dec":"251","Dingbat hex":"FB","Unicode dec":"128506","Unicode hex":"1F5FA"},{"Typeface name":"Webdings","Dingbat dec":"252","Dingbat hex":"FC","Unicode dec":"127757","Unicode hex":"1F30D"},{"Typeface name":"Webdings","Dingbat dec":"253","Dingbat hex":"FD","Unicode dec":"127759","Unicode hex":"1F30F"},{"Typeface name":"Webdings","Dingbat dec":"254","Dingbat hex":"FE","Unicode dec":"127758","Unicode hex":"1F30E"},{"Typeface name":"Webdings","Dingbat dec":"255","Dingbat hex":"FF","Unicode dec":"128330","Unicode hex":"1F54A"},{"Typeface name":"Wingdings","Dingbat dec":"32","Dingbat hex":"20","Unicode dec":"32","Unicode hex":"20"},{"Typeface name":"Wingdings","Dingbat dec":"33","Dingbat hex":"21","Unicode dec":"128393","Unicode hex":"1F589"},{"Typeface name":"Wingdings","Dingbat dec":"34","Dingbat hex":"22","Unicode dec":"9986","Unicode hex":"2702"},{"Typeface name":"Wingdings","Dingbat dec":"35","Dingbat hex":"23","Unicode dec":"9985","Unicode hex":"2701"},{"Typeface name":"Wingdings","Dingbat dec":"36","Dingbat hex":"24","Unicode dec":"128083","Unicode hex":"1F453"},{"Typeface name":"Wingdings","Dingbat dec":"37","Dingbat hex":"25","Unicode dec":"128365","Unicode hex":"1F56D"},{"Typeface name":"Wingdings","Dingbat dec":"38","Dingbat hex":"26","Unicode dec":"128366","Unicode hex":"1F56E"},{"Typeface name":"Wingdings","Dingbat dec":"39","Dingbat hex":"27","Unicode dec":"128367","Unicode hex":"1F56F"},{"Typeface name":"Wingdings","Dingbat dec":"40","Dingbat hex":"28","Unicode dec":"128383","Unicode hex":"1F57F"},{"Typeface name":"Wingdings","Dingbat dec":"41","Dingbat hex":"29","Unicode dec":"9990","Unicode hex":"2706"},{"Typeface name":"Wingdings","Dingbat dec":"42","Dingbat hex":"2A","Unicode dec":"128386","Unicode hex":"1F582"},{"Typeface name":"Wingdings","Dingbat dec":"43","Dingbat hex":"2B","Unicode dec":"128387","Unicode hex":"1F583"},{"Typeface name":"Wingdings","Dingbat dec":"44","Dingbat hex":"2C","Unicode dec":"128234","Unicode hex":"1F4EA"},{"Typeface name":"Wingdings","Dingbat dec":"45","Dingbat hex":"2D","Unicode dec":"128235","Unicode hex":"1F4EB"},{"Typeface name":"Wingdings","Dingbat dec":"46","Dingbat hex":"2E","Unicode dec":"128236","Unicode hex":"1F4EC"},{"Typeface name":"Wingdings","Dingbat dec":"47","Dingbat hex":"2F","Unicode dec":"128237","Unicode hex":"1F4ED"},{"Typeface name":"Wingdings","Dingbat dec":"48","Dingbat hex":"30","Unicode dec":"128448","Unicode hex":"1F5C0"},{"Typeface name":"Wingdings","Dingbat dec":"49","Dingbat hex":"31","Unicode dec":"128449","Unicode hex":"1F5C1"},{"Typeface name":"Wingdings","Dingbat dec":"50","Dingbat hex":"32","Unicode dec":"128462","Unicode hex":"1F5CE"},{"Typeface name":"Wingdings","Dingbat dec":"51","Dingbat hex":"33","Unicode dec":"128463","Unicode hex":"1F5CF"},{"Typeface name":"Wingdings","Dingbat dec":"52","Dingbat hex":"34","Unicode dec":"128464","Unicode hex":"1F5D0"},{"Typeface name":"Wingdings","Dingbat dec":"53","Dingbat hex":"35","Unicode dec":"128452","Unicode hex":"1F5C4"},{"Typeface name":"Wingdings","Dingbat dec":"54","Dingbat hex":"36","Unicode dec":"8987","Unicode hex":"231B"},{"Typeface name":"Wingdings","Dingbat dec":"55","Dingbat hex":"37","Unicode dec":"128430","Unicode hex":"1F5AE"},{"Typeface name":"Wingdings","Dingbat dec":"56","Dingbat hex":"38","Unicode dec":"128432","Unicode hex":"1F5B0"},{"Typeface name":"Wingdings","Dingbat dec":"57","Dingbat hex":"39","Unicode dec":"128434","Unicode hex":"1F5B2"},{"Typeface name":"Wingdings","Dingbat dec":"58","Dingbat hex":"3A","Unicode dec":"128435","Unicode hex":"1F5B3"},{"Typeface name":"Wingdings","Dingbat dec":"59","Dingbat hex":"3B","Unicode dec":"128436","Unicode hex":"1F5B4"},{"Typeface name":"Wingdings","Dingbat dec":"60","Dingbat hex":"3C","Unicode dec":"128427","Unicode hex":"1F5AB"},{"Typeface name":"Wingdings","Dingbat dec":"61","Dingbat hex":"3D","Unicode dec":"128428","Unicode hex":"1F5AC"},{"Typeface name":"Wingdings","Dingbat dec":"62","Dingbat hex":"3E","Unicode dec":"9991","Unicode hex":"2707"},{"Typeface name":"Wingdings","Dingbat dec":"63","Dingbat hex":"3F","Unicode dec":"9997","Unicode hex":"270D"},{"Typeface name":"Wingdings","Dingbat dec":"64","Dingbat hex":"40","Unicode dec":"128398","Unicode hex":"1F58E"},{"Typeface name":"Wingdings","Dingbat dec":"65","Dingbat hex":"41","Unicode dec":"9996","Unicode hex":"270C"},{"Typeface name":"Wingdings","Dingbat dec":"66","Dingbat hex":"42","Unicode dec":"128399","Unicode hex":"1F58F"},{"Typeface name":"Wingdings","Dingbat dec":"67","Dingbat hex":"43","Unicode dec":"128077","Unicode hex":"1F44D"},{"Typeface name":"Wingdings","Dingbat dec":"68","Dingbat hex":"44","Unicode dec":"128078","Unicode hex":"1F44E"},{"Typeface name":"Wingdings","Dingbat dec":"69","Dingbat hex":"45","Unicode dec":"9756","Unicode hex":"261C"},{"Typeface name":"Wingdings","Dingbat dec":"70","Dingbat hex":"46","Unicode dec":"9758","Unicode hex":"261E"},{"Typeface name":"Wingdings","Dingbat dec":"71","Dingbat hex":"47","Unicode dec":"9757","Unicode hex":"261D"},{"Typeface name":"Wingdings","Dingbat dec":"72","Dingbat hex":"48","Unicode dec":"9759","Unicode hex":"261F"},{"Typeface name":"Wingdings","Dingbat dec":"73","Dingbat hex":"49","Unicode dec":"128400","Unicode hex":"1F590"},{"Typeface name":"Wingdings","Dingbat dec":"74","Dingbat hex":"4A","Unicode dec":"9786","Unicode hex":"263A"},{"Typeface name":"Wingdings","Dingbat dec":"75","Dingbat hex":"4B","Unicode dec":"128528","Unicode hex":"1F610"},{"Typeface name":"Wingdings","Dingbat dec":"76","Dingbat hex":"4C","Unicode dec":"9785","Unicode hex":"2639"},{"Typeface name":"Wingdings","Dingbat dec":"77","Dingbat hex":"4D","Unicode dec":"128163","Unicode hex":"1F4A3"},{"Typeface name":"Wingdings","Dingbat dec":"78","Dingbat hex":"4E","Unicode dec":"128369","Unicode hex":"1F571"},{"Typeface name":"Wingdings","Dingbat dec":"79","Dingbat hex":"4F","Unicode dec":"127987","Unicode hex":"1F3F3"},{"Typeface name":"Wingdings","Dingbat dec":"80","Dingbat hex":"50","Unicode dec":"127985","Unicode hex":"1F3F1"},{"Typeface name":"Wingdings","Dingbat dec":"81","Dingbat hex":"51","Unicode dec":"9992","Unicode hex":"2708"},{"Typeface name":"Wingdings","Dingbat dec":"82","Dingbat hex":"52","Unicode dec":"9788","Unicode hex":"263C"},{"Typeface name":"Wingdings","Dingbat dec":"83","Dingbat hex":"53","Unicode dec":"127778","Unicode hex":"1F322"},{"Typeface name":"Wingdings","Dingbat dec":"84","Dingbat hex":"54","Unicode dec":"10052","Unicode hex":"2744"},{"Typeface name":"Wingdings","Dingbat dec":"85","Dingbat hex":"55","Unicode dec":"128326","Unicode hex":"1F546"},{"Typeface name":"Wingdings","Dingbat dec":"86","Dingbat hex":"56","Unicode dec":"10014","Unicode hex":"271E"},{"Typeface name":"Wingdings","Dingbat dec":"87","Dingbat hex":"57","Unicode dec":"128328","Unicode hex":"1F548"},{"Typeface name":"Wingdings","Dingbat dec":"88","Dingbat hex":"58","Unicode dec":"10016","Unicode hex":"2720"},{"Typeface name":"Wingdings","Dingbat dec":"89","Dingbat hex":"59","Unicode dec":"10017","Unicode hex":"2721"},{"Typeface name":"Wingdings","Dingbat dec":"90","Dingbat hex":"5A","Unicode dec":"9770","Unicode hex":"262A"},{"Typeface name":"Wingdings","Dingbat dec":"91","Dingbat hex":"5B","Unicode dec":"9775","Unicode hex":"262F"},{"Typeface name":"Wingdings","Dingbat dec":"92","Dingbat hex":"5C","Unicode dec":"128329","Unicode hex":"1F549"},{"Typeface name":"Wingdings","Dingbat dec":"93","Dingbat hex":"5D","Unicode dec":"9784","Unicode hex":"2638"},{"Typeface name":"Wingdings","Dingbat dec":"94","Dingbat hex":"5E","Unicode dec":"9800","Unicode hex":"2648"},{"Typeface name":"Wingdings","Dingbat dec":"95","Dingbat hex":"5F","Unicode dec":"9801","Unicode hex":"2649"},{"Typeface name":"Wingdings","Dingbat dec":"96","Dingbat hex":"60","Unicode dec":"9802","Unicode hex":"264A"},{"Typeface name":"Wingdings","Dingbat dec":"97","Dingbat hex":"61","Unicode dec":"9803","Unicode hex":"264B"},{"Typeface name":"Wingdings","Dingbat dec":"98","Dingbat hex":"62","Unicode dec":"9804","Unicode hex":"264C"},{"Typeface name":"Wingdings","Dingbat dec":"99","Dingbat hex":"63","Unicode dec":"9805","Unicode hex":"264D"},{"Typeface name":"Wingdings","Dingbat dec":"100","Dingbat hex":"64","Unicode dec":"9806","Unicode hex":"264E"},{"Typeface name":"Wingdings","Dingbat dec":"101","Dingbat hex":"65","Unicode dec":"9807","Unicode hex":"264F"},{"Typeface name":"Wingdings","Dingbat dec":"102","Dingbat hex":"66","Unicode dec":"9808","Unicode hex":"2650"},{"Typeface name":"Wingdings","Dingbat dec":"103","Dingbat hex":"67","Unicode dec":"9809","Unicode hex":"2651"},{"Typeface name":"Wingdings","Dingbat dec":"104","Dingbat hex":"68","Unicode dec":"9810","Unicode hex":"2652"},{"Typeface name":"Wingdings","Dingbat dec":"105","Dingbat hex":"69","Unicode dec":"9811","Unicode hex":"2653"},{"Typeface name":"Wingdings","Dingbat dec":"106","Dingbat hex":"6A","Unicode dec":"128624","Unicode hex":"1F670"},{"Typeface name":"Wingdings","Dingbat dec":"107","Dingbat hex":"6B","Unicode dec":"128629","Unicode hex":"1F675"},{"Typeface name":"Wingdings","Dingbat dec":"108","Dingbat hex":"6C","Unicode dec":"9899","Unicode hex":"26AB"},{"Typeface name":"Wingdings","Dingbat dec":"109","Dingbat hex":"6D","Unicode dec":"128318","Unicode hex":"1F53E"},{"Typeface name":"Wingdings","Dingbat dec":"110","Dingbat hex":"6E","Unicode dec":"9724","Unicode hex":"25FC"},{"Typeface name":"Wingdings","Dingbat dec":"111","Dingbat hex":"6F","Unicode dec":"128911","Unicode hex":"1F78F"},{"Typeface name":"Wingdings","Dingbat dec":"112","Dingbat hex":"70","Unicode dec":"128912","Unicode hex":"1F790"},{"Typeface name":"Wingdings","Dingbat dec":"113","Dingbat hex":"71","Unicode dec":"10065","Unicode hex":"2751"},{"Typeface name":"Wingdings","Dingbat dec":"114","Dingbat hex":"72","Unicode dec":"10066","Unicode hex":"2752"},{"Typeface name":"Wingdings","Dingbat dec":"115","Dingbat hex":"73","Unicode dec":"128927","Unicode hex":"1F79F"},{"Typeface name":"Wingdings","Dingbat dec":"116","Dingbat hex":"74","Unicode dec":"10731","Unicode hex":"29EB"},{"Typeface name":"Wingdings","Dingbat dec":"117","Dingbat hex":"75","Unicode dec":"9670","Unicode hex":"25C6"},{"Typeface name":"Wingdings","Dingbat dec":"118","Dingbat hex":"76","Unicode dec":"10070","Unicode hex":"2756"},{"Typeface name":"Wingdings","Dingbat dec":"119","Dingbat hex":"77","Unicode dec":"11049","Unicode hex":"2B29"},{"Typeface name":"Wingdings","Dingbat dec":"120","Dingbat hex":"78","Unicode dec":"8999","Unicode hex":"2327"},{"Typeface name":"Wingdings","Dingbat dec":"121","Dingbat hex":"79","Unicode dec":"11193","Unicode hex":"2BB9"},{"Typeface name":"Wingdings","Dingbat dec":"122","Dingbat hex":"7A","Unicode dec":"8984","Unicode hex":"2318"},{"Typeface name":"Wingdings","Dingbat dec":"123","Dingbat hex":"7B","Unicode dec":"127989","Unicode hex":"1F3F5"},{"Typeface name":"Wingdings","Dingbat dec":"124","Dingbat hex":"7C","Unicode dec":"127990","Unicode hex":"1F3F6"},{"Typeface name":"Wingdings","Dingbat dec":"125","Dingbat hex":"7D","Unicode dec":"128630","Unicode hex":"1F676"},{"Typeface name":"Wingdings","Dingbat dec":"126","Dingbat hex":"7E","Unicode dec":"128631","Unicode hex":"1F677"},{"Typeface name":"Wingdings","Dingbat dec":"127","Dingbat hex":"7F","Unicode dec":"9647","Unicode hex":"25AF"},{"Typeface name":"Wingdings","Dingbat dec":"128","Dingbat hex":"80","Unicode dec":"127243","Unicode hex":"1F10B"},{"Typeface name":"Wingdings","Dingbat dec":"129","Dingbat hex":"81","Unicode dec":"10112","Unicode hex":"2780"},{"Typeface name":"Wingdings","Dingbat dec":"130","Dingbat hex":"82","Unicode dec":"10113","Unicode hex":"2781"},{"Typeface name":"Wingdings","Dingbat dec":"131","Dingbat hex":"83","Unicode dec":"10114","Unicode hex":"2782"},{"Typeface name":"Wingdings","Dingbat dec":"132","Dingbat hex":"84","Unicode dec":"10115","Unicode hex":"2783"},{"Typeface name":"Wingdings","Dingbat dec":"133","Dingbat hex":"85","Unicode dec":"10116","Unicode hex":"2784"},{"Typeface name":"Wingdings","Dingbat dec":"134","Dingbat hex":"86","Unicode dec":"10117","Unicode hex":"2785"},{"Typeface name":"Wingdings","Dingbat dec":"135","Dingbat hex":"87","Unicode dec":"10118","Unicode hex":"2786"},{"Typeface name":"Wingdings","Dingbat dec":"136","Dingbat hex":"88","Unicode dec":"10119","Unicode hex":"2787"},{"Typeface name":"Wingdings","Dingbat dec":"137","Dingbat hex":"89","Unicode dec":"10120","Unicode hex":"2788"},{"Typeface name":"Wingdings","Dingbat dec":"138","Dingbat hex":"8A","Unicode dec":"10121","Unicode hex":"2789"},{"Typeface name":"Wingdings","Dingbat dec":"139","Dingbat hex":"8B","Unicode dec":"127244","Unicode hex":"1F10C"},{"Typeface name":"Wingdings","Dingbat dec":"140","Dingbat hex":"8C","Unicode dec":"10122","Unicode hex":"278A"},{"Typeface name":"Wingdings","Dingbat dec":"141","Dingbat hex":"8D","Unicode dec":"10123","Unicode hex":"278B"},{"Typeface name":"Wingdings","Dingbat dec":"142","Dingbat hex":"8E","Unicode dec":"10124","Unicode hex":"278C"},{"Typeface name":"Wingdings", +"Dingbat dec":"143","Dingbat hex":"8F","Unicode dec":"10125","Unicode hex":"278D"},{"Typeface name":"Wingdings","Dingbat dec":"144","Dingbat hex":"90","Unicode dec":"10126","Unicode hex":"278E"},{"Typeface name":"Wingdings","Dingbat dec":"145","Dingbat hex":"91","Unicode dec":"10127","Unicode hex":"278F"},{"Typeface name":"Wingdings","Dingbat dec":"146","Dingbat hex":"92","Unicode dec":"10128","Unicode hex":"2790"},{"Typeface name":"Wingdings","Dingbat dec":"147","Dingbat hex":"93","Unicode dec":"10129","Unicode hex":"2791"},{"Typeface name":"Wingdings","Dingbat dec":"148","Dingbat hex":"94","Unicode dec":"10130","Unicode hex":"2792"},{"Typeface name":"Wingdings","Dingbat dec":"149","Dingbat hex":"95","Unicode dec":"10131","Unicode hex":"2793"},{"Typeface name":"Wingdings","Dingbat dec":"150","Dingbat hex":"96","Unicode dec":"128610","Unicode hex":"1F662"},{"Typeface name":"Wingdings","Dingbat dec":"151","Dingbat hex":"97","Unicode dec":"128608","Unicode hex":"1F660"},{"Typeface name":"Wingdings","Dingbat dec":"152","Dingbat hex":"98","Unicode dec":"128609","Unicode hex":"1F661"},{"Typeface name":"Wingdings","Dingbat dec":"153","Dingbat hex":"99","Unicode dec":"128611","Unicode hex":"1F663"},{"Typeface name":"Wingdings","Dingbat dec":"154","Dingbat hex":"9A","Unicode dec":"128606","Unicode hex":"1F65E"},{"Typeface name":"Wingdings","Dingbat dec":"155","Dingbat hex":"9B","Unicode dec":"128604","Unicode hex":"1F65C"},{"Typeface name":"Wingdings","Dingbat dec":"156","Dingbat hex":"9C","Unicode dec":"128605","Unicode hex":"1F65D"},{"Typeface name":"Wingdings","Dingbat dec":"157","Dingbat hex":"9D","Unicode dec":"128607","Unicode hex":"1F65F"},{"Typeface name":"Wingdings","Dingbat dec":"158","Dingbat hex":"9E","Unicode dec":"8729","Unicode hex":"2219"},{"Typeface name":"Wingdings","Dingbat dec":"159","Dingbat hex":"9F","Unicode dec":"8226","Unicode hex":"2022"},{"Typeface name":"Wingdings","Dingbat dec":"160","Dingbat hex":"A0","Unicode dec":"11037","Unicode hex":"2B1D"},{"Typeface name":"Wingdings","Dingbat dec":"161","Dingbat hex":"A1","Unicode dec":"11096","Unicode hex":"2B58"},{"Typeface name":"Wingdings","Dingbat dec":"162","Dingbat hex":"A2","Unicode dec":"128902","Unicode hex":"1F786"},{"Typeface name":"Wingdings","Dingbat dec":"163","Dingbat hex":"A3","Unicode dec":"128904","Unicode hex":"1F788"},{"Typeface name":"Wingdings","Dingbat dec":"164","Dingbat hex":"A4","Unicode dec":"128906","Unicode hex":"1F78A"},{"Typeface name":"Wingdings","Dingbat dec":"165","Dingbat hex":"A5","Unicode dec":"128907","Unicode hex":"1F78B"},{"Typeface name":"Wingdings","Dingbat dec":"166","Dingbat hex":"A6","Unicode dec":"128319","Unicode hex":"1F53F"},{"Typeface name":"Wingdings","Dingbat dec":"167","Dingbat hex":"A7","Unicode dec":"9642","Unicode hex":"25AA"},{"Typeface name":"Wingdings","Dingbat dec":"168","Dingbat hex":"A8","Unicode dec":"128910","Unicode hex":"1F78E"},{"Typeface name":"Wingdings","Dingbat dec":"169","Dingbat hex":"A9","Unicode dec":"128961","Unicode hex":"1F7C1"},{"Typeface name":"Wingdings","Dingbat dec":"170","Dingbat hex":"AA","Unicode dec":"128965","Unicode hex":"1F7C5"},{"Typeface name":"Wingdings","Dingbat dec":"171","Dingbat hex":"AB","Unicode dec":"9733","Unicode hex":"2605"},{"Typeface name":"Wingdings","Dingbat dec":"172","Dingbat hex":"AC","Unicode dec":"128971","Unicode hex":"1F7CB"},{"Typeface name":"Wingdings","Dingbat dec":"173","Dingbat hex":"AD","Unicode dec":"128975","Unicode hex":"1F7CF"},{"Typeface name":"Wingdings","Dingbat dec":"174","Dingbat hex":"AE","Unicode dec":"128979","Unicode hex":"1F7D3"},{"Typeface name":"Wingdings","Dingbat dec":"175","Dingbat hex":"AF","Unicode dec":"128977","Unicode hex":"1F7D1"},{"Typeface name":"Wingdings","Dingbat dec":"176","Dingbat hex":"B0","Unicode dec":"11216","Unicode hex":"2BD0"},{"Typeface name":"Wingdings","Dingbat dec":"177","Dingbat hex":"B1","Unicode dec":"8982","Unicode hex":"2316"},{"Typeface name":"Wingdings","Dingbat dec":"178","Dingbat hex":"B2","Unicode dec":"11214","Unicode hex":"2BCE"},{"Typeface name":"Wingdings","Dingbat dec":"179","Dingbat hex":"B3","Unicode dec":"11215","Unicode hex":"2BCF"},{"Typeface name":"Wingdings","Dingbat dec":"180","Dingbat hex":"B4","Unicode dec":"11217","Unicode hex":"2BD1"},{"Typeface name":"Wingdings","Dingbat dec":"181","Dingbat hex":"B5","Unicode dec":"10026","Unicode hex":"272A"},{"Typeface name":"Wingdings","Dingbat dec":"182","Dingbat hex":"B6","Unicode dec":"10032","Unicode hex":"2730"},{"Typeface name":"Wingdings","Dingbat dec":"183","Dingbat hex":"B7","Unicode dec":"128336","Unicode hex":"1F550"},{"Typeface name":"Wingdings","Dingbat dec":"184","Dingbat hex":"B8","Unicode dec":"128337","Unicode hex":"1F551"},{"Typeface name":"Wingdings","Dingbat dec":"185","Dingbat hex":"B9","Unicode dec":"128338","Unicode hex":"1F552"},{"Typeface name":"Wingdings","Dingbat dec":"186","Dingbat hex":"BA","Unicode dec":"128339","Unicode hex":"1F553"},{"Typeface name":"Wingdings","Dingbat dec":"187","Dingbat hex":"BB","Unicode dec":"128340","Unicode hex":"1F554"},{"Typeface name":"Wingdings","Dingbat dec":"188","Dingbat hex":"BC","Unicode dec":"128341","Unicode hex":"1F555"},{"Typeface name":"Wingdings","Dingbat dec":"189","Dingbat hex":"BD","Unicode dec":"128342","Unicode hex":"1F556"},{"Typeface name":"Wingdings","Dingbat dec":"190","Dingbat hex":"BE","Unicode dec":"128343","Unicode hex":"1F557"},{"Typeface name":"Wingdings","Dingbat dec":"191","Dingbat hex":"BF","Unicode dec":"128344","Unicode hex":"1F558"},{"Typeface name":"Wingdings","Dingbat dec":"192","Dingbat hex":"C0","Unicode dec":"128345","Unicode hex":"1F559"},{"Typeface name":"Wingdings","Dingbat dec":"193","Dingbat hex":"C1","Unicode dec":"128346","Unicode hex":"1F55A"},{"Typeface name":"Wingdings","Dingbat dec":"194","Dingbat hex":"C2","Unicode dec":"128347","Unicode hex":"1F55B"},{"Typeface name":"Wingdings","Dingbat dec":"195","Dingbat hex":"C3","Unicode dec":"11184","Unicode hex":"2BB0"},{"Typeface name":"Wingdings","Dingbat dec":"196","Dingbat hex":"C4","Unicode dec":"11185","Unicode hex":"2BB1"},{"Typeface name":"Wingdings","Dingbat dec":"197","Dingbat hex":"C5","Unicode dec":"11186","Unicode hex":"2BB2"},{"Typeface name":"Wingdings","Dingbat dec":"198","Dingbat hex":"C6","Unicode dec":"11187","Unicode hex":"2BB3"},{"Typeface name":"Wingdings","Dingbat dec":"199","Dingbat hex":"C7","Unicode dec":"11188","Unicode hex":"2BB4"},{"Typeface name":"Wingdings","Dingbat dec":"200","Dingbat hex":"C8","Unicode dec":"11189","Unicode hex":"2BB5"},{"Typeface name":"Wingdings","Dingbat dec":"201","Dingbat hex":"C9","Unicode dec":"11190","Unicode hex":"2BB6"},{"Typeface name":"Wingdings","Dingbat dec":"202","Dingbat hex":"CA","Unicode dec":"11191","Unicode hex":"2BB7"},{"Typeface name":"Wingdings","Dingbat dec":"203","Dingbat hex":"CB","Unicode dec":"128618","Unicode hex":"1F66A"},{"Typeface name":"Wingdings","Dingbat dec":"204","Dingbat hex":"CC","Unicode dec":"128619","Unicode hex":"1F66B"},{"Typeface name":"Wingdings","Dingbat dec":"205","Dingbat hex":"CD","Unicode dec":"128597","Unicode hex":"1F655"},{"Typeface name":"Wingdings","Dingbat dec":"206","Dingbat hex":"CE","Unicode dec":"128596","Unicode hex":"1F654"},{"Typeface name":"Wingdings","Dingbat dec":"207","Dingbat hex":"CF","Unicode dec":"128599","Unicode hex":"1F657"},{"Typeface name":"Wingdings","Dingbat dec":"208","Dingbat hex":"D0","Unicode dec":"128598","Unicode hex":"1F656"},{"Typeface name":"Wingdings","Dingbat dec":"209","Dingbat hex":"D1","Unicode dec":"128592","Unicode hex":"1F650"},{"Typeface name":"Wingdings","Dingbat dec":"210","Dingbat hex":"D2","Unicode dec":"128593","Unicode hex":"1F651"},{"Typeface name":"Wingdings","Dingbat dec":"211","Dingbat hex":"D3","Unicode dec":"128594","Unicode hex":"1F652"},{"Typeface name":"Wingdings","Dingbat dec":"212","Dingbat hex":"D4","Unicode dec":"128595","Unicode hex":"1F653"},{"Typeface name":"Wingdings","Dingbat dec":"213","Dingbat hex":"D5","Unicode dec":"9003","Unicode hex":"232B"},{"Typeface name":"Wingdings","Dingbat dec":"214","Dingbat hex":"D6","Unicode dec":"8998","Unicode hex":"2326"},{"Typeface name":"Wingdings","Dingbat dec":"215","Dingbat hex":"D7","Unicode dec":"11160","Unicode hex":"2B98"},{"Typeface name":"Wingdings","Dingbat dec":"216","Dingbat hex":"D8","Unicode dec":"11162","Unicode hex":"2B9A"},{"Typeface name":"Wingdings","Dingbat dec":"217","Dingbat hex":"D9","Unicode dec":"11161","Unicode hex":"2B99"},{"Typeface name":"Wingdings","Dingbat dec":"218","Dingbat hex":"DA","Unicode dec":"11163","Unicode hex":"2B9B"},{"Typeface name":"Wingdings","Dingbat dec":"219","Dingbat hex":"DB","Unicode dec":"11144","Unicode hex":"2B88"},{"Typeface name":"Wingdings","Dingbat dec":"220","Dingbat hex":"DC","Unicode dec":"11146","Unicode hex":"2B8A"},{"Typeface name":"Wingdings","Dingbat dec":"221","Dingbat hex":"DD","Unicode dec":"11145","Unicode hex":"2B89"},{"Typeface name":"Wingdings","Dingbat dec":"222","Dingbat hex":"DE","Unicode dec":"11147","Unicode hex":"2B8B"},{"Typeface name":"Wingdings","Dingbat dec":"223","Dingbat hex":"DF","Unicode dec":"129128","Unicode hex":"1F868"},{"Typeface name":"Wingdings","Dingbat dec":"224","Dingbat hex":"E0","Unicode dec":"129130","Unicode hex":"1F86A"},{"Typeface name":"Wingdings","Dingbat dec":"225","Dingbat hex":"E1","Unicode dec":"129129","Unicode hex":"1F869"},{"Typeface name":"Wingdings","Dingbat dec":"226","Dingbat hex":"E2","Unicode dec":"129131","Unicode hex":"1F86B"},{"Typeface name":"Wingdings","Dingbat dec":"227","Dingbat hex":"E3","Unicode dec":"129132","Unicode hex":"1F86C"},{"Typeface name":"Wingdings","Dingbat dec":"228","Dingbat hex":"E4","Unicode dec":"129133","Unicode hex":"1F86D"},{"Typeface name":"Wingdings","Dingbat dec":"229","Dingbat hex":"E5","Unicode dec":"129135","Unicode hex":"1F86F"},{"Typeface name":"Wingdings","Dingbat dec":"230","Dingbat hex":"E6","Unicode dec":"129134","Unicode hex":"1F86E"},{"Typeface name":"Wingdings","Dingbat dec":"231","Dingbat hex":"E7","Unicode dec":"129144","Unicode hex":"1F878"},{"Typeface name":"Wingdings","Dingbat dec":"232","Dingbat hex":"E8","Unicode dec":"129146","Unicode hex":"1F87A"},{"Typeface name":"Wingdings","Dingbat dec":"233","Dingbat hex":"E9","Unicode dec":"129145","Unicode hex":"1F879"},{"Typeface name":"Wingdings","Dingbat dec":"234","Dingbat hex":"EA","Unicode dec":"129147","Unicode hex":"1F87B"},{"Typeface name":"Wingdings","Dingbat dec":"235","Dingbat hex":"EB","Unicode dec":"129148","Unicode hex":"1F87C"},{"Typeface name":"Wingdings","Dingbat dec":"236","Dingbat hex":"EC","Unicode dec":"129149","Unicode hex":"1F87D"},{"Typeface name":"Wingdings","Dingbat dec":"237","Dingbat hex":"ED","Unicode dec":"129151","Unicode hex":"1F87F"},{"Typeface name":"Wingdings","Dingbat dec":"238","Dingbat hex":"EE","Unicode dec":"129150","Unicode hex":"1F87E"},{"Typeface name":"Wingdings","Dingbat dec":"239","Dingbat hex":"EF","Unicode dec":"8678","Unicode hex":"21E6"},{"Typeface name":"Wingdings","Dingbat dec":"240","Dingbat hex":"F0","Unicode dec":"8680","Unicode hex":"21E8"},{"Typeface name":"Wingdings","Dingbat dec":"241","Dingbat hex":"F1","Unicode dec":"8679","Unicode hex":"21E7"},{"Typeface name":"Wingdings","Dingbat dec":"242","Dingbat hex":"F2","Unicode dec":"8681","Unicode hex":"21E9"},{"Typeface name":"Wingdings","Dingbat dec":"243","Dingbat hex":"F3","Unicode dec":"11012","Unicode hex":"2B04"},{"Typeface name":"Wingdings","Dingbat dec":"244","Dingbat hex":"F4","Unicode dec":"8691","Unicode hex":"21F3"},{"Typeface name":"Wingdings","Dingbat dec":"245","Dingbat hex":"F5","Unicode dec":"11009","Unicode hex":"2B01"},{"Typeface name":"Wingdings","Dingbat dec":"246","Dingbat hex":"F6","Unicode dec":"11008","Unicode hex":"2B00"},{"Typeface name":"Wingdings","Dingbat dec":"247","Dingbat hex":"F7","Unicode dec":"11011","Unicode hex":"2B03"},{"Typeface name":"Wingdings","Dingbat dec":"248","Dingbat hex":"F8","Unicode dec":"11010","Unicode hex":"2B02"},{"Typeface name":"Wingdings","Dingbat dec":"249","Dingbat hex":"F9","Unicode dec":"129196","Unicode hex":"1F8AC"},{"Typeface name":"Wingdings","Dingbat dec":"250","Dingbat hex":"FA","Unicode dec":"129197","Unicode hex":"1F8AD"},{"Typeface name":"Wingdings","Dingbat dec":"251","Dingbat hex":"FB","Unicode dec":"128502","Unicode hex":"1F5F6"},{"Typeface name":"Wingdings","Dingbat dec":"252","Dingbat hex":"FC","Unicode dec":"10003","Unicode hex":"2713"},{"Typeface name":"Wingdings","Dingbat dec":"253","Dingbat hex":"FD","Unicode dec":"128503","Unicode hex":"1F5F7"},{"Typeface name":"Wingdings","Dingbat dec":"254","Dingbat hex":"FE","Unicode dec":"128505","Unicode hex":"1F5F9"},{"Typeface name":"Wingdings 2","Dingbat dec":"32","Dingbat hex":"20","Unicode dec":"32","Unicode hex":"20"},{"Typeface name":"Wingdings 2","Dingbat dec":"33","Dingbat hex":"21","Unicode dec":"128394","Unicode hex":"1F58A"},{"Typeface name":"Wingdings 2","Dingbat dec":"34","Dingbat hex":"22","Unicode dec":"128395","Unicode hex":"1F58B"},{"Typeface name":"Wingdings 2","Dingbat dec":"35","Dingbat hex":"23","Unicode dec":"128396","Unicode hex":"1F58C"},{"Typeface name":"Wingdings 2","Dingbat dec":"36","Dingbat hex":"24","Unicode dec":"128397","Unicode hex":"1F58D"},{"Typeface name":"Wingdings 2","Dingbat dec":"37","Dingbat hex":"25","Unicode dec":"9988","Unicode hex":"2704"},{"Typeface name":"Wingdings 2","Dingbat dec":"38","Dingbat hex":"26","Unicode dec":"9984","Unicode hex":"2700"},{"Typeface name":"Wingdings 2","Dingbat dec":"39","Dingbat hex":"27","Unicode dec":"128382","Unicode hex":"1F57E"},{"Typeface name":"Wingdings 2","Dingbat dec":"40","Dingbat hex":"28","Unicode dec":"128381","Unicode hex":"1F57D"},{"Typeface name":"Wingdings 2","Dingbat dec":"41","Dingbat hex":"29","Unicode dec":"128453","Unicode hex":"1F5C5"},{"Typeface name":"Wingdings 2","Dingbat dec":"42","Dingbat hex":"2A","Unicode dec":"128454","Unicode hex":"1F5C6"},{"Typeface name":"Wingdings 2","Dingbat dec":"43","Dingbat hex":"2B","Unicode dec":"128455","Unicode hex":"1F5C7"},{"Typeface name":"Wingdings 2","Dingbat dec":"44","Dingbat hex":"2C","Unicode dec":"128456","Unicode hex":"1F5C8"},{"Typeface name":"Wingdings 2","Dingbat dec":"45","Dingbat hex":"2D","Unicode dec":"128457","Unicode hex":"1F5C9"},{"Typeface name":"Wingdings 2","Dingbat dec":"46","Dingbat hex":"2E","Unicode dec":"128458","Unicode hex":"1F5CA"},{"Typeface name":"Wingdings 2","Dingbat dec":"47","Dingbat hex":"2F","Unicode dec":"128459","Unicode hex":"1F5CB"},{"Typeface name":"Wingdings 2","Dingbat dec":"48","Dingbat hex":"30","Unicode dec":"128460","Unicode hex":"1F5CC"},{"Typeface name":"Wingdings 2","Dingbat dec":"49","Dingbat hex":"31","Unicode dec":"128461","Unicode hex":"1F5CD"},{"Typeface name":"Wingdings 2","Dingbat dec":"50","Dingbat hex":"32","Unicode dec":"128203","Unicode hex":"1F4CB"},{"Typeface name":"Wingdings 2","Dingbat dec":"51","Dingbat hex":"33","Unicode dec":"128465","Unicode hex":"1F5D1"},{"Typeface name":"Wingdings 2","Dingbat dec":"52","Dingbat hex":"34","Unicode dec":"128468","Unicode hex":"1F5D4"},{"Typeface name":"Wingdings 2","Dingbat dec":"53","Dingbat hex":"35","Unicode dec":"128437","Unicode hex":"1F5B5"},{"Typeface name":"Wingdings 2","Dingbat dec":"54","Dingbat hex":"36","Unicode dec":"128438","Unicode hex":"1F5B6"},{"Typeface name":"Wingdings 2","Dingbat dec":"55","Dingbat hex":"37","Unicode dec":"128439","Unicode hex":"1F5B7"},{"Typeface name":"Wingdings 2","Dingbat dec":"56","Dingbat hex":"38","Unicode dec":"128440","Unicode hex":"1F5B8"},{"Typeface name":"Wingdings 2","Dingbat dec":"57","Dingbat hex":"39","Unicode dec":"128429","Unicode hex":"1F5AD"},{"Typeface name":"Wingdings 2","Dingbat dec":"58","Dingbat hex":"3A","Unicode dec":"128431","Unicode hex":"1F5AF"},{"Typeface name":"Wingdings 2","Dingbat dec":"59","Dingbat hex":"3B","Unicode dec":"128433","Unicode hex":"1F5B1"},{"Typeface name":"Wingdings 2","Dingbat dec":"60","Dingbat hex":"3C","Unicode dec":"128402","Unicode hex":"1F592"},{"Typeface name":"Wingdings 2","Dingbat dec":"61","Dingbat hex":"3D","Unicode dec":"128403","Unicode hex":"1F593"},{"Typeface name":"Wingdings 2","Dingbat dec":"62","Dingbat hex":"3E","Unicode dec":"128408","Unicode hex":"1F598"},{"Typeface name":"Wingdings 2","Dingbat dec":"63","Dingbat hex":"3F","Unicode dec":"128409","Unicode hex":"1F599"},{"Typeface name":"Wingdings 2","Dingbat dec":"64","Dingbat hex":"40","Unicode dec":"128410","Unicode hex":"1F59A"},{"Typeface name":"Wingdings 2","Dingbat dec":"65","Dingbat hex":"41","Unicode dec":"128411","Unicode hex":"1F59B"},{"Typeface name":"Wingdings 2","Dingbat dec":"66","Dingbat hex":"42","Unicode dec":"128072","Unicode hex":"1F448"},{"Typeface name":"Wingdings 2","Dingbat dec":"67","Dingbat hex":"43","Unicode dec":"128073","Unicode hex":"1F449"},{"Typeface name":"Wingdings 2","Dingbat dec":"68","Dingbat hex":"44","Unicode dec":"128412","Unicode hex":"1F59C"},{"Typeface name":"Wingdings 2","Dingbat dec":"69","Dingbat hex":"45","Unicode dec":"128413","Unicode hex":"1F59D"},{"Typeface name":"Wingdings 2","Dingbat dec":"70","Dingbat hex":"46","Unicode dec":"128414","Unicode hex":"1F59E"},{"Typeface name":"Wingdings 2","Dingbat dec":"71","Dingbat hex":"47","Unicode dec":"128415","Unicode hex":"1F59F"},{"Typeface name":"Wingdings 2","Dingbat dec":"72","Dingbat hex":"48","Unicode dec":"128416","Unicode hex":"1F5A0"},{"Typeface name":"Wingdings 2","Dingbat dec":"73","Dingbat hex":"49","Unicode dec":"128417","Unicode hex":"1F5A1"},{"Typeface name":"Wingdings 2","Dingbat dec":"74","Dingbat hex":"4A","Unicode dec":"128070","Unicode hex":"1F446"},{"Typeface name":"Wingdings 2","Dingbat dec":"75","Dingbat hex":"4B","Unicode dec":"128071","Unicode hex":"1F447"},{"Typeface name":"Wingdings 2","Dingbat dec":"76","Dingbat hex":"4C","Unicode dec":"128418","Unicode hex":"1F5A2"},{"Typeface name":"Wingdings 2","Dingbat dec":"77","Dingbat hex":"4D","Unicode dec":"128419","Unicode hex":"1F5A3"},{"Typeface name":"Wingdings 2","Dingbat dec":"78","Dingbat hex":"4E","Unicode dec":"128401","Unicode hex":"1F591"},{"Typeface name":"Wingdings 2","Dingbat dec":"79","Dingbat hex":"4F","Unicode dec":"128500","Unicode hex":"1F5F4"},{"Typeface name":"Wingdings 2","Dingbat dec":"80","Dingbat hex":"50","Unicode dec":"128504","Unicode hex":"1F5F8"},{"Typeface name":"Wingdings 2","Dingbat dec":"81","Dingbat hex":"51","Unicode dec":"128501","Unicode hex":"1F5F5"},{"Typeface name":"Wingdings 2","Dingbat dec":"82","Dingbat hex":"52","Unicode dec":"9745","Unicode hex":"2611"},{"Typeface name":"Wingdings 2","Dingbat dec":"83","Dingbat hex":"53","Unicode dec":"11197","Unicode hex":"2BBD"},{"Typeface name":"Wingdings 2","Dingbat dec":"84","Dingbat hex":"54","Unicode dec":"9746","Unicode hex":"2612"},{"Typeface name":"Wingdings 2","Dingbat dec":"85","Dingbat hex":"55","Unicode dec":"11198","Unicode hex":"2BBE"},{"Typeface name":"Wingdings 2","Dingbat dec":"86","Dingbat hex":"56","Unicode dec":"11199","Unicode hex":"2BBF"},{"Typeface name":"Wingdings 2","Dingbat dec":"87","Dingbat hex":"57","Unicode dec":"128711","Unicode hex":"1F6C7"},{"Typeface name":"Wingdings 2","Dingbat dec":"88","Dingbat hex":"58","Unicode dec":"10680","Unicode hex":"29B8"},{"Typeface name":"Wingdings 2","Dingbat dec":"89","Dingbat hex":"59","Unicode dec":"128625","Unicode hex":"1F671"},{"Typeface name":"Wingdings 2","Dingbat dec":"90","Dingbat hex":"5A","Unicode dec":"128628","Unicode hex":"1F674"},{"Typeface name":"Wingdings 2","Dingbat dec":"91","Dingbat hex":"5B","Unicode dec":"128626","Unicode hex":"1F672"},{"Typeface name":"Wingdings 2","Dingbat dec":"92","Dingbat hex":"5C","Unicode dec":"128627","Unicode hex":"1F673"},{"Typeface name":"Wingdings 2","Dingbat dec":"93","Dingbat hex":"5D","Unicode dec":"8253","Unicode hex":"203D"},{"Typeface name":"Wingdings 2","Dingbat dec":"94","Dingbat hex":"5E","Unicode dec":"128633","Unicode hex":"1F679"},{"Typeface name":"Wingdings 2","Dingbat dec":"95","Dingbat hex":"5F","Unicode dec":"128634","Unicode hex":"1F67A"},{"Typeface name":"Wingdings 2","Dingbat dec":"96","Dingbat hex":"60","Unicode dec":"128635","Unicode hex":"1F67B"},{"Typeface name":"Wingdings 2","Dingbat dec":"97","Dingbat hex":"61","Unicode dec":"128614","Unicode hex":"1F666"},{"Typeface name":"Wingdings 2","Dingbat dec":"98","Dingbat hex":"62","Unicode dec":"128612","Unicode hex":"1F664"},{"Typeface name":"Wingdings 2","Dingbat dec":"99","Dingbat hex":"63","Unicode dec":"128613","Unicode hex":"1F665"},{"Typeface name":"Wingdings 2","Dingbat dec":"100","Dingbat hex":"64","Unicode dec":"128615","Unicode hex":"1F667"},{"Typeface name":"Wingdings 2","Dingbat dec":"101","Dingbat hex":"65","Unicode dec":"128602","Unicode hex":"1F65A"},{"Typeface name":"Wingdings 2","Dingbat dec":"102","Dingbat hex":"66","Unicode dec":"128600","Unicode hex":"1F658"},{"Typeface name":"Wingdings 2","Dingbat dec":"103","Dingbat hex":"67","Unicode dec":"128601","Unicode hex":"1F659"},{"Typeface name":"Wingdings 2","Dingbat dec":"104","Dingbat hex":"68","Unicode dec":"128603","Unicode hex":"1F65B"},{"Typeface name":"Wingdings 2","Dingbat dec":"105","Dingbat hex":"69","Unicode dec":"9450","Unicode hex":"24EA"},{"Typeface name":"Wingdings 2","Dingbat dec":"106","Dingbat hex":"6A","Unicode dec":"9312","Unicode hex":"2460"},{"Typeface name":"Wingdings 2","Dingbat dec":"107","Dingbat hex":"6B","Unicode dec":"9313","Unicode hex":"2461"},{"Typeface name":"Wingdings 2","Dingbat dec":"108","Dingbat hex":"6C","Unicode dec":"9314","Unicode hex":"2462"},{"Typeface name":"Wingdings 2","Dingbat dec":"109","Dingbat hex":"6D","Unicode dec":"9315","Unicode hex":"2463"},{"Typeface name":"Wingdings 2","Dingbat dec":"110","Dingbat hex":"6E","Unicode dec":"9316","Unicode hex":"2464"},{"Typeface name":"Wingdings 2","Dingbat dec":"111","Dingbat hex":"6F","Unicode dec":"9317","Unicode hex":"2465"},{"Typeface name":"Wingdings 2","Dingbat dec":"112","Dingbat hex":"70","Unicode dec":"9318","Unicode hex":"2466"},{"Typeface name":"Wingdings 2","Dingbat dec":"113","Dingbat hex":"71","Unicode dec":"9319","Unicode hex":"2467"},{"Typeface name":"Wingdings 2","Dingbat dec":"114","Dingbat hex":"72","Unicode dec":"9320","Unicode hex":"2468"},{"Typeface name":"Wingdings 2","Dingbat dec":"115","Dingbat hex":"73","Unicode dec":"9321","Unicode hex":"2469"},{"Typeface name":"Wingdings 2","Dingbat dec":"116","Dingbat hex":"74","Unicode dec":"9471","Unicode hex":"24FF"},{"Typeface name":"Wingdings 2","Dingbat dec":"117","Dingbat hex":"75","Unicode dec":"10102","Unicode hex":"2776"},{"Typeface name":"Wingdings 2","Dingbat dec":"118","Dingbat hex":"76","Unicode dec":"10103","Unicode hex":"2777"},{"Typeface name":"Wingdings 2","Dingbat dec":"119","Dingbat hex":"77","Unicode dec":"10104","Unicode hex":"2778"},{"Typeface name":"Wingdings 2","Dingbat dec":"120","Dingbat hex":"78","Unicode dec":"10105","Unicode hex":"2779"},{"Typeface name":"Wingdings 2","Dingbat dec":"121","Dingbat hex":"79","Unicode dec":"10106","Unicode hex":"277A"},{"Typeface name":"Wingdings 2","Dingbat dec":"122","Dingbat hex":"7A","Unicode dec":"10107","Unicode hex":"277B"},{"Typeface name":"Wingdings 2","Dingbat dec":"123","Dingbat hex":"7B","Unicode dec":"10108","Unicode hex":"277C"},{"Typeface name":"Wingdings 2","Dingbat dec":"124","Dingbat hex":"7C","Unicode dec":"10109","Unicode hex":"277D"},{"Typeface name":"Wingdings 2","Dingbat dec":"125","Dingbat hex":"7D","Unicode dec":"10110","Unicode hex":"277E"},{"Typeface name":"Wingdings 2","Dingbat dec":"126","Dingbat hex":"7E","Unicode dec":"10111","Unicode hex":"277F"},{"Typeface name":"Wingdings 2","Dingbat dec":"128","Dingbat hex":"80","Unicode dec":"9737","Unicode hex":"2609"},{"Typeface name":"Wingdings 2","Dingbat dec":"129","Dingbat hex":"81","Unicode dec":"127765","Unicode hex":"1F315"},{"Typeface name":"Wingdings 2","Dingbat dec":"130","Dingbat hex":"82","Unicode dec":"9789","Unicode hex":"263D"},{"Typeface name":"Wingdings 2","Dingbat dec":"131","Dingbat hex":"83","Unicode dec":"9790","Unicode hex":"263E"},{"Typeface name":"Wingdings 2","Dingbat dec":"132","Dingbat hex":"84","Unicode dec":"11839","Unicode hex":"2E3F"},{"Typeface name":"Wingdings 2","Dingbat dec":"133","Dingbat hex":"85","Unicode dec":"10013","Unicode hex":"271D"},{"Typeface name":"Wingdings 2","Dingbat dec":"134","Dingbat hex":"86","Unicode dec":"128327","Unicode hex":"1F547"},{"Typeface name":"Wingdings 2","Dingbat dec":"135","Dingbat hex":"87","Unicode dec":"128348","Unicode hex":"1F55C"},{"Typeface name":"Wingdings 2","Dingbat dec":"136","Dingbat hex":"88","Unicode dec":"128349","Unicode hex":"1F55D"},{"Typeface name":"Wingdings 2","Dingbat dec":"137","Dingbat hex":"89","Unicode dec":"128350","Unicode hex":"1F55E"},{"Typeface name":"Wingdings 2","Dingbat dec":"138","Dingbat hex":"8A","Unicode dec":"128351","Unicode hex":"1F55F"},{"Typeface name":"Wingdings 2","Dingbat dec":"139","Dingbat hex":"8B","Unicode dec":"128352","Unicode hex":"1F560"},{"Typeface name":"Wingdings 2","Dingbat dec":"140","Dingbat hex":"8C","Unicode dec":"128353","Unicode hex":"1F561"},{"Typeface name":"Wingdings 2","Dingbat dec":"141","Dingbat hex":"8D","Unicode dec":"128354","Unicode hex":"1F562"},{"Typeface name":"Wingdings 2","Dingbat dec":"142","Dingbat hex":"8E","Unicode dec":"128355","Unicode hex":"1F563"},{"Typeface name":"Wingdings 2","Dingbat dec":"143","Dingbat hex":"8F","Unicode dec":"128356","Unicode hex":"1F564"},{"Typeface name":"Wingdings 2","Dingbat dec":"144","Dingbat hex":"90","Unicode dec":"128357","Unicode hex":"1F565"},{"Typeface name":"Wingdings 2","Dingbat dec":"145","Dingbat hex":"91","Unicode dec":"128358","Unicode hex":"1F566"},{"Typeface name":"Wingdings 2","Dingbat dec":"146","Dingbat hex":"92","Unicode dec":"128359","Unicode hex":"1F567"},{"Typeface name":"Wingdings 2","Dingbat dec":"147","Dingbat hex":"93","Unicode dec":"128616","Unicode hex":"1F668"},{"Typeface name":"Wingdings 2","Dingbat dec":"148","Dingbat hex":"94","Unicode dec":"128617","Unicode hex":"1F669"},{"Typeface name":"Wingdings 2","Dingbat dec":"149","Dingbat hex":"95","Unicode dec":"8901","Unicode hex":"22C5"},{"Typeface name":"Wingdings 2","Dingbat dec":"150","Dingbat hex":"96","Unicode dec":"128900","Unicode hex":"1F784"},{"Typeface name":"Wingdings 2","Dingbat dec":"151","Dingbat hex":"97","Unicode dec":"10625","Unicode hex":"2981"},{"Typeface name":"Wingdings 2","Dingbat dec":"152","Dingbat hex":"98","Unicode dec":"9679","Unicode hex":"25CF"},{"Typeface name":"Wingdings 2","Dingbat dec":"153","Dingbat hex":"99","Unicode dec":"9675","Unicode hex":"25CB"},{"Typeface name":"Wingdings 2","Dingbat dec":"154","Dingbat hex":"9A","Unicode dec":"128901","Unicode hex":"1F785"},{"Typeface name":"Wingdings 2","Dingbat dec":"155","Dingbat hex":"9B","Unicode dec":"128903","Unicode hex":"1F787"},{"Typeface name":"Wingdings 2","Dingbat dec":"156","Dingbat hex":"9C","Unicode dec":"128905","Unicode hex":"1F789"},{"Typeface name":"Wingdings 2","Dingbat dec":"157","Dingbat hex":"9D","Unicode dec":"8857","Unicode hex":"2299"},{"Typeface name":"Wingdings 2","Dingbat dec":"158","Dingbat hex":"9E","Unicode dec":"10687","Unicode hex":"29BF"},{"Typeface name":"Wingdings 2","Dingbat dec":"159","Dingbat hex":"9F","Unicode dec":"128908","Unicode hex":"1F78C"},{"Typeface name":"Wingdings 2","Dingbat dec":"160","Dingbat hex":"A0","Unicode dec":"128909","Unicode hex":"1F78D"},{"Typeface name":"Wingdings 2","Dingbat dec":"161","Dingbat hex":"A1","Unicode dec":"9726","Unicode hex":"25FE"},{"Typeface name":"Wingdings 2","Dingbat dec":"162","Dingbat hex":"A2","Unicode dec":"9632","Unicode hex":"25A0"},{"Typeface name":"Wingdings 2","Dingbat dec":"163","Dingbat hex":"A3","Unicode dec":"9633","Unicode hex":"25A1"},{"Typeface name":"Wingdings 2","Dingbat dec":"164","Dingbat hex":"A4","Unicode dec":"128913","Unicode hex":"1F791"},{"Typeface name":"Wingdings 2","Dingbat dec":"165","Dingbat hex":"A5","Unicode dec":"128914","Unicode hex":"1F792"},{"Typeface name":"Wingdings 2","Dingbat dec":"166","Dingbat hex":"A6","Unicode dec":"128915","Unicode hex":"1F793"},{"Typeface name":"Wingdings 2","Dingbat dec":"167","Dingbat hex":"A7","Unicode dec":"128916","Unicode hex":"1F794"},{"Typeface name":"Wingdings 2","Dingbat dec":"168","Dingbat hex":"A8","Unicode dec":"9635","Unicode hex":"25A3"},{"Typeface name":"Wingdings 2","Dingbat dec":"169","Dingbat hex":"A9","Unicode dec":"128917","Unicode hex":"1F795"},{"Typeface name":"Wingdings 2","Dingbat dec":"170","Dingbat hex":"AA","Unicode dec":"128918","Unicode hex":"1F796"},{"Typeface name":"Wingdings 2","Dingbat dec":"171","Dingbat hex":"AB","Unicode dec":"128919","Unicode hex":"1F797"},{"Typeface name":"Wingdings 2","Dingbat dec":"172","Dingbat hex":"AC","Unicode dec":"128920","Unicode hex":"1F798"},{"Typeface name":"Wingdings 2","Dingbat dec":"173","Dingbat hex":"AD","Unicode dec":"11049","Unicode hex":"2B29"},{"Typeface name":"Wingdings 2","Dingbat dec":"174","Dingbat hex":"AE","Unicode dec":"11045","Unicode hex":"2B25"},{"Typeface name":"Wingdings 2","Dingbat dec":"175","Dingbat hex":"AF","Unicode dec":"9671","Unicode hex":"25C7"},{"Typeface name":"Wingdings 2","Dingbat dec":"176","Dingbat hex":"B0","Unicode dec":"128922","Unicode hex":"1F79A"},{"Typeface name":"Wingdings 2","Dingbat dec":"177","Dingbat hex":"B1","Unicode dec":"9672","Unicode hex":"25C8"},{"Typeface name":"Wingdings 2","Dingbat dec":"178","Dingbat hex":"B2","Unicode dec":"128923","Unicode hex":"1F79B"},{"Typeface name":"Wingdings 2","Dingbat dec":"179","Dingbat hex":"B3","Unicode dec":"128924","Unicode hex":"1F79C"},{"Typeface name":"Wingdings 2","Dingbat dec":"180","Dingbat hex":"B4","Unicode dec":"128925","Unicode hex":"1F79D"},{"Typeface name":"Wingdings 2","Dingbat dec":"181","Dingbat hex":"B5","Unicode dec":"128926","Unicode hex":"1F79E"},{"Typeface name":"Wingdings 2","Dingbat dec":"182","Dingbat hex":"B6","Unicode dec":"11050","Unicode hex":"2B2A"},{"Typeface name":"Wingdings 2","Dingbat dec":"183","Dingbat hex":"B7","Unicode dec":"11047","Unicode hex":"2B27"},{"Typeface name":"Wingdings 2","Dingbat dec":"184","Dingbat hex":"B8","Unicode dec":"9674","Unicode hex":"25CA"},{"Typeface name":"Wingdings 2","Dingbat dec":"185","Dingbat hex":"B9","Unicode dec":"128928","Unicode hex":"1F7A0"},{"Typeface name":"Wingdings 2","Dingbat dec":"186","Dingbat hex":"BA","Unicode dec":"9686","Unicode hex":"25D6"},{"Typeface name":"Wingdings 2","Dingbat dec":"187","Dingbat hex":"BB","Unicode dec":"9687","Unicode hex":"25D7"},{"Typeface name":"Wingdings 2","Dingbat dec":"188","Dingbat hex":"BC","Unicode dec":"11210","Unicode hex":"2BCA"},{"Typeface name":"Wingdings 2","Dingbat dec":"189","Dingbat hex":"BD","Unicode dec":"11211","Unicode hex":"2BCB"},{"Typeface name":"Wingdings 2","Dingbat dec":"190","Dingbat hex":"BE","Unicode dec":"11200","Unicode hex":"2BC0"},{"Typeface name":"Wingdings 2","Dingbat dec":"191","Dingbat hex":"BF","Unicode dec":"11201","Unicode hex":"2BC1"},{"Typeface name":"Wingdings 2","Dingbat dec":"192","Dingbat hex":"C0","Unicode dec":"11039","Unicode hex":"2B1F"},{"Typeface name":"Wingdings 2","Dingbat dec":"193","Dingbat hex":"C1","Unicode dec":"11202","Unicode hex":"2BC2"},{"Typeface name":"Wingdings 2","Dingbat dec":"194","Dingbat hex":"C2","Unicode dec":"11043","Unicode hex":"2B23"},{"Typeface name":"Wingdings 2","Dingbat dec":"195","Dingbat hex":"C3","Unicode dec":"11042","Unicode hex":"2B22"},{"Typeface name":"Wingdings 2","Dingbat dec":"196","Dingbat hex":"C4","Unicode dec":"11203","Unicode hex":"2BC3"},{"Typeface name":"Wingdings 2","Dingbat dec":"197","Dingbat hex":"C5","Unicode dec":"11204","Unicode hex":"2BC4"},{"Typeface name":"Wingdings 2","Dingbat dec":"198","Dingbat hex":"C6","Unicode dec":"128929","Unicode hex":"1F7A1"},{"Typeface name":"Wingdings 2","Dingbat dec":"199","Dingbat hex":"C7","Unicode dec":"128930","Unicode hex":"1F7A2"},{"Typeface name":"Wingdings 2","Dingbat dec":"200","Dingbat hex":"C8","Unicode dec":"128931","Unicode hex":"1F7A3"},{"Typeface name":"Wingdings 2","Dingbat dec":"201","Dingbat hex":"C9","Unicode dec":"128932","Unicode hex":"1F7A4"},{"Typeface name":"Wingdings 2", +"Dingbat dec":"202","Dingbat hex":"CA","Unicode dec":"128933","Unicode hex":"1F7A5"},{"Typeface name":"Wingdings 2","Dingbat dec":"203","Dingbat hex":"CB","Unicode dec":"128934","Unicode hex":"1F7A6"},{"Typeface name":"Wingdings 2","Dingbat dec":"204","Dingbat hex":"CC","Unicode dec":"128935","Unicode hex":"1F7A7"},{"Typeface name":"Wingdings 2","Dingbat dec":"205","Dingbat hex":"CD","Unicode dec":"128936","Unicode hex":"1F7A8"},{"Typeface name":"Wingdings 2","Dingbat dec":"206","Dingbat hex":"CE","Unicode dec":"128937","Unicode hex":"1F7A9"},{"Typeface name":"Wingdings 2","Dingbat dec":"207","Dingbat hex":"CF","Unicode dec":"128938","Unicode hex":"1F7AA"},{"Typeface name":"Wingdings 2","Dingbat dec":"208","Dingbat hex":"D0","Unicode dec":"128939","Unicode hex":"1F7AB"},{"Typeface name":"Wingdings 2","Dingbat dec":"209","Dingbat hex":"D1","Unicode dec":"128940","Unicode hex":"1F7AC"},{"Typeface name":"Wingdings 2","Dingbat dec":"210","Dingbat hex":"D2","Unicode dec":"128941","Unicode hex":"1F7AD"},{"Typeface name":"Wingdings 2","Dingbat dec":"211","Dingbat hex":"D3","Unicode dec":"128942","Unicode hex":"1F7AE"},{"Typeface name":"Wingdings 2","Dingbat dec":"212","Dingbat hex":"D4","Unicode dec":"128943","Unicode hex":"1F7AF"},{"Typeface name":"Wingdings 2","Dingbat dec":"213","Dingbat hex":"D5","Unicode dec":"128944","Unicode hex":"1F7B0"},{"Typeface name":"Wingdings 2","Dingbat dec":"214","Dingbat hex":"D6","Unicode dec":"128945","Unicode hex":"1F7B1"},{"Typeface name":"Wingdings 2","Dingbat dec":"215","Dingbat hex":"D7","Unicode dec":"128946","Unicode hex":"1F7B2"},{"Typeface name":"Wingdings 2","Dingbat dec":"216","Dingbat hex":"D8","Unicode dec":"128947","Unicode hex":"1F7B3"},{"Typeface name":"Wingdings 2","Dingbat dec":"217","Dingbat hex":"D9","Unicode dec":"128948","Unicode hex":"1F7B4"},{"Typeface name":"Wingdings 2","Dingbat dec":"218","Dingbat hex":"DA","Unicode dec":"128949","Unicode hex":"1F7B5"},{"Typeface name":"Wingdings 2","Dingbat dec":"219","Dingbat hex":"DB","Unicode dec":"128950","Unicode hex":"1F7B6"},{"Typeface name":"Wingdings 2","Dingbat dec":"220","Dingbat hex":"DC","Unicode dec":"128951","Unicode hex":"1F7B7"},{"Typeface name":"Wingdings 2","Dingbat dec":"221","Dingbat hex":"DD","Unicode dec":"128952","Unicode hex":"1F7B8"},{"Typeface name":"Wingdings 2","Dingbat dec":"222","Dingbat hex":"DE","Unicode dec":"128953","Unicode hex":"1F7B9"},{"Typeface name":"Wingdings 2","Dingbat dec":"223","Dingbat hex":"DF","Unicode dec":"128954","Unicode hex":"1F7BA"},{"Typeface name":"Wingdings 2","Dingbat dec":"224","Dingbat hex":"E0","Unicode dec":"128955","Unicode hex":"1F7BB"},{"Typeface name":"Wingdings 2","Dingbat dec":"225","Dingbat hex":"E1","Unicode dec":"128956","Unicode hex":"1F7BC"},{"Typeface name":"Wingdings 2","Dingbat dec":"226","Dingbat hex":"E2","Unicode dec":"128957","Unicode hex":"1F7BD"},{"Typeface name":"Wingdings 2","Dingbat dec":"227","Dingbat hex":"E3","Unicode dec":"128958","Unicode hex":"1F7BE"},{"Typeface name":"Wingdings 2","Dingbat dec":"228","Dingbat hex":"E4","Unicode dec":"128959","Unicode hex":"1F7BF"},{"Typeface name":"Wingdings 2","Dingbat dec":"229","Dingbat hex":"E5","Unicode dec":"128960","Unicode hex":"1F7C0"},{"Typeface name":"Wingdings 2","Dingbat dec":"230","Dingbat hex":"E6","Unicode dec":"128962","Unicode hex":"1F7C2"},{"Typeface name":"Wingdings 2","Dingbat dec":"231","Dingbat hex":"E7","Unicode dec":"128964","Unicode hex":"1F7C4"},{"Typeface name":"Wingdings 2","Dingbat dec":"232","Dingbat hex":"E8","Unicode dec":"128966","Unicode hex":"1F7C6"},{"Typeface name":"Wingdings 2","Dingbat dec":"233","Dingbat hex":"E9","Unicode dec":"128969","Unicode hex":"1F7C9"},{"Typeface name":"Wingdings 2","Dingbat dec":"234","Dingbat hex":"EA","Unicode dec":"128970","Unicode hex":"1F7CA"},{"Typeface name":"Wingdings 2","Dingbat dec":"235","Dingbat hex":"EB","Unicode dec":"10038","Unicode hex":"2736"},{"Typeface name":"Wingdings 2","Dingbat dec":"236","Dingbat hex":"EC","Unicode dec":"128972","Unicode hex":"1F7CC"},{"Typeface name":"Wingdings 2","Dingbat dec":"237","Dingbat hex":"ED","Unicode dec":"128974","Unicode hex":"1F7CE"},{"Typeface name":"Wingdings 2","Dingbat dec":"238","Dingbat hex":"EE","Unicode dec":"128976","Unicode hex":"1F7D0"},{"Typeface name":"Wingdings 2","Dingbat dec":"239","Dingbat hex":"EF","Unicode dec":"128978","Unicode hex":"1F7D2"},{"Typeface name":"Wingdings 2","Dingbat dec":"240","Dingbat hex":"F0","Unicode dec":"10041","Unicode hex":"2739"},{"Typeface name":"Wingdings 2","Dingbat dec":"241","Dingbat hex":"F1","Unicode dec":"128963","Unicode hex":"1F7C3"},{"Typeface name":"Wingdings 2","Dingbat dec":"242","Dingbat hex":"F2","Unicode dec":"128967","Unicode hex":"1F7C7"},{"Typeface name":"Wingdings 2","Dingbat dec":"243","Dingbat hex":"F3","Unicode dec":"10031","Unicode hex":"272F"},{"Typeface name":"Wingdings 2","Dingbat dec":"244","Dingbat hex":"F4","Unicode dec":"128973","Unicode hex":"1F7CD"},{"Typeface name":"Wingdings 2","Dingbat dec":"245","Dingbat hex":"F5","Unicode dec":"128980","Unicode hex":"1F7D4"},{"Typeface name":"Wingdings 2","Dingbat dec":"246","Dingbat hex":"F6","Unicode dec":"11212","Unicode hex":"2BCC"},{"Typeface name":"Wingdings 2","Dingbat dec":"247","Dingbat hex":"F7","Unicode dec":"11213","Unicode hex":"2BCD"},{"Typeface name":"Wingdings 2","Dingbat dec":"248","Dingbat hex":"F8","Unicode dec":"8251","Unicode hex":"203B"},{"Typeface name":"Wingdings 2","Dingbat dec":"249","Dingbat hex":"F9","Unicode dec":"8258","Unicode hex":"2042"},{"Typeface name":"Wingdings 3","Dingbat dec":"32","Dingbat hex":"20","Unicode dec":"32","Unicode hex":"20"},{"Typeface name":"Wingdings 3","Dingbat dec":"33","Dingbat hex":"21","Unicode dec":"11104","Unicode hex":"2B60"},{"Typeface name":"Wingdings 3","Dingbat dec":"34","Dingbat hex":"22","Unicode dec":"11106","Unicode hex":"2B62"},{"Typeface name":"Wingdings 3","Dingbat dec":"35","Dingbat hex":"23","Unicode dec":"11105","Unicode hex":"2B61"},{"Typeface name":"Wingdings 3","Dingbat dec":"36","Dingbat hex":"24","Unicode dec":"11107","Unicode hex":"2B63"},{"Typeface name":"Wingdings 3","Dingbat dec":"37","Dingbat hex":"25","Unicode dec":"11110","Unicode hex":"2B66"},{"Typeface name":"Wingdings 3","Dingbat dec":"38","Dingbat hex":"26","Unicode dec":"11111","Unicode hex":"2B67"},{"Typeface name":"Wingdings 3","Dingbat dec":"39","Dingbat hex":"27","Unicode dec":"11113","Unicode hex":"2B69"},{"Typeface name":"Wingdings 3","Dingbat dec":"40","Dingbat hex":"28","Unicode dec":"11112","Unicode hex":"2B68"},{"Typeface name":"Wingdings 3","Dingbat dec":"41","Dingbat hex":"29","Unicode dec":"11120","Unicode hex":"2B70"},{"Typeface name":"Wingdings 3","Dingbat dec":"42","Dingbat hex":"2A","Unicode dec":"11122","Unicode hex":"2B72"},{"Typeface name":"Wingdings 3","Dingbat dec":"43","Dingbat hex":"2B","Unicode dec":"11121","Unicode hex":"2B71"},{"Typeface name":"Wingdings 3","Dingbat dec":"44","Dingbat hex":"2C","Unicode dec":"11123","Unicode hex":"2B73"},{"Typeface name":"Wingdings 3","Dingbat dec":"45","Dingbat hex":"2D","Unicode dec":"11126","Unicode hex":"2B76"},{"Typeface name":"Wingdings 3","Dingbat dec":"46","Dingbat hex":"2E","Unicode dec":"11128","Unicode hex":"2B78"},{"Typeface name":"Wingdings 3","Dingbat dec":"47","Dingbat hex":"2F","Unicode dec":"11131","Unicode hex":"2B7B"},{"Typeface name":"Wingdings 3","Dingbat dec":"48","Dingbat hex":"30","Unicode dec":"11133","Unicode hex":"2B7D"},{"Typeface name":"Wingdings 3","Dingbat dec":"49","Dingbat hex":"31","Unicode dec":"11108","Unicode hex":"2B64"},{"Typeface name":"Wingdings 3","Dingbat dec":"50","Dingbat hex":"32","Unicode dec":"11109","Unicode hex":"2B65"},{"Typeface name":"Wingdings 3","Dingbat dec":"51","Dingbat hex":"33","Unicode dec":"11114","Unicode hex":"2B6A"},{"Typeface name":"Wingdings 3","Dingbat dec":"52","Dingbat hex":"34","Unicode dec":"11116","Unicode hex":"2B6C"},{"Typeface name":"Wingdings 3","Dingbat dec":"53","Dingbat hex":"35","Unicode dec":"11115","Unicode hex":"2B6B"},{"Typeface name":"Wingdings 3","Dingbat dec":"54","Dingbat hex":"36","Unicode dec":"11117","Unicode hex":"2B6D"},{"Typeface name":"Wingdings 3","Dingbat dec":"55","Dingbat hex":"37","Unicode dec":"11085","Unicode hex":"2B4D"},{"Typeface name":"Wingdings 3","Dingbat dec":"56","Dingbat hex":"38","Unicode dec":"11168","Unicode hex":"2BA0"},{"Typeface name":"Wingdings 3","Dingbat dec":"57","Dingbat hex":"39","Unicode dec":"11169","Unicode hex":"2BA1"},{"Typeface name":"Wingdings 3","Dingbat dec":"58","Dingbat hex":"3A","Unicode dec":"11170","Unicode hex":"2BA2"},{"Typeface name":"Wingdings 3","Dingbat dec":"59","Dingbat hex":"3B","Unicode dec":"11171","Unicode hex":"2BA3"},{"Typeface name":"Wingdings 3","Dingbat dec":"60","Dingbat hex":"3C","Unicode dec":"11172","Unicode hex":"2BA4"},{"Typeface name":"Wingdings 3","Dingbat dec":"61","Dingbat hex":"3D","Unicode dec":"11173","Unicode hex":"2BA5"},{"Typeface name":"Wingdings 3","Dingbat dec":"62","Dingbat hex":"3E","Unicode dec":"11174","Unicode hex":"2BA6"},{"Typeface name":"Wingdings 3","Dingbat dec":"63","Dingbat hex":"3F","Unicode dec":"11175","Unicode hex":"2BA7"},{"Typeface name":"Wingdings 3","Dingbat dec":"64","Dingbat hex":"40","Unicode dec":"11152","Unicode hex":"2B90"},{"Typeface name":"Wingdings 3","Dingbat dec":"65","Dingbat hex":"41","Unicode dec":"11153","Unicode hex":"2B91"},{"Typeface name":"Wingdings 3","Dingbat dec":"66","Dingbat hex":"42","Unicode dec":"11154","Unicode hex":"2B92"},{"Typeface name":"Wingdings 3","Dingbat dec":"67","Dingbat hex":"43","Unicode dec":"11155","Unicode hex":"2B93"},{"Typeface name":"Wingdings 3","Dingbat dec":"68","Dingbat hex":"44","Unicode dec":"11136","Unicode hex":"2B80"},{"Typeface name":"Wingdings 3","Dingbat dec":"69","Dingbat hex":"45","Unicode dec":"11139","Unicode hex":"2B83"},{"Typeface name":"Wingdings 3","Dingbat dec":"70","Dingbat hex":"46","Unicode dec":"11134","Unicode hex":"2B7E"},{"Typeface name":"Wingdings 3","Dingbat dec":"71","Dingbat hex":"47","Unicode dec":"11135","Unicode hex":"2B7F"},{"Typeface name":"Wingdings 3","Dingbat dec":"72","Dingbat hex":"48","Unicode dec":"11140","Unicode hex":"2B84"},{"Typeface name":"Wingdings 3","Dingbat dec":"73","Dingbat hex":"49","Unicode dec":"11142","Unicode hex":"2B86"},{"Typeface name":"Wingdings 3","Dingbat dec":"74","Dingbat hex":"4A","Unicode dec":"11141","Unicode hex":"2B85"},{"Typeface name":"Wingdings 3","Dingbat dec":"75","Dingbat hex":"4B","Unicode dec":"11143","Unicode hex":"2B87"},{"Typeface name":"Wingdings 3","Dingbat dec":"76","Dingbat hex":"4C","Unicode dec":"11151","Unicode hex":"2B8F"},{"Typeface name":"Wingdings 3","Dingbat dec":"77","Dingbat hex":"4D","Unicode dec":"11149","Unicode hex":"2B8D"},{"Typeface name":"Wingdings 3","Dingbat dec":"78","Dingbat hex":"4E","Unicode dec":"11150","Unicode hex":"2B8E"},{"Typeface name":"Wingdings 3","Dingbat dec":"79","Dingbat hex":"4F","Unicode dec":"11148","Unicode hex":"2B8C"},{"Typeface name":"Wingdings 3","Dingbat dec":"80","Dingbat hex":"50","Unicode dec":"11118","Unicode hex":"2B6E"},{"Typeface name":"Wingdings 3","Dingbat dec":"81","Dingbat hex":"51","Unicode dec":"11119","Unicode hex":"2B6F"},{"Typeface name":"Wingdings 3","Dingbat dec":"82","Dingbat hex":"52","Unicode dec":"9099","Unicode hex":"238B"},{"Typeface name":"Wingdings 3","Dingbat dec":"83","Dingbat hex":"53","Unicode dec":"8996","Unicode hex":"2324"},{"Typeface name":"Wingdings 3","Dingbat dec":"84","Dingbat hex":"54","Unicode dec":"8963","Unicode hex":"2303"},{"Typeface name":"Wingdings 3","Dingbat dec":"85","Dingbat hex":"55","Unicode dec":"8997","Unicode hex":"2325"},{"Typeface name":"Wingdings 3","Dingbat dec":"86","Dingbat hex":"56","Unicode dec":"9251","Unicode hex":"2423"},{"Typeface name":"Wingdings 3","Dingbat dec":"87","Dingbat hex":"57","Unicode dec":"9085","Unicode hex":"237D"},{"Typeface name":"Wingdings 3","Dingbat dec":"88","Dingbat hex":"58","Unicode dec":"8682","Unicode hex":"21EA"},{"Typeface name":"Wingdings 3","Dingbat dec":"89","Dingbat hex":"59","Unicode dec":"11192","Unicode hex":"2BB8"},{"Typeface name":"Wingdings 3","Dingbat dec":"90","Dingbat hex":"5A","Unicode dec":"129184","Unicode hex":"1F8A0"},{"Typeface name":"Wingdings 3","Dingbat dec":"91","Dingbat hex":"5B","Unicode dec":"129185","Unicode hex":"1F8A1"},{"Typeface name":"Wingdings 3","Dingbat dec":"92","Dingbat hex":"5C","Unicode dec":"129186","Unicode hex":"1F8A2"},{"Typeface name":"Wingdings 3","Dingbat dec":"93","Dingbat hex":"5D","Unicode dec":"129187","Unicode hex":"1F8A3"},{"Typeface name":"Wingdings 3","Dingbat dec":"94","Dingbat hex":"5E","Unicode dec":"129188","Unicode hex":"1F8A4"},{"Typeface name":"Wingdings 3","Dingbat dec":"95","Dingbat hex":"5F","Unicode dec":"129189","Unicode hex":"1F8A5"},{"Typeface name":"Wingdings 3","Dingbat dec":"96","Dingbat hex":"60","Unicode dec":"129190","Unicode hex":"1F8A6"},{"Typeface name":"Wingdings 3","Dingbat dec":"97","Dingbat hex":"61","Unicode dec":"129191","Unicode hex":"1F8A7"},{"Typeface name":"Wingdings 3","Dingbat dec":"98","Dingbat hex":"62","Unicode dec":"129192","Unicode hex":"1F8A8"},{"Typeface name":"Wingdings 3","Dingbat dec":"99","Dingbat hex":"63","Unicode dec":"129193","Unicode hex":"1F8A9"},{"Typeface name":"Wingdings 3","Dingbat dec":"100","Dingbat hex":"64","Unicode dec":"129194","Unicode hex":"1F8AA"},{"Typeface name":"Wingdings 3","Dingbat dec":"101","Dingbat hex":"65","Unicode dec":"129195","Unicode hex":"1F8AB"},{"Typeface name":"Wingdings 3","Dingbat dec":"102","Dingbat hex":"66","Unicode dec":"129104","Unicode hex":"1F850"},{"Typeface name":"Wingdings 3","Dingbat dec":"103","Dingbat hex":"67","Unicode dec":"129106","Unicode hex":"1F852"},{"Typeface name":"Wingdings 3","Dingbat dec":"104","Dingbat hex":"68","Unicode dec":"129105","Unicode hex":"1F851"},{"Typeface name":"Wingdings 3","Dingbat dec":"105","Dingbat hex":"69","Unicode dec":"129107","Unicode hex":"1F853"},{"Typeface name":"Wingdings 3","Dingbat dec":"106","Dingbat hex":"6A","Unicode dec":"129108","Unicode hex":"1F854"},{"Typeface name":"Wingdings 3","Dingbat dec":"107","Dingbat hex":"6B","Unicode dec":"129109","Unicode hex":"1F855"},{"Typeface name":"Wingdings 3","Dingbat dec":"108","Dingbat hex":"6C","Unicode dec":"129111","Unicode hex":"1F857"},{"Typeface name":"Wingdings 3","Dingbat dec":"109","Dingbat hex":"6D","Unicode dec":"129110","Unicode hex":"1F856"},{"Typeface name":"Wingdings 3","Dingbat dec":"110","Dingbat hex":"6E","Unicode dec":"129112","Unicode hex":"1F858"},{"Typeface name":"Wingdings 3","Dingbat dec":"111","Dingbat hex":"6F","Unicode dec":"129113","Unicode hex":"1F859"},{"Typeface name":"Wingdings 3","Dingbat dec":"112","Dingbat hex":"70","Unicode dec":"9650","Unicode hex":"25B2"},{"Typeface name":"Wingdings 3","Dingbat dec":"113","Dingbat hex":"71","Unicode dec":"9660","Unicode hex":"25BC"},{"Typeface name":"Wingdings 3","Dingbat dec":"114","Dingbat hex":"72","Unicode dec":"9651","Unicode hex":"25B3"},{"Typeface name":"Wingdings 3","Dingbat dec":"115","Dingbat hex":"73","Unicode dec":"9661","Unicode hex":"25BD"},{"Typeface name":"Wingdings 3","Dingbat dec":"116","Dingbat hex":"74","Unicode dec":"9664","Unicode hex":"25C0"},{"Typeface name":"Wingdings 3","Dingbat dec":"117","Dingbat hex":"75","Unicode dec":"9654","Unicode hex":"25B6"},{"Typeface name":"Wingdings 3","Dingbat dec":"118","Dingbat hex":"76","Unicode dec":"9665","Unicode hex":"25C1"},{"Typeface name":"Wingdings 3","Dingbat dec":"119","Dingbat hex":"77","Unicode dec":"9655","Unicode hex":"25B7"},{"Typeface name":"Wingdings 3","Dingbat dec":"120","Dingbat hex":"78","Unicode dec":"9699","Unicode hex":"25E3"},{"Typeface name":"Wingdings 3","Dingbat dec":"121","Dingbat hex":"79","Unicode dec":"9698","Unicode hex":"25E2"},{"Typeface name":"Wingdings 3","Dingbat dec":"122","Dingbat hex":"7A","Unicode dec":"9700","Unicode hex":"25E4"},{"Typeface name":"Wingdings 3","Dingbat dec":"123","Dingbat hex":"7B","Unicode dec":"9701","Unicode hex":"25E5"},{"Typeface name":"Wingdings 3","Dingbat dec":"124","Dingbat hex":"7C","Unicode dec":"128896","Unicode hex":"1F780"},{"Typeface name":"Wingdings 3","Dingbat dec":"125","Dingbat hex":"7D","Unicode dec":"128898","Unicode hex":"1F782"},{"Typeface name":"Wingdings 3","Dingbat dec":"126","Dingbat hex":"7E","Unicode dec":"128897","Unicode hex":"1F781"},{"Typeface name":"Wingdings 3","Dingbat dec":"128","Dingbat hex":"80","Unicode dec":"128899","Unicode hex":"1F783"},{"Typeface name":"Wingdings 3","Dingbat dec":"129","Dingbat hex":"81","Unicode dec":"11205","Unicode hex":"2BC5"},{"Typeface name":"Wingdings 3","Dingbat dec":"130","Dingbat hex":"82","Unicode dec":"11206","Unicode hex":"2BC6"},{"Typeface name":"Wingdings 3","Dingbat dec":"131","Dingbat hex":"83","Unicode dec":"11207","Unicode hex":"2BC7"},{"Typeface name":"Wingdings 3","Dingbat dec":"132","Dingbat hex":"84","Unicode dec":"11208","Unicode hex":"2BC8"},{"Typeface name":"Wingdings 3","Dingbat dec":"133","Dingbat hex":"85","Unicode dec":"11164","Unicode hex":"2B9C"},{"Typeface name":"Wingdings 3","Dingbat dec":"134","Dingbat hex":"86","Unicode dec":"11166","Unicode hex":"2B9E"},{"Typeface name":"Wingdings 3","Dingbat dec":"135","Dingbat hex":"87","Unicode dec":"11165","Unicode hex":"2B9D"},{"Typeface name":"Wingdings 3","Dingbat dec":"136","Dingbat hex":"88","Unicode dec":"11167","Unicode hex":"2B9F"},{"Typeface name":"Wingdings 3","Dingbat dec":"137","Dingbat hex":"89","Unicode dec":"129040","Unicode hex":"1F810"},{"Typeface name":"Wingdings 3","Dingbat dec":"138","Dingbat hex":"8A","Unicode dec":"129042","Unicode hex":"1F812"},{"Typeface name":"Wingdings 3","Dingbat dec":"139","Dingbat hex":"8B","Unicode dec":"129041","Unicode hex":"1F811"},{"Typeface name":"Wingdings 3","Dingbat dec":"140","Dingbat hex":"8C","Unicode dec":"129043","Unicode hex":"1F813"},{"Typeface name":"Wingdings 3","Dingbat dec":"141","Dingbat hex":"8D","Unicode dec":"129044","Unicode hex":"1F814"},{"Typeface name":"Wingdings 3","Dingbat dec":"142","Dingbat hex":"8E","Unicode dec":"129046","Unicode hex":"1F816"},{"Typeface name":"Wingdings 3","Dingbat dec":"143","Dingbat hex":"8F","Unicode dec":"129045","Unicode hex":"1F815"},{"Typeface name":"Wingdings 3","Dingbat dec":"144","Dingbat hex":"90","Unicode dec":"129047","Unicode hex":"1F817"},{"Typeface name":"Wingdings 3","Dingbat dec":"145","Dingbat hex":"91","Unicode dec":"129048","Unicode hex":"1F818"},{"Typeface name":"Wingdings 3","Dingbat dec":"146","Dingbat hex":"92","Unicode dec":"129050","Unicode hex":"1F81A"},{"Typeface name":"Wingdings 3","Dingbat dec":"147","Dingbat hex":"93","Unicode dec":"129049","Unicode hex":"1F819"},{"Typeface name":"Wingdings 3","Dingbat dec":"148","Dingbat hex":"94","Unicode dec":"129051","Unicode hex":"1F81B"},{"Typeface name":"Wingdings 3","Dingbat dec":"149","Dingbat hex":"95","Unicode dec":"129052","Unicode hex":"1F81C"},{"Typeface name":"Wingdings 3","Dingbat dec":"150","Dingbat hex":"96","Unicode dec":"129054","Unicode hex":"1F81E"},{"Typeface name":"Wingdings 3","Dingbat dec":"151","Dingbat hex":"97","Unicode dec":"129053","Unicode hex":"1F81D"},{"Typeface name":"Wingdings 3","Dingbat dec":"152","Dingbat hex":"98","Unicode dec":"129055","Unicode hex":"1F81F"},{"Typeface name":"Wingdings 3","Dingbat dec":"153","Dingbat hex":"99","Unicode dec":"129024","Unicode hex":"1F800"},{"Typeface name":"Wingdings 3","Dingbat dec":"154","Dingbat hex":"9A","Unicode dec":"129026","Unicode hex":"1F802"},{"Typeface name":"Wingdings 3","Dingbat dec":"155","Dingbat hex":"9B","Unicode dec":"129025","Unicode hex":"1F801"},{"Typeface name":"Wingdings 3","Dingbat dec":"156","Dingbat hex":"9C","Unicode dec":"129027","Unicode hex":"1F803"},{"Typeface name":"Wingdings 3","Dingbat dec":"157","Dingbat hex":"9D","Unicode dec":"129028","Unicode hex":"1F804"},{"Typeface name":"Wingdings 3","Dingbat dec":"158","Dingbat hex":"9E","Unicode dec":"129030","Unicode hex":"1F806"},{"Typeface name":"Wingdings 3","Dingbat dec":"159","Dingbat hex":"9F","Unicode dec":"129029","Unicode hex":"1F805"},{"Typeface name":"Wingdings 3","Dingbat dec":"160","Dingbat hex":"A0","Unicode dec":"129031","Unicode hex":"1F807"},{"Typeface name":"Wingdings 3","Dingbat dec":"161","Dingbat hex":"A1","Unicode dec":"129032","Unicode hex":"1F808"},{"Typeface name":"Wingdings 3","Dingbat dec":"162","Dingbat hex":"A2","Unicode dec":"129034","Unicode hex":"1F80A"},{"Typeface name":"Wingdings 3","Dingbat dec":"163","Dingbat hex":"A3","Unicode dec":"129033","Unicode hex":"1F809"},{"Typeface name":"Wingdings 3","Dingbat dec":"164","Dingbat hex":"A4","Unicode dec":"129035","Unicode hex":"1F80B"},{"Typeface name":"Wingdings 3","Dingbat dec":"165","Dingbat hex":"A5","Unicode dec":"129056","Unicode hex":"1F820"},{"Typeface name":"Wingdings 3","Dingbat dec":"166","Dingbat hex":"A6","Unicode dec":"129058","Unicode hex":"1F822"},{"Typeface name":"Wingdings 3","Dingbat dec":"167","Dingbat hex":"A7","Unicode dec":"129060","Unicode hex":"1F824"},{"Typeface name":"Wingdings 3","Dingbat dec":"168","Dingbat hex":"A8","Unicode dec":"129062","Unicode hex":"1F826"},{"Typeface name":"Wingdings 3","Dingbat dec":"169","Dingbat hex":"A9","Unicode dec":"129064","Unicode hex":"1F828"},{"Typeface name":"Wingdings 3","Dingbat dec":"170","Dingbat hex":"AA","Unicode dec":"129066","Unicode hex":"1F82A"},{"Typeface name":"Wingdings 3","Dingbat dec":"171","Dingbat hex":"AB","Unicode dec":"129068","Unicode hex":"1F82C"},{"Typeface name":"Wingdings 3","Dingbat dec":"172","Dingbat hex":"AC","Unicode dec":"129180","Unicode hex":"1F89C"},{"Typeface name":"Wingdings 3","Dingbat dec":"173","Dingbat hex":"AD","Unicode dec":"129181","Unicode hex":"1F89D"},{"Typeface name":"Wingdings 3","Dingbat dec":"174","Dingbat hex":"AE","Unicode dec":"129182","Unicode hex":"1F89E"},{"Typeface name":"Wingdings 3","Dingbat dec":"175","Dingbat hex":"AF","Unicode dec":"129183","Unicode hex":"1F89F"},{"Typeface name":"Wingdings 3","Dingbat dec":"176","Dingbat hex":"B0","Unicode dec":"129070","Unicode hex":"1F82E"},{"Typeface name":"Wingdings 3","Dingbat dec":"177","Dingbat hex":"B1","Unicode dec":"129072","Unicode hex":"1F830"},{"Typeface name":"Wingdings 3","Dingbat dec":"178","Dingbat hex":"B2","Unicode dec":"129074","Unicode hex":"1F832"},{"Typeface name":"Wingdings 3","Dingbat dec":"179","Dingbat hex":"B3","Unicode dec":"129076","Unicode hex":"1F834"},{"Typeface name":"Wingdings 3","Dingbat dec":"180","Dingbat hex":"B4","Unicode dec":"129078","Unicode hex":"1F836"},{"Typeface name":"Wingdings 3","Dingbat dec":"181","Dingbat hex":"B5","Unicode dec":"129080","Unicode hex":"1F838"},{"Typeface name":"Wingdings 3","Dingbat dec":"182","Dingbat hex":"B6","Unicode dec":"129082","Unicode hex":"1F83A"},{"Typeface name":"Wingdings 3","Dingbat dec":"183","Dingbat hex":"B7","Unicode dec":"129081","Unicode hex":"1F839"},{"Typeface name":"Wingdings 3","Dingbat dec":"184","Dingbat hex":"B8","Unicode dec":"129083","Unicode hex":"1F83B"},{"Typeface name":"Wingdings 3","Dingbat dec":"185","Dingbat hex":"B9","Unicode dec":"129176","Unicode hex":"1F898"},{"Typeface name":"Wingdings 3","Dingbat dec":"186","Dingbat hex":"BA","Unicode dec":"129178","Unicode hex":"1F89A"},{"Typeface name":"Wingdings 3","Dingbat dec":"187","Dingbat hex":"BB","Unicode dec":"129177","Unicode hex":"1F899"},{"Typeface name":"Wingdings 3","Dingbat dec":"188","Dingbat hex":"BC","Unicode dec":"129179","Unicode hex":"1F89B"},{"Typeface name":"Wingdings 3","Dingbat dec":"189","Dingbat hex":"BD","Unicode dec":"129084","Unicode hex":"1F83C"},{"Typeface name":"Wingdings 3","Dingbat dec":"190","Dingbat hex":"BE","Unicode dec":"129086","Unicode hex":"1F83E"},{"Typeface name":"Wingdings 3","Dingbat dec":"191","Dingbat hex":"BF","Unicode dec":"129085","Unicode hex":"1F83D"},{"Typeface name":"Wingdings 3","Dingbat dec":"192","Dingbat hex":"C0","Unicode dec":"129087","Unicode hex":"1F83F"},{"Typeface name":"Wingdings 3","Dingbat dec":"193","Dingbat hex":"C1","Unicode dec":"129088","Unicode hex":"1F840"},{"Typeface name":"Wingdings 3","Dingbat dec":"194","Dingbat hex":"C2","Unicode dec":"129090","Unicode hex":"1F842"},{"Typeface name":"Wingdings 3","Dingbat dec":"195","Dingbat hex":"C3","Unicode dec":"129089","Unicode hex":"1F841"},{"Typeface name":"Wingdings 3","Dingbat dec":"196","Dingbat hex":"C4","Unicode dec":"129091","Unicode hex":"1F843"},{"Typeface name":"Wingdings 3","Dingbat dec":"197","Dingbat hex":"C5","Unicode dec":"129092","Unicode hex":"1F844"},{"Typeface name":"Wingdings 3","Dingbat dec":"198","Dingbat hex":"C6","Unicode dec":"129094","Unicode hex":"1F846"},{"Typeface name":"Wingdings 3","Dingbat dec":"199","Dingbat hex":"C7","Unicode dec":"129093","Unicode hex":"1F845"},{"Typeface name":"Wingdings 3","Dingbat dec":"200","Dingbat hex":"C8","Unicode dec":"129095","Unicode hex":"1F847"},{"Typeface name":"Wingdings 3","Dingbat dec":"201","Dingbat hex":"C9","Unicode dec":"11176","Unicode hex":"2BA8"},{"Typeface name":"Wingdings 3","Dingbat dec":"202","Dingbat hex":"CA","Unicode dec":"11177","Unicode hex":"2BA9"},{"Typeface name":"Wingdings 3","Dingbat dec":"203","Dingbat hex":"CB","Unicode dec":"11178","Unicode hex":"2BAA"},{"Typeface name":"Wingdings 3","Dingbat dec":"204","Dingbat hex":"CC","Unicode dec":"11179","Unicode hex":"2BAB"},{"Typeface name":"Wingdings 3","Dingbat dec":"205","Dingbat hex":"CD","Unicode dec":"11180","Unicode hex":"2BAC"},{"Typeface name":"Wingdings 3","Dingbat dec":"206","Dingbat hex":"CE","Unicode dec":"11181","Unicode hex":"2BAD"},{"Typeface name":"Wingdings 3","Dingbat dec":"207","Dingbat hex":"CF","Unicode dec":"11182","Unicode hex":"2BAE"},{"Typeface name":"Wingdings 3","Dingbat dec":"208","Dingbat hex":"D0","Unicode dec":"11183","Unicode hex":"2BAF"},{"Typeface name":"Wingdings 3","Dingbat dec":"209","Dingbat hex":"D1","Unicode dec":"129120","Unicode hex":"1F860"},{"Typeface name":"Wingdings 3","Dingbat dec":"210","Dingbat hex":"D2","Unicode dec":"129122","Unicode hex":"1F862"},{"Typeface name":"Wingdings 3","Dingbat dec":"211","Dingbat hex":"D3","Unicode dec":"129121","Unicode hex":"1F861"},{"Typeface name":"Wingdings 3","Dingbat dec":"212","Dingbat hex":"D4","Unicode dec":"129123","Unicode hex":"1F863"},{"Typeface name":"Wingdings 3","Dingbat dec":"213","Dingbat hex":"D5","Unicode dec":"129124","Unicode hex":"1F864"},{"Typeface name":"Wingdings 3","Dingbat dec":"214","Dingbat hex":"D6","Unicode dec":"129125","Unicode hex":"1F865"},{"Typeface name":"Wingdings 3","Dingbat dec":"215","Dingbat hex":"D7","Unicode dec":"129127","Unicode hex":"1F867"},{"Typeface name":"Wingdings 3","Dingbat dec":"216","Dingbat hex":"D8","Unicode dec":"129126","Unicode hex":"1F866"},{"Typeface name":"Wingdings 3","Dingbat dec":"217","Dingbat hex":"D9","Unicode dec":"129136","Unicode hex":"1F870"},{"Typeface name":"Wingdings 3","Dingbat dec":"218","Dingbat hex":"DA","Unicode dec":"129138","Unicode hex":"1F872"},{"Typeface name":"Wingdings 3","Dingbat dec":"219","Dingbat hex":"DB","Unicode dec":"129137","Unicode hex":"1F871"},{"Typeface name":"Wingdings 3","Dingbat dec":"220","Dingbat hex":"DC","Unicode dec":"129139","Unicode hex":"1F873"},{"Typeface name":"Wingdings 3","Dingbat dec":"221","Dingbat hex":"DD","Unicode dec":"129140","Unicode hex":"1F874"},{"Typeface name":"Wingdings 3","Dingbat dec":"222","Dingbat hex":"DE","Unicode dec":"129141","Unicode hex":"1F875"},{"Typeface name":"Wingdings 3","Dingbat dec":"223","Dingbat hex":"DF","Unicode dec":"129143","Unicode hex":"1F877"},{"Typeface name":"Wingdings 3","Dingbat dec":"224","Dingbat hex":"E0","Unicode dec":"129142","Unicode hex":"1F876"},{"Typeface name":"Wingdings 3","Dingbat dec":"225","Dingbat hex":"E1","Unicode dec":"129152","Unicode hex":"1F880"},{"Typeface name":"Wingdings 3","Dingbat dec":"226","Dingbat hex":"E2","Unicode dec":"129154","Unicode hex":"1F882"},{"Typeface name":"Wingdings 3","Dingbat dec":"227","Dingbat hex":"E3","Unicode dec":"129153","Unicode hex":"1F881"},{"Typeface name":"Wingdings 3","Dingbat dec":"228","Dingbat hex":"E4","Unicode dec":"129155","Unicode hex":"1F883"},{"Typeface name":"Wingdings 3","Dingbat dec":"229","Dingbat hex":"E5","Unicode dec":"129156","Unicode hex":"1F884"},{"Typeface name":"Wingdings 3","Dingbat dec":"230","Dingbat hex":"E6","Unicode dec":"129157","Unicode hex":"1F885"},{"Typeface name":"Wingdings 3","Dingbat dec":"231","Dingbat hex":"E7","Unicode dec":"129159","Unicode hex":"1F887"},{"Typeface name":"Wingdings 3","Dingbat dec":"232","Dingbat hex":"E8","Unicode dec":"129158","Unicode hex":"1F886"},{"Typeface name":"Wingdings 3","Dingbat dec":"233","Dingbat hex":"E9","Unicode dec":"129168","Unicode hex":"1F890"},{"Typeface name":"Wingdings 3","Dingbat dec":"234","Dingbat hex":"EA","Unicode dec":"129170","Unicode hex":"1F892"},{"Typeface name":"Wingdings 3","Dingbat dec":"235","Dingbat hex":"EB","Unicode dec":"129169","Unicode hex":"1F891"},{"Typeface name":"Wingdings 3","Dingbat dec":"236","Dingbat hex":"EC","Unicode dec":"129171","Unicode hex":"1F893"},{"Typeface name":"Wingdings 3","Dingbat dec":"237","Dingbat hex":"ED","Unicode dec":"129172","Unicode hex":"1F894"},{"Typeface name":"Wingdings 3","Dingbat dec":"238","Dingbat hex":"EE","Unicode dec":"129174","Unicode hex":"1F896"},{"Typeface name":"Wingdings 3","Dingbat dec":"239","Dingbat hex":"EF","Unicode dec":"129173","Unicode hex":"1F895"},{"Typeface name":"Wingdings 3","Dingbat dec":"240","Dingbat hex":"F0","Unicode dec":"129175","Unicode hex":"1F897"}];exports["default"]=dingbats},{}],85:[function(require,module,exports){"use strict";function codePoint(typeface,codePoint){return dingbatsByCodePoint[typeface.toUpperCase()+"_"+codePoint]}function dec(typeface,dec){return codePoint(typeface,parseInt(dec,10))}function hex(typeface,hex){return codePoint(typeface,parseInt(hex,16))}function fromCodePointPolyfill(codePoint){if(65535>=codePoint)return String.fromCharCode(codePoint);var highSurrogate=Math.floor((codePoint-65536)/1024)+55296,lowSurrogate=(codePoint-65536)%1024+56320;return String.fromCharCode(highSurrogate,lowSurrogate)}var __importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{"default":mod}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.hex=exports.dec=exports.codePoint=void 0;for(var dingbats_1=__importDefault(require("./dingbats")),dingbatsByCodePoint={},fromCodePoint=String.fromCodePoint?String.fromCodePoint:fromCodePointPolyfill,_i=0,dingbats_2=dingbats_1["default"];_i>1,nBits=-7,i=isLE?nBytes-1:0,d=isLE?-1:1,s=buffer[offset+i];for(i+=d,e=s&(1<<-nBits)-1,s>>=-nBits,nBits+=eLen;nBits>0;e=256*e+buffer[offset+i],i+=d,nBits-=8);for(m=e&(1<<-nBits)-1,e>>=-nBits,nBits+=mLen;nBits>0;m=256*m+buffer[offset+i],i+=d,nBits-=8);if(0===e)e=1-eBias;else{if(e===eMax)return m?NaN:(s?-1:1)*(1/0);m+=Math.pow(2,mLen),e-=eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)},exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c,eLen=8*nBytes-mLen-1,eMax=(1<>1,rt=23===mLen?Math.pow(2,-24)-Math.pow(2,-77):0,i=isLE?0:nBytes-1,d=isLE?1:-1,s=0>value||0===value&&0>1/value?1:0;for(value=Math.abs(value),isNaN(value)||value===1/0?(m=isNaN(value)?1:0,e=eMax):(e=Math.floor(Math.log(value)/Math.LN2),value*(c=Math.pow(2,-e))<1&&(e--,c*=2),value+=e+eBias>=1?rt/c:rt*Math.pow(2,1-eBias),value*c>=2&&(e++,c/=2),e+eBias>=eMax?(m=0,e=eMax):e+eBias>=1?(m=(value*c-1)*Math.pow(2,mLen),e+=eBias):(m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen),e=0));mLen>=8;buffer[offset+i]=255&m,i+=d,m/=256,mLen-=8);for(e=e<0;buffer[offset+i]=255&e,i+=d,e/=256,eLen-=8);buffer[offset+i-d]|=128*s; +}},{}],87:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return"[object Array]"==toString.call(arr)}},{}],88:[function(require,module,exports){(function(global,Buffer){!function(t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=t()}(function(){return function s(a,o,h){function u(r,t){if(!o[r]){if(!a[r]){var e="function"==typeof require&&require;if(!t&&e)return e(r,!0);if(l)return l(r,!0);var i=new Error("Cannot find module '"+r+"'");throw i.code="MODULE_NOT_FOUND",i}var n=o[r]={exports:{}};a[r][0].call(n.exports,function(t){var e=a[r][1][t];return u(e||t)},n,n.exports,s,a,o,h)}return o[r].exports}for(var l="function"==typeof require&&require,t=0;tu?t[u++]:0,l>u?t[u++]:0):(e=t.charCodeAt(u++),r=l>u?t.charCodeAt(u++):0,l>u?t.charCodeAt(u++):0),n=e>>2,s=(3&e)<<4|r>>4,a=f>1?(15&r)<<2|i>>6:64,o=f>2?63&i:64,h.push(p.charAt(n)+p.charAt(s)+p.charAt(a)+p.charAt(o));return h.join("")},r.decode=function(t){var e,r,i,n,s,a,o=0,h=0,u="data:";if(t.substr(0,u.length)===u)throw new Error("Invalid base64 input, it looks like a data url.");var l,f=3*(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"")).length/4;if(t.charAt(t.length-1)===p.charAt(64)&&f--,t.charAt(t.length-2)===p.charAt(64)&&f--,f%1!=0)throw new Error("Invalid base64 input, bad content length.");for(l=d.uint8array?new Uint8Array(0|f):new Array(0|f);o>4,r=(15&n)<<4|(s=p.indexOf(t.charAt(o++)))>>2,i=(3&s)<<6|(a=p.indexOf(t.charAt(o++))),l[h++]=e,64!==s&&(l[h++]=r),64!==a&&(l[h++]=i);return l}},{"./support":30,"./utils":32}],2:[function(t,e,r){"use strict";function o(t,e,r,i,n){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=i,this.compressedContent=n}var i=t("./external"),n=t("./stream/DataWorker"),s=t("./stream/Crc32Probe"),a=t("./stream/DataLengthProbe");o.prototype={getContentWorker:function(){var t=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),e=this;return t.on("end",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),t},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new s).pipe(new a("uncompressedSize")).pipe(e.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",e)},e.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,e,r){"use strict";var i=t("./stream/GenericWorker");r.STORE={magic:"\x00\x00",compressWorker:function(t){return new i("STORE compression")},uncompressWorker:function(){return new i("STORE decompression")}},r.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,e,r){"use strict";var i=t("./utils"),o=function(){for(var t,e=[],r=0;256>r;r++){t=r;for(var i=0;8>i;i++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?"string"!==i.getTypeOf(t)?function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;s>a;a++)t=t>>>8^n[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;s>a;a++)t=t>>>8^n[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},{"./utils":32}],5:[function(t,e,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){"use strict";var i=null;i="undefined"!=typeof Promise?Promise:t("lie"),e.exports={Promise:i}},{lie:37}],7:[function(t,e,r){"use strict";function h(t,e){a.call(this,"FlateWorker/"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,n=t("pako"),s=t("./utils"),a=t("./stream/GenericWorker"),o=i?"uint8array":"array";r.magic="\b\x00",s.inherits(h,a),h.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,t.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(t){return new h("Deflate",t)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,e,r){"use strict";function A(t,e){var r,i="";for(r=0;e>r;r++)i+=String.fromCharCode(255&t),t>>>=8;return i}function i(t,e,r,i,n,s){var a,o,h=t.file,u=t.compression,l=s!==O.utf8encode,f=I.transformTo("string",s(h.name)),d=I.transformTo("string",O.utf8encode(h.name)),c=h.comment,p=I.transformTo("string",s(c)),m=I.transformTo("string",O.utf8encode(c)),_=d.length!==h.name.length,g=m.length!==c.length,b="",v="",y="",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(x.crc32=t.crc32,x.compressedSize=t.compressedSize,x.uncompressedSize=t.uncompressedSize);var S=0;e&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),"UNIX"===n?(C=798,z|=function(t,e){var r=t;return t||(r=e?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(t){return 63&(t||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+d,b+="up"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+="uc"+A(y.length,2)+y);var E="";return E+="\n\x00",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+"\x00\x00\x00\x00"+A(z,4)+A(i,4)+f+b+p}}function s(t,e,r,i){n.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=i,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}var I=t("../utils"),n=t("../stream/GenericWorker"),O=t("../utf8"),B=t("../crc32"),R=t("../signature");I.inherits(s,n),s.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,n.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-i-1))/r:100}}))},s.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return R.DATA_DESCRIPTOR+A(t.crc32,4)+A(t.compressedSize,4)+A(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e0?t.substring(0,e):""},g=function(t){return"/"!==t.slice(-1)&&(t+="/"),t},b=function(t,e){return e=void 0!==e?e:f.createFolders,t=g(t),this.files[t]||s.call(this,t,null,{dir:!0,createFolders:e}),this.files[t]},i={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(t){var e,r,i;for(e in this.files)i=this.files[e],(r=e.slice(this.root.length,e.length))&&e.slice(0,this.root.length)===this.root&&t(r,i)},filter:function(r){var i=[];return this.forEach(function(t,e){r(t,e)&&i.push(e)}),i},file:function(t,e,r){if(1!==arguments.length)return t=this.root+t,s.call(this,t,e,r),this;if(h(t)){var i=t;return this.filter(function(t,e){return!e.dir&&i.test(t)})}var n=this.files[this.root+t];return n&&!n.dir?n:null},folder:function(r){if(!r)return this;if(h(r))return this.filter(function(t,e){return e.dir&&r.test(t)});var t=this.root+r,e=b.call(this,t),i=this.clone();return i.root=e.name,i},remove:function(r){r=this.root+r;var t=this.files[r];if(t||("/"!==r.slice(-1)&&(r+="/"),t=this.files[r]),t&&!t.dir)delete this.files[r];else for(var e=this.filter(function(t,e){return e.name.slice(0,r.length)===r}),i=0;i=0;--s)if(this.data[s]===e&&this.data[s+1]===r&&this.data[s+2]===i&&this.data[s+3]===n)return s-this.zero;return-1},n.prototype.readAndCheckSignature=function(t){var e=t.charCodeAt(0),r=t.charCodeAt(1),i=t.charCodeAt(2),n=t.charCodeAt(3),s=this.readData(4);return e===s[0]&&r===s[1]&&i===s[2]&&n===s[3]},n.prototype.readData=function(t){if(this.checkOffset(t),0===t)return[];var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./DataReader":18}],18:[function(t,e,r){"use strict";function n(t){this.data=t,this.length=t.length,this.index=0,this.zero=0}var i=t("../utils");n.prototype={checkOffset:function(t){this.checkIndex(this.index+t)},checkIndex:function(t){if(this.lengtht)throw new Error("End of data reached (data length = "+this.length+", asked index = "+t+"). Corrupted zip ?")},setIndex:function(t){this.checkIndex(t),this.index=t},skip:function(t){this.setIndex(this.index+t)},byteAt:function(t){},readInt:function(t){var e,r=0;for(this.checkOffset(t),e=this.index+t-1;e>=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return i.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=n},{"../utils":32}],19:[function(t,e,r){"use strict";function n(t){i.call(this,t)}var i=t("./Uint8ArrayReader");t("../utils").inherits(n,i),n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,e,r){"use strict";function n(t){i.call(this,t)}var i=t("./DataReader");t("../utils").inherits(n,i),n.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},n.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},n.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./DataReader":18}],21:[function(t,e,r){"use strict";function n(t){i.call(this,t)}var i=t("./ArrayReader");t("../utils").inherits(n,i),n.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./ArrayReader":17}],22:[function(t,e,r){"use strict";var i=t("../utils"),n=t("../support"),s=t("./ArrayReader"),a=t("./StringReader"),o=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");e.exports=function(t){var e=i.getTypeOf(t);return i.checkSupport(e),"string"!==e||n.uint8array?"nodebuffer"===e?new o(t):n.uint8array?new h(i.transformTo("uint8array",t)):new s(i.transformTo("array",t)):new a(t)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,e,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(t,e,r){"use strict";function s(t){i.call(this,"ConvertWorker to "+t),this.destType=t}var i=t("./GenericWorker"),n=t("../utils");n.inherits(s,i),s.prototype.processChunk=function(t){this.push({data:n.transformTo(this.destType,t.data),meta:t.meta})},e.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(t,e,r){"use strict";function s(){i.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}var i=t("./GenericWorker"),n=t("../crc32");t("../utils").inherits(s,i),s.prototype.processChunk=function(t){this.streamInfo.crc32=n(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,e,r){"use strict";function s(t){n.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}var i=t("../utils"),n=t("./GenericWorker");i.inherits(s,n),s.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}n.prototype.processChunk.call(this,t)},e.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(t,e,r){"use strict";function s(t){n.call(this,"DataWorker");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=i.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}var i=t("../utils"),n=t("./GenericWorker");i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(t,e,r){"use strict";function i(t){this.name=t||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(t){this.emit("data",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit("error",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit("error",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r "+t:t}},e.exports=i},{}],29:[function(t,e,r){"use strict";function l(t,o){return new a.Promise(function(e,r){var i=[],n=t._internalType,s=t._outputType,a=t._mimeType;t.on("data",function(t,e){i.push(t),o&&o(e)}).on("error",function(t){i=[],r(t)}).on("end",function(){try{var t=function(t,e,r){switch(t){case"blob":return h.newBlob(h.transformTo("arraybuffer",e),r);case"base64":return u.encode(e);default:return h.transformTo(t,e)}}(s,function(t,e){var r,i=0,n=null,s=0;for(r=0;rn;n++)u[n]=n>=252?6:n>=248?5:n>=240?4:n>=224?3:n>=192?2:1;u[254]=u[254]=1,s.utf8encode=function(t){return h.nodebuffer?r.newBufferFrom(t,"utf-8"):function(t){var e,r,i,n,s,a=t.length,o=0;for(n=0;a>n;n++)55296==(64512&(r=t.charCodeAt(n)))&&a>n+1&&56320==(64512&(i=t.charCodeAt(n+1)))&&(r=65536+(r-55296<<10)+(i-56320),n++),o+=128>r?1:2048>r?2:65536>r?3:4;for(e=h.uint8array?new Uint8Array(o):new Array(o),n=s=0;o>s;n++)55296==(64512&(r=t.charCodeAt(n)))&&a>n+1&&56320==(64512&(i=t.charCodeAt(n+1)))&&(r=65536+(r-55296<<10)+(i-56320),n++),128>r?e[s++]=r:(2048>r?e[s++]=192|r>>>6:(65536>r?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},s.utf8decode=function(t){return h.nodebuffer?o.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,n,s=t.length,a=new Array(2*s);for(e=r=0;s>e;)if((i=t[e++])<128)a[r++]=i;else if(4<(n=u[i]))a[r++]=65533,e+=n-1;else{for(i&=2===n?31:3===n?15:7;n>1&&s>e;)i=i<<6|63&t[e++],n--;n>1?a[r++]=65533:65536>i?a[r++]=i:(i-=65536,a[r++]=55296|i>>10&1023,a[r++]=56320|1023&i)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(t=o.transformTo(h.uint8array?"uint8array":"array",t))},o.inherits(a,i),a.prototype.processChunk=function(t){var e=o.transformTo(h.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=e;(e=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),e.set(r,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var i=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return 0>r?e:0===r?e:r+u[t[r]]>e?r:e}(e),n=e;i!==e.length&&(h.uint8array?(n=e.subarray(0,i),this.leftOver=e.subarray(i,e.length)):(n=e.slice(0,i),this.leftOver=e.slice(i,e.length))),this.push({data:s.utf8decode(n),meta:t.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,i),l.prototype.processChunk=function(t){this.push({data:s.utf8encode(t.data),meta:t.meta})},s.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,e,a){"use strict";function n(t){return t}function l(t,e){for(var r=0;r1;)try{return s.stringifyByChunk(t,r,e)}catch(t){e=Math.floor(e/2)}return s.stringifyByChar(t)}function d(t,e){for(var r=0;r=s)return String.fromCharCode.apply(null,t);for(;s>n;)"array"===e||"nodebuffer"===e?i.push(String.fromCharCode.apply(null,t.slice(n,Math.min(n+r,s)))):i.push(String.fromCharCode.apply(null,t.subarray(n,Math.min(n+r,s)))),n+=r;return i.join("")},stringifyByChar:function(t){for(var e="",r=0;r0;)t=this.reader.readInt(2),e=this.reader.readInt(4),r=this.reader.readData(e),this.zip64ExtensibleData[t]={id:t,length:e,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1t)throw this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error("Corrupted zip: can't find end of central directory"):new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");this.reader.setIndex(t);var e=t;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===n.MAX_VALUE_16BITS||this.diskWithCentralDirStart===n.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===n.MAX_VALUE_16BITS||this.centralDirRecords===n.MAX_VALUE_16BITS||this.centralDirSize===n.MAX_VALUE_32BITS||this.centralDirOffset===n.MAX_VALUE_32BITS){if(this.zip64=!0,(t=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(t),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var i=e-r;if(i>0)this.isSignature(e,s.CENTRAL_FILE_HEADER)||(this.reader.zero=i);else if(0>i)throw new Error("Corrupted zip: missing "+Math.abs(i)+" bytes.")},prepareReader:function(t){this.reader=i(t)},load:function(t){this.prepareReader(t),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},e.exports=h},{"./reader/readerFor":22,"./signature":23,"./support":30,"./utf8":31,"./utils":32,"./zipEntry":34}],34:[function(t,e,r){"use strict";function l(t,e){this.options=t,this.loadOptions=e}var i=t("./reader/readerFor"),s=t("./utils"),n=t("./compressedObject"),a=t("./crc32"),o=t("./utf8"),h=t("./compressions"),u=t("./support");l.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(t){var e,r;if(t.skip(22),this.fileNameLength=t.readInt(2),r=t.readInt(2),this.fileName=t.readData(this.fileNameLength),t.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(null===(e=function(t){for(var e in h)if(h.hasOwnProperty(e)&&h[e].magic===t)return h[e];return null}(this.compressionMethod)))throw new Error("Corrupted zip : compression "+s.pretty(this.compressionMethod)+" unknown (inner file : "+s.transformTo("string",this.fileName)+")");this.decompressed=new n(this.compressedSize,this.uncompressedSize,this.crc32,e,t.readData(this.compressedSize))},readCentralPart:function(t){this.versionMadeBy=t.readInt(2),t.skip(2),this.bitFlag=t.readInt(2),this.compressionMethod=t.readString(2),this.date=t.readDate(),this.crc32=t.readInt(4),this.compressedSize=t.readInt(4),this.uncompressedSize=t.readInt(4);var e=t.readInt(2);if(this.extraFieldsLength=t.readInt(2),this.fileCommentLength=t.readInt(2),this.diskNumberStart=t.readInt(2),this.internalFileAttributes=t.readInt(2),this.externalFileAttributes=t.readInt(4),this.localHeaderOffset=t.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");t.skip(e),this.readExtraFields(t),this.parseZIP64ExtraField(t),this.fileComment=t.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var t=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,i,n=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index+4s;s++)t[n+s]=e[r+s]},flattenChunks:function(t){var e,r,i,n,s,a;for(e=i=0,r=t.length;r>e;e++)i+=t[e].length;for(a=new Uint8Array(i),e=n=0,r=t.length;r>e;e++)s=t[e],a.set(s,n),n+=s.length;return a}},s={arraySet:function(t,e,r,i,n){for(var s=0;i>s;s++)t[n+s]=e[r+s]},flattenChunks:function(t){return[].concat.apply([],t)}};r.setTyped=function(t){t?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,n)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(i)},{}],42:[function(t,e,r){"use strict";function l(t,e){if(65537>e&&(t.subarray&&s||!t.subarray&&n))return String.fromCharCode.apply(null,h.shrinkBuf(t,e));for(var r="",i=0;e>i;i++)r+=String.fromCharCode(t[i]);return r}var h=t("./common"),n=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(t){n=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){s=!1}for(var u=new h.Buf8(256),i=0;256>i;i++)u[i]=i>=252?6:i>=248?5:i>=240?4:i>=224?3:i>=192?2:1;u[254]=u[254]=1,r.string2buf=function(t){var e,r,i,n,s,a=t.length,o=0;for(n=0;a>n;n++)55296==(64512&(r=t.charCodeAt(n)))&&a>n+1&&56320==(64512&(i=t.charCodeAt(n+1)))&&(r=65536+(r-55296<<10)+(i-56320),n++),o+=128>r?1:2048>r?2:65536>r?3:4;for(e=new h.Buf8(o),n=s=0;o>s;n++)55296==(64512&(r=t.charCodeAt(n)))&&a>n+1&&56320==(64512&(i=t.charCodeAt(n+1)))&&(r=65536+(r-55296<<10)+(i-56320),n++),128>r?e[s++]=r:(2048>r?e[s++]=192|r>>>6:(65536>r?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return l(t,t.length)},r.binstring2buf=function(t){for(var e=new h.Buf8(t.length),r=0,i=e.length;i>r;r++)e[r]=t.charCodeAt(r);return e},r.buf2string=function(t,e){var r,i,n,s,a=e||t.length,o=new Array(2*a);for(r=i=0;a>r;)if((n=t[r++])<128)o[i++]=n;else if(4<(s=u[n]))o[i++]=65533,r+=s-1;else{for(n&=2===s?31:3===s?15:7;s>1&&a>r;)n=n<<6|63&t[r++],s--;s>1?o[i++]=65533:65536>n?o[i++]=n:(n-=65536,o[i++]=55296|n>>10&1023,o[i++]=56320|1023&n)}return l(o,i)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return 0>r?e:0===r?e:r+u[t[r]]>e?r:e}},{"./common":41}],43:[function(t,e,r){"use strict";e.exports=function(t,e,r,i){for(var n=65535&t|0,s=t>>>16&65535|0,a=0;0!==r;){for(r-=a=r>2e3?2e3:r;s=s+(n=n+e[i++]|0)|0,--a;);n%=65521,s%=65521}return n|s<<16|0}},{}],44:[function(t,e,r){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(t,e,r){"use strict";var o=function(){for(var t,e=[],r=0;256>r;r++){t=r;for(var i=0;8>i;i++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;s>a;a++)t=t>>>8^n[255&(t^e[a])];return-1^t}},{}],46:[function(t,e,r){"use strict";function R(t,e){return t.msg=i[e],e}function T(t){return(t<<1)-(t>4?9:0)}function D(t){for(var e=t.length;0<=--e;)t[e]=0}function F(t){var e=t.state,r=e.pending;r>t.avail_out&&(r=t.avail_out),0!==r&&(d.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function N(t,e){u._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,F(t.strm)}function U(t,e){t.pending_buf[t.pending++]=e}function P(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function L(t,e){var r,i,n=t.max_chain_length,s=t.strstart,a=t.prev_length,o=t.nice_match,h=t.strstart>t.w_size-z?t.strstart-(t.w_size-z):0,u=t.window,l=t.w_mask,f=t.prev,d=t.strstart+S,c=u[s+a-1],p=u[s+a];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do if(u[(r=e)+a]===p&&u[r+a-1]===c&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do;while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&d>s);if(i=S-(d-s),s=d-S,i>a){if(t.match_start=e,o<=(a=i))break;c=u[s+a-1],p=u[s+a]}}while((e=f[e&l])>h&&0!=--n);return a<=t.lookahead?a:t.lookahead}function j(t){var e,r,i,n,s,a,o,h,u,l,f=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=f+(f-z)){for(d.arraySet(t.window,t.window,f,f,0),t.match_start-=f,t.strstart-=f,t.block_start-=f,e=r=t.hash_size;i=t.head[--e],t.head[e]=i>=f?i-f:0,--r;);for(e=r=f;i=t.prev[--e],t.prev[e]=i>=f?i-f:0,--r;);n+=f}if(0===t.strm.avail_in)break;if(a=t.strm,o=t.window,h=t.strstart+t.lookahead,u=n,l=void 0,l=a.avail_in,l>u&&(l=u),r=0===l?0:(a.avail_in-=l,d.arraySet(o,a.input,a.next_in,l,h),1===a.state.wrap?a.adler=c(a.adler,o,l,h):2===a.state.wrap&&(a.adler=p(a.adler,o,l,h)),a.next_in+=l,a.total_in+=l,l),t.lookahead+=r,t.lookahead+t.insert>=x)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(i=u._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(n=t.strstart+t.lookahead-x,i=u._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=n&&(t.ins_h=(t.ins_h<i?(a=0,i=-i):i>15&&(a=2,i-=16),1>n||n>y||r!==v||8>i||i>15||0>e||e>9||0>s||s>b)return R(t,_);8===i&&(i=9);var o=new H;return(t.state=o).strm=t,o.wrap=a,o.gzhead=null,o.w_bits=i,o.w_size=1<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(j(t),0===t.lookahead&&e===l)return A;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+r;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,N(t,!1),0===t.strm.avail_out))return A;if(t.strstart-t.block_start>=t.w_size-z&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):(t.strstart>t.block_start&&(N(t,!1),t.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(t,e){return Y(t,e,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?_:(t.state.gzhead=e,m):_},r.deflate=function(t,e){var r,i,n,s;if(!t||!t.state||e>5||0>e)return t?R(t,_):_;if(i=t.state,!t.output||!t.input&&0!==t.avail_in||666===i.status&&e!==f)return R(t,0===t.avail_out?-5:_);if(i.strm=t,r=i.last_flush,i.last_flush=e,i.status===C)if(2===i.wrap)t.adler=0,U(i,31),U(i,139),U(i,8),i.gzhead?(U(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),U(i,255&i.gzhead.time),U(i,i.gzhead.time>>8&255),U(i,i.gzhead.time>>16&255),U(i,i.gzhead.time>>24&255),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(U(i,255&i.gzhead.extra.length),U(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=p(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(U(i,0),U(i,0),U(i,0),U(i,0),U(i,0),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,3),i.status=E);else{var a=v+(i.w_bits-8<<4)<<8;a|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(a|=32),a+=31-a%31,i.status=E,P(i,a),0!==i.strstart&&(P(i,t.adler>>>16),P(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(n=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending!==i.pending_buf_size));)U(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&F(t),i.pending+2<=i.pending_buf_size&&(U(i,255&t.adler),U(i,t.adler>>8&255),t.adler=0,i.status=E)):i.status=E),0!==i.pending){if(F(t),0===t.avail_out)return i.last_flush=-1,m}else if(0===t.avail_in&&T(e)<=T(r)&&e!==f)return R(t,-5);if(666===i.status&&0!==t.avail_in)return R(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var o=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(j(t),0===t.lookahead)){if(e===l)return A;break}if(t.match_length=0,r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):3===i.strategy?function(t,e){for(var r,i,n,s,a=t.window;;){if(t.lookahead<=S){if(j(t),t.lookahead<=S&&e===l)return A;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0n);t.match_length=S-(s-n),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=u._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):h[i.level].func(i,e);if(o!==O&&o!==B||(i.status=666),o===A||o===O)return 0===t.avail_out&&(i.last_flush=-1),m;if(o===I&&(1===e?u._tr_align(i):5!==e&&(u._tr_stored_block(i,0,0,!1),3===e&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),F(t),0===t.avail_out))return i.last_flush=-1,m}return e!==f?m:i.wrap<=0?1:(2===i.wrap?(U(i,255&t.adler),U(i,t.adler>>8&255),U(i,t.adler>>16&255),U(i,t.adler>>24&255),U(i,255&t.total_in),U(i,t.total_in>>8&255),U(i,t.total_in>>16&255),U(i,t.total_in>>24&255)):(P(i,t.adler>>>16),P(i,65535&t.adler)),F(t),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new d.Buf8(r.w_size),d.arraySet(u,e,l-r.w_size,r.w_size,0),e=u,l=r.w_size),a=t.avail_in,o=t.next_in,h=t.input,t.avail_in=l,t.next_in=0,t.input=e,j(r);r.lookahead>=x;){for(i=r.strstart,n=r.lookahead-(x-1);r.ins_h=(r.ins_h<p&&(c+=z[i++]<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(c&(1<p&&(c+=z[i++]<>>=y,p-=y),15>p&&(c+=z[i++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(c&(1<>>=y,p-=y,(y=s-a)y){for(w-=y;C[s++]=d[x++],--y;);x=s-k,S=C}}else if(y>f){if(x+=u+f-y,(y-=f)f){for(w-=y=f;C[s++]=d[x++],--y;);x=s-k,S=C}}}else if(x+=f-y,w>y){for(w-=y;C[s++]=d[x++],--y;);x=s-k,S=C}for(;w>2;)C[s++]=S[x++],C[s++]=S[x++],C[s++]=S[x++],w-=3;w&&(C[s++]=S[x++],w>1&&(C[s++]=S[x++]))}else{for(x=s-k;C[s++]=C[x++],C[s++]=C[x++],C[s++]=C[x++],2<(w-=3););w&&(C[s++]=C[x++],w>1&&(C[s++]=C[x++]))}break}}break}}while(n>i&&o>s);i-=w=p>>3,c&=(1<<(p-=w<<3))-1,t.next_in=i,t.next_out=s,t.avail_in=n>i?n-i+5:5-(i-n),t.avail_out=o>s?o-s+257:257-(s-o),r.hold=c,r.bits=p}},{}],49:[function(t,e,r){"use strict";function L(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=P,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new I.Buf32(i),e.distcode=e.distdyn=new I.Buf32(n),e.sane=1,e.back=-1,N):U}function o(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,a(t)):U}function h(t,e){var r,i;return t&&t.state?(i=t.state,0>e?(r=0,e=-e):(r=1+(e>>4),48>e&&(e&=15)),e&&(8>e||e>15)?U:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=r,i.wbits=e,o(t))):U}function u(t,e){var r,i;return t?(i=new s,(t.state=i).window=null,(r=h(t,e))!==N&&(t.state=null),r):U}function j(t){if(d){var e;for(l=new I.Buf32(512),f=new I.Buf32(32),e=0;144>e;)t.lens[e++]=8;for(;256>e;)t.lens[e++]=9;for(;280>e;)t.lens[e++]=7;for(;288>e;)t.lens[e++]=8;for(T(D,t.lens,0,288,l,0,t.work,{bits:9}),e=0;32>e;)t.lens[e++]=5;T(F,t.lens,0,32,f,0,t.work,{bits:5}),d=!1}t.lencode=l,t.lenbits=9,t.distcode=f,t.distbits=5}function Z(t,e,r,i){var n,s=t.state;return null===s.window&&(s.wsize=1<=s.wsize?(I.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(n=s.wsize-s.wnext)&&(n=i),I.arraySet(s.window,e,r-i,n,s.wnext),(i-=n)?(I.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whavel;){if(0===o)break t;o--,u+=i[s++]<>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){t.msg="incorrect header check",r.mode=30;break}if(8!=(15&u)){t.msg="unknown compression method",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){t.msg="invalid window size",r.mode=30;break}r.dmax=1<l;){if(0===o)break t;o--,u+=i[s++]<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;32>l;){if(0===o)break t;o--,u+=i[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;16>l;){if(0===o)break t;o--,u+=i[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;16>l;){if(0===o)break t;o--,u+=i[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,i,s,c,k)),512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,r.length-=c),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break t;for(c=0;k=i[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&o>c;);if(512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,k)break t}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===o)break t;for(c=0;k=i[s+c++],r.head&&k&&r.length<65536&&(r.head.comment+=String.fromCharCode(k)),k&&o>c;);if(512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,k)break t}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;16>l;){if(0===o)break t;o--,u+=i[s++]<>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;32>l;){if(0===o)break t;o--,u+=i[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;3>l;){if(0===o)break t;o--,u+=i[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==e)break;u>>>=2,l-=2;break t;case 2:r.mode=17;break;case 3:t.msg="invalid block type",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;32>l;){if(0===o)break t;o--,u+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(c=r.length){if(c>o&&(c=o),c>h&&(c=h),0===c)break t;I.arraySet(n,i,s,c,a),o-=c,s+=c,h-=c,a+=c,r.length-=c;break}r.mode=12;break;case 17:for(;14>l;){if(0===o)break t;o--,u+=i[s++]<>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286l;){if(0===o)break t;o--,u+=i[s++]<>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<b)u>>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;z>l;){if(0===o)break t;o--,u+=i[s++]<>>=_,l-=_,0===r.have){t.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;z>l;){if(0===o)break t;o--,u+=i[s++]<>>=_)),u>>>=3,l-=3}else{for(z=_+7;z>l;){if(0===o)break t;o--,u+=i[s++]<>>=_)),u>>>=7,l-=7}if(r.have+c>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){t.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(o>=6&&h>=258){t.next_out=a,t.avail_out=h,t.next_in=s,t.avail_in=o,r.hold=u,r.bits=l,R(t,d),a=t.next_out,n=t.output,h=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){t.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;z>l;){if(0===o)break t;o--,u+=i[s++]<>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){t.msg="invalid distance code",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;z>l;){if(0===o)break t;o--,u+=i[s++]<>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===h)break t;if(c=d-h,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=n,p=a-r.offset,c=r.length;for(c>h&&(c=h),h-=c,r.length-=c;n[a++]=m[p++],--c;);0===r.length&&(r.mode=21);break;case 26:if(0===h)break t;n[a++]=r.length,h--,r.mode=21;break;case 27:if(r.wrap){for(;32>l;){if(0===o)break t;o--,u|=i[s++]<l;){if(0===o)break t;o--,u+=i[s++]<=b;b++)O[b]=0;for(v=0;i>v;v++)O[e[r+v]]++;for(k=g,w=15;w>=1&&0===O[w];w--);if(k>w&&(k=w),0===w)return n[s++]=20971520,n[s++]=20971520,o.bits=1,0;for(y=1;w>y&&0===O[y];y++);for(y>k&&(k=y),b=z=1;15>=b;b++)if(z<<=1,(z-=O[b])<0)return-1;if(z>0&&(0===t||1!==w))return-1;for(B[1]=0,b=1;15>b;b++)B[b+1]=B[b]+O[b];for(v=0;i>v;v++)0!==e[r+v]&&(a[B[e[r+v]]++]=v);if(c=0===t?(A=R=a,19):1===t?(A=F,I-=257,R=N,T-=257,256):(A=U,R=P,-1),b=y,d=s,S=v=E=0,l=-1,f=(C=1<<(x=k))-1,1===t&&C>852||2===t&&C>592)return 1;for(;;){for(p=b-S,_=a[v]c?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=e[r+a[v]]}if(b>k&&(E&f)!==l){for(0===S&&(S=k),d+=y,z=1<<(x=b-S);w>x+S&&!((z-=O[x+S])<=0);)x++,z<<=1;if(C+=1<852||2===t&&C>592)return 1;n[l=E&f]=k<<24|x<<16|d-s|0}}return 0!==E&&(n[d+E]=b-S<<24|64<<16|0),o.bits=k,0}},{"../utils/common":41}],51:[function(t,e,r){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],52:[function(t,e,r){"use strict";function i(t){for(var e=t.length;0<=--e;)t[e]=0}function D(t,e,r,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=r,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}function F(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function N(t){return 256>t?E[t]:E[256+(t>>>7)]}function U(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<>>=1,r<<=1,0<--e;);return r>>>1}function Z(t,e,r){var i,n,s=new Array(g+1),a=0;for(i=1;g>=i;i++)s[i]=a=a+r[i-1]<<1;for(n=0;e>=n;n++){var o=t[2*n+1];0!==o&&(t[2*n]=j(s[o]++,o))}}function W(t){var e;for(e=0;l>e;e++)t.dyn_ltree[2*e]=0;for(e=0;f>e;e++)t.dyn_dtree[2*e]=0;for(e=0;d>e;e++)t.bl_tree[2*e]=0;t.dyn_ltree[2*m]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function M(t){8r;r++)0!==s[2*r]?(t.heap[++t.heap_len]=u=r,t.depth[r]=0):s[2*r+1]=0;for(;t.heap_len<2;)s[2*(n=t.heap[++t.heap_len]=2>u?++u:0)]=1,t.depth[n]=0,t.opt_len--,o&&(t.static_len-=a[2*n+1]);for(e.max_code=u,r=t.heap_len>>1;r>=1;r--)G(t,s,r);for(n=h;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,s,1),i=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=i,s[2*n]=s[2*r]+s[2*i],t.depth[n]=(t.depth[r]>=t.depth[i]?t.depth[r]:t.depth[i])+1,s[2*r+1]=s[2*i+1]=n,t.heap[1]=n++,G(t,s,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,i,n,s,a,o,h=e.dyn_tree,u=e.max_code,l=e.stat_desc.static_tree,f=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,p=e.stat_desc.max_length,m=0;for(s=0;g>=s;s++)t.bl_count[s]=0;for(h[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;_>r;r++)p<(s=h[2*h[2*(i=t.heap[r])+1]+1]+1)&&(s=p,m++),h[2*i+1]=s,i>u||(t.bl_count[s]++,a=0,i>=c&&(a=d[i-c]),o=h[2*i],t.opt_len+=o*(s+a),f&&(t.static_len+=o*(l[2*i+1]+a)));if(0!==m){do{for(s=p-1;0===t.bl_count[s];)s--;t.bl_count[s]--,t.bl_count[s+1]+=2,t.bl_count[p]--,m-=2}while(m>0);for(s=p;0!==s;s--)for(i=t.bl_count[s];0!==i;)u<(n=t.heap[--r])||(h[2*n+1]!==s&&(t.opt_len+=(s-h[2*n+1])*h[2*n],h[2*n+1]=s),i--)}}(t,e),Z(s,u,t.bl_count)}function X(t,e,r){var i,n,s=-1,a=e[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),e[2*(r+1)+1]=65535,i=0;r>=i;i++)n=a,a=e[2*(i+1)+1],++oo?t.bl_tree[2*n]+=o:0!==n?(n!==s&&t.bl_tree[2*n]++,t.bl_tree[2*b]++):10>=o?t.bl_tree[2*v]++:t.bl_tree[2*y]++,s=n,u=(o=0)===a?(h=138,3):n===a?(h=6,3):(h=7,4))}function V(t,e,r){var i,n,s=-1,a=e[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),i=0;r>=i;i++)if(n=a,a=e[2*(i+1)+1],!(++oo)for(;L(t,n,t.bl_tree),0!=--o;);else 0!==n?(n!==s&&(L(t,n,t.bl_tree),o--),L(t,b,t.bl_tree),P(t,o-3,2)):10>=o?(L(t,v,t.bl_tree),P(t,o-3,3)):(L(t,y,t.bl_tree),P(t,o-11,7));s=n,u=(o=0)===a?(h=138,3):n===a?(h=6,3):(h=7,4)}}function J(t,e,r,i){P(t,(s<<1)+(i?1:0),3),function(t,e,r,i){M(t),i&&(U(t,r),U(t,~r)),n.arraySet(t.pending_buf,t.window,e,r,t.pending),t.pending+=r}(t,e,r,!0)}var n=t("../utils/common"),o=0,h=1,s=0,a=29,u=256,l=u+1+a,f=30,d=19,_=2*l+1,g=15,c=16,p=7,m=256,b=16,v=17,y=18,w=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],k=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],z=new Array(2*(l+2));i(z);var C=new Array(2*f);i(C);var E=new Array(512);i(E);var A=new Array(256);i(A);var I=new Array(a);i(I);var O,B,R,T=new Array(f);i(T);var q=!1;r._tr_init=function(t){q||(function(){var t,e,r,i,n,s=new Array(g+1);for(i=r=0;a-1>i;i++)for(I[i]=r,t=0;t<1<i;i++)for(T[i]=n,t=0;t<1<>=7;f>i;i++)for(T[i]=n<<7,t=0;t<1<=e;e++)s[e]=0;for(t=0;143>=t;)z[2*t+1]=8,t++,s[8]++;for(;255>=t;)z[2*t+1]=9,t++,s[9]++;for(;279>=t;)z[2*t+1]=7,t++,s[7]++;for(;287>=t;)z[2*t+1]=8,t++,s[8]++;for(Z(z,l+1,s),t=0;f>t;t++)C[2*t+1]=5,C[2*t]=j(t,5);O=new D(z,w,u+1,l,g),B=new D(C,k,0,f,g),R=new D(new Array(0),x,0,d,p)}(),q=!0),t.l_desc=new F(t.dyn_ltree,O),t.d_desc=new F(t.dyn_dtree,B),t.bl_desc=new F(t.bl_tree,R),t.bi_buf=0,t.bi_valid=0,W(t)},r._tr_stored_block=J,r._tr_flush_block=function(t,e,r,i){var n,s,a=0;0=e;e++,r>>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return h;for(e=32;u>e;e++)if(0!==t.dyn_ltree[2*e])return h;return o}(t)),Y(t,t.l_desc),Y(t,t.d_desc),a=function(t){var e;for(X(t,t.dyn_ltree,t.l_desc.max_code),X(t,t.dyn_dtree,t.d_desc.max_code),Y(t,t.bl_desc),e=d-1;e>=3&&0===t.bl_tree[2*S[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),n=t.opt_len+3+7>>>3,(s=t.static_len+3+7>>>3)<=n&&(n=s)):n=s=r+5,n>=r+4&&-1!==e?J(t,e,r,i):4===t.strategy||s===n?(P(t,2+(i?1:0),3),K(t,z,C)):(P(t,4+(i?1:0),3),function(t,e,r,i){var n;for(P(t,e-257,5),P(t,r-1,5),P(t,i-4,4),n=0;i>n;n++)P(t,t.bl_tree[2*S[n]+1],3);V(t,t.dyn_ltree,e-1),V(t,t.dyn_dtree,r-1)}(t,t.l_desc.max_code+1,t.d_desc.max_code+1,a+1),K(t,t.dyn_ltree,t.dyn_dtree)),W(t),i&&M(t)},r._tr_tally=function(t,e,r){return t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(A[r]+u+1)]++,t.dyn_dtree[2*N(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),L(t,m,z),function(t){16===t.bi_valid?(U(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{"../utils/common":41}],53:[function(t,e,r){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){"use strict";e.exports="function"==typeof setImmediate?setImmediate:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},require("buffer").Buffer)},{buffer:83}],89:[function(require,module,exports){exports.Parser=require("./lib/parser").Parser,exports.rules=require("./lib/rules"),exports.errors=require("./lib/errors"),exports.results=require("./lib/parsing-results"),exports.StringSource=require("./lib/StringSource"),exports.Token=require("./lib/Token"),exports.bottomUp=require("./lib/bottom-up"),exports.RegexTokeniser=require("./lib/regex-tokeniser").RegexTokeniser, +exports.rule=function(ruleBuilder){var rule;return function(input){return rule||(rule=ruleBuilder()),rule(input)}}},{"./lib/StringSource":90,"./lib/Token":91,"./lib/bottom-up":93,"./lib/errors":94,"./lib/parser":96,"./lib/parsing-results":97,"./lib/regex-tokeniser":98,"./lib/rules":99}],90:[function(require,module,exports){var util=require("util"),StringSourceRange=(module.exports=function(string,description){var self={asString:function(){return string},range:function(startIndex,endIndex){return new StringSourceRange(string,description,startIndex,endIndex)}};return self},function(string,description,startIndex,endIndex){this._string=string,this._description=description,this._startIndex=startIndex,this._endIndex=endIndex});StringSourceRange.prototype.to=function(otherRange){return new StringSourceRange(this._string,this._description,this._startIndex,otherRange._endIndex)},StringSourceRange.prototype.describe=function(){var position=this._position(),description=this._description?this._description+"\n":"";return util.format("%sLine number: %s\nCharacter number: %s",description,position.lineNumber,position.characterNumber)},StringSourceRange.prototype.lineNumber=function(){return this._position().lineNumber},StringSourceRange.prototype.characterNumber=function(){return this._position().characterNumber},StringSourceRange.prototype._position=function(){for(var self=this,index=0,nextNewLine=function(){return self._string.indexOf("\n",index)},lineNumber=1;-1!==nextNewLine()&&nextNewLine()startIndex){var value=result[1],token=new Token(rules[i].name,value,source.range(startIndex,endIndex));return{token:token,endIndex:endIndex}}}}var endIndex=startIndex+1,token=new Token("unrecognisedCharacter",string.substring(startIndex,endIndex),source.range(startIndex,endIndex));return{token:token,endIndex:endIndex}}function endToken(input,source){return new Token("end",null,source.range(input.length,input.length))}return rules=rules.map(function(rule){return{name:rule.name,regex:new RegExp(rule.regex.source,"g")}}),{tokenise:tokenise}}var Token=require("./Token"),StringSource=require("./StringSource");exports.RegexTokeniser=RegexTokeniser},{"./StringSource":90,"./Token":91}],99:[function(require,module,exports){function noOpRule(input){return results.success(null,input)}function describeTokenMismatch(input,expected){var error,token=input.head();return error=token?errors.error({expected:expected,actual:describeToken(token),location:token.source}):errors.error({expected:expected,actual:"end of tokens"}),results.failure([error],input)}var _=require("underscore"),options=require("option"),results=require("./parsing-results"),errors=require("./errors"),lazyIterators=require("./lazy-iterators");exports.token=function(tokenType,value){var matchValue=void 0!==value;return function(input){var token=input.head();if(!token||token.name!==tokenType||matchValue&&token.value!==value){var expected=describeToken({name:tokenType,value:value});return describeTokenMismatch(input,expected)}return results.success(token.value,input.tail(),token.source)}},exports.tokenOfType=function(tokenType){return exports.token(tokenType)},exports.firstOf=function(name,parsers){return _.isArray(parsers)||(parsers=Array.prototype.slice.call(arguments,1)),function(input){return lazyIterators.fromArray(parsers).map(function(parser){return parser(input)}).filter(function(result){return result.isSuccess()||result.isError()}).first()||describeTokenMismatch(input,name)}},exports.then=function(parser,func){return function(input){var result=parser(input);return result.map||console.log(result),result.map(func)}},exports.sequence=function(){function isCapturedRule(subRule){return subRule.isCaptured}var parsers=Array.prototype.slice.call(arguments,0),rule=function(input){var result=_.foldl(parsers,function(memo,parser){var result=memo.result,hasCut=memo.hasCut;if(!result.isSuccess())return{result:result,hasCut:hasCut};var subResult=parser(result.remaining());if(subResult.isCut())return{result:result,hasCut:!0};if(subResult.isSuccess()){var values;values=parser.isCaptured?result.value().withValue(parser,subResult.value()):result.value();var remaining=subResult.remaining(),source=input.to(remaining);return{result:results.success(values,remaining,source),hasCut:hasCut}}return hasCut?{result:results.error(subResult.errors(),subResult.remaining()),hasCut:hasCut}:{result:subResult,hasCut:hasCut}},{result:results.success(new SequenceValues,input),hasCut:!1}).result,source=input.to(result.remaining());return result.map(function(values){return values.withValue(exports.sequence.source,source)})};return rule.head=function(){var firstCapture=_.find(parsers,isCapturedRule);return exports.then(rule,exports.sequence.extract(firstCapture))},rule.map=function(func){return exports.then(rule,function(result){return func.apply(this,result.toArray())})},rule};var SequenceValues=function(values,valuesArray){this._values=values||{},this._valuesArray=valuesArray||[]};SequenceValues.prototype.withValue=function(rule,value){if(rule.captureName&&rule.captureName in this._values)throw new Error('Cannot add second value for capture "'+rule.captureName+'"');var newValues=_.clone(this._values);newValues[rule.captureName]=value;var newValuesArray=this._valuesArray.concat([value]);return new SequenceValues(newValues,newValuesArray)},SequenceValues.prototype.get=function(rule){if(rule.captureName in this._values)return this._values[rule.captureName];throw new Error('No value for capture "'+rule.captureName+'"')},SequenceValues.prototype.toArray=function(){return this._valuesArray},exports.sequence.capture=function(rule,name){var captureRule=function(){return rule.apply(this,arguments)};return captureRule.captureName=name,captureRule.isCaptured=!0,captureRule},exports.sequence.extract=function(rule){return function(result){return result.get(rule)}},exports.sequence.applyValues=function(func){var rules=Array.prototype.slice.call(arguments,1);return function(result){var values=rules.map(function(rule){return result.get(rule)});return func.apply(this,values)}},exports.sequence.source={captureName:"☃source☃"},exports.sequence.cut=function(){return function(input){return results.cut(input)}},exports.optional=function(rule){return function(input){var result=rule(input);return result.isSuccess()?result.map(options.some):result.isFailure()?results.success(options.none,input):result}},exports.zeroOrMoreWithSeparator=function(rule,separator){return repeatedWithSeparator(rule,separator,!1)},exports.oneOrMoreWithSeparator=function(rule,separator){return repeatedWithSeparator(rule,separator,!0)};var zeroOrMore=exports.zeroOrMore=function(rule){return function(input){for(var result,values=[];(result=rule(input))&&result.isSuccess();)input=result.remaining(),values.push(result.value());return result.isError()?result:results.success(values,input)}};exports.oneOrMore=function(rule){return exports.oneOrMoreWithSeparator(rule,noOpRule)};var repeatedWithSeparator=function(rule,separator,isOneOrMore){return function(input){var result=rule(input);if(result.isSuccess()){var mainRule=exports.sequence.capture(rule,"main"),remainingRule=zeroOrMore(exports.then(exports.sequence(separator,mainRule),exports.sequence.extract(mainRule))),remainingResult=remainingRule(result.remaining());return results.success([result.value()].concat(remainingResult.value()),remainingResult.remaining())}return isOneOrMore||result.isError()?result:results.success([],input)}};exports.leftAssociative=function(leftRule,rightRule,func){var rights;rights=func?[{func:func,rule:rightRule}]:rightRule,rights=rights.map(function(right){return exports.then(right.rule,function(rightValue){return function(leftValue,source){return right.func(leftValue,rightValue,source)}})});var repeatedRule=exports.firstOf.apply(null,["rules"].concat(rights));return function(input){var start=input,leftResult=leftRule(input);if(!leftResult.isSuccess())return leftResult;for(var repeatedResult=repeatedRule(leftResult.remaining());repeatedResult.isSuccess();){var remaining=repeatedResult.remaining(),source=start.to(repeatedResult.remaining()),right=repeatedResult.value();leftResult=results.success(right(leftResult.value(),source),remaining,source),repeatedResult=repeatedRule(leftResult.remaining())}return repeatedResult.isError()?repeatedResult:leftResult}},exports.leftAssociative.firstOf=function(){return Array.prototype.slice.call(arguments,0)},exports.nonConsuming=function(rule){return function(input){return rule(input).changeRemaining(input)}};var describeToken=function(token){return token.value?token.name+' "'+token.value+'"':token.name}},{"./errors":94,"./lazy-iterators":95,"./parsing-results":97,option:100,underscore:103}],100:[function(require,module,exports){function callOrReturn(value){return"function"==typeof value?value():value}exports.none=Object.create({value:function(){throw new Error("Called value on none")},isNone:function(){return!0},isSome:function(){return!1},map:function(){return exports.none},flatMap:function(){return exports.none},filter:function(){return exports.none},toArray:function(){return[]},orElse:callOrReturn,valueOrElse:callOrReturn}),exports.some=function(value){return new Some(value)};var Some=function(value){this._value=value};Some.prototype.value=function(){return this._value},Some.prototype.isNone=function(){return!1},Some.prototype.isSome=function(){return!0},Some.prototype.map=function(func){return new Some(func(this._value))},Some.prototype.flatMap=function(func){return func(this._value)},Some.prototype.filter=function(predicate){return predicate(this._value)?this:exports.none},Some.prototype.toArray=function(){return[this._value]},Some.prototype.orElse=function(value){return this},Some.prototype.valueOrElse=function(value){return this._value},exports.isOption=function(value){return value===exports.none||value instanceof Some},exports.fromNullable=function(value){return null==value?exports.none:new Some(value)}},{}],101:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){for(var up=0,i=parts.length-1;i>=0;i--){var last=parts[i];"."===last?parts.splice(i,1):".."===last?(parts.splice(i,1),up++):up&&(parts.splice(i,1),up--)}if(allowAboveRoot)for(;up--;up)parts.unshift("..");return parts}function filter(xs,f){if(xs.filter)return xs.filter(f);for(var res=[],i=0;i=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if("string"!=typeof path)throw new TypeError("Arguments to path.resolve must be strings");path&&(resolvedPath=path+"/"+resolvedPath,resolvedAbsolute="/"===path.charAt(0))}return resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/"),(resolvedAbsolute?"/":"")+resolvedPath||"."},exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash="/"===substr(path,-1);return path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/"),path||isAbsolute||(path="."),path&&trailingSlash&&(path+="/"),(isAbsolute?"/":"")+path},exports.isAbsolute=function(path){return"/"===path.charAt(0)},exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if("string"!=typeof p)throw new TypeError("Arguments to path.join must be strings");return p}).join("/"))},exports.relative=function(from,to){function trim(arr){for(var start=0;start=0&&""===arr[end];end--);return start>end?[]:arr.slice(start,end-start+1)}from=exports.resolve(from).substr(1),to=exports.resolve(to).substr(1);for(var fromParts=trim(from.split("/")),toParts=trim(to.split("/")),length=Math.min(fromParts.length,toParts.length),samePartsLength=length,i=0;length>i;i++)if(fromParts[i]!==toParts[i]){samePartsLength=i;break}for(var outputParts=[],i=samePartsLength;istart&&(start=str.length+start),str.substr(start,len)}}).call(this,require("_process"))},{_process:102}],102:[function(require,module,exports){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(fun){if(cachedSetTimeout===setTimeout)return setTimeout(fun,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(fun,0);try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout)return clearTimeout(marker);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(marker);try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var timeout=runTimeout(cleanUpNextTick);draining=!0;for(var len=queue.length;len;){for(currentQueue=queue,queue=[];++queueIndex1)for(var i=1;iindex;index++)rest[index]=arguments[index+startIndex];switch(startIndex){case 0:return func.call(this,rest);case 1:return func.call(this,arguments[0],rest);case 2:return func.call(this,arguments[0],arguments[1],rest)}var args=Array(startIndex+1);for(index=0;startIndex>index;index++)args[index]=arguments[index];return args[startIndex]=rest,func.apply(this,args)}}function isObject(obj){var type=typeof obj;return"function"===type||"object"===type&&!!obj}function isNull(obj){return null===obj}function isUndefined(obj){return void 0===obj}function isBoolean(obj){return obj===!0||obj===!1||"[object Boolean]"===toString.call(obj)}function isElement(obj){return!(!obj||1!==obj.nodeType)}function tagTester(name){var tag="[object "+name+"]";return function(obj){return toString.call(obj)===tag}}function ie10IsDataView(obj){return null!=obj&&isFunction$1(obj.getInt8)&&isArrayBuffer(obj.buffer)}function has$1(obj,key){return null!=obj&&hasOwnProperty.call(obj,key)}function isFinite$1(obj){return!isSymbol(obj)&&_isFinite(obj)&&!isNaN(parseFloat(obj))}function isNaN$1(obj){return isNumber(obj)&&_isNaN(obj)}function constant(value){return function(){return value}}function createSizePropertyCheck(getSizeProperty){return function(collection){var sizeProperty=getSizeProperty(collection);return"number"==typeof sizeProperty&&sizeProperty>=0&&MAX_ARRAY_INDEX>=sizeProperty}}function shallowProperty(key){return function(obj){return null==obj?void 0:obj[key]}}function isTypedArray(obj){return nativeIsView?nativeIsView(obj)&&!isDataView$1(obj):isBufferLike(obj)&&typedArrayPattern.test(toString.call(obj))}function emulatedSet(keys){for(var hash={},l=keys.length,i=0;l>i;++i)hash[keys[i]]=!0;return{contains:function(key){return hash[key]},push:function(key){return hash[key]=!0,keys.push(key)}}}function collectNonEnumProps(obj,keys){keys=emulatedSet(keys);var nonEnumIdx=nonEnumerableProps.length,constructor=obj.constructor,proto=isFunction$1(constructor)&&constructor.prototype||ObjProto,prop="constructor";for(has$1(obj,prop)&&!keys.contains(prop)&&keys.push(prop);nonEnumIdx--;)prop=nonEnumerableProps[nonEnumIdx],prop in obj&&obj[prop]!==proto[prop]&&!keys.contains(prop)&&keys.push(prop)}function keys(obj){if(!isObject(obj))return[];if(nativeKeys)return nativeKeys(obj);var keys=[];for(var key in obj)has$1(obj,key)&&keys.push(key);return hasEnumBug&&collectNonEnumProps(obj,keys),keys}function isEmpty(obj){if(null==obj)return!0;var length=getLength(obj);return"number"==typeof length&&(isArray(obj)||isString(obj)||isArguments$1(obj))?0===length:0===getLength(keys(obj))}function isMatch(object,attrs){var _keys=keys(attrs),length=_keys.length;if(null==object)return!length;for(var obj=Object(object),i=0;length>i;i++){var key=_keys[i];if(attrs[key]!==obj[key]||!(key in obj))return!1}return!0}function _$1(obj){return obj instanceof _$1?obj:this instanceof _$1?void(this._wrapped=obj):new _$1(obj)}function toBufferView(bufferSource){return new Uint8Array(bufferSource.buffer||bufferSource,bufferSource.byteOffset||0,getByteLength(bufferSource))}function eq(a,b,aStack,bStack){if(a===b)return 0!==a||1/a===1/b;if(null==a||null==b)return!1;if(a!==a)return b!==b;var type=typeof a;return"function"!==type&&"object"!==type&&"object"!=typeof b?!1:deepEq(a,b,aStack,bStack)}function deepEq(a,b,aStack,bStack){a instanceof _$1&&(a=a._wrapped),b instanceof _$1&&(b=b._wrapped);var className=toString.call(a);if(className!==toString.call(b))return!1;if(hasStringTagBug&&"[object Object]"==className&&isDataView$1(a)){if(!isDataView$1(b))return!1;className=tagDataView}switch(className){case"[object RegExp]":case"[object String]":return""+a==""+b;case"[object Number]":return+a!==+a?+b!==+b:0===+a?1/+a===1/b:+a===+b;case"[object Date]":case"[object Boolean]":return+a===+b;case"[object Symbol]":return SymbolProto.valueOf.call(a)===SymbolProto.valueOf.call(b);case"[object ArrayBuffer]":case tagDataView:return deepEq(toBufferView(a),toBufferView(b),aStack,bStack)}var areArrays="[object Array]"===className;if(!areArrays&&isTypedArray$1(a)){var byteLength=getByteLength(a);if(byteLength!==getByteLength(b))return!1;if(a.buffer===b.buffer&&a.byteOffset===b.byteOffset)return!0;areArrays=!0}if(!areArrays){if("object"!=typeof a||"object"!=typeof b)return!1;var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(isFunction$1(aCtor)&&aCtor instanceof aCtor&&isFunction$1(bCtor)&&bCtor instanceof bCtor)&&"constructor"in a&&"constructor"in b)return!1}aStack=aStack||[],bStack=bStack||[];for(var length=aStack.length;length--;)if(aStack[length]===a)return bStack[length]===b;if(aStack.push(a),bStack.push(b),areArrays){if(length=a.length,length!==b.length)return!1;for(;length--;)if(!eq(a[length],b[length],aStack,bStack))return!1}else{var key,_keys=keys(a);if(length=_keys.length,keys(b).length!==length)return!1;for(;length--;)if(key=_keys[length],!has$1(b,key)||!eq(a[key],b[key],aStack,bStack))return!1}return aStack.pop(),bStack.pop(),!0}function isEqual(a,b){return eq(a,b)}function allKeys(obj){if(!isObject(obj))return[];var keys=[];for(var key in obj)keys.push(key);return hasEnumBug&&collectNonEnumProps(obj,keys),keys}function ie11fingerprint(methods){var length=getLength(methods);return function(obj){if(null==obj)return!1;var keys=allKeys(obj);if(getLength(keys))return!1;for(var i=0;length>i;i++)if(!isFunction$1(obj[methods[i]]))return!1;return methods!==weakMapMethods||!isFunction$1(obj[forEachName])}}function values(obj){for(var _keys=keys(obj),length=_keys.length,values=Array(length),i=0;length>i;i++)values[i]=obj[_keys[i]];return values}function pairs(obj){for(var _keys=keys(obj),length=_keys.length,pairs=Array(length),i=0;length>i;i++)pairs[i]=[_keys[i],obj[_keys[i]]];return pairs}function invert(obj){for(var result={},_keys=keys(obj),i=0,length=_keys.length;length>i;i++)result[obj[_keys[i]]]=_keys[i];return result}function functions(obj){var names=[];for(var key in obj)isFunction$1(obj[key])&&names.push(key);return names.sort()}function createAssigner(keysFunc,defaults){return function(obj){var length=arguments.length;if(defaults&&(obj=Object(obj)),2>length||null==obj)return obj;for(var index=1;length>index;index++)for(var source=arguments[index],keys=keysFunc(source),l=keys.length,i=0;l>i;i++){var key=keys[i];defaults&&void 0!==obj[key]||(obj[key]=source[key])}return obj}}function ctor(){return function(){}}function baseCreate(prototype){if(!isObject(prototype))return{};if(nativeCreate)return nativeCreate(prototype);var Ctor=ctor();Ctor.prototype=prototype;var result=new Ctor;return Ctor.prototype=null,result}function create(prototype,props){var result=baseCreate(prototype);return props&&extendOwn(result,props),result}function clone(obj){return isObject(obj)?isArray(obj)?obj.slice():extend({},obj):obj}function tap(obj,interceptor){return interceptor(obj),obj}function toPath$1(path){return isArray(path)?path:[path]}function toPath(path){return _$1.toPath(path)}function deepGet(obj,path){for(var length=path.length,i=0;length>i;i++){if(null==obj)return void 0;obj=obj[path[i]]}return length?obj:void 0}function get(object,path,defaultValue){var value=deepGet(object,toPath(path));return isUndefined(value)?defaultValue:value}function has(obj,path){path=toPath(path);for(var length=path.length,i=0;length>i;i++){var key=path[i];if(!has$1(obj,key))return!1;obj=obj[key]}return!!length}function identity(value){return value}function matcher(attrs){return attrs=extendOwn({},attrs),function(obj){return isMatch(obj,attrs)}}function property(path){return path=toPath(path),function(obj){return deepGet(obj,path)}}function optimizeCb(func,context,argCount){if(void 0===context)return func;switch(null==argCount?3:argCount){case 1:return function(value){return func.call(context,value)};case 3:return function(value,index,collection){return func.call(context,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(context,accumulator,value,index,collection)}}return function(){return func.apply(context,arguments)}}function baseIteratee(value,context,argCount){return null==value?identity:isFunction$1(value)?optimizeCb(value,context,argCount):isObject(value)&&!isArray(value)?matcher(value):property(value); +}function iteratee(value,context){return baseIteratee(value,context,1/0)}function cb(value,context,argCount){return _$1.iteratee!==iteratee?_$1.iteratee(value,context):baseIteratee(value,context,argCount)}function mapObject(obj,iteratee,context){iteratee=cb(iteratee,context);for(var _keys=keys(obj),length=_keys.length,results={},index=0;length>index;index++){var currentKey=_keys[index];results[currentKey]=iteratee(obj[currentKey],currentKey,obj)}return results}function noop(){}function propertyOf(obj){return null==obj?noop:function(path){return get(obj,path)}}function times(n,iteratee,context){var accum=Array(Math.max(0,n));iteratee=optimizeCb(iteratee,context,1);for(var i=0;n>i;i++)accum[i]=iteratee(i);return accum}function random(min,max){return null==max&&(max=min,min=0),min+Math.floor(Math.random()*(max-min+1))}function createEscaper(map){var escaper=function(match){return map[match]},source="(?:"+keys(map).join("|")+")",testRegexp=RegExp(source),replaceRegexp=RegExp(source,"g");return function(string){return string=null==string?"":""+string,testRegexp.test(string)?string.replace(replaceRegexp,escaper):string}}function escapeChar(match){return"\\"+escapes[match]}function template(text,settings,oldSettings){!settings&&oldSettings&&(settings=oldSettings),settings=defaults({},settings,_$1.templateSettings);var matcher=RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g"),index=0,source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){return source+=text.slice(index,offset).replace(escapeRegExp,escapeChar),index=offset+match.length,escape?source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'":interpolate?source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'":evaluate&&(source+="';\n"+evaluate+"\n__p+='"),match}),source+="';\n";var argument=settings.variable;if(argument){if(!bareIdentifier.test(argument))throw new Error("variable is not a bare identifier: "+argument)}else source="with(obj||{}){\n"+source+"}\n",argument="obj";source="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";var render;try{render=new Function(argument,"_",source)}catch(e){throw e.source=source,e}var template=function(data){return render.call(this,data,_$1)};return template.source="function("+argument+"){\n"+source+"}",template}function result(obj,path,fallback){path=toPath(path);var length=path.length;if(!length)return isFunction$1(fallback)?fallback.call(obj):fallback;for(var i=0;length>i;i++){var prop=null==obj?void 0:obj[path[i]];void 0===prop&&(prop=fallback,i=length),obj=isFunction$1(prop)?prop.call(obj):prop}return obj}function uniqueId(prefix){var id=++idCounter+"";return prefix?prefix+id:id}function chain(obj){var instance=_$1(obj);return instance._chain=!0,instance}function executeBound(sourceFunc,boundFunc,context,callingContext,args){if(!(callingContext instanceof boundFunc))return sourceFunc.apply(context,args);var self=baseCreate(sourceFunc.prototype),result=sourceFunc.apply(self,args);return isObject(result)?result:self}function flatten$1(input,depth,strict,output){if(output=output||[],depth||0===depth){if(0>=depth)return output.concat(input)}else depth=1/0;for(var idx=output.length,i=0,length=getLength(input);length>i;i++){var value=input[i];if(isArrayLike(value)&&(isArray(value)||isArguments$1(value)))if(depth>1)flatten$1(value,depth-1,strict,output),idx=output.length;else for(var j=0,len=value.length;len>j;)output[idx++]=value[j++];else strict||(output[idx++]=value)}return output}function memoize(func,hasher){var memoize=function(key){var cache=memoize.cache,address=""+(hasher?hasher.apply(this,arguments):key);return has$1(cache,address)||(cache[address]=func.apply(this,arguments)),cache[address]};return memoize.cache={},memoize}function throttle(func,wait,options){var timeout,context,args,result,previous=0;options||(options={});var later=function(){previous=options.leading===!1?0:now(),timeout=null,result=func.apply(context,args),timeout||(context=args=null)},throttled=function(){var _now=now();previous||options.leading!==!1||(previous=_now);var remaining=wait-(_now-previous);return context=this,args=arguments,0>=remaining||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=_now,result=func.apply(context,args),timeout||(context=args=null)):timeout||options.trailing===!1||(timeout=setTimeout(later,remaining)),result};return throttled.cancel=function(){clearTimeout(timeout),previous=0,timeout=context=args=null},throttled}function debounce(func,wait,immediate){var timeout,previous,args,result,context,later=function(){var passed=now()-previous;wait>passed?timeout=setTimeout(later,wait-passed):(timeout=null,immediate||(result=func.apply(context,args)),timeout||(args=context=null))},debounced=restArguments(function(_args){return context=this,args=_args,previous=now(),timeout||(timeout=setTimeout(later,wait),immediate&&(result=func.apply(context,args))),result});return debounced.cancel=function(){clearTimeout(timeout),timeout=args=context=null},debounced}function wrap(func,wrapper){return partial(wrapper,func)}function negate(predicate){return function(){return!predicate.apply(this,arguments)}}function compose(){var args=arguments,start=args.length-1;return function(){for(var i=start,result=args[start].apply(this,arguments);i--;)result=args[i].call(this,result);return result}}function after(times,func){return function(){return--times<1?func.apply(this,arguments):void 0}}function before(times,func){var memo;return function(){return--times>0&&(memo=func.apply(this,arguments)),1>=times&&(func=null),memo}}function findKey(obj,predicate,context){predicate=cb(predicate,context);for(var key,_keys=keys(obj),i=0,length=_keys.length;length>i;i++)if(key=_keys[i],predicate(obj[key],key,obj))return key}function createPredicateIndexFinder(dir){return function(array,predicate,context){predicate=cb(predicate,context);for(var length=getLength(array),index=dir>0?0:length-1;index>=0&&length>index;index+=dir)if(predicate(array[index],index,array))return index;return-1}}function sortedIndex(array,obj,iteratee,context){iteratee=cb(iteratee,context,1);for(var value=iteratee(obj),low=0,high=getLength(array);high>low;){var mid=Math.floor((low+high)/2);iteratee(array[mid])0?i=idx>=0?idx:Math.max(idx+length,i):length=idx>=0?Math.min(idx+1,length):idx+length+1;else if(sortedIndex&&idx&&length)return idx=sortedIndex(array,item),array[idx]===item?idx:-1;if(item!==item)return idx=predicateFind(slice.call(array,i,length),isNaN$1),idx>=0?idx+i:-1;for(idx=dir>0?i:length-1;idx>=0&&length>idx;idx+=dir)if(array[idx]===item)return idx;return-1}}function find(obj,predicate,context){var keyFinder=isArrayLike(obj)?findIndex:findKey,key=keyFinder(obj,predicate,context);return void 0!==key&&-1!==key?obj[key]:void 0}function findWhere(obj,attrs){return find(obj,matcher(attrs))}function each(obj,iteratee,context){iteratee=optimizeCb(iteratee,context);var i,length;if(isArrayLike(obj))for(i=0,length=obj.length;length>i;i++)iteratee(obj[i],i,obj);else{var _keys=keys(obj);for(i=0,length=_keys.length;length>i;i++)iteratee(obj[_keys[i]],_keys[i],obj)}return obj}function map(obj,iteratee,context){iteratee=cb(iteratee,context);for(var _keys=!isArrayLike(obj)&&keys(obj),length=(_keys||obj).length,results=Array(length),index=0;length>index;index++){var currentKey=_keys?_keys[index]:index;results[index]=iteratee(obj[currentKey],currentKey,obj)}return results}function createReduce(dir){var reducer=function(obj,iteratee,memo,initial){var _keys=!isArrayLike(obj)&&keys(obj),length=(_keys||obj).length,index=dir>0?0:length-1;for(initial||(memo=obj[_keys?_keys[index]:index],index+=dir);index>=0&&length>index;index+=dir){var currentKey=_keys?_keys[index]:index;memo=iteratee(memo,obj[currentKey],currentKey,obj)}return memo};return function(obj,iteratee,memo,context){var initial=arguments.length>=3;return reducer(obj,optimizeCb(iteratee,context,4),memo,initial)}}function filter(obj,predicate,context){var results=[];return predicate=cb(predicate,context),each(obj,function(value,index,list){predicate(value,index,list)&&results.push(value)}),results}function reject(obj,predicate,context){return filter(obj,negate(cb(predicate)),context)}function every(obj,predicate,context){predicate=cb(predicate,context);for(var _keys=!isArrayLike(obj)&&keys(obj),length=(_keys||obj).length,index=0;length>index;index++){var currentKey=_keys?_keys[index]:index;if(!predicate(obj[currentKey],currentKey,obj))return!1}return!0}function some(obj,predicate,context){predicate=cb(predicate,context);for(var _keys=!isArrayLike(obj)&&keys(obj),length=(_keys||obj).length,index=0;length>index;index++){var currentKey=_keys?_keys[index]:index;if(predicate(obj[currentKey],currentKey,obj))return!0}return!1}function contains(obj,item,fromIndex,guard){return isArrayLike(obj)||(obj=values(obj)),("number"!=typeof fromIndex||guard)&&(fromIndex=0),indexOf(obj,item,fromIndex)>=0}function pluck(obj,key){return map(obj,property(key))}function where(obj,attrs){return filter(obj,matcher(attrs))}function max(obj,iteratee,context){var value,computed,result=-(1/0),lastComputed=-(1/0);if(null==iteratee||"number"==typeof iteratee&&"object"!=typeof obj[0]&&null!=obj){obj=isArrayLike(obj)?obj:values(obj);for(var i=0,length=obj.length;length>i;i++)value=obj[i],null!=value&&value>result&&(result=value)}else iteratee=cb(iteratee,context),each(obj,function(v,index,list){computed=iteratee(v,index,list),(computed>lastComputed||computed===-(1/0)&&result===-(1/0))&&(result=v,lastComputed=computed)});return result}function min(obj,iteratee,context){var value,computed,result=1/0,lastComputed=1/0;if(null==iteratee||"number"==typeof iteratee&&"object"!=typeof obj[0]&&null!=obj){obj=isArrayLike(obj)?obj:values(obj);for(var i=0,length=obj.length;length>i;i++)value=obj[i],null!=value&&result>value&&(result=value)}else iteratee=cb(iteratee,context),each(obj,function(v,index,list){computed=iteratee(v,index,list),(lastComputed>computed||computed===1/0&&result===1/0)&&(result=v,lastComputed=computed)});return result}function sample(obj,n,guard){if(null==n||guard)return isArrayLike(obj)||(obj=values(obj)),obj[random(obj.length-1)];var sample=isArrayLike(obj)?clone(obj):values(obj),length=getLength(sample);n=Math.max(Math.min(n,length),0);for(var last=length-1,index=0;n>index;index++){var rand=random(index,last),temp=sample[index];sample[index]=sample[rand],sample[rand]=temp}return sample.slice(0,n)}function shuffle(obj){return sample(obj,1/0)}function sortBy(obj,iteratee,context){var index=0;return iteratee=cb(iteratee,context),pluck(map(obj,function(value,key,list){return{value:value,index:index++,criteria:iteratee(value,key,list)}}).sort(function(left,right){var a=left.criteria,b=right.criteria;if(a!==b){if(a>b||void 0===a)return 1;if(b>a||void 0===b)return-1}return left.index-right.index}),"value")}function group(behavior,partition){return function(obj,iteratee,context){var result=partition?[[],[]]:{};return iteratee=cb(iteratee,context),each(obj,function(value,index){var key=iteratee(value,index,obj);behavior(result,value,key)}),result}}function toArray(obj){return obj?isArray(obj)?slice.call(obj):isString(obj)?obj.match(reStrSymbol):isArrayLike(obj)?map(obj,identity):values(obj):[]}function size(obj){return null==obj?0:isArrayLike(obj)?obj.length:keys(obj).length}function keyInObj(value,key,obj){return key in obj}function initial(array,n,guard){return slice.call(array,0,Math.max(0,array.length-(null==n||guard?1:n)))}function first(array,n,guard){return null==array||array.length<1?null==n||guard?void 0:[]:null==n||guard?array[0]:initial(array,array.length-n)}function rest(array,n,guard){return slice.call(array,null==n||guard?1:n)}function last(array,n,guard){return null==array||array.length<1?null==n||guard?void 0:[]:null==n||guard?array[array.length-1]:rest(array,Math.max(0,array.length-n))}function compact(array){return filter(array,Boolean)}function flatten(array,depth){return flatten$1(array,depth,!1)}function uniq(array,isSorted,iteratee,context){isBoolean(isSorted)||(context=iteratee,iteratee=isSorted,isSorted=!1),null!=iteratee&&(iteratee=cb(iteratee,context));for(var result=[],seen=[],i=0,length=getLength(array);length>i;i++){var value=array[i],computed=iteratee?iteratee(value,i,array):value;isSorted&&!iteratee?(i&&seen===computed||result.push(value),seen=computed):iteratee?contains(seen,computed)||(seen.push(computed),result.push(value)):contains(result,value)||result.push(value)}return result}function intersection(array){for(var result=[],argsLength=arguments.length,i=0,length=getLength(array);length>i;i++){var item=array[i];if(!contains(result,item)){var j;for(j=1;argsLength>j&&contains(arguments[j],item);j++);j===argsLength&&result.push(item)}}return result}function unzip(array){for(var length=array&&max(array,getLength).length||0,result=Array(length),index=0;length>index;index++)result[index]=pluck(array,index);return result}function object(list,values){for(var result={},i=0,length=getLength(list);length>i;i++)values?result[list[i]]=values[i]:result[list[i][0]]=list[i][1];return result}function range(start,stop,step){null==stop&&(stop=start||0,start=0),step||(step=start>stop?-1:1);for(var length=Math.max(Math.ceil((stop-start)/step),0),range=Array(length),idx=0;length>idx;idx++,start+=step)range[idx]=start;return range}function chunk(array,count){if(null==count||1>count)return[];for(var result=[],i=0,length=array.length;length>i;)result.push(slice.call(array,i,i+=count));return result}function chainResult(instance,obj){return instance._chain?_$1(obj).chain():obj}function mixin(obj){return each(functions(obj),function(name){var func=_$1[name]=obj[name];_$1.prototype[name]=function(){var args=[this._wrapped];return push.apply(args,arguments),chainResult(this,func.apply(_$1,args))}}),_$1}var VERSION="1.13.1",root="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},ArrayProto=Array.prototype,ObjProto=Object.prototype,SymbolProto="undefined"!=typeof Symbol?Symbol.prototype:null,push=ArrayProto.push,slice=ArrayProto.slice,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty,supportsArrayBuffer="undefined"!=typeof ArrayBuffer,supportsDataView="undefined"!=typeof DataView,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeCreate=Object.create,nativeIsView=supportsArrayBuffer&&ArrayBuffer.isView,_isNaN=isNaN,_isFinite=isFinite,hasEnumBug=!{toString:null}.propertyIsEnumerable("toString"),nonEnumerableProps=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],MAX_ARRAY_INDEX=Math.pow(2,53)-1,isString=tagTester("String"),isNumber=tagTester("Number"),isDate=tagTester("Date"),isRegExp=tagTester("RegExp"),isError=tagTester("Error"),isSymbol=tagTester("Symbol"),isArrayBuffer=tagTester("ArrayBuffer"),isFunction=tagTester("Function"),nodelist=root.document&&root.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof nodelist&&(isFunction=function(obj){return"function"==typeof obj||!1});var isFunction$1=isFunction,hasObjectTag=tagTester("Object"),hasStringTagBug=supportsDataView&&hasObjectTag(new DataView(new ArrayBuffer(8))),isIE11="undefined"!=typeof Map&&hasObjectTag(new Map),isDataView=tagTester("DataView"),isDataView$1=hasStringTagBug?ie10IsDataView:isDataView,isArray=nativeIsArray||tagTester("Array"),isArguments=tagTester("Arguments");!function(){isArguments(arguments)||(isArguments=function(obj){return has$1(obj,"callee")})}();var isArguments$1=isArguments,getByteLength=shallowProperty("byteLength"),isBufferLike=createSizePropertyCheck(getByteLength),typedArrayPattern=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/,isTypedArray$1=supportsArrayBuffer?isTypedArray:constant(!1),getLength=shallowProperty("length");_$1.VERSION=VERSION,_$1.prototype.value=function(){return this._wrapped},_$1.prototype.valueOf=_$1.prototype.toJSON=_$1.prototype.value,_$1.prototype.toString=function(){return String(this._wrapped)};var tagDataView="[object DataView]",forEachName="forEach",hasName="has",commonInit=["clear","delete"],mapTail=["get",hasName,"set"],mapMethods=commonInit.concat(forEachName,mapTail),weakMapMethods=commonInit.concat(mapTail),setMethods=["add"].concat(commonInit,forEachName,hasName),isMap=isIE11?ie11fingerprint(mapMethods):tagTester("Map"),isWeakMap=isIE11?ie11fingerprint(weakMapMethods):tagTester("WeakMap"),isSet=isIE11?ie11fingerprint(setMethods):tagTester("Set"),isWeakSet=tagTester("WeakSet"),extend=createAssigner(allKeys),extendOwn=createAssigner(keys),defaults=createAssigner(allKeys,!0);_$1.toPath=toPath$1,_$1.iteratee=iteratee;var now=Date.now||function(){return(new Date).getTime()},escapeMap={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},_escape=createEscaper(escapeMap),unescapeMap=invert(escapeMap),_unescape=createEscaper(unescapeMap),templateSettings=_$1.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},noMatch=/(.)^/,escapes={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},escapeRegExp=/\\|'|\r|\n|\u2028|\u2029/g,bareIdentifier=/^\s*(\w|\$)+\s*$/,idCounter=0,partial=restArguments(function(func,boundArgs){var placeholder=partial.placeholder,bound=function(){for(var position=0,length=boundArgs.length,args=Array(length),i=0;length>i;i++)args[i]=boundArgs[i]===placeholder?arguments[position++]:boundArgs[i];for(;positionindex)throw new Error("bindAll must be passed function names");for(;index--;){var key=keys[index];obj[key]=bind(obj[key],obj)}return obj}),delay=restArguments(function(func,wait,args){return setTimeout(function(){return func.apply(null,args)},wait)}),defer=partial(delay,_$1,1),once=partial(before,2),findIndex=createPredicateIndexFinder(1),findLastIndex=createPredicateIndexFinder(-1),indexOf=createIndexFinder(1,findIndex,sortedIndex),lastIndexOf=createIndexFinder(-1,findLastIndex),reduce=createReduce(1),reduceRight=createReduce(-1),invoke=restArguments(function(obj,path,args){var contextPath,func;return isFunction$1(path)?func=path:(path=toPath(path),contextPath=path.slice(0,-1),path=path[path.length-1]),map(obj,function(context){var method=func;if(!method){if(contextPath&&contextPath.length&&(context=deepGet(context,contextPath)),null==context)return void 0;method=context[path]}return null==method?method:method.apply(context,args)})}),groupBy=group(function(result,value,key){has$1(result,key)?result[key].push(value):result[key]=[value]}),indexBy=group(function(result,value,key){result[key]=value}),countBy=group(function(result,value,key){has$1(result,key)?result[key]++:result[key]=1}),partition=group(function(result,value,pass){result[pass?0:1].push(value)},!0),reStrSymbol=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g,pick=restArguments(function(obj,keys){var result={},iteratee=keys[0];if(null==obj)return result;isFunction$1(iteratee)?(keys.length>1&&(iteratee=optimizeCb(iteratee,keys[1])),keys=allKeys(obj)):(iteratee=keyInObj,keys=flatten$1(keys,!1,!1),obj=Object(obj));for(var i=0,length=keys.length;length>i;i++){var key=keys[i],value=obj[key];iteratee(value,key,obj)&&(result[key]=value)}return result}),omit=restArguments(function(obj,keys){var context,iteratee=keys[0];return isFunction$1(iteratee)?(iteratee=negate(iteratee),keys.length>1&&(context=keys[1])):(keys=map(flatten$1(keys,!1,!1),String),iteratee=function(value,key){return!contains(keys,key)}),pick(obj,iteratee,context)}),difference=restArguments(function(array,rest){return rest=flatten$1(rest,!0,!0),filter(array,function(value){return!contains(rest,value)})}),without=restArguments(function(array,otherArrays){return difference(array,otherArrays)}),union=restArguments(function(arrays){return uniq(flatten$1(arrays,!0,!0))}),zip=restArguments(unzip);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_$1.prototype[name]=function(){var obj=this._wrapped;return null!=obj&&(method.apply(obj,arguments),"shift"!==name&&"splice"!==name||0!==obj.length||delete obj[0]),chainResult(this,obj)}}),each(["concat","join","slice"],function(name){var method=ArrayProto[name];_$1.prototype[name]=function(){var obj=this._wrapped;return null!=obj&&(obj=method.apply(obj,arguments)),chainResult(this,obj)}});var allExports={__proto__:null,VERSION:VERSION,restArguments:restArguments,isObject:isObject,isNull:isNull,isUndefined:isUndefined,isBoolean:isBoolean,isElement:isElement,isString:isString,isNumber:isNumber,isDate:isDate,isRegExp:isRegExp,isError:isError,isSymbol:isSymbol,isArrayBuffer:isArrayBuffer,isDataView:isDataView$1,isArray:isArray,isFunction:isFunction$1,isArguments:isArguments$1,isFinite:isFinite$1,isNaN:isNaN$1,isTypedArray:isTypedArray$1,isEmpty:isEmpty,isMatch:isMatch,isEqual:isEqual,isMap:isMap,isWeakMap:isWeakMap,isSet:isSet,isWeakSet:isWeakSet,keys:keys,allKeys:allKeys,values:values,pairs:pairs,invert:invert,functions:functions,methods:functions,extend:extend,extendOwn:extendOwn,assign:extendOwn,defaults:defaults,create:create,clone:clone,tap:tap,get:get,has:has,mapObject:mapObject,identity:identity,constant:constant,noop:noop,toPath:toPath$1,property:property,propertyOf:propertyOf,matcher:matcher,matches:matcher,times:times,random:random,now:now,escape:_escape,unescape:_unescape,templateSettings:templateSettings,template:template,result:result,uniqueId:uniqueId,chain:chain,iteratee:iteratee,partial:partial,bind:bind,bindAll:bindAll,memoize:memoize,delay:delay,defer:defer,throttle:throttle,debounce:debounce,wrap:wrap,negate:negate,compose:compose,after:after,before:before,once:once,findKey:findKey,findIndex:findIndex,findLastIndex:findLastIndex,sortedIndex:sortedIndex,indexOf:indexOf,lastIndexOf:lastIndexOf,find:find,detect:find,findWhere:findWhere,each:each,forEach:each,map:map,collect:map,reduce:reduce,foldl:reduce,inject:reduce,reduceRight:reduceRight,foldr:reduceRight,filter:filter,select:filter,reject:reject,every:every,all:every,some:some,any:some,contains:contains,includes:contains,include:contains,invoke:invoke,pluck:pluck,where:where,max:max,min:min,shuffle:shuffle,sample:sample,sortBy:sortBy,groupBy:groupBy,indexBy:indexBy,countBy:countBy,partition:partition,toArray:toArray,size:size,pick:pick,omit:omit,first:first,head:first,take:first,initial:initial,last:last,rest:rest,tail:rest,drop:rest,compact:compact,flatten:flatten,without:without,uniq:uniq,unique:uniq,union:union,intersection:intersection,difference:difference,unzip:unzip,transpose:unzip,zip:zip,object:object,range:range,chunk:chunk,mixin:mixin,"default":_$1},_=mixin(allExports);return _._=_,_})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],104:[function(require,module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},{}],105:[function(require,module,exports){module.exports=function(arg){return arg&&"object"==typeof arg&&"function"==typeof arg.copy&&"function"==typeof arg.fill&&"function"==typeof arg.readUInt8}},{}],106:[function(require,module,exports){(function(process,global){function inspect(obj,opts){var ctx={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(ctx.depth=arguments[2]),arguments.length>=4&&(ctx.colors=arguments[3]),isBoolean(opts)?ctx.showHidden=opts:opts&&exports._extend(ctx,opts),isUndefined(ctx.showHidden)&&(ctx.showHidden=!1),isUndefined(ctx.depth)&&(ctx.depth=2),isUndefined(ctx.colors)&&(ctx.colors=!1),isUndefined(ctx.customInspect)&&(ctx.customInspect=!0),ctx.colors&&(ctx.stylize=stylizeWithColor),formatValue(ctx,obj,ctx.depth)}function stylizeWithColor(str,styleType){var style=inspect.styles[styleType];return style?"["+inspect.colors[style][0]+"m"+str+"["+inspect.colors[style][1]+"m":str}function stylizeNoColor(str,styleType){return str}function arrayToHash(array){var hash={};return array.forEach(function(val,idx){hash[val]=!0}),hash}function formatValue(ctx,value,recurseTimes){if(ctx.customInspect&&value&&isFunction(value.inspect)&&value.inspect!==exports.inspect&&(!value.constructor||value.constructor.prototype!==value)){var ret=value.inspect(recurseTimes,ctx);return isString(ret)||(ret=formatValue(ctx,ret,recurseTimes)),ret}var primitive=formatPrimitive(ctx,value);if(primitive)return primitive;var keys=Object.keys(value),visibleKeys=arrayToHash(keys);if(ctx.showHidden&&(keys=Object.getOwnPropertyNames(value)),isError(value)&&(keys.indexOf("message")>=0||keys.indexOf("description")>=0))return formatError(value);if(0===keys.length){if(isFunction(value)){var name=value.name?": "+value.name:"";return ctx.stylize("[Function"+name+"]","special")}if(isRegExp(value))return ctx.stylize(RegExp.prototype.toString.call(value),"regexp");if(isDate(value))return ctx.stylize(Date.prototype.toString.call(value),"date");if(isError(value))return formatError(value)}var base="",array=!1,braces=["{","}"];if(isArray(value)&&(array=!0,braces=["[","]"]),isFunction(value)){var n=value.name?": "+value.name:"";base=" [Function"+n+"]"}if(isRegExp(value)&&(base=" "+RegExp.prototype.toString.call(value)),isDate(value)&&(base=" "+Date.prototype.toUTCString.call(value)),isError(value)&&(base=" "+formatError(value)),0===keys.length&&(!array||0==value.length))return braces[0]+base+braces[1];if(0>recurseTimes)return isRegExp(value)?ctx.stylize(RegExp.prototype.toString.call(value),"regexp"):ctx.stylize("[Object]","special");ctx.seen.push(value);var output;return output=array?formatArray(ctx,value,recurseTimes,visibleKeys,keys):keys.map(function(key){return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array)}),ctx.seen.pop(),reduceToSingleString(output,base,braces)}function formatPrimitive(ctx,value){if(isUndefined(value))return ctx.stylize("undefined","undefined");if(isString(value)){var simple="'"+JSON.stringify(value).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return ctx.stylize(simple,"string")}return isNumber(value)?ctx.stylize(""+value,"number"):isBoolean(value)?ctx.stylize(""+value,"boolean"):isNull(value)?ctx.stylize("null","null"):void 0}function formatError(value){return"["+Error.prototype.toString.call(value)+"]"}function formatArray(ctx,value,recurseTimes,visibleKeys,keys){for(var output=[],i=0,l=value.length;l>i;++i)hasOwnProperty(value,String(i))?output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,String(i),!0)):output.push("");return keys.forEach(function(key){key.match(/^\d+$/)||output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,key,!0))}),output}function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){var name,str,desc;if(desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]},desc.get?str=desc.set?ctx.stylize("[Getter/Setter]","special"):ctx.stylize("[Getter]","special"):desc.set&&(str=ctx.stylize("[Setter]","special")),hasOwnProperty(visibleKeys,key)||(name="["+key+"]"),str||(ctx.seen.indexOf(desc.value)<0?(str=isNull(recurseTimes)?formatValue(ctx,desc.value,null):formatValue(ctx,desc.value,recurseTimes-1),str.indexOf("\n")>-1&&(str=array?str.split("\n").map(function(line){return" "+line}).join("\n").substr(2):"\n"+str.split("\n").map(function(line){return" "+line}).join("\n"))):str=ctx.stylize("[Circular]","special")),isUndefined(name)){if(array&&key.match(/^\d+$/))return str;name=JSON.stringify(""+key),name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(name=name.substr(1,name.length-2),name=ctx.stylize(name,"name")):(name=name.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),name=ctx.stylize(name,"string"))}return name+": "+str}function reduceToSingleString(output,base,braces){var numLinesEst=0,length=output.reduce(function(prev,cur){return numLinesEst++,cur.indexOf("\n")>=0&&numLinesEst++,prev+cur.replace(/\u001b\[\d\d?m/g,"").length+1},0);return length>60?braces[0]+(""===base?"":base+"\n ")+" "+output.join(",\n ")+" "+braces[1]:braces[0]+base+" "+output.join(", ")+" "+braces[1]}function isArray(ar){return Array.isArray(ar)}function isBoolean(arg){return"boolean"==typeof arg}function isNull(arg){return null===arg}function isNullOrUndefined(arg){return null==arg}function isNumber(arg){return"number"==typeof arg}function isString(arg){return"string"==typeof arg}function isSymbol(arg){return"symbol"==typeof arg}function isUndefined(arg){return void 0===arg}function isRegExp(re){return isObject(re)&&"[object RegExp]"===objectToString(re)}function isObject(arg){return"object"==typeof arg&&null!==arg}function isDate(d){return isObject(d)&&"[object Date]"===objectToString(d)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(arg){return"function"==typeof arg}function isPrimitive(arg){return null===arg||"boolean"==typeof arg||"number"==typeof arg||"string"==typeof arg||"symbol"==typeof arg||"undefined"==typeof arg}function objectToString(o){return Object.prototype.toString.call(o)}function pad(n){return 10>n?"0"+n.toString(10):n.toString(10)}function timestamp(){var d=new Date,time=[pad(d.getHours()),pad(d.getMinutes()),pad(d.getSeconds())].join(":");return[d.getDate(),months[d.getMonth()],time].join(" ")}function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}var formatRegExp=/%[sdj%]/g;exports.format=function(f){if(!isString(f)){for(var objects=[],i=0;i=len)return x;switch(x){case"%s":return String(args[i++]);case"%d":return Number(args[i++]);case"%j":try{return JSON.stringify(args[i++])}catch(_){return"[Circular]"}default:return x}}),x=args[i];len>i;x=args[++i])str+=isNull(x)||!isObject(x)?" "+x:" "+inspect(x);return str},exports.deprecate=function(fn,msg){function deprecated(){if(!warned){if(process.throwDeprecation)throw new Error(msg);process.traceDeprecation?console.trace(msg):console.error(msg),warned=!0}return fn.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(fn,msg).apply(this,arguments)};if(process.noDeprecation===!0)return fn;var warned=!1;return deprecated};var debugEnviron,debugs={};exports.debuglog=function(set){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),set=set.toUpperCase(),!debugs[set])if(new RegExp("\\b"+set+"\\b","i").test(debugEnviron)){var pid=process.pid;debugs[set]=function(){var msg=exports.format.apply(exports,arguments);console.error("%s %d: %s",set,pid,msg)}}else debugs[set]=function(){};return debugs[set]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39], +green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=require("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=require("inherits"),exports._extend=function(origin,add){if(!add||!isObject(add))return origin;for(var keys=Object.keys(add),i=keys.length;i--;)origin[keys[i]]=add[keys[i]];return origin}}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":105,_process:102,inherits:104}],107:[function(require,module,exports){(function(){var assign,getValue,isArray,isEmpty,isFunction,isObject,isPlainObject,slice=[].slice,hasProp={}.hasOwnProperty;assign=function(){var i,key,len,source,sources,target;if(target=arguments[0],sources=2<=arguments.length?slice.call(arguments,1):[],isFunction(Object.assign))Object.assign.apply(null,arguments);else for(i=0,len=sources.length;len>i;i++)if(source=sources[i],null!=source)for(key in source)hasProp.call(source,key)&&(target[key]=source[key]);return target},isFunction=function(val){return!!val&&"[object Function]"===Object.prototype.toString.call(val)},isObject=function(val){var ref;return!!val&&("function"==(ref=typeof val)||"object"===ref)},isArray=function(val){return isFunction(Array.isArray)?Array.isArray(val):"[object Array]"===Object.prototype.toString.call(val)},isEmpty=function(val){var key;if(isArray(val))return!val.length;for(key in val)if(hasProp.call(val,key))return!1;return!0},isPlainObject=function(val){var ctor,proto;return isObject(val)&&(proto=Object.getPrototypeOf(val))&&(ctor=proto.constructor)&&"function"==typeof ctor&&ctor instanceof ctor&&Function.prototype.toString.call(ctor)===Function.prototype.toString.call(Object)},getValue=function(obj){return isFunction(obj.valueOf)?obj.valueOf():obj},module.exports.assign=assign,module.exports.isFunction=isFunction,module.exports.isObject=isObject,module.exports.isArray=isArray,module.exports.isEmpty=isEmpty,module.exports.isPlainObject=isPlainObject,module.exports.getValue=getValue}).call(this)},{}],108:[function(require,module,exports){(function(){var XMLAttribute;module.exports=XMLAttribute=function(){function XMLAttribute(parent,name,value){if(this.options=parent.options,this.stringify=parent.stringify,this.parent=parent,null==name)throw new Error("Missing attribute name. "+this.debugInfo(name));if(null==value)throw new Error("Missing attribute value. "+this.debugInfo(name));this.name=this.stringify.attName(name),this.value=this.stringify.attValue(value)}return XMLAttribute.prototype.clone=function(){return Object.create(this)},XMLAttribute.prototype.toString=function(options){return this.options.writer.set(options).attribute(this)},XMLAttribute.prototype.debugInfo=function(name){var ref,ref1;return name=name||this.name,null!=name||(null!=(ref=this.parent)?ref.name:void 0)?null==name?"parent: <"+this.parent.name+">":(null!=(ref1=this.parent)?ref1.name:void 0)?"attribute: {"+name+"}, parent: <"+this.parent.name+">":"attribute: {"+name+"}":""},XMLAttribute}()}).call(this)},{}],109:[function(require,module,exports){(function(){var XMLCData,XMLNode,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLCData=function(superClass){function XMLCData(parent,text){if(XMLCData.__super__.constructor.call(this,parent),null==text)throw new Error("Missing CDATA text. "+this.debugInfo());this.text=this.stringify.cdata(text)}return extend(XMLCData,superClass),XMLCData.prototype.clone=function(){return Object.create(this)},XMLCData.prototype.toString=function(options){return this.options.writer.set(options).cdata(this)},XMLCData}(XMLNode)}).call(this)},{"./XMLNode":120}],110:[function(require,module,exports){(function(){var XMLComment,XMLNode,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLComment=function(superClass){function XMLComment(parent,text){if(XMLComment.__super__.constructor.call(this,parent),null==text)throw new Error("Missing comment text. "+this.debugInfo());this.text=this.stringify.comment(text)}return extend(XMLComment,superClass),XMLComment.prototype.clone=function(){return Object.create(this)},XMLComment.prototype.toString=function(options){return this.options.writer.set(options).comment(this)},XMLComment}(XMLNode)}).call(this)},{"./XMLNode":120}],111:[function(require,module,exports){(function(){var XMLDTDAttList,XMLNode,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLDTDAttList=function(superClass){function XMLDTDAttList(parent,elementName,attributeName,attributeType,defaultValueType,defaultValue){if(XMLDTDAttList.__super__.constructor.call(this,parent),null==elementName)throw new Error("Missing DTD element name. "+this.debugInfo());if(null==attributeName)throw new Error("Missing DTD attribute name. "+this.debugInfo(elementName));if(!attributeType)throw new Error("Missing DTD attribute type. "+this.debugInfo(elementName));if(!defaultValueType)throw new Error("Missing DTD attribute default. "+this.debugInfo(elementName));if(0!==defaultValueType.indexOf("#")&&(defaultValueType="#"+defaultValueType),!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/))throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. "+this.debugInfo(elementName));if(defaultValue&&!defaultValueType.match(/^(#FIXED|#DEFAULT)$/))throw new Error("Default value only applies to #FIXED or #DEFAULT. "+this.debugInfo(elementName));this.elementName=this.stringify.eleName(elementName),this.attributeName=this.stringify.attName(attributeName),this.attributeType=this.stringify.dtdAttType(attributeType),this.defaultValue=this.stringify.dtdAttDefault(defaultValue),this.defaultValueType=defaultValueType}return extend(XMLDTDAttList,superClass),XMLDTDAttList.prototype.toString=function(options){return this.options.writer.set(options).dtdAttList(this)},XMLDTDAttList}(XMLNode)}).call(this)},{"./XMLNode":120}],112:[function(require,module,exports){(function(){var XMLDTDElement,XMLNode,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLDTDElement=function(superClass){function XMLDTDElement(parent,name,value){if(XMLDTDElement.__super__.constructor.call(this,parent),null==name)throw new Error("Missing DTD element name. "+this.debugInfo());value||(value="(#PCDATA)"),Array.isArray(value)&&(value="("+value.join(",")+")"),this.name=this.stringify.eleName(name),this.value=this.stringify.dtdElementValue(value)}return extend(XMLDTDElement,superClass),XMLDTDElement.prototype.toString=function(options){return this.options.writer.set(options).dtdElement(this)},XMLDTDElement}(XMLNode)}).call(this)},{"./XMLNode":120}],113:[function(require,module,exports){(function(){var XMLDTDEntity,XMLNode,isObject,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;isObject=require("./Utility").isObject,XMLNode=require("./XMLNode"),module.exports=XMLDTDEntity=function(superClass){function XMLDTDEntity(parent,pe,name,value){if(XMLDTDEntity.__super__.constructor.call(this,parent),null==name)throw new Error("Missing DTD entity name. "+this.debugInfo(name));if(null==value)throw new Error("Missing DTD entity value. "+this.debugInfo(name));if(this.pe=!!pe,this.name=this.stringify.eleName(name),isObject(value)){if(!value.pubID&&!value.sysID)throw new Error("Public and/or system identifiers are required for an external entity. "+this.debugInfo(name));if(value.pubID&&!value.sysID)throw new Error("System identifier is required for a public external entity. "+this.debugInfo(name));if(null!=value.pubID&&(this.pubID=this.stringify.dtdPubID(value.pubID)),null!=value.sysID&&(this.sysID=this.stringify.dtdSysID(value.sysID)),null!=value.nData&&(this.nData=this.stringify.dtdNData(value.nData)),this.pe&&this.nData)throw new Error("Notation declaration is not allowed in a parameter entity. "+this.debugInfo(name))}else this.value=this.stringify.dtdEntityValue(value)}return extend(XMLDTDEntity,superClass),XMLDTDEntity.prototype.toString=function(options){return this.options.writer.set(options).dtdEntity(this)},XMLDTDEntity}(XMLNode)}).call(this)},{"./Utility":107,"./XMLNode":120}],114:[function(require,module,exports){(function(){var XMLDTDNotation,XMLNode,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLDTDNotation=function(superClass){function XMLDTDNotation(parent,name,value){if(XMLDTDNotation.__super__.constructor.call(this,parent),null==name)throw new Error("Missing DTD notation name. "+this.debugInfo(name));if(!value.pubID&&!value.sysID)throw new Error("Public or system identifiers are required for an external entity. "+this.debugInfo(name));this.name=this.stringify.eleName(name),null!=value.pubID&&(this.pubID=this.stringify.dtdPubID(value.pubID)),null!=value.sysID&&(this.sysID=this.stringify.dtdSysID(value.sysID))}return extend(XMLDTDNotation,superClass),XMLDTDNotation.prototype.toString=function(options){return this.options.writer.set(options).dtdNotation(this)},XMLDTDNotation}(XMLNode)}).call(this)},{"./XMLNode":120}],115:[function(require,module,exports){(function(){var XMLDeclaration,XMLNode,isObject,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;isObject=require("./Utility").isObject,XMLNode=require("./XMLNode"),module.exports=XMLDeclaration=function(superClass){function XMLDeclaration(parent,version,encoding,standalone){var ref;XMLDeclaration.__super__.constructor.call(this,parent),isObject(version)&&(ref=version,version=ref.version,encoding=ref.encoding,standalone=ref.standalone),version||(version="1.0"),this.version=this.stringify.xmlVersion(version),null!=encoding&&(this.encoding=this.stringify.xmlEncoding(encoding)),null!=standalone&&(this.standalone=this.stringify.xmlStandalone(standalone))}return extend(XMLDeclaration,superClass),XMLDeclaration.prototype.toString=function(options){return this.options.writer.set(options).declaration(this)},XMLDeclaration}(XMLNode)}).call(this)},{"./Utility":107,"./XMLNode":120}],116:[function(require,module,exports){(function(){var XMLDTDAttList,XMLDTDElement,XMLDTDEntity,XMLDTDNotation,XMLDocType,XMLNode,isObject,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;isObject=require("./Utility").isObject,XMLNode=require("./XMLNode"),XMLDTDAttList=require("./XMLDTDAttList"),XMLDTDEntity=require("./XMLDTDEntity"),XMLDTDElement=require("./XMLDTDElement"),XMLDTDNotation=require("./XMLDTDNotation"),module.exports=XMLDocType=function(superClass){function XMLDocType(parent,pubID,sysID){var ref,ref1;XMLDocType.__super__.constructor.call(this,parent),this.name="!DOCTYPE",this.documentObject=parent,isObject(pubID)&&(ref=pubID,pubID=ref.pubID,sysID=ref.sysID),null==sysID&&(ref1=[pubID,sysID],sysID=ref1[0],pubID=ref1[1]),null!=pubID&&(this.pubID=this.stringify.dtdPubID(pubID)),null!=sysID&&(this.sysID=this.stringify.dtdSysID(sysID))}return extend(XMLDocType,superClass),XMLDocType.prototype.element=function(name,value){var child;return child=new XMLDTDElement(this,name,value),this.children.push(child),this},XMLDocType.prototype.attList=function(elementName,attributeName,attributeType,defaultValueType,defaultValue){var child;return child=new XMLDTDAttList(this,elementName,attributeName,attributeType,defaultValueType,defaultValue),this.children.push(child),this},XMLDocType.prototype.entity=function(name,value){var child;return child=new XMLDTDEntity(this,!1,name,value),this.children.push(child),this},XMLDocType.prototype.pEntity=function(name,value){var child;return child=new XMLDTDEntity(this,!0,name,value),this.children.push(child),this},XMLDocType.prototype.notation=function(name,value){var child;return child=new XMLDTDNotation(this,name,value),this.children.push(child),this},XMLDocType.prototype.toString=function(options){return this.options.writer.set(options).docType(this)},XMLDocType.prototype.ele=function(name,value){return this.element(name,value)},XMLDocType.prototype.att=function(elementName,attributeName,attributeType,defaultValueType,defaultValue){return this.attList(elementName,attributeName,attributeType,defaultValueType,defaultValue)},XMLDocType.prototype.ent=function(name,value){return this.entity(name,value)},XMLDocType.prototype.pent=function(name,value){return this.pEntity(name,value)},XMLDocType.prototype.not=function(name,value){return this.notation(name,value)},XMLDocType.prototype.up=function(){return this.root()||this.documentObject},XMLDocType}(XMLNode)}).call(this)},{"./Utility":107,"./XMLDTDAttList":111,"./XMLDTDElement":112,"./XMLDTDEntity":113,"./XMLDTDNotation":114,"./XMLNode":120}],117:[function(require,module,exports){(function(){var XMLDocument,XMLNode,XMLStringWriter,XMLStringifier,isPlainObject,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;isPlainObject=require("./Utility").isPlainObject,XMLNode=require("./XMLNode"),XMLStringifier=require("./XMLStringifier"),XMLStringWriter=require("./XMLStringWriter"),module.exports=XMLDocument=function(superClass){function XMLDocument(options){XMLDocument.__super__.constructor.call(this,null),this.name="?xml",options||(options={}),options.writer||(options.writer=new XMLStringWriter),this.options=options,this.stringify=new XMLStringifier(options),this.isDocument=!0}return extend(XMLDocument,superClass),XMLDocument.prototype.end=function(writer){var writerOptions;return writer?isPlainObject(writer)&&(writerOptions=writer,writer=this.options.writer.set(writerOptions)):writer=this.options.writer,writer.document(this)},XMLDocument.prototype.toString=function(options){return this.options.writer.set(options).document(this)},XMLDocument}(XMLNode)}).call(this)},{"./Utility":107,"./XMLNode":120,"./XMLStringWriter":124,"./XMLStringifier":125}],118:[function(require,module,exports){(function(){var XMLAttribute,XMLCData,XMLComment,XMLDTDAttList,XMLDTDElement,XMLDTDEntity,XMLDTDNotation,XMLDeclaration,XMLDocType,XMLDocumentCB,XMLElement,XMLProcessingInstruction,XMLRaw,XMLStringWriter,XMLStringifier,XMLText,getValue,isFunction,isObject,isPlainObject,ref,hasProp={}.hasOwnProperty;ref=require("./Utility"),isObject=ref.isObject,isFunction=ref.isFunction,isPlainObject=ref.isPlainObject,getValue=ref.getValue,XMLElement=require("./XMLElement"),XMLCData=require("./XMLCData"),XMLComment=require("./XMLComment"),XMLRaw=require("./XMLRaw"),XMLText=require("./XMLText"),XMLProcessingInstruction=require("./XMLProcessingInstruction"),XMLDeclaration=require("./XMLDeclaration"),XMLDocType=require("./XMLDocType"),XMLDTDAttList=require("./XMLDTDAttList"),XMLDTDEntity=require("./XMLDTDEntity"),XMLDTDElement=require("./XMLDTDElement"),XMLDTDNotation=require("./XMLDTDNotation"),XMLAttribute=require("./XMLAttribute"),XMLStringifier=require("./XMLStringifier"),XMLStringWriter=require("./XMLStringWriter"),module.exports=XMLDocumentCB=function(){function XMLDocumentCB(options,onData,onEnd){var writerOptions;this.name="?xml",options||(options={}),options.writer?isPlainObject(options.writer)&&(writerOptions=options.writer,options.writer=new XMLStringWriter(writerOptions)):options.writer=new XMLStringWriter(options),this.options=options,this.writer=options.writer,this.stringify=new XMLStringifier(options),this.onDataCallback=onData||function(){},this.onEndCallback=onEnd||function(){},this.currentNode=null,this.currentLevel=-1,this.openTags={},this.documentStarted=!1,this.documentCompleted=!1,this.root=null}return XMLDocumentCB.prototype.node=function(name,attributes,text){var ref1;if(null==name)throw new Error("Missing node name.");if(this.root&&-1===this.currentLevel)throw new Error("Document can only have one root node. "+this.debugInfo(name));return this.openCurrent(),name=getValue(name),null==attributes&&(attributes={}),attributes=getValue(attributes),isObject(attributes)||(ref1=[attributes,text],text=ref1[0],attributes=ref1[1]),this.currentNode=new XMLElement(this,name,attributes),this.currentNode.children=!1,this.currentLevel++,this.openTags[this.currentLevel]=this.currentNode,null!=text&&this.text(text),this},XMLDocumentCB.prototype.element=function(name,attributes,text){return this.currentNode&&this.currentNode instanceof XMLDocType?this.dtdElement.apply(this,arguments):this.node(name,attributes,text)},XMLDocumentCB.prototype.attribute=function(name,value){var attName,attValue;if(!this.currentNode||this.currentNode.children)throw new Error("att() can only be used immediately after an ele() call in callback mode. "+this.debugInfo(name));if(null!=name&&(name=getValue(name)),isObject(name))for(attName in name)hasProp.call(name,attName)&&(attValue=name[attName],this.attribute(attName,attValue));else isFunction(value)&&(value=value.apply()),this.options.skipNullAttributes&&null==value||(this.currentNode.attributes[name]=new XMLAttribute(this,name,value));return this},XMLDocumentCB.prototype.text=function(value){var node;return this.openCurrent(),node=new XMLText(this,value),this.onData(this.writer.text(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.cdata=function(value){var node;return this.openCurrent(),node=new XMLCData(this,value),this.onData(this.writer.cdata(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.comment=function(value){var node;return this.openCurrent(),node=new XMLComment(this,value),this.onData(this.writer.comment(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.raw=function(value){var node;return this.openCurrent(),node=new XMLRaw(this,value),this.onData(this.writer.raw(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.instruction=function(target,value){var i,insTarget,insValue,len,node;if(this.openCurrent(),null!=target&&(target=getValue(target)),null!=value&&(value=getValue(value)),Array.isArray(target))for(i=0,len=target.length;len>i;i++)insTarget=target[i],this.instruction(insTarget);else if(isObject(target))for(insTarget in target)hasProp.call(target,insTarget)&&(insValue=target[insTarget],this.instruction(insTarget,insValue));else isFunction(value)&&(value=value.apply()),node=new XMLProcessingInstruction(this,target,value),this.onData(this.writer.processingInstruction(node,this.currentLevel+1),this.currentLevel+1);return this},XMLDocumentCB.prototype.declaration=function(version,encoding,standalone){var node;if(this.openCurrent(),this.documentStarted)throw new Error("declaration() must be the first node.");return node=new XMLDeclaration(this,version,encoding,standalone),this.onData(this.writer.declaration(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.doctype=function(root,pubID,sysID){if(this.openCurrent(),null==root)throw new Error("Missing root node name.");if(this.root)throw new Error("dtd() must come before the root node.");return this.currentNode=new XMLDocType(this,pubID,sysID),this.currentNode.rootNodeName=root,this.currentNode.children=!1,this.currentLevel++,this.openTags[this.currentLevel]=this.currentNode,this},XMLDocumentCB.prototype.dtdElement=function(name,value){var node;return this.openCurrent(),node=new XMLDTDElement(this,name,value),this.onData(this.writer.dtdElement(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.attList=function(elementName,attributeName,attributeType,defaultValueType,defaultValue){var node;return this.openCurrent(),node=new XMLDTDAttList(this,elementName,attributeName,attributeType,defaultValueType,defaultValue),this.onData(this.writer.dtdAttList(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.entity=function(name,value){var node;return this.openCurrent(),node=new XMLDTDEntity(this,!1,name,value),this.onData(this.writer.dtdEntity(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.pEntity=function(name,value){var node;return this.openCurrent(),node=new XMLDTDEntity(this,!0,name,value),this.onData(this.writer.dtdEntity(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.notation=function(name,value){var node;return this.openCurrent(),node=new XMLDTDNotation(this,name,value),this.onData(this.writer.dtdNotation(node,this.currentLevel+1),this.currentLevel+1),this},XMLDocumentCB.prototype.up=function(){if(this.currentLevel<0)throw new Error("The document node has no parent.");return this.currentNode?(this.currentNode.children?this.closeNode(this.currentNode):this.openNode(this.currentNode),this.currentNode=null):this.closeNode(this.openTags[this.currentLevel]),delete this.openTags[this.currentLevel],this.currentLevel--,this},XMLDocumentCB.prototype.end=function(){for(;this.currentLevel>=0;)this.up();return this.onEnd()},XMLDocumentCB.prototype.openCurrent=function(){return this.currentNode?(this.currentNode.children=!0,this.openNode(this.currentNode)):void 0},XMLDocumentCB.prototype.openNode=function(node){return node.isOpen?void 0:(!this.root&&0===this.currentLevel&&node instanceof XMLElement&&(this.root=node),this.onData(this.writer.openNode(node,this.currentLevel),this.currentLevel),node.isOpen=!0)},XMLDocumentCB.prototype.closeNode=function(node){return node.isClosed?void 0:(this.onData(this.writer.closeNode(node,this.currentLevel),this.currentLevel),node.isClosed=!0)},XMLDocumentCB.prototype.onData=function(chunk,level){return this.documentStarted=!0,this.onDataCallback(chunk,level+1)},XMLDocumentCB.prototype.onEnd=function(){return this.documentCompleted=!0,this.onEndCallback()},XMLDocumentCB.prototype.debugInfo=function(name){return null==name?"":"node: <"+name+">"},XMLDocumentCB.prototype.ele=function(){return this.element.apply(this,arguments)},XMLDocumentCB.prototype.nod=function(name,attributes,text){return this.node(name,attributes,text)},XMLDocumentCB.prototype.txt=function(value){return this.text(value)},XMLDocumentCB.prototype.dat=function(value){return this.cdata(value)},XMLDocumentCB.prototype.com=function(value){return this.comment(value)},XMLDocumentCB.prototype.ins=function(target,value){return this.instruction(target,value)},XMLDocumentCB.prototype.dec=function(version,encoding,standalone){return this.declaration(version,encoding,standalone)},XMLDocumentCB.prototype.dtd=function(root,pubID,sysID){return this.doctype(root,pubID,sysID)},XMLDocumentCB.prototype.e=function(name,attributes,text){return this.element(name,attributes,text)},XMLDocumentCB.prototype.n=function(name,attributes,text){return this.node(name,attributes,text)},XMLDocumentCB.prototype.t=function(value){return this.text(value)},XMLDocumentCB.prototype.d=function(value){return this.cdata(value)},XMLDocumentCB.prototype.c=function(value){return this.comment(value)},XMLDocumentCB.prototype.r=function(value){return this.raw(value)},XMLDocumentCB.prototype.i=function(target,value){return this.instruction(target,value)},XMLDocumentCB.prototype.att=function(){return this.currentNode&&this.currentNode instanceof XMLDocType?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)},XMLDocumentCB.prototype.a=function(){return this.currentNode&&this.currentNode instanceof XMLDocType?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)},XMLDocumentCB.prototype.ent=function(name,value){return this.entity(name,value)},XMLDocumentCB.prototype.pent=function(name,value){return this.pEntity(name,value)},XMLDocumentCB.prototype.not=function(name,value){return this.notation(name,value)},XMLDocumentCB}()}).call(this)},{"./Utility":107,"./XMLAttribute":108,"./XMLCData":109,"./XMLComment":110,"./XMLDTDAttList":111,"./XMLDTDElement":112,"./XMLDTDEntity":113,"./XMLDTDNotation":114,"./XMLDeclaration":115,"./XMLDocType":116,"./XMLElement":119,"./XMLProcessingInstruction":121,"./XMLRaw":122,"./XMLStringWriter":124,"./XMLStringifier":125,"./XMLText":126}],119:[function(require,module,exports){(function(){var XMLAttribute,XMLElement,XMLNode,getValue,isFunction,isObject,ref,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;ref=require("./Utility"),isObject=ref.isObject,isFunction=ref.isFunction,getValue=ref.getValue,XMLNode=require("./XMLNode"),XMLAttribute=require("./XMLAttribute"),module.exports=XMLElement=function(superClass){function XMLElement(parent,name,attributes){if(XMLElement.__super__.constructor.call(this,parent),null==name)throw new Error("Missing element name. "+this.debugInfo());this.name=this.stringify.eleName(name),this.attributes={},null!=attributes&&this.attribute(attributes),parent.isDocument&&(this.isRoot=!0,this.documentObject=parent,parent.rootObject=this)}return extend(XMLElement,superClass),XMLElement.prototype.clone=function(){var att,attName,clonedSelf,ref1;clonedSelf=Object.create(this),clonedSelf.isRoot&&(clonedSelf.documentObject=null),clonedSelf.attributes={},ref1=this.attributes;for(attName in ref1)hasProp.call(ref1,attName)&&(att=ref1[attName],clonedSelf.attributes[attName]=att.clone());return clonedSelf.children=[],this.children.forEach(function(child){var clonedChild;return clonedChild=child.clone(),clonedChild.parent=clonedSelf,clonedSelf.children.push(clonedChild)}),clonedSelf},XMLElement.prototype.attribute=function(name,value){var attName,attValue;if(null!=name&&(name=getValue(name)),isObject(name))for(attName in name)hasProp.call(name,attName)&&(attValue=name[attName],this.attribute(attName,attValue));else isFunction(value)&&(value=value.apply()),this.options.skipNullAttributes&&null==value||(this.attributes[name]=new XMLAttribute(this,name,value));return this},XMLElement.prototype.removeAttribute=function(name){var attName,i,len;if(null==name)throw new Error("Missing attribute name. "+this.debugInfo());if(name=getValue(name),Array.isArray(name))for(i=0,len=name.length;len>i;i++)attName=name[i],delete this.attributes[attName];else delete this.attributes[name];return this},XMLElement.prototype.toString=function(options){return this.options.writer.set(options).element(this)},XMLElement.prototype.att=function(name,value){return this.attribute(name,value)},XMLElement.prototype.a=function(name,value){return this.attribute(name,value)},XMLElement}(XMLNode)}).call(this)},{"./Utility":107,"./XMLAttribute":108,"./XMLNode":120}],120:[function(require,module,exports){(function(){var XMLCData,XMLComment,XMLDeclaration,XMLDocType,XMLElement,XMLNode,XMLProcessingInstruction,XMLRaw,XMLText,getValue,isEmpty,isFunction,isObject,ref,hasProp={}.hasOwnProperty;ref=require("./Utility"),isObject=ref.isObject,isFunction=ref.isFunction,isEmpty=ref.isEmpty,getValue=ref.getValue,XMLElement=null,XMLCData=null,XMLComment=null,XMLDeclaration=null,XMLDocType=null,XMLRaw=null,XMLText=null,XMLProcessingInstruction=null,module.exports=XMLNode=function(){function XMLNode(parent){this.parent=parent,this.parent&&(this.options=this.parent.options,this.stringify=this.parent.stringify),this.children=[],XMLElement||(XMLElement=require("./XMLElement"),XMLCData=require("./XMLCData"),XMLComment=require("./XMLComment"),XMLDeclaration=require("./XMLDeclaration"),XMLDocType=require("./XMLDocType"),XMLRaw=require("./XMLRaw"),XMLText=require("./XMLText"),XMLProcessingInstruction=require("./XMLProcessingInstruction"))}return XMLNode.prototype.element=function(name,attributes,text){var childNode,item,j,k,key,lastChild,len,len1,ref1,val;if(lastChild=null,null==attributes&&(attributes={}),attributes=getValue(attributes),isObject(attributes)||(ref1=[attributes,text],text=ref1[0],attributes=ref1[1]),null!=name&&(name=getValue(name)),Array.isArray(name))for(j=0,len=name.length;len>j;j++)item=name[j],lastChild=this.element(item);else if(isFunction(name))lastChild=this.element(name.apply());else if(isObject(name)){for(key in name)if(hasProp.call(name,key))if(val=name[key],isFunction(val)&&(val=val.apply()),isObject(val)&&isEmpty(val)&&(val=null),!this.options.ignoreDecorators&&this.stringify.convertAttKey&&0===key.indexOf(this.stringify.convertAttKey))lastChild=this.attribute(key.substr(this.stringify.convertAttKey.length),val);else if(!this.options.separateArrayItems&&Array.isArray(val))for(k=0,len1=val.length;len1>k;k++)item=val[k],childNode={},childNode[key]=item,lastChild=this.element(childNode);else isObject(val)?(lastChild=this.element(key),lastChild.element(val)):lastChild=this.element(key,val)}else lastChild=!this.options.ignoreDecorators&&this.stringify.convertTextKey&&0===name.indexOf(this.stringify.convertTextKey)?this.text(text):!this.options.ignoreDecorators&&this.stringify.convertCDataKey&&0===name.indexOf(this.stringify.convertCDataKey)?this.cdata(text):!this.options.ignoreDecorators&&this.stringify.convertCommentKey&&0===name.indexOf(this.stringify.convertCommentKey)?this.comment(text):!this.options.ignoreDecorators&&this.stringify.convertRawKey&&0===name.indexOf(this.stringify.convertRawKey)?this.raw(text):!this.options.ignoreDecorators&&this.stringify.convertPIKey&&0===name.indexOf(this.stringify.convertPIKey)?this.instruction(name.substr(this.stringify.convertPIKey.length),text):this.node(name,attributes,text);if(null==lastChild)throw new Error("Could not create any elements with: "+name+". "+this.debugInfo());return lastChild},XMLNode.prototype.insertBefore=function(name,attributes,text){var child,i,removed;if(this.isRoot)throw new Error("Cannot insert elements at root level. "+this.debugInfo(name)); +return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i),child=this.parent.element(name,attributes,text),Array.prototype.push.apply(this.parent.children,removed),child},XMLNode.prototype.insertAfter=function(name,attributes,text){var child,i,removed;if(this.isRoot)throw new Error("Cannot insert elements at root level. "+this.debugInfo(name));return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i+1),child=this.parent.element(name,attributes,text),Array.prototype.push.apply(this.parent.children,removed),child},XMLNode.prototype.remove=function(){var i,ref1;if(this.isRoot)throw new Error("Cannot remove the root element. "+this.debugInfo());return i=this.parent.children.indexOf(this),[].splice.apply(this.parent.children,[i,i-i+1].concat(ref1=[])),ref1,this.parent},XMLNode.prototype.node=function(name,attributes,text){var child,ref1;return null!=name&&(name=getValue(name)),attributes||(attributes={}),attributes=getValue(attributes),isObject(attributes)||(ref1=[attributes,text],text=ref1[0],attributes=ref1[1]),child=new XMLElement(this,name,attributes),null!=text&&child.text(text),this.children.push(child),child},XMLNode.prototype.text=function(value){var child;return child=new XMLText(this,value),this.children.push(child),this},XMLNode.prototype.cdata=function(value){var child;return child=new XMLCData(this,value),this.children.push(child),this},XMLNode.prototype.comment=function(value){var child;return child=new XMLComment(this,value),this.children.push(child),this},XMLNode.prototype.commentBefore=function(value){var child,i,removed;return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i),child=this.parent.comment(value),Array.prototype.push.apply(this.parent.children,removed),this},XMLNode.prototype.commentAfter=function(value){var child,i,removed;return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i+1),child=this.parent.comment(value),Array.prototype.push.apply(this.parent.children,removed),this},XMLNode.prototype.raw=function(value){var child;return child=new XMLRaw(this,value),this.children.push(child),this},XMLNode.prototype.instruction=function(target,value){var insTarget,insValue,instruction,j,len;if(null!=target&&(target=getValue(target)),null!=value&&(value=getValue(value)),Array.isArray(target))for(j=0,len=target.length;len>j;j++)insTarget=target[j],this.instruction(insTarget);else if(isObject(target))for(insTarget in target)hasProp.call(target,insTarget)&&(insValue=target[insTarget],this.instruction(insTarget,insValue));else isFunction(value)&&(value=value.apply()),instruction=new XMLProcessingInstruction(this,target,value),this.children.push(instruction);return this},XMLNode.prototype.instructionBefore=function(target,value){var child,i,removed;return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i),child=this.parent.instruction(target,value),Array.prototype.push.apply(this.parent.children,removed),this},XMLNode.prototype.instructionAfter=function(target,value){var child,i,removed;return i=this.parent.children.indexOf(this),removed=this.parent.children.splice(i+1),child=this.parent.instruction(target,value),Array.prototype.push.apply(this.parent.children,removed),this},XMLNode.prototype.declaration=function(version,encoding,standalone){var doc,xmldec;return doc=this.document(),xmldec=new XMLDeclaration(doc,version,encoding,standalone),doc.children[0]instanceof XMLDeclaration?doc.children[0]=xmldec:doc.children.unshift(xmldec),doc.root()||doc},XMLNode.prototype.doctype=function(pubID,sysID){var child,doc,doctype,i,j,k,len,len1,ref1,ref2;for(doc=this.document(),doctype=new XMLDocType(doc,pubID,sysID),ref1=doc.children,i=j=0,len=ref1.length;len>j;i=++j)if(child=ref1[i],child instanceof XMLDocType)return doc.children[i]=doctype,doctype;for(ref2=doc.children,i=k=0,len1=ref2.length;len1>k;i=++k)if(child=ref2[i],child.isRoot)return doc.children.splice(i,0,doctype),doctype;return doc.children.push(doctype),doctype},XMLNode.prototype.up=function(){if(this.isRoot)throw new Error("The root node has no parent. Use doc() if you need to get the document object.");return this.parent},XMLNode.prototype.root=function(){var node;for(node=this;node;){if(node.isDocument)return node.rootObject;if(node.isRoot)return node;node=node.parent}},XMLNode.prototype.document=function(){var node;for(node=this;node;){if(node.isDocument)return node;node=node.parent}},XMLNode.prototype.end=function(options){return this.document().end(options)},XMLNode.prototype.prev=function(){var i;if(i=this.parent.children.indexOf(this),1>i)throw new Error("Already at the first node. "+this.debugInfo());return this.parent.children[i-1]},XMLNode.prototype.next=function(){var i;if(i=this.parent.children.indexOf(this),-1===i||i===this.parent.children.length-1)throw new Error("Already at the last node. "+this.debugInfo());return this.parent.children[i+1]},XMLNode.prototype.importDocument=function(doc){var clonedRoot;return clonedRoot=doc.root().clone(),clonedRoot.parent=this,clonedRoot.isRoot=!1,this.children.push(clonedRoot),this},XMLNode.prototype.debugInfo=function(name){var ref1,ref2;return name=name||this.name,null!=name||(null!=(ref1=this.parent)?ref1.name:void 0)?null==name?"parent: <"+this.parent.name+">":(null!=(ref2=this.parent)?ref2.name:void 0)?"node: <"+name+">, parent: <"+this.parent.name+">":"node: <"+name+">":""},XMLNode.prototype.ele=function(name,attributes,text){return this.element(name,attributes,text)},XMLNode.prototype.nod=function(name,attributes,text){return this.node(name,attributes,text)},XMLNode.prototype.txt=function(value){return this.text(value)},XMLNode.prototype.dat=function(value){return this.cdata(value)},XMLNode.prototype.com=function(value){return this.comment(value)},XMLNode.prototype.ins=function(target,value){return this.instruction(target,value)},XMLNode.prototype.doc=function(){return this.document()},XMLNode.prototype.dec=function(version,encoding,standalone){return this.declaration(version,encoding,standalone)},XMLNode.prototype.dtd=function(pubID,sysID){return this.doctype(pubID,sysID)},XMLNode.prototype.e=function(name,attributes,text){return this.element(name,attributes,text)},XMLNode.prototype.n=function(name,attributes,text){return this.node(name,attributes,text)},XMLNode.prototype.t=function(value){return this.text(value)},XMLNode.prototype.d=function(value){return this.cdata(value)},XMLNode.prototype.c=function(value){return this.comment(value)},XMLNode.prototype.r=function(value){return this.raw(value)},XMLNode.prototype.i=function(target,value){return this.instruction(target,value)},XMLNode.prototype.u=function(){return this.up()},XMLNode.prototype.importXMLBuilder=function(doc){return this.importDocument(doc)},XMLNode}()}).call(this)},{"./Utility":107,"./XMLCData":109,"./XMLComment":110,"./XMLDeclaration":115,"./XMLDocType":116,"./XMLElement":119,"./XMLProcessingInstruction":121,"./XMLRaw":122,"./XMLText":126}],121:[function(require,module,exports){(function(){var XMLNode,XMLProcessingInstruction,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLProcessingInstruction=function(superClass){function XMLProcessingInstruction(parent,target,value){if(XMLProcessingInstruction.__super__.constructor.call(this,parent),null==target)throw new Error("Missing instruction target. "+this.debugInfo());this.target=this.stringify.insTarget(target),value&&(this.value=this.stringify.insValue(value))}return extend(XMLProcessingInstruction,superClass),XMLProcessingInstruction.prototype.clone=function(){return Object.create(this)},XMLProcessingInstruction.prototype.toString=function(options){return this.options.writer.set(options).processingInstruction(this)},XMLProcessingInstruction}(XMLNode)}).call(this)},{"./XMLNode":120}],122:[function(require,module,exports){(function(){var XMLNode,XMLRaw,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLNode=require("./XMLNode"),module.exports=XMLRaw=function(superClass){function XMLRaw(parent,text){if(XMLRaw.__super__.constructor.call(this,parent),null==text)throw new Error("Missing raw text. "+this.debugInfo());this.value=this.stringify.raw(text)}return extend(XMLRaw,superClass),XMLRaw.prototype.clone=function(){return Object.create(this)},XMLRaw.prototype.toString=function(options){return this.options.writer.set(options).raw(this)},XMLRaw}(XMLNode)}).call(this)},{"./XMLNode":120}],123:[function(require,module,exports){(function(){var XMLCData,XMLComment,XMLDTDAttList,XMLDTDElement,XMLDTDEntity,XMLDTDNotation,XMLDeclaration,XMLDocType,XMLElement,XMLProcessingInstruction,XMLRaw,XMLStreamWriter,XMLText,XMLWriterBase,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLDeclaration=require("./XMLDeclaration"),XMLDocType=require("./XMLDocType"),XMLCData=require("./XMLCData"),XMLComment=require("./XMLComment"),XMLElement=require("./XMLElement"),XMLRaw=require("./XMLRaw"),XMLText=require("./XMLText"),XMLProcessingInstruction=require("./XMLProcessingInstruction"),XMLDTDAttList=require("./XMLDTDAttList"),XMLDTDElement=require("./XMLDTDElement"),XMLDTDEntity=require("./XMLDTDEntity"),XMLDTDNotation=require("./XMLDTDNotation"),XMLWriterBase=require("./XMLWriterBase"),module.exports=XMLStreamWriter=function(superClass){function XMLStreamWriter(stream,options){XMLStreamWriter.__super__.constructor.call(this,options),this.stream=stream}return extend(XMLStreamWriter,superClass),XMLStreamWriter.prototype.document=function(doc){var child,i,j,len,len1,ref,ref1,results;for(ref=doc.children,i=0,len=ref.length;len>i;i++)child=ref[i],child.isLastRootNode=!1;for(doc.children[doc.children.length-1].isLastRootNode=!0,ref1=doc.children,results=[],j=0,len1=ref1.length;len1>j;j++)switch(child=ref1[j],!1){case!(child instanceof XMLDeclaration):results.push(this.declaration(child));break;case!(child instanceof XMLDocType):results.push(this.docType(child));break;case!(child instanceof XMLComment):results.push(this.comment(child));break;case!(child instanceof XMLProcessingInstruction):results.push(this.processingInstruction(child));break;default:results.push(this.element(child))}return results},XMLStreamWriter.prototype.attribute=function(att){return this.stream.write(" "+att.name+'="'+att.value+'"')},XMLStreamWriter.prototype.cdata=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.comment=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.declaration=function(node,level){return this.stream.write(this.space(level)),this.stream.write('"),this.stream.write(this.endline(node))},XMLStreamWriter.prototype.docType=function(node,level){var child,i,len,ref;if(level||(level=0),this.stream.write(this.space(level)),this.stream.write("0){for(this.stream.write(" ["),this.stream.write(this.endline(node)),ref=node.children,i=0,len=ref.length;len>i;i++)switch(child=ref[i],!1){case!(child instanceof XMLDTDAttList):this.dtdAttList(child,level+1);break;case!(child instanceof XMLDTDElement):this.dtdElement(child,level+1);break;case!(child instanceof XMLDTDEntity):this.dtdEntity(child,level+1);break;case!(child instanceof XMLDTDNotation):this.dtdNotation(child,level+1);break;case!(child instanceof XMLCData):this.cdata(child,level+1);break;case!(child instanceof XMLComment):this.comment(child,level+1);break;case!(child instanceof XMLProcessingInstruction):this.processingInstruction(child,level+1);break;default:throw new Error("Unknown DTD node type: "+child.constructor.name)}this.stream.write("]")}return this.stream.write(this.spacebeforeslash+">"),this.stream.write(this.endline(node))},XMLStreamWriter.prototype.element=function(node,level){var att,child,i,len,name,ref,ref1,space;level||(level=0),space=this.space(level),this.stream.write(space+"<"+node.name),ref=node.attributes;for(name in ref)hasProp.call(ref,name)&&(att=ref[name],this.attribute(att));if(0===node.children.length||node.children.every(function(e){return""===e.value}))this.allowEmpty?this.stream.write(">"):this.stream.write(this.spacebeforeslash+"/>");else if(this.pretty&&1===node.children.length&&null!=node.children[0].value)this.stream.write(">"),this.stream.write(node.children[0].value),this.stream.write("");else{for(this.stream.write(">"+this.newline),ref1=node.children,i=0,len=ref1.length;len>i;i++)switch(child=ref1[i],!1){case!(child instanceof XMLCData):this.cdata(child,level+1);break;case!(child instanceof XMLComment):this.comment(child,level+1);break;case!(child instanceof XMLElement):this.element(child,level+1);break;case!(child instanceof XMLRaw):this.raw(child,level+1);break;case!(child instanceof XMLText):this.text(child,level+1);break;case!(child instanceof XMLProcessingInstruction):this.processingInstruction(child,level+1);break;default:throw new Error("Unknown XML node type: "+child.constructor.name)}this.stream.write(space+"")}return this.stream.write(this.endline(node))},XMLStreamWriter.prototype.processingInstruction=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.raw=function(node,level){return this.stream.write(this.space(level)+node.value+this.endline(node))},XMLStreamWriter.prototype.text=function(node,level){return this.stream.write(this.space(level)+node.value+this.endline(node))},XMLStreamWriter.prototype.dtdAttList=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.dtdElement=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.dtdEntity=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.dtdNotation=function(node,level){return this.stream.write(this.space(level)+""+this.endline(node))},XMLStreamWriter.prototype.endline=function(node){return node.isLastRootNode?"":this.newline},XMLStreamWriter}(XMLWriterBase)}).call(this)},{"./XMLCData":109,"./XMLComment":110,"./XMLDTDAttList":111,"./XMLDTDElement":112,"./XMLDTDEntity":113,"./XMLDTDNotation":114,"./XMLDeclaration":115,"./XMLDocType":116,"./XMLElement":119,"./XMLProcessingInstruction":121,"./XMLRaw":122,"./XMLText":126,"./XMLWriterBase":127}],124:[function(require,module,exports){(function(){var XMLCData,XMLComment,XMLDTDAttList,XMLDTDElement,XMLDTDEntity,XMLDTDNotation,XMLDeclaration,XMLDocType,XMLElement,XMLProcessingInstruction,XMLRaw,XMLStringWriter,XMLText,XMLWriterBase,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;XMLDeclaration=require("./XMLDeclaration"),XMLDocType=require("./XMLDocType"),XMLCData=require("./XMLCData"),XMLComment=require("./XMLComment"),XMLElement=require("./XMLElement"),XMLRaw=require("./XMLRaw"),XMLText=require("./XMLText"),XMLProcessingInstruction=require("./XMLProcessingInstruction"),XMLDTDAttList=require("./XMLDTDAttList"),XMLDTDElement=require("./XMLDTDElement"),XMLDTDEntity=require("./XMLDTDEntity"),XMLDTDNotation=require("./XMLDTDNotation"),XMLWriterBase=require("./XMLWriterBase"),module.exports=XMLStringWriter=function(superClass){function XMLStringWriter(options){XMLStringWriter.__super__.constructor.call(this,options)}return extend(XMLStringWriter,superClass),XMLStringWriter.prototype.document=function(doc){var child,i,len,r,ref;for(this.textispresent=!1,r="",ref=doc.children,i=0,len=ref.length;len>i;i++)child=ref[i],r+=function(){switch(!1){case!(child instanceof XMLDeclaration):return this.declaration(child);case!(child instanceof XMLDocType):return this.docType(child);case!(child instanceof XMLComment):return this.comment(child);case!(child instanceof XMLProcessingInstruction):return this.processingInstruction(child);default:return this.element(child,0)}}.call(this);return this.pretty&&r.slice(-this.newline.length)===this.newline&&(r=r.slice(0,-this.newline.length)),r},XMLStringWriter.prototype.attribute=function(att){return" "+att.name+'="'+att.value+'"'},XMLStringWriter.prototype.cdata=function(node,level){return this.space(level)+""+this.newline},XMLStringWriter.prototype.comment=function(node,level){return this.space(level)+""+this.newline},XMLStringWriter.prototype.declaration=function(node,level){var r;return r=this.space(level),r+='",r+=this.newline},XMLStringWriter.prototype.docType=function(node,level){var child,i,len,r,ref;if(level||(level=0),r=this.space(level),r+="0){for(r+=" [",r+=this.newline,ref=node.children,i=0,len=ref.length;len>i;i++)child=ref[i],r+=function(){switch(!1){case!(child instanceof XMLDTDAttList):return this.dtdAttList(child,level+1);case!(child instanceof XMLDTDElement):return this.dtdElement(child,level+1);case!(child instanceof XMLDTDEntity):return this.dtdEntity(child,level+1);case!(child instanceof XMLDTDNotation):return this.dtdNotation(child,level+1);case!(child instanceof XMLCData):return this.cdata(child,level+1);case!(child instanceof XMLComment):return this.comment(child,level+1);case!(child instanceof XMLProcessingInstruction):return this.processingInstruction(child,level+1);default:throw new Error("Unknown DTD node type: "+child.constructor.name)}}.call(this);r+="]"}return r+=this.spacebeforeslash+">",r+=this.newline},XMLStringWriter.prototype.element=function(node,level){var att,child,i,j,len,len1,name,r,ref,ref1,ref2,space,textispresentwasset;level||(level=0),textispresentwasset=!1,this.textispresent?(this.newline="",this.pretty=!1):(this.newline=this.newlinedefault,this.pretty=this.prettydefault),space=this.space(level),r="",r+=space+"<"+node.name,ref=node.attributes;for(name in ref)hasProp.call(ref,name)&&(att=ref[name],r+=this.attribute(att));if(0===node.children.length||node.children.every(function(e){return""===e.value}))r+=this.allowEmpty?">"+this.newline:this.spacebeforeslash+"/>"+this.newline;else if(this.pretty&&1===node.children.length&&null!=node.children[0].value)r+=">",r+=node.children[0].value,r+=""+this.newline;else{if(this.dontprettytextnodes)for(ref1=node.children,i=0,len=ref1.length;len>i;i++)if(child=ref1[i],null!=child.value){this.textispresent++,textispresentwasset=!0;break}for(this.textispresent&&(this.newline="",this.pretty=!1,space=this.space(level)),r+=">"+this.newline,ref2=node.children,j=0,len1=ref2.length;len1>j;j++)child=ref2[j],r+=function(){switch(!1){case!(child instanceof XMLCData):return this.cdata(child,level+1);case!(child instanceof XMLComment):return this.comment(child,level+1);case!(child instanceof XMLElement):return this.element(child,level+1);case!(child instanceof XMLRaw):return this.raw(child,level+1);case!(child instanceof XMLText):return this.text(child,level+1);case!(child instanceof XMLProcessingInstruction):return this.processingInstruction(child,level+1);default:throw new Error("Unknown XML node type: "+child.constructor.name)}}.call(this);textispresentwasset&&this.textispresent--,this.textispresent||(this.newline=this.newlinedefault,this.pretty=this.prettydefault),r+=space+""+this.newline}return r},XMLStringWriter.prototype.processingInstruction=function(node,level){var r;return r=this.space(level)+""+this.newline},XMLStringWriter.prototype.raw=function(node,level){return this.space(level)+node.value+this.newline},XMLStringWriter.prototype.text=function(node,level){return this.space(level)+node.value+this.newline},XMLStringWriter.prototype.dtdAttList=function(node,level){var r;return r=this.space(level)+""+this.newline},XMLStringWriter.prototype.dtdElement=function(node,level){return this.space(level)+""+this.newline},XMLStringWriter.prototype.dtdEntity=function(node,level){var r;return r=this.space(level)+""+this.newline},XMLStringWriter.prototype.dtdNotation=function(node,level){var r;return r=this.space(level)+""+this.newline},XMLStringWriter.prototype.openNode=function(node,level){var att,name,r,ref;if(level||(level=0),node instanceof XMLElement){r=this.space(level)+"<"+node.name,ref=node.attributes;for(name in ref)hasProp.call(ref,name)&&(att=ref[name],r+=this.attribute(att));return r+=(node.children?">":"/>")+this.newline}return r=this.space(level)+"")+this.newline},XMLStringWriter.prototype.closeNode=function(node,level){switch(level||(level=0),!1){case!(node instanceof XMLElement):return this.space(level)+""+this.newline;case!(node instanceof XMLDocType):return this.space(level)+"]>"+this.newline}},XMLStringWriter}(XMLWriterBase)}).call(this)},{"./XMLCData":109,"./XMLComment":110,"./XMLDTDAttList":111,"./XMLDTDElement":112,"./XMLDTDEntity":113,"./XMLDTDNotation":114,"./XMLDeclaration":115,"./XMLDocType":116,"./XMLElement":119,"./XMLProcessingInstruction":121,"./XMLRaw":122,"./XMLText":126,"./XMLWriterBase":127}],125:[function(require,module,exports){(function(){var XMLStringifier,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},hasProp={}.hasOwnProperty;module.exports=XMLStringifier=function(){function XMLStringifier(options){this.assertLegalChar=bind(this.assertLegalChar,this);var key,ref,value;options||(options={}),this.noDoubleEncoding=options.noDoubleEncoding,ref=options.stringify||{};for(key in ref)hasProp.call(ref,key)&&(value=ref[key],this[key]=value)}return XMLStringifier.prototype.eleName=function(val){return val=""+val||"",this.assertLegalChar(val)},XMLStringifier.prototype.eleText=function(val){return val=""+val||"",this.assertLegalChar(this.elEscape(val))},XMLStringifier.prototype.cdata=function(val){return val=""+val||"",val=val.replace("]]>","]]]]>"),this.assertLegalChar(val)},XMLStringifier.prototype.comment=function(val){if(val=""+val||"",val.match(/--/))throw new Error("Comment text cannot contain double-hypen: "+val);return this.assertLegalChar(val)},XMLStringifier.prototype.raw=function(val){return""+val||""},XMLStringifier.prototype.attName=function(val){return val=""+val||""},XMLStringifier.prototype.attValue=function(val){return val=""+val||"",this.attEscape(val)},XMLStringifier.prototype.insTarget=function(val){return""+val||""},XMLStringifier.prototype.insValue=function(val){if(val=""+val||"",val.match(/\?>/))throw new Error("Invalid processing instruction value: "+val);return val},XMLStringifier.prototype.xmlVersion=function(val){if(val=""+val||"",!val.match(/1\.[0-9]+/))throw new Error("Invalid version number: "+val);return val},XMLStringifier.prototype.xmlEncoding=function(val){if(val=""+val||"",!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/))throw new Error("Invalid encoding: "+val);return val},XMLStringifier.prototype.xmlStandalone=function(val){return val?"yes":"no"},XMLStringifier.prototype.dtdPubID=function(val){return""+val||""},XMLStringifier.prototype.dtdSysID=function(val){return""+val||""},XMLStringifier.prototype.dtdElementValue=function(val){return""+val||""},XMLStringifier.prototype.dtdAttType=function(val){return""+val||""},XMLStringifier.prototype.dtdAttDefault=function(val){return null!=val?""+val||"":val},XMLStringifier.prototype.dtdEntityValue=function(val){return""+val||""},XMLStringifier.prototype.dtdNData=function(val){return""+val||""},XMLStringifier.prototype.convertAttKey="@",XMLStringifier.prototype.convertPIKey="?",XMLStringifier.prototype.convertTextKey="#text",XMLStringifier.prototype.convertCDataKey="#cdata",XMLStringifier.prototype.convertCommentKey="#comment",XMLStringifier.prototype.convertRawKey="#raw",XMLStringifier.prototype.assertLegalChar=function(str){var res;if(res=str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/))throw new Error("Invalid character in string: "+str+" at index "+res.index);return str},XMLStringifier.prototype.elEscape=function(str){var ampregex;return ampregex=this.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,str.replace(ampregex,"&").replace(//g,">").replace(/\r/g," ")},XMLStringifier.prototype.attEscape=function(str){var ampregex;return ampregex=this.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,str.replace(ampregex,"&").replace(/0?new Array(indent).join(this.indent):""):""},XMLWriterBase}()}).call(this)},{}],128:[function(require,module,exports){(function(){var XMLDocument,XMLDocumentCB,XMLStreamWriter,XMLStringWriter,assign,isFunction,ref;ref=require("./Utility"),assign=ref.assign,isFunction=ref.isFunction,XMLDocument=require("./XMLDocument"),XMLDocumentCB=require("./XMLDocumentCB"),XMLStringWriter=require("./XMLStringWriter"),XMLStreamWriter=require("./XMLStreamWriter"),module.exports.create=function(name,xmldec,doctype,options){var doc,root;if(null==name)throw new Error("Root element needs a name.");return options=assign({},xmldec,doctype,options),doc=new XMLDocument(options),root=doc.element(name),options.headless||(doc.declaration(options),(null!=options.pubID||null!=options.sysID)&&doc.doctype(options)),root},module.exports.begin=function(options,onData,onEnd){var ref1;return isFunction(options)&&(ref1=[options,onData],onData=ref1[0],onEnd=ref1[1],options={}),onData?new XMLDocumentCB(options,onData,onEnd):new XMLDocument(options)},module.exports.stringWriter=function(options){return new XMLStringWriter(options)},module.exports.streamWriter=function(stream,options){return new XMLStreamWriter(stream,options)}}).call(this)},{"./Utility":107,"./XMLDocument":117,"./XMLDocumentCB":118,"./XMLStreamWriter":123,"./XMLStringWriter":124 +}]},{},[21])(21)}); diff --git a/public/js/ueditor/dialogs/contentimport/showdown.min.js b/public/js/ueditor/dialogs/contentimport/showdown.min.js new file mode 100644 index 0000000..cf721d9 --- /dev/null +++ b/public/js/ueditor/dialogs/contentimport/showdown.min.js @@ -0,0 +1,3 @@ +/*! showdown v 2.1.0 - 21-04-2022 */ +!function(){function a(e){"use strict";var r={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
    (GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
    foo
    ",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(r));var t,a={};for(t in r)r.hasOwnProperty(t)&&(a[t]=r[t].defaultValue);return a}var x={},t={},d={},p=a(!0),h="vanilla",_={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:a(!0),allOn:function(){"use strict";var e,r=a(!0),t={};for(e in r)r.hasOwnProperty(e)&&(t[e]=!0);return t}()};function g(e,r){"use strict";var t=r?"Error in "+r+" extension->":"Error in unnamed extension",a={valid:!0,error:""};x.helper.isArray(e)||(e=[e]);for(var n=0;n").replace(/&/g,"&")};function u(e,r,t,a){"use strict";var n,s,o,i=-1<(a=a||"").indexOf("g"),l=new RegExp(r+"|"+t,"g"+a.replace(/g/g,"")),c=new RegExp(r,a.replace(/g/g,"")),u=[];do{for(n=0;p=l.exec(e);)if(c.test(p[0]))n++||(o=(s=l.lastIndex)-p[0].length);else if(n&&!--n){var d=p.index+p[0].length,p={left:{start:o,end:s},match:{start:s,end:p.index},right:{start:p.index,end:d},wholeMatch:{start:o,end:d}};if(u.push(p),!i)return u}}while(n&&(l.lastIndex=s));return u}function s(u){"use strict";return function(e,r,t,a,n,s,o){var i=t=t.replace(x.helper.regexes.asteriskDashAndColon,x.helper.escapeCharactersCallback),l="",c="",r=r||"",o=o||"";return/^www\./i.test(t)&&(t=t.replace(/^www\./i,"http://www.")),u.excludeTrailingPunctuationFromURLs&&s&&(l=s),r+'"+i+""+l+o}}function o(n,s){"use strict";return function(e,r,t){var a="mailto:";return r=r||"",t=x.subParser("unescapeSpecialChars")(t,n,s),n.encodeEmails?(a=x.helper.encodeEmailAddress(a+t),t=x.helper.encodeEmailAddress(t)):a+=t,r+''+t+""}}x.helper.matchRecursiveRegExp=function(e,r,t,a){"use strict";for(var n=u(e,r,t,a),s=[],o=0;o>=0,t=String(t||" "),e.length>r?String(e):((r-=e.length)>t.length&&(t+=t.repeat(r/t.length)),String(e)+t.slice(0,r))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),x.helper.regexes={asteriskDashAndColon:/([*_:~])/g},x.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},x.Converter=function(e){"use strict";var r,t,n={},i=[],l=[],o={},a=h,s={parsed:{},raw:"",format:""};for(r in e=e||{},p)p.hasOwnProperty(r)&&(n[r]=p[r]);if("object"!=typeof e)throw Error("Converter expects the passed parameter to be an object, but "+typeof e+" was passed instead.");for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);function c(e,r){if(r=r||null,x.helper.isString(e)){if(r=e=x.helper.stdExtName(e),x.extensions[e]){console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!");var t=x.extensions[e],a=e;if("function"==typeof t&&(t=t(new x.Converter)),x.helper.isArray(t)||(t=[t]),!(a=g(t,a)).valid)throw Error(a.error);for(var n=0;n[ \t]+¨NBSP;<"),!r){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");r=window.document}for(var r=r.createElement("div"),t=(r.innerHTML=e,{preList:function(e){for(var r=e.querySelectorAll("pre"),t=[],a=0;a'}else t.push(r[a].innerHTML),r[a].innerHTML="",r[a].setAttribute("prenum",a.toString());return t}(r)}),a=(!function e(r){for(var t=0;t? ?(['"].*['"])?\)$/m))a="";else if(!a){if(a="#"+(t=t||r.toLowerCase().replace(/ ?\n/g," ")),x.helper.isUndefined(l.gUrls[t]))return e;a=l.gUrls[t],x.helper.isUndefined(l.gTitles[t])||(o=l.gTitles[t])}return e='"}return e=(e=(e=(e=(e=l.converter._dispatch("anchors.before",e,i,l)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,r)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,r)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,r)).replace(/\[([^\[\]]+)]()()()()()/g,r),i.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,function(e,r,t,a,n){if("\\"===t)return r+a;if(!x.helper.isString(i.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");t="";return r+'"+a+""})),e=l.converter._dispatch("anchors.after",e,i,l)});var i=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,l=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,c=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,m=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi;x.subParser("autoLinks",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("autoLinks.before",e,r,t)).replace(c,s(r))).replace(f,o(r,t)),e=t.converter._dispatch("autoLinks.after",e,r,t)}),x.subParser("simplifiedAutoLinks",function(e,r,t){"use strict";return r.simplifiedAutoLink?(e=t.converter._dispatch("simplifiedAutoLinks.before",e,r,t),e=(e=r.excludeTrailingPunctuationFromURLs?e.replace(l,s(r)):e.replace(i,s(r))).replace(m,o(r,t)),t.converter._dispatch("simplifiedAutoLinks.after",e,r,t)):e}),x.subParser("blockGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("blockGamut.before",e,r,t),e=x.subParser("blockQuotes")(e,r,t),e=x.subParser("headers")(e,r,t),e=x.subParser("horizontalRule")(e,r,t),e=x.subParser("lists")(e,r,t),e=x.subParser("codeBlocks")(e,r,t),e=x.subParser("tables")(e,r,t),e=x.subParser("hashHTMLBlocks")(e,r,t),e=x.subParser("paragraphs")(e,r,t),e=t.converter._dispatch("blockGamut.after",e,r,t)}),x.subParser("blockQuotes",function(e,r,t){"use strict";e=t.converter._dispatch("blockQuotes.before",e,r,t);var a=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return r.splitAdjacentBlockquotes&&(a=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=(e+="\n\n").replace(a,function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=x.subParser("githubCodeBlocks")(e,r,t),e=(e=(e=x.subParser("blockGamut")(e,r,t)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(e,r){return r.replace(/^  /gm,"¨0").replace(/¨0/g,"")}),x.subParser("hashBlock")("
    \n"+e+"\n
    ",r,t)}),e=t.converter._dispatch("blockQuotes.after",e,r,t)}),x.subParser("codeBlocks",function(e,n,s){"use strict";e=s.converter._dispatch("codeBlocks.before",e,n,s);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,function(e,r,t){var a="\n",r=x.subParser("outdent")(r,n,s);return r=x.subParser("encodeCode")(r,n,s),r="
    "+(r=(r=(r=x.subParser("detab")(r,n,s)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+(a=n.omitExtraWLInCodeBlocks?"":a)+"
    ",x.subParser("hashBlock")(r,n,s)+t})).replace(/¨0/,""),e=s.converter._dispatch("codeBlocks.after",e,n,s)}),x.subParser("codeSpans",function(e,n,s){"use strict";return e=(e=void 0===(e=s.converter._dispatch("codeSpans.before",e,n,s))?"":e).replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(e,r,t,a){return a=(a=a.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),a=r+""+(a=x.subParser("encodeCode")(a,n,s))+"",a=x.subParser("hashHTMLSpans")(a,n,s)}),e=s.converter._dispatch("codeSpans.after",e,n,s)}),x.subParser("completeHTMLDocument",function(e,r,t){"use strict";if(!r.completeHTMLDocument)return e;e=t.converter._dispatch("completeHTMLDocument.before",e,r,t);var a,n="html",s="\n",o="",i='\n',l="",c="";for(a in void 0!==t.metadata.parsed.doctype&&(s="\n","html"!==(n=t.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==n||(i='')),t.metadata.parsed)if(t.metadata.parsed.hasOwnProperty(a))switch(a.toLowerCase()){case"doctype":break;case"title":o=""+t.metadata.parsed.title+"\n";break;case"charset":i="html"===n||"html5"===n?'\n':'\n';break;case"language":case"lang":l=' lang="'+t.metadata.parsed[a]+'"',c+='\n';break;default:c+='\n'}return e=s+"\n\n"+o+i+c+"\n\n"+e.trim()+"\n\n",e=t.converter._dispatch("completeHTMLDocument.after",e,r,t)}),x.subParser("detab",function(e,r,t){"use strict";return e=(e=(e=(e=(e=(e=t.converter._dispatch("detab.before",e,r,t)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,function(e,r){for(var t=r,a=4-t.length%4,n=0;n/g,">"),e=t.converter._dispatch("encodeAmpsAndAngles.after",e,r,t)}),x.subParser("encodeBackslashEscapes",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("encodeBackslashEscapes.before",e,r,t)).replace(/\\(\\)/g,x.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,x.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeBackslashEscapes.after",e,r,t)}),x.subParser("encodeCode",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("encodeCode.before",e,r,t)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,x.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeCode.after",e,r,t)}),x.subParser("escapeSpecialCharsWithinTagAttributes",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,r,t)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,x.helper.escapeCharactersCallback)})).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,function(e){return e.replace(/([\\`*_~=|])/g,x.helper.escapeCharactersCallback)}),e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,r,t)}),x.subParser("githubCodeBlocks",function(e,s,o){"use strict";return s.ghCodeBlocks?(e=o.converter._dispatch("githubCodeBlocks.before",e,s,o),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,function(e,r,t,a){var n=s.omitExtraWLInCodeBlocks?"":"\n";return a=x.subParser("encodeCode")(a,s,o),a="
    "+(a=(a=(a=x.subParser("detab")(a,s,o)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+n+"
    ",a=x.subParser("hashBlock")(a,s,o),"\n\n¨G"+(o.ghCodeBlocks.push({text:e,codeblock:a})-1)+"G\n\n"})).replace(/¨0/,""),o.converter._dispatch("githubCodeBlocks.after",e,s,o)):e}),x.subParser("hashBlock",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("hashBlock.before",e,r,t)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(t.gHtmlBlocks.push(e)-1)+"K\n\n",e=t.converter._dispatch("hashBlock.after",e,r,t)}),x.subParser("hashCodeTags",function(e,n,s){"use strict";e=s.converter._dispatch("hashCodeTags.before",e,n,s);return e=x.helper.replaceRecursiveRegExp(e,function(e,r,t,a){t=t+x.subParser("encodeCode")(r,n,s)+a;return"¨C"+(s.gHtmlSpans.push(t)-1)+"C"},"]*>","","gim"),e=s.converter._dispatch("hashCodeTags.after",e,n,s)}),x.subParser("hashElement",function(e,r,t){"use strict";return function(e,r){return r=(r=(r=r.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),r="\n\n¨K"+(t.gHtmlBlocks.push(r)-1)+"K\n\n"}}),x.subParser("hashHTMLBlocks",function(e,r,n){"use strict";e=n.converter._dispatch("hashHTMLBlocks.before",e,r,n);function t(e,r,t,a){return-1!==t.search(/\bmarkdown\b/)&&(e=t+n.converter.makeHtml(r)+a),"\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n"}var a=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"];r.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,function(e,r){return"<"+r+">"}));for(var s=0;s]*>)","im"),i="<"+a[s]+"\\b[^>]*>",l="";-1!==(c=x.helper.regexIndexOf(e,o));){var c=x.helper.splitAtIndex(e,c),u=x.helper.replaceRecursiveRegExp(c[1],t,i,l,"im");if(u===c[1])break;e=c[0].concat(u)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,x.subParser("hashElement")(e,r,n)),e=(e=x.helper.replaceRecursiveRegExp(e,function(e){return"\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n"},"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,x.subParser("hashElement")(e,r,n)),e=n.converter._dispatch("hashHTMLBlocks.after",e,r,n)}),x.subParser("hashHTMLSpans",function(e,r,t){"use strict";function a(e){return"¨C"+(t.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=t.converter._dispatch("hashHTMLSpans.before",e,r,t)).replace(/<[^>]+?\/>/gi,a)).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,a)).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,a)).replace(/<[^>]+?>/gi,a),e=t.converter._dispatch("hashHTMLSpans.after",e,r,t)}),x.subParser("unhashHTMLSpans",function(e,r,t){"use strict";e=t.converter._dispatch("unhashHTMLSpans.before",e,r,t);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
    ","gim"),e=s.converter._dispatch("hashPreCodeTags.after",e,n,s)}),x.subParser("headers",function(e,n,s){"use strict";e=s.converter._dispatch("headers.before",e,n,s);var o=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),r=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,t=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm,r=(e=(e=e.replace(r,function(e,r){var t=x.subParser("spanGamut")(r,n,s),r=n.noHeaderId?"":' id="'+i(r)+'"',r=""+t+"";return x.subParser("hashBlock")(r,n,s)})).replace(t,function(e,r){var t=x.subParser("spanGamut")(r,n,s),r=n.noHeaderId?"":' id="'+i(r)+'"',a=o+1,r=""+t+"";return x.subParser("hashBlock")(r,n,s)}),n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm);function i(e){var r=e=n.customizedHeaderId&&(r=e.match(/\{([^{]+?)}\s*$/))&&r[1]?r[1]:e,e=x.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"";return n.rawPrefixHeaderId||(r=e+r),r=(n.ghCompatibleHeaderId?r.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,""):n.rawHeaderId?r.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-"):r.replace(/[^\w]/g,"")).toLowerCase(),n.rawPrefixHeaderId&&(r=e+r),s.hashLinkCounts[r]?r=r+"-"+s.hashLinkCounts[r]++:s.hashLinkCounts[r]=1,r}return e=e.replace(r,function(e,r,t){var a=t,a=(n.customizedHeaderId&&(a=t.replace(/\s?\{([^{]+?)}\s*$/,"")),x.subParser("spanGamut")(a,n,s)),t=n.noHeaderId?"":' id="'+i(t)+'"',r=o-1+r.length,t=""+a+"";return x.subParser("hashBlock")(t,n,s)}),e=s.converter._dispatch("headers.after",e,n,s)}),x.subParser("horizontalRule",function(e,r,t){"use strict";e=t.converter._dispatch("horizontalRule.before",e,r,t);var a=x.subParser("hashBlock")("
    ",r,t);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,a)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,a)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,a),e=t.converter._dispatch("horizontalRule.after",e,r,t)}),x.subParser("images",function(e,r,d){"use strict";function l(e,r,t,a,n,s,o,i){var l=d.gUrls,c=d.gTitles,u=d.gDimensions;if(t=t.toLowerCase(),i=i||"",-1? ?(['"].*['"])?\)$/m))a="";else if(""===a||null===a){if(a="#"+(t=""!==t&&null!==t?t:r.toLowerCase().replace(/ ?\n/g," ")),x.helper.isUndefined(l[t]))return e;a=l[t],x.helper.isUndefined(c[t])||(i=c[t]),x.helper.isUndefined(u[t])||(n=u[t].width,s=u[t].height)}r=r.replace(/"/g,""").replace(x.helper.regexes.asteriskDashAndColon,x.helper.escapeCharactersCallback);e=''+r+'"}return e=(e=(e=(e=(e=(e=d.converter._dispatch("images.before",e,r,d)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,l)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,function(e,r,t,a,n,s,o,i){return l(e,r,t,a=a.replace(/\s/g,""),n,s,0,i)})).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,l)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,l)).replace(/!\[([^\[\]]+)]()()()()()/g,l),e=d.converter._dispatch("images.after",e,r,d)}),x.subParser("italicsAndBold",function(e,r,t){"use strict";return e=t.converter._dispatch("italicsAndBold.before",e,r,t),e=r.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return""+r+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return""+r+""})).replace(/\b_(\S[\s\S]*?)_\b/g,function(e,r){return""+r+""}):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/_([^\s_][\s\S]*?)_/g,function(e,r){return/\S$/.test(r)?""+r+"":e}),e=r.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,function(e,r,t){return r+""+t+""})).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,function(e,r,t){return r+""+t+""})).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,function(e,r,t){return r+""+t+""}):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/\*\*(\S[\s\S]*?)\*\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/\*([^\s*][\s\S]*?)\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e}),e=t.converter._dispatch("italicsAndBold.after",e,r,t)}),x.subParser("lists",function(e,d,c){"use strict";function p(e,r){c.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var t=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,l=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return d.disableForced4SpacesIndentedSublists&&(t=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(t,function(e,r,t,a,n,s,o){o=o&&""!==o.trim();var n=x.subParser("outdent")(n,d,c),i="";return s&&d.tasklists&&(i=' class="task-list-item" style="list-style-type: none;"',n=n.replace(/^[ \t]*\[(x|X| )?]/m,function(){var e='"+(n=(n=r||-1\n"})).replace(/¨0/g,""),c.gListLevel--,e=r?e.replace(/\s+$/,""):e}function h(e,r){if("ol"===r){r=e.match(/^ *(\d+)\./);if(r&&"1"!==r[1])return' start="'+r[1]+'"'}return""}function n(n,s,o){var e,i=d.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,l=d.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,c="ul"===s?i:l,u="";return-1!==n.search(c)?function e(r){var t=r.search(c),a=h(n,s);-1!==t?(u+="\n\n<"+s+a+">\n"+p(r.slice(0,t),!!o)+"\n",c="ul"===(s="ul"===s?"ol":"ul")?i:l,e(r.slice(t))):u+="\n\n<"+s+a+">\n"+p(r,!!o)+"\n"}(n):(e=h(n,s),u="\n\n<"+s+e+">\n"+p(n,!!o)+"\n"),u}return e=c.converter._dispatch("lists.before",e,d,c),e+="¨0",e=(e=c.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,r,t){return n(r,-1"),i+="

    ",n.push(i))}for(s=n.length,o=0;o]*>\s*]*>/.test(c)&&(u=!0)}n[o]=c}return e=(e=(e=n.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),t.converter._dispatch("paragraphs.after",e,r,t)}),x.subParser("runExtension",function(e,r,t,a){"use strict";return e.filter?r=e.filter(r,a.converter,t):e.regex&&((a=e.regex)instanceof RegExp||(a=new RegExp(a,"g")),r=r.replace(a,e.replace)),r}),x.subParser("spanGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("spanGamut.before",e,r,t),e=x.subParser("codeSpans")(e,r,t),e=x.subParser("escapeSpecialCharsWithinTagAttributes")(e,r,t),e=x.subParser("encodeBackslashEscapes")(e,r,t),e=x.subParser("images")(e,r,t),e=x.subParser("anchors")(e,r,t),e=x.subParser("autoLinks")(e,r,t),e=x.subParser("simplifiedAutoLinks")(e,r,t),e=x.subParser("emoji")(e,r,t),e=x.subParser("underline")(e,r,t),e=x.subParser("italicsAndBold")(e,r,t),e=x.subParser("strikethrough")(e,r,t),e=x.subParser("ellipsis")(e,r,t),e=x.subParser("hashHTMLSpans")(e,r,t),e=x.subParser("encodeAmpsAndAngles")(e,r,t),r.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
    \n")):e=e.replace(/ +\n/g,"
    \n"),e=t.converter._dispatch("spanGamut.after",e,r,t)}),x.subParser("strikethrough",function(e,t,a){"use strict";return t.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,t,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,function(e,r){return r=r,""+(r=t.simplifiedAutoLink?x.subParser("simplifiedAutoLinks")(r,t,a):r)+""}),e=a.converter._dispatch("strikethrough.after",e,t,a)),e}),x.subParser("stripLinkDefinitions",function(i,l,c){"use strict";function e(e,r,t,a,n,s,o){return r=r.toLowerCase(),i.toLowerCase().split(r).length-1<2?e:(t.match(/^data:.+?\/.+?;base64,/)?c.gUrls[r]=t.replace(/\s/g,""):c.gUrls[r]=x.subParser("encodeAmpsAndAngles")(t,l,c),s?s+o:(o&&(c.gTitles[r]=o.replace(/"|'/g,""")),l.parseImgDimensions&&a&&n&&(c.gDimensions[r]={width:a,height:n}),""))}return i=(i=(i=(i+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,e)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,e)).replace(/¨0/,"")}),x.subParser("tables",function(e,y,P){"use strict";if(!y.tables)return e;function r(e){for(var r=e.split("\n"),t=0;t"+(n=x.subParser("spanGamut")(n,y,P))+"\n"));for(t=0;t"+x.subParser("spanGamut")(i,y,P)+"\n"));h.push(_)}for(var m=d,f=h,b="\n\n\n",w=m.length,k=0;k\n\n\n",k=0;k\n";for(var v=0;v\n"}return b+="\n
    \n"}return e=(e=(e=(e=P.converter._dispatch("tables.before",e,y,P)).replace(/\\(\|)/g,x.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,r)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,r),e=P.converter._dispatch("tables.after",e,y,P)}),x.subParser("underline",function(e,r,t){"use strict";return r.underline?(e=t.converter._dispatch("underline.before",e,r,t),e=(e=r.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return""+r+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return""+r+""}):(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/(_)/g,x.helper.escapeCharactersCallback),t.converter._dispatch("underline.after",e,r,t)):e}),x.subParser("unescapeSpecialChars",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("unescapeSpecialChars.before",e,r,t)).replace(/¨E(\d+)E/g,function(e,r){r=parseInt(r);return String.fromCharCode(r)}),e=t.converter._dispatch("unescapeSpecialChars.after",e,r,t)}),x.subParser("makeMarkdown.blockquote",function(e,r){"use strict";var t="";if(e.hasChildNodes())for(var a=e.childNodes,n=a.length,s=0;s ")}),x.subParser("makeMarkdown.codeBlock",function(e,r){"use strict";var t=e.getAttribute("language"),e=e.getAttribute("precodenum");return"```"+t+"\n"+r.preList[e]+"\n```"}),x.subParser("makeMarkdown.codeSpan",function(e){"use strict";return"`"+e.innerHTML+"`"}),x.subParser("makeMarkdown.emphasis",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="*";for(var a=e.childNodes,n=a.length,s=0;s",e.hasAttribute("width")&&e.hasAttribute("height")&&(r+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(r+=' "'+e.getAttribute("title")+'"'),r+=")"),r}),x.subParser("makeMarkdown.links",function(e,r){"use strict";var t="";if(e.hasChildNodes()&&e.hasAttribute("href")){for(var a=e.childNodes,n=a.length,t="[",s=0;s"),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"}return t}),x.subParser("makeMarkdown.list",function(e,r,t){"use strict";var a="";if(!e.hasChildNodes())return"";for(var n=e.childNodes,s=n.length,o=e.getAttribute("start")||1,i=0;i"+r.preList[e]+""}),x.subParser("makeMarkdown.strikethrough",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="~~";for(var a=e.childNodes,n=a.length,s=0;str>th"),s=e.querySelectorAll("tbody>tr"),o=0;o/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")});"function"==typeof define&&define.amd?define(function(){"use strict";return x}):"undefined"!=typeof module&&module.exports?module.exports=x:this.showdown=x}.call(this); +//# sourceMappingURL=showdown.min.js.map diff --git a/public/js/ueditor/dialogs/emotion/emotion.css b/public/js/ueditor/dialogs/emotion/emotion.css index f801105..6bfee85 100644 --- a/public/js/ueditor/dialogs/emotion/emotion.css +++ b/public/js/ueditor/dialogs/emotion/emotion.css @@ -1,43 +1,129 @@ -.jd img{ - background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; -} -.pp img{ - background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:25px;height:25px;display:block; -} -.ldw img{ - background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; -} -.tsj img{ - background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; -} -.cat img{ - background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; -} -.bb img{ - background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; -} -.youa img{ - background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; - cursor:pointer;width:35px;height:35px;display:block; +.jd img { + background: transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; } -.smileytable td {height: 37px;} -#tabPanel{margin-left:5px;overflow: hidden;} -#tabContent {float:left;background:#FFFFFF;} -#tabContent div{display: none;width:480px;overflow:hidden;} -#tabIconReview.show{left:17px;display:block;} -.menuFocus{background:#ACCD3C;} -.menuDefault{background:#FFFFFF;} -#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} -img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} +.pp img { + background: transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 25px; + height: 25px; + display: block; +} -.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} -.tabbody table{width: 100%;} -.tabbody td{border:1px solid #BAC498;} -.tabbody td span{display: block;zoom:1;padding:0 4px;} \ No newline at end of file +.ldw img { + background: transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; +} + +.tsj img { + background: transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; +} + +.cat img { + background: transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; +} + +.bb img { + background: transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; +} + +.youa img { + background: transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; + cursor: pointer; + width: 35px; + height: 35px; + display: block; +} + +.smileytable td { + height: 37px; +} + +#tabPanel { + margin-left: 5px; + overflow: hidden; +} + +#tabContent { + float: left; + background: #FFFFFF; +} + +#tabContent div { + display: none; + width: 480px; + overflow: hidden; +} + +#tabIconReview.show { + left: 17px; + display: block; +} + +.menuFocus { + background: #ACCD3C; +} + +.menuDefault { + background: #FFFFFF; +} + +#tabIconReview { + position: absolute; + left: 406px; + left: 398px \9; + top: 41px; + z-index: 65533; + width: 90px; + height: 76px; +} + +img.review { + width: 90px; + height: 76px; + border: 2px solid #9cb945; + background: #FFFFFF; + background-position: center; + background-repeat: no-repeat; +} + +.wrapper .tabbody { + position: relative; + float: left; + clear: both; + padding: 10px; + width: 95%; +} + +.tabbody table { + width: 100%; +} + +.tabbody td { + border: 1px solid #BAC498; +} + +.tabbody td span { + display: block; + zoom: 1; + padding: 0 4px; +} diff --git a/public/js/ueditor/dialogs/emotion/emotion.html b/public/js/ueditor/dialogs/emotion/emotion.html index a33b8f3..a37edd6 100644 --- a/public/js/ueditor/dialogs/emotion/emotion.html +++ b/public/js/ueditor/dialogs/emotion/emotion.html @@ -4,8 +4,8 @@ - - + +
    @@ -31,22 +31,38 @@
    - + diff --git a/public/js/ueditor/dialogs/emotion/emotion.js b/public/js/ueditor/dialogs/emotion/emotion.js index 6e158a9..5e907f0 100644 --- a/public/js/ueditor/dialogs/emotion/emotion.js +++ b/public/js/ueditor/dialogs/emotion/emotion.js @@ -1,73 +1,73 @@ window.onload = function () { editor.setOpt({ - emotionLocalization:false + emotionLocalization: false }); emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; - emotion.SmileyBox = createTabList( emotion.tabNum ); - emotion.tabExist = createArr( emotion.tabNum ); + emotion.SmileyBox = createTabList(emotion.tabNum); + emotion.tabExist = createArr(emotion.tabNum); initImgName(); - initEvtHandler( "tabHeads" ); + initEvtHandler("tabHeads"); }; function initImgName() { - for ( var pro in emotion.SmilmgName ) { + for (var pro in emotion.SmilmgName) { var tempName = emotion.SmilmgName[pro], - tempBox = emotion.SmileyBox[pro], - tempStr = ""; + tempBox = emotion.SmileyBox[pro], + tempStr = ""; - if ( tempBox.length ) return; - for ( var i = 1; i <= tempName[1]; i++ ) { + if (tempBox.length) return; + for (var i = 1; i <= tempName[1]; i++) { tempStr = tempName[0]; - if ( i < 10 ) tempStr = tempStr + '0'; + if (i < 10) tempStr = tempStr + '0'; tempStr = tempStr + i + '.gif'; - tempBox.push( tempStr ); + tempBox.push(tempStr); } } } -function initEvtHandler( conId ) { - var tabHeads = $G( conId ); - for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { +function initEvtHandler(conId) { + var tabHeads = $G(conId); + for (var i = 0, j = 0; i < tabHeads.childNodes.length; i++) { var tabObj = tabHeads.childNodes[i]; - if ( tabObj.nodeType == 1 ) { - domUtils.on( tabObj, "click", (function ( index ) { + if (tabObj.nodeType == 1) { + domUtils.on(tabObj, "click", (function (index) { return function () { - switchTab( index ); + switchTab(index); }; - })( j ) ); + })(j)); j++; } } - switchTab( 0 ); - $G( "tabIconReview" ).style.display = 'none'; + switchTab(0); + $G("tabIconReview").style.display = 'none'; } -function InsertSmiley( url, evt ) { +function InsertSmiley(url, evt) { var obj = { - src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + src: editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url }; obj._src = obj.src; - editor.execCommand( 'insertimage', obj ); - if ( !evt.ctrlKey ) { + editor.execCommand('insertimage', obj); + if (!evt.ctrlKey) { dialog.popup.hide(); } } -function switchTab( index ) { +function switchTab(index) { - autoHeight( index ); - if ( emotion.tabExist[index] == 0 ) { + autoHeight(index); + if (emotion.tabExist[index] == 0) { emotion.tabExist[index] = 1; - createTab( 'tab' + index ); + createTab('tab' + index); } //获取呈现元素句柄数组 - var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), - tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), - i = 0, L = tabHeads.length; + var tabHeads = $G("tabHeads").getElementsByTagName("span"), + tabBodys = $G("tabBodys").getElementsByTagName("div"), + i = 0, L = tabHeads.length; //隐藏所有呈现元素 - for ( ; i < L; i++ ) { + for (; i < L; i++) { tabHeads[i].className = ""; tabBodys[i].style.display = "none"; } @@ -76,10 +76,10 @@ function switchTab( index ) { tabBodys[index].style.display = "block"; } -function autoHeight( index ) { - var iframe = dialog.getDom( "iframe" ), - parent = iframe.parentNode.parentNode; - switch ( index ) { +function autoHeight(index) { + var iframe = dialog.getDom("iframe"), + parent = iframe.parentNode.parentNode; + switch (index) { case 0: iframe.style.height = "380px"; parent.style.height = "392px"; @@ -114,71 +114,71 @@ function autoHeight( index ) { } -function createTab( tabName ) { +function createTab(tabName) { var faceVersion = "?v=1.1", //版本号 - tab = $G( tabName ), //获取将要生成的Div句柄 - imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 - positionLine = 11 / 2, //中间数 - iWidth = iHeight = 35, //图片长宽 - iColWidth = 3, //表格剩余空间的显示比例 - tableCss = emotion.imageCss[tabName], - cssOffset = emotion.imageCssOffset[tabName], - textHTML = [''], - i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, - sUrl, realUrl, posflag, offset, infor; + tab = $G(tabName), //获取将要生成的Div句柄 + imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[tabName], + cssOffset = emotion.imageCssOffset[tabName], + textHTML = ['
    '], + i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; - for ( ; i < imgNum; ) { - textHTML.push( '' ); - for ( var j = 0; j < imgColNum; j++, i++ ) { + for (; i < imgNum;) { + textHTML.push(''); + for (var j = 0; j < imgColNum; j++, i++) { faceImage = emotion.SmileyBox[tabName][i]; - if ( faceImage ) { + if (faceImage) { sUrl = imagePath + faceImage + faceVersion; realUrl = imagePath + faceImage; posflag = j < positionLine ? 0 : 1; offset = cssOffset * i * (-1) - 1; infor = emotion.SmileyInfor[tabName][i]; - textHTML.push( '' ); + textHTML.push(''); } - textHTML.push( '' ); + textHTML.push(''); } - textHTML.push( '
    ' ); - textHTML.push( '' ); - textHTML.push( '' ); - textHTML.push( '' ); + textHTML.push(''); + textHTML.push(''); + textHTML.push(''); + textHTML.push(''); } else { - textHTML.push( '' ); + textHTML.push(''); } - textHTML.push( '
    ' ); - textHTML = textHTML.join( "" ); + textHTML.push(''); + textHTML = textHTML.join(""); tab.innerHTML = textHTML; } -function over( td, srcPath, posFlag ) { +function over(td, srcPath, posFlag) { td.style.backgroundColor = "#ACCD3C"; - $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; - if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; - $G( "tabIconReview" ).style.display = 'block'; + $G('faceReview').style.backgroundImage = "url(" + srcPath + ")"; + if (posFlag == 1) $G("tabIconReview").className = "show"; + $G("tabIconReview").style.display = 'block'; } -function out( td ) { +function out(td) { td.style.backgroundColor = "transparent"; - var tabIconRevew = $G( "tabIconReview" ); + var tabIconRevew = $G("tabIconReview"); tabIconRevew.className = ""; tabIconRevew.style.display = 'none'; } -function createTabList( tabNum ) { +function createTabList(tabNum) { var obj = {}; - for ( var i = 0; i < tabNum; i++ ) { + for (var i = 0; i < tabNum; i++) { obj["tab" + i] = []; } return obj; } -function createArr( tabNum ) { +function createArr(tabNum) { var arr = []; - for ( var i = 0; i < tabNum; i++ ) { + for (var i = 0; i < tabNum; i++) { arr[i] = 0; } return arr; diff --git a/public/js/ueditor/dialogs/formula/formula.html b/public/js/ueditor/dialogs/formula/formula.html index 735fd2b..12294f4 100644 --- a/public/js/ueditor/dialogs/formula/formula.html +++ b/public/js/ueditor/dialogs/formula/formula.html @@ -1,86 +1,98 @@ - - - - + .editor-preview .body .image { + max-width: 100%; + max-height: 100px; + } +
    -
    - -
    -
    - 基于 latex 语法,点击输入示例。 -
    -
    -
    预览
    -
    - + + -
    + + +
    - - - + + + diff --git a/public/js/ueditor/dialogs/formula/formula.js b/public/js/ueditor/dialogs/formula/formula.js index 33809c3..de47bfe 100644 --- a/public/js/ueditor/dialogs/formula/formula.js +++ b/public/js/ueditor/dialogs/formula/formula.js @@ -1,71 +1,147 @@ function preg_quote(str, delimiter) { - // Quote regular expression characters plus an optional character - // - // version: 1107.2516 - // discuss at: http://phpjs.org/functions/preg_quote - // + original by: booeyOH - // + improved by: Ates Goral (http://magnetiq.com) - // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + bugfixed by: Onno Marsman - // + improved by: Brett Zamir (http://brett-zamir.me) - // * example 1: preg_quote("$40"); - // * returns 1: '\$40' - // * example 2: preg_quote("*RRRING* Hello?"); - // * returns 2: '\*RRRING\* Hello\?' - // * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); - // * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:' - return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&'); + // Quote regular expression characters plus an optional character + // + // version: 1107.2516 + // discuss at: http://phpjs.org/functions/preg_quote + // + original by: booeyOH + // + improved by: Ates Goral (http://magnetiq.com) + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Onno Marsman + // + improved by: Brett Zamir (http://brett-zamir.me) + // * example 1: preg_quote("$40"); + // * returns 1: '\$40' + // * example 2: preg_quote("*RRRING* Hello?"); + // * returns 2: '\*RRRING\* Hello\?' + // * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); + // * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:' + return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&'); +} + +function loadScript(url, cb) { + var script; + script = document.createElement('script'); + script.src = url; + script.onload = function () { + cb && cb({isNew: true}) + }; + document.getElementsByTagName('head')[0].appendChild(script); } var Formula = { - init: function () { - // console.log('Formula.init') - Formula.initValue(); - Formula.initEvent(); - Formula.initSubmit(); - }, - render: function () { - var content = $.trim($('#editor').val()); - if (!content) { - $('#preview').hide(); - return; + mode: 'plain', + latexeasy: null, + init: function () { + // console.log('Formula.init') + Formula.initMode(); + Formula.initEvent(); + Formula.initSubmit(); + }, + renderPlain: function () { + var $preview = $('#preview'); + var value = $('#editor').val(); + if (!value) { + $preview.hide(); + return; + } + value = encodeURIComponent(value); + var formulaConfig = editor.getOpt('formulaConfig'); + var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value); + $('#previewImage').attr('src', src); + $preview.show(); + }, + setValuePlain: function (value) { + $('#editor').val(value); + Formula.renderPlain(); + }, + setValueLive: function (value) { + if (!Formula.latexeasy) { + setTimeout(function () { + Formula.setValueLive(value); + }, 100); + return; + } + Formula.latexeasy.call('set.latex', {latex: value}); + }, + initMode: function () { + var formulaConfig = editor.getOpt('formulaConfig'); + if ('live' === formulaConfig.editorMode) { + $('#liveEditor').attr('src', formulaConfig.editorLiveServer + '/editor'); + $('#modeLive').show(); + Formula.mode = 'live'; + } else { + $('#modePlain').show(); + Formula.mode = 'plain'; + } + var img = editor.selection.getRange().getClosedNode(); + if (img && img.getAttribute('data-formula-image') !== null) { + var value = img.getAttribute('data-formula-image'); + if (value) { + Formula.setValue(decodeURIComponent(value)); + } + } + }, + setValue: function (value) { + switch (Formula.mode) { + case 'plain': + Formula.setValuePlain(value); + break; + case 'live': + Formula.setValueLive(value); + break; + } + }, + getValue: function (cb) { + switch (Formula.mode) { + case 'plain': + cb($.trim($('#editor').val())); + break; + case 'live': + Formula.latexeasy.call('get.latex', {}, function (data) { + cb(data.latex); + }); + break; + } + }, + initEvent: function () { + var changeTimer = null, le; + switch (Formula.mode) { + case 'plain': + // console.log('Formula.initEvent'); + $('#editor').on('change keypress', function () { + changeTimer && clearTimeout(changeTimer); + changeTimer = setTimeout(function () { + Formula.renderPlain(); + }, 1000); + }); + $('#inputDemo').on('click', function () { + $('#editor').val('f(a) = \\frac{1}{2\\pi i} \\oint\\frac{f(z)}{z-a}dz'); + Formula.renderPlain(); + }); + break; + case 'live': + var formulaConfig = editor.getOpt('formulaConfig'); + loadScript(formulaConfig.editorLiveServer + '/vendor/LatexEasyEditor/editor/sdk.js', function () { + le = new window.LatexEasy(document.getElementById('liveEditor')); + le.on('ready', function () { + Formula.latexeasy = le; + }); + le.init(); + }); + break; + } + }, + initSubmit: function () { + dialog.onclose = function (t, ok) { + if (!ok) { + return true; + } + // console.log('onclose', t, ok); + Formula.getValue(function (value) { + editor.execCommand('formula', value); + editor.fireEvent('saveScene'); + dialog.close(false); + }); + return false; + }; } - content = encodeURIComponent(content); - var formulaConfig = editor.getOpt('formulaConfig'); - var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, content); - $('#previewImage').attr('src', src); - $('#preview').show(); - }, - initValue: function () { - var img = editor.selection.getRange().getClosedNode(); - if (img && img.getAttribute('data-formula-image') !== null) { - var value = img.getAttribute('data-formula-image'); - if (value) { - $('#editor').val(decodeURIComponent(value)); - Formula.render(); - } - } - }, - initEvent: function () { - var changeTimer = null; - // console.log('Formula.initEvent'); - $('#editor').on('change keypress', function () { - changeTimer && clearTimeout(changeTimer); - changeTimer = setTimeout(function () { - Formula.render(); - }, 1000); - }); - $('#inputDemo').on('click', function () { - $('#editor').val('f(a) = \\frac{1}{2\\pi i} \\oint\\frac{f(z)}{z-a}dz'); - Formula.render(); - }); - }, - initSubmit: function () { - dialog.onok = function () { - editor.execCommand('formula', $.trim($('#editor').val())); - editor.fireEvent('saveScene'); - }; - dialog.oncancel = function () { - }; - } }; diff --git a/public/js/ueditor/dialogs/help/help.css b/public/js/ueditor/dialogs/help/help.css index 4478475..3f48f9d 100644 --- a/public/js/ueditor/dialogs/help/help.css +++ b/public/js/ueditor/dialogs/help/help.css @@ -1,7 +1,37 @@ -.wrapper{width: 370px;margin: 10px auto;zoom: 1;} -.tabbody{height: 360px;} -.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} -.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} -.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} -.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} -.tabbody table thead{font-weight: bold;line-height: 25px;} \ No newline at end of file +.wrapper { + width: 370px; + margin: 10px auto; + zoom: 1; +} + +.tabbody { + height: 360px; +} + +.tabbody .panel { + width: 100%; + height: 360px; + position: absolute; + background: #fff; +} + +.tabbody .panel h1 { + font-size: 26px; + margin: 5px 0 0 5px; +} + +.tabbody .panel p { + font-size: 12px; + margin: 5px 0 0 5px; +} + +.tabbody table { + width: 90%; + line-height: 20px; + margin: 5px 0 0 5px;; +} + +.tabbody table thead { + font-weight: bold; + line-height: 25px; +} diff --git a/public/js/ueditor/dialogs/help/help.html b/public/js/ueditor/dialogs/help/help.html index 2fffafd..6413645 100644 --- a/public/js/ueditor/dialogs/help/help.html +++ b/public/js/ueditor/dialogs/help/help.html @@ -1,11 +1,11 @@ + "http://www.w3.org/TR/html4/loose.dtd"> 帮助 - - + +
    @@ -77,6 +77,6 @@
    - + diff --git a/public/js/ueditor/dialogs/help/help.js b/public/js/ueditor/dialogs/help/help.js index 9a2272e..87e2c6a 100644 --- a/public/js/ueditor/dialogs/help/help.js +++ b/public/js/ueditor/dialogs/help/help.js @@ -11,21 +11,21 @@ * @param tabBodys * @param obj */ -function clickHandler( tabHeads,tabBodys,obj ) { +function clickHandler(tabHeads, tabBodys, obj) { //head样式更改 - for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + for (var k = 0, len = tabHeads.length; k < len; k++) { tabHeads[k].className = ""; } obj.className = "focus"; //body显隐 - var tabSrc = obj.getAttribute( "tabSrc" ); - for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var tabSrc = obj.getAttribute("tabSrc"); + for (var j = 0, length = tabBodys.length; j < length; j++) { var body = tabBodys[j], - id = body.getAttribute( "id" ); - body.onclick = function(){ + id = body.getAttribute("id"); + body.onclick = function () { this.style.zoom = 1; }; - if ( id != tabSrc ) { + if (id != tabSrc) { body.style.zIndex = 1; } else { body.style.zIndex = 200; @@ -38,19 +38,20 @@ function clickHandler( tabHeads,tabBodys,obj ) { * TAB切换 * @param tabParentId tab的父节点ID或者对象本身 */ -function switchTab( tabParentId ) { - var tabElements = $G( tabParentId ).children, +function switchTab(tabParentId) { + var tabElements = $G(tabParentId).children, tabHeads = tabElements[0].children, tabBodys = tabElements[1].children; - for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + for (var i = 0, length = tabHeads.length; i < length; i++) { var head = tabHeads[i]; - if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + if (head.className === "focus") clickHandler(tabHeads, tabBodys, head); head.onclick = function () { - clickHandler(tabHeads,tabBodys,this); + clickHandler(tabHeads, tabBodys, this); } } } + switchTab("helptab"); -document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file +document.getElementById('version').innerHTML = parent.UE.version; diff --git a/public/js/ueditor/dialogs/image/image.css b/public/js/ueditor/dialogs/image/image.css index d494fec..bf35d20 100644 --- a/public/js/ueditor/dialogs/image/image.css +++ b/public/js/ueditor/dialogs/image/image.css @@ -13,8 +13,9 @@ /*tab样式框大小*/ .tabhead { - float:left; + float: left; } + .tabbody { width: 100%; height: 346px; @@ -38,25 +39,26 @@ } /* 图片对齐方式 */ -.alignBar{ - float:right; +.alignBar { + float: right; margin-top: 5px; position: relative; } -.alignBar .algnLabel{ - float:left; +.alignBar .algnLabel { + float: left; height: 20px; line-height: 20px; } -.alignBar #alignIcon{ - zoom:1; +.alignBar #alignIcon { + zoom: 1; _display: inline; display: inline-block; position: relative; } -.alignBar #alignIcon span{ + +.alignBar #alignIcon span { float: left; cursor: pointer; display: block; @@ -66,75 +68,85 @@ margin-left: 3px; background-image: url(./images/alignicon.jpg); } -.alignBar #alignIcon .none-align{ + +.alignBar #alignIcon .none-align { background-position: 0 -18px; } -.alignBar #alignIcon .left-align{ + +.alignBar #alignIcon .left-align { background-position: -20px -18px; } -.alignBar #alignIcon .right-align{ + +.alignBar #alignIcon .right-align { background-position: -40px -18px; } -.alignBar #alignIcon .center-align{ + +.alignBar #alignIcon .center-align { background-position: -60px -18px; } -.alignBar #alignIcon .none-align.focus{ + +.alignBar #alignIcon .none-align.focus { background-position: 0 0; } -.alignBar #alignIcon .left-align.focus{ + +.alignBar #alignIcon .left-align.focus { background-position: -20px 0; } -.alignBar #alignIcon .right-align.focus{ + +.alignBar #alignIcon .right-align.focus { background-position: -40px 0; } -.alignBar #alignIcon .center-align.focus{ + +.alignBar #alignIcon .center-align.focus { background-position: -60px 0; } - - /* 远程图片样式 */ #remote { z-index: 200; } -#remote .top{ +#remote .top { width: 100%; margin-top: 25px; } -#remote .left{ + +#remote .left { display: block; float: left; width: 300px; - height:10px; + height: 10px; } -#remote .right{ + +#remote .right { display: block; float: right; width: 300px; - height:10px; + height: 10px; } -#remote .row{ + +#remote .row { margin-left: 20px; clear: both; height: 40px; } -#remote .row label{ +#remote .row label { text-align: center; width: 50px; - zoom:1; + zoom: 1; _display: inline; - display:inline-block; + display: inline-block; vertical-align: middle; } -#remote .row label.algnLabel{ + +#remote .row label.algnLabel { float: left; } -#remote input.text{ +#remote input.text { width: 150px; padding: 3px 6px; font-size: 14px; @@ -149,52 +161,60 @@ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } + #remote input.text:focus { outline: 0; } -#remote #url{ - width: 400px; - margin-bottom: 2px; + +#remote #url { + width: 400px; + margin-bottom: 2px; } -#remote #imageSelect{ - width: 100px; - display: inline-block; - background: #FFF; - border: 1px solid #EEE; - line-height: 26px; - text-align: center; - color: #333; - text-decoration: none; - border-radius: 3px; - vertical-align: top; + +#remote #imageSelect { + width: 100px; + display: inline-block; + background: #FFF; + border: 1px solid #EEE; + line-height: 26px; + text-align: center; + color: #333; + text-decoration: none; + border-radius: 3px; + vertical-align: top; } + #remote #width, -#remote #height{ +#remote #height { width: 30px; margin-left: 2px; margin-right: 2px; - text-align:center; + text-align: center; } + #remote #border, #remote #vhSpace, -#remote #title{ +#remote #title { width: 180px; margin-right: 5px; } -#remote #lock{ - display:inline-block; - vertical-align: middle; + +#remote #lock { + display: inline-block; + vertical-align: middle; } -#remote #lockicon{ + +#remote #lockicon { zoom: 1; - _display:inline; + _display: inline; display: inline-block; width: 20px; height: 20px; background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; vertical-align: middle; } -#remote #preview{ + +#remote #preview { clear: both; width: 260px; height: 240px; @@ -256,7 +276,7 @@ color: #cccccc; font-size: 18px; position: relative; - top:0; + top: 0; *top: 10px; } @@ -456,7 +476,7 @@ line-height: 28px; width: 100%; z-index: 100; - display:none; + display: none; } #upload .filelist li .success { @@ -478,7 +498,8 @@ border: 1px solid #eeeeee; border-radius: 0; } -#upload .filelist li.filePickerBlock div.webuploader-pick { + +#upload .filelist li.filePickerBlock div.webuploader-pick { width: 100%; height: 100%; margin: 0; @@ -511,7 +532,7 @@ background: url(./images/icons.gif) no-repeat \9; margin: 5px 1px 1px; cursor: pointer; - -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; @@ -519,7 +540,7 @@ } #upload .filelist div.file-panel span.rotateLeft { - display:none; + display: none; background-position: 0 -24px; } @@ -528,7 +549,7 @@ } #upload .filelist div.file-panel span.rotateRight { - display:none; + display: none; background-position: -24px -24px; } @@ -567,6 +588,7 @@ color: #6dbfff; margin: 0 10px 0 0; } + #upload .statusBar .progress span.percentage { width: 0; height: 100%; @@ -575,6 +597,7 @@ background: #1483d8; position: absolute; } + #upload .statusBar .progress span.text { position: relative; z-index: 10; @@ -597,6 +620,7 @@ display: inline-block; float: left; } + #upload .statusBar .btns .webuploader-pick, #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-uploading, @@ -616,6 +640,7 @@ -ms-user-select: none; user-select: none; } + #upload .statusBar .btns .webuploader-pick-hover, #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-uploading:hover, @@ -624,45 +649,48 @@ } #upload .statusBar .btns .uploadBtn, -#upload .statusBar .btns .uploadBtn.state-paused{ +#upload .statusBar .btns .uploadBtn.state-paused { background: #00b7ee; color: #fff; border-color: transparent; } + #upload .statusBar .btns .uploadBtn:hover, -#upload .statusBar .btns .uploadBtn.state-paused:hover{ +#upload .statusBar .btns .uploadBtn.state-paused:hover { background: #00a2d4; } #upload .statusBar .btns .uploadBtn.disabled { pointer-events: none; - filter:alpha(opacity=60); - -moz-opacity:0.6; + filter: alpha(opacity=60); + -moz-opacity: 0.6; -khtml-opacity: 0.6; opacity: 0.6; } - /* 图片管理样式 */ #online { width: 100%; height: 336px; padding: 10px 0 0 0; } -#online #imageList{ + +#online #imageList { width: 100%; height: 100%; overflow-x: hidden; overflow-y: auto; position: relative; } + #online ul { display: block; list-style: none; margin: 0; padding: 0; } + #online li { float: left; display: block; @@ -677,18 +705,21 @@ cursor: pointer; position: relative; } + #online li.clearFloat { float: none; clear: both; display: block; - width:0; - height:0; + width: 0; + height: 0; margin: 0; padding: 0; } + #online li img { cursor: pointer; } + #online li .icon { cursor: pointer; width: 113px; @@ -700,16 +731,19 @@ border: 0; background-repeat: no-repeat; } + #online li .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; } + #online li.selected .icon { background-image: url(images/success.png); - background-image: url(images/success.gif)\9; + background-image: url(images/success.gif) \9; background-position: 75px 75px; } + #online li.selected .icon:hover { width: 107px; height: 107px; diff --git a/public/js/ueditor/dialogs/image/image.html b/public/js/ueditor/dialogs/image/image.html index 7a66c39..e7d513f 100644 --- a/public/js/ueditor/dialogs/image/image.html +++ b/public/js/ueditor/dialogs/image/image.html @@ -3,117 +3,123 @@ ueditor图片对话框 - + - + - - + + - + -
    -
    - - - -
    -
    - - +
    +
    + + + +
    +
    + + - -
    -
    - - -
    -
    -
    - - - -
    -
    -
    -
    - -   px -   px - -
    -
    - - px -
    -
    - - px -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    - - -
    -
    -
    - - - - -
    +
    - +
    + + +
    +
    +
    + + + +
    +
    +
    +
    + +   px +   px + +
    +
    + + px +
    +
    + + px +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + + + + +
    +
    + diff --git a/public/js/ueditor/dialogs/image/image.js b/public/js/ueditor/dialogs/image/image.js index d7d1c62..418cfe0 100644 --- a/public/js/ueditor/dialogs/image/image.js +++ b/public/js/ueditor/dialogs/image/image.js @@ -27,32 +27,32 @@ setTabFocus(target.getAttribute('data-content-id')); }); } - if(!editorOpt.disableUpload){ - $G('tabhead').querySelector('[data-content-id="upload"]').style.display = 'inline-block'; + if (!editorOpt.disableUpload) { + $G('tabhead').querySelector('[data-content-id="upload"]').style.display = 'inline-block'; } - if(!editorOpt.disableOnline){ - $G('tabhead').querySelector('[data-content-id="online"]').style.display = 'inline-block'; + if (!editorOpt.disableOnline) { + $G('tabhead').querySelector('[data-content-id="online"]').style.display = 'inline-block'; } - if(!!editorOpt.selectCallback){ - $G('imageSelect').style.display = 'inline-block'; - domUtils.on($G('imageSelect'), "click", function (e) { - editorOpt.selectCallback(editor,function(info){ - if(info){ - $G('url').value = info.path; - $G('title').value = info.name; - var img = new Image(); - img.onload = function(){ - $G('width').value = img.width; - $G('height').value = img.height; - remoteImage.setPreview(); - }; - img.onerror = function(){ - remoteImage.setPreview(); - }; - img.src = info.path; - } + if (!!editorOpt.selectCallback) { + $G('imageSelect').style.display = 'inline-block'; + domUtils.on($G('imageSelect'), "click", function (e) { + editorOpt.selectCallback(editor, function (info) { + if (info) { + $G('url').value = info.path; + $G('title').value = info.name; + var img = new Image(); + img.onload = function () { + $G('width').value = img.width; + $G('height').value = img.height; + remoteImage.setPreview(); + }; + img.onerror = function () { + remoteImage.setPreview(); + }; + img.src = info.path; + } + }); }); - }); } var img = editor.selection.getRange().getClosedNode(); if (img && img.tagName && img.tagName.toLowerCase() == 'img') { @@ -64,7 +64,7 @@ /* 初始化tabbody */ function setTabFocus(id) { - if(!id) return; + if (!id) return; var i, bodyId, tabs = $G('tabhead').children; for (i = 0; i < tabs.length; i++) { bodyId = tabs[i].getAttribute('data-content-id'); @@ -121,7 +121,7 @@ break; } - if(list) { + if (list) { editor.execCommand('insertimage', list); remote && editor.fireEvent("catchRemoteImage"); } @@ -130,22 +130,22 @@ /* 初始化对其方式的点击事件 */ - function initAlign(){ + function initAlign() { /* 点击align图标 */ - domUtils.on($G("alignIcon"), 'click', function(e){ + domUtils.on($G("alignIcon"), 'click', function (e) { var target = e.target || e.srcElement; - if(target.className && target.className.indexOf('-align') != -1) { + if (target.className && target.className.indexOf('-align') != -1) { setAlign(target.getAttribute('data-align')); } }); } /* 设置对齐方式 */ - function setAlign(align){ + function setAlign(align) { align = align || 'none'; var aligns = $G("alignIcon").children; - for(i = 0; i < aligns.length; i++){ - if(aligns[i].getAttribute('data-align') == align) { + for (i = 0; i < aligns.length; i++) { + if (aligns[i].getAttribute('data-align') == align) { domUtils.addClass(aligns[i], 'focus'); $G("align").value = aligns[i].getAttribute('data-align'); } else { @@ -153,10 +153,11 @@ } } } + /* 获取对齐方式 */ - function getAlign(){ + function getAlign() { var align = $G("align").value || 'none'; - return align == 'none' ? '':align; + return align == 'none' ? '' : align; } @@ -165,6 +166,7 @@ this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } + RemoteImage.prototype = { init: function () { this.initContainer(); @@ -194,38 +196,38 @@ domUtils.on($G("border"), 'keyup', updatePreview); domUtils.on($G("title"), 'keyup', updatePreview); - domUtils.on($G("width"), 'keyup', function(){ - if(locker.checked) { - var proportion =locker.getAttribute('data-proportion'); + domUtils.on($G("width"), 'keyup', function () { + if (locker.checked) { + var proportion = locker.getAttribute('data-proportion'); $G('height').value = Math.round(this.value / proportion); } else { _this.updateLocker(); } updatePreview(); }); - domUtils.on($G("height"), 'keyup', function(){ - if(locker.checked) { - var proportion =locker.getAttribute('data-proportion'); + domUtils.on($G("height"), 'keyup', function () { + if (locker.checked) { + var proportion = locker.getAttribute('data-proportion'); $G('width').value = Math.round(this.value * proportion); } else { _this.updateLocker(); } updatePreview(); }); - domUtils.on($G("lock"), 'change', function(){ - var proportion = parseInt($G("width").value) /parseInt($G("height").value); + domUtils.on($G("lock"), 'change', function () { + var proportion = parseInt($G("width").value) / parseInt($G("height").value); locker.setAttribute('data-proportion', proportion); }); - function updatePreview(){ + function updatePreview() { _this.setPreview(); } }, - updateLocker: function(){ + updateLocker: function () { var width = $G('width').value, height = $G('height').value, locker = $G('lock'); - if(width && height && width == parseInt(width) && height == parseInt(height)) { + if (width && height && width == parseInt(width) && height == parseInt(height)) { locker.disabled = false; locker.title = ''; } else { @@ -234,7 +236,7 @@ locker.title = lang.remoteLockError; } }, - setImage: function(img){ + setImage: function (img) { /* 不是正常的图片 */ if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; @@ -244,7 +246,7 @@ /* 防止onchange事件循环调用 */ if (src !== $G("url").value) $G("url").value = src; - if(src) { + if (src) { /* 设置表单内容 */ $G("width").value = img.width || ''; $G("height").value = img.height || ''; @@ -256,14 +258,14 @@ this.updateLocker(); } }, - getData: function(){ + getData: function () { var data = {}; - for(var k in this.dom){ + for (var k in this.dom) { data[k] = this.dom[k].value; } return data; }, - setPreview: function(){ + setPreview: function () { var url = $G('url').value, ow = $G('width').value, oh = $G('height').value, @@ -273,59 +275,59 @@ width, height; - width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth)); - width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2)); - height = (!ow || !oh) ? '':width*oh/ow; + width = ((!ow || !oh) ? preview.offsetWidth : Math.min(ow, preview.offsetWidth)); + width = width + (border * 2) > preview.offsetWidth ? width : (preview.offsetWidth - (border * 2)); + height = (!ow || !oh) ? '' : width * oh / ow; - if(url) { + if (url) { preview.innerHTML = ''; } }, getInsertList: function () { var data = this.getData(); - if(data['url']) { + if (data['url']) { var img = { - src: data['url'], - _src: data['url'], + src: data['url'], + _src: data['url'], } img._propertyDelete = [] img.style = [] - if(data['width']){ - img.width = data['width']; - img.style.push('width:'+data['width']+'px'); - }else{ - img._propertyDelete.push('width'); + if (data['width']) { + img.width = data['width']; + img.style.push('width:' + data['width'] + 'px'); + } else { + img._propertyDelete.push('width'); } - if(data['height']){ - img.height = data['height']; - img.style.push('height:'+data['height']+'px'); - }else{ - img._propertyDelete.push('height'); + if (data['height']) { + img.height = data['height']; + img.style.push('height:' + data['height'] + 'px'); + } else { + img._propertyDelete.push('height'); } - if(data['border']){ - img.border = data['border']; - }else{ - img._propertyDelete.push('border'); + if (data['border']) { + img.border = data['border']; + } else { + img._propertyDelete.push('border'); } - if(data['align']){ - img.floatStyle = data['align']; - }else{ - img._propertyDelete.push('floatStyle'); + if (data['align']) { + img.floatStyle = data['align']; + } else { + img._propertyDelete.push('floatStyle'); } - if(data['vhSpace']){ - img.vspace = data['vhSpace']; - }else{ - img._propertyDelete.push('vspace'); + if (data['vhSpace']) { + img.vspace = data['vhSpace']; + } else { + img._propertyDelete.push('vspace'); } - if(data['title']){ - img.alt = data['title']; - }else{ - img._propertyDelete.push('alt'); + if (data['title']) { + img.alt = data['title']; + } else { + img._propertyDelete.push('alt'); } - if(img.style.length> 0){ - img.style = img.style.join(';'); - }else{ - img._propertyDelete.push('style'); + if (img.style.length > 0) { + img.style = img.style.join(';'); + } else { + img._propertyDelete.push('style'); } return [img]; } else { @@ -335,12 +337,12 @@ }; - /* 上传图片 */ function UploadImage(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } + UploadImage.prototype = { init: function () { this.imageList = []; @@ -355,34 +357,34 @@ var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, - // 图片容器 + // 图片容器 $queue = $wrap.find('.filelist'), - // 状态栏,包括进度和控制按钮 + // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), - // 文件总体选择信息。 + // 文件总体选择信息。 $info = $statusBar.find('.info'), - // 上传按钮 + // 上传按钮 $upload = $wrap.find('.uploadBtn'), - // 上传按钮 + // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), - // 上传按钮 + // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), - // 没选择文件之前的内容。 + // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), - // 总体进度条 + // 总体进度条 $progress = $statusBar.find('.progress').hide(), - // 添加的文件数量 + // 添加的文件数量 fileCount = 0, - // 添加的文件总大小 + // 添加的文件总大小 fileSize = 0, - // 优化retina, 在retina下这个值是2 + // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, - // 缩略图大小 + // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, - // 可能有pedding, ready, uploading, confirm, done. + // 可能有pedding, ready, uploading, confirm, done. state = '', - // 所有文件的进度信息,key为file id + // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, @@ -394,7 +396,7 @@ s = null; return r; })(), - // WebUploader实例 + // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), @@ -409,7 +411,7 @@ return; } - uploader = _this.uploader = WebUploader.create({ + var uploaderOption = { pick: { id: '#filePickerReady', label: lang.uploadSelectFile @@ -425,19 +427,32 @@ duplicate: true, fileSingleSizeLimit: imageMaxSize, // 默认 2 M threads: 1, + headers: editor.getOpt('serverHeaders') || {}, compress: editor.getOpt('imageCompressEnable') ? { - width: imageCompressBorder, - height: imageCompressBorder, - // 图片质量,只有type为`image/jpeg`的时候才有效。 - quality: 90, - // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - allowMagnify: false, - // 是否允许裁剪。 - crop: false, - // 是否保留头部meta信息。 - preserveHeaders: true - }:false - }); + enable: editor.getOpt('imageCompressEnable'), + maxWidthOrHeight: imageCompressBorder, + maxSize: imageMaxSize, + } : false + }; + if(editor.getOpt('uploadServiceEnable')) { + uploaderOption.customUpload = function (file, callback) { + editor.getOpt('uploadServiceUpload')('image', file, { + success: function( res ) { + callback.onSuccess(file, {_raw:JSON.stringify(res)}); + }, + error: function( err ) { + callback.onError(file, err); + }, + progress: function( percent ) { + callback.onProgress(file, percent); + } + }, { + from: 'image' + }); + }; + } + + uploader = _this.uploader = WebUploader.create(uploaderOption); uploader.addButton({ id: '#filePickerBlock' }); @@ -451,15 +466,15 @@ // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('
  • ' + - '

    ' + file.name + '

    ' + - '

    ' + - '

    ' + - '
  • '), + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + ''), $btns = $('
    ' + - '' + lang.uploadDelete + '' + - '' + lang.uploadTurnRight + '' + - '' + lang.uploadTurnLeft + '
    ').appendTo($li), + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('

    ').hide().appendTo($li), @@ -504,7 +519,7 @@ } }, thumbnailWidth, thumbnailHeight); } - percentages[ file.id ] = [ file.size, 0 ]; + percentages[file.id] = [file.size, 0]; file.rotation = 0; /* 检查文件格式 */ @@ -524,11 +539,11 @@ // 成功 if (cur === 'error' || cur === 'invalid') { showError(file.statusText); - percentages[ file.id ][ 1 ] = 1; + percentages[file.id][1] = 1; } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { - percentages[ file.id ][ 1 ] = 0; + percentages[file.id][1] = 0; } else if (cur === 'progress') { $info.hide(); $prgress.css('display', 'block'); @@ -581,7 +596,7 @@ // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); - delete percentages[ file.id ]; + delete percentages[file.id]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } @@ -593,8 +608,8 @@ percent; $.each(percentages, function (k, v) { - total += v[ 0 ]; - loaded += v[ 0 ] * v[ 1 ]; + total += v[0]; + loaded += v[0] * v[1]; }); percent = total ? loaded / total : 0; @@ -606,7 +621,7 @@ function setState(val, files) { - if (val != state) { + if (val !== state) { var stats = uploader.getStats(); @@ -620,7 +635,8 @@ $queue.addClass('element-invisible'); $statusBar.addClass('element-invisible'); $placeHolder.removeClass('element-invisible'); - $progress.hide(); $info.hide(); + $progress.hide(); + $info.hide(); uploader.refresh(); break; @@ -629,25 +645,29 @@ $placeHolder.addClass('element-invisible'); $queue.removeClass('element-invisible'); $statusBar.removeClass('element-invisible'); - $progress.hide(); $info.show(); + $progress.hide(); + $info.show(); $upload.text(lang.uploadStart); uploader.refresh(); break; /* 上传中 */ case 'uploading': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadPause); break; /* 暂停上传 */ case 'paused': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadContinue); break; case 'confirm': - $progress.show(); $info.hide(); + $progress.show(); + $info.hide(); $upload.text(lang.uploadStart); stats = uploader.getStats(); @@ -658,7 +678,8 @@ break; case 'finish': - $progress.hide(); $info.show(); + $progress.hide(); + $info.show(); if (stats.uploadFailNum) { $upload.text(lang.uploadRetry); } else { @@ -692,9 +713,7 @@ } } else { stats = uploader.getStats(); - text = lang.updateStatusFinish.replace('_', fileCount). - replace('_KB', WebUploader.formatSize(fileSize)). - replace('_', stats.successNum); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); if (stats.uploadFailNum) { text += lang.updateStatusError.replace('_', stats.uploadFailNum); @@ -741,7 +760,7 @@ case 'startUpload': /* 添加额外的GET参数 */ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', - url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); uploader.option('server', url); setState('uploading', files); break; @@ -763,7 +782,7 @@ $percent = $li.find('.progress span'); $percent.css('width', percentage * 100 + '%'); - percentages[ file.id ][ 1 ] = percentage; + percentages[file.id][1] = percentage; updateTotalProgress(); }); @@ -772,9 +791,15 @@ try { var responseText = (ret._raw || ret), json = utils.str2json(responseText); + json = editor.options.serverResponsePrepare(json); if (json.state == 'SUCCESS') { _this.imageList.push(json); $file.append(''); + // 触发上传图片事件 + editor.fireEvent("uploadsuccess", { + res: json, + type: 'image' + }); } else { $file.find('.error').text(json.state).show(); } @@ -785,9 +810,11 @@ uploader.on('uploadError', function (file, code) { }); - uploader.on('error', function (code, file) { - if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { - addFile(file); + uploader.on('error', function (code, param1, param2) { + if (code === 'F_EXCEED_SIZE') { + editor.getOpt('tipError')(lang.errorExceedSize + ' ' + (param1 / 1024 / 1024).toFixed(1) + 'MB'); + } else { + console.log('error', code, param1, param2); } }); uploader.on('uploadComplete', function (file, ret) { @@ -812,7 +839,7 @@ }, getQueueCount: function () { var file, i, status, readyFile = 0, files = this.uploader.getFiles(); - for (i = 0; file = files[i++]; ) { + for (i = 0; file = files[i++];) { status = file.getStatus(); if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; } @@ -844,6 +871,7 @@ this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } + OnlineImage.prototype = { init: function () { this.reset(); @@ -866,7 +894,7 @@ var _this = this; /* 滚动拉取图片 */ - domUtils.on($G('imageList'), 'scroll', function(e){ + domUtils.on($G('imageList'), 'scroll', function (e) { var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getImageData(); @@ -899,7 +927,7 @@ this.getImageData(); }, /* 重置界面 */ - reset: function() { + reset: function () { this.initContainer(); this.initData(); }, @@ -907,13 +935,14 @@ getImageData: function () { var _this = this; - if(!_this.listEnd && !this.isLoadingData) { + if (!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), isJsonp = utils.isCrossDomainUrl(url); ajax.request(url, { 'timeout': 100000, - 'dataType': isJsonp ? 'jsonp':'', + 'dataType': isJsonp ? 'jsonp' : '', + 'headers': editor.options.serverHeaders || {}, 'data': utils.extend({ start: this.listIndex, size: this.listSize @@ -921,17 +950,18 @@ 'method': 'get', 'onsuccess': function (r) { try { - var json = isJsonp ? r:eval('(' + r.responseText + ')'); - if (json.state == 'SUCCESS') { + var json = isJsonp ? r : eval('(' + r.responseText + ')'); + json = editor.options.serverResponsePrepare(json); + if (json.state === 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); - if(_this.listIndex >= json.total) { + if (_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); @@ -951,18 +981,18 @@ var i, item, img, icon, _this = this, urlPrefix = editor.getOpt('imageManagerUrlPrefix'); for (i = 0; i < list.length; i++) { - if(list[i] && list[i].url) { + if (list[i] && list[i].url) { item = document.createElement('li'); img = document.createElement('img'); icon = document.createElement('span'); - domUtils.on(img, 'load', (function(image){ - return function(){ + domUtils.on(img, 'load', (function (image) { + return function () { _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); } })(img)); img.width = 113; - img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); img.setAttribute('_src', urlPrefix + list[i].url); domUtils.addClass(icon, 'icon'); diff --git a/public/js/ueditor/dialogs/insertframe/insertframe.html b/public/js/ueditor/dialogs/insertframe/insertframe.html index 0d23658..de0e375 100644 --- a/public/js/ueditor/dialogs/insertframe/insertframe.html +++ b/public/js/ueditor/dialogs/insertframe/insertframe.html @@ -3,96 +3,132 @@ - + +
    - - - - - - +
    - - -
    px
    + + + + + - - - - - - - - + + + + + + + + - - - -
    + + +
    + px +
    px
    px +
    - -
    + + + + + +
    diff --git a/public/js/ueditor/dialogs/internal.js b/public/js/ueditor/dialogs/internal.js index 44dc17f..e1eec2c 100644 --- a/public/js/ueditor/dialogs/internal.js +++ b/public/js/ueditor/dialogs/internal.js @@ -1,7 +1,7 @@ (function () { var parent = window.parent; //dialog对象 - dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; + dialog = parent.$EDITORUI[window.frameElement.id.replace(/_iframe$/, '')]; //当前打开dialog的编辑器实例 editor = dialog.editor; @@ -15,65 +15,65 @@ ajax = UE.ajax; - $G = function ( id ) { - return document.getElementById( id ) + $G = function (id) { + return document.getElementById(id) }; //focus元素 - $focus = function ( node ) { - setTimeout( function () { - if ( browser.ie ) { + $focus = function (node) { + setTimeout(function () { + if (browser.ie) { var r = node.createTextRange(); - r.collapse( false ); + r.collapse(false); r.select(); } else { node.focus() } - }, 0 ) + }, 0) }; - utils.loadFile(document,{ - href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), - tag:"link", - type:"text/css", - rel:"stylesheet" + utils.loadFile(document, { + href: editor.options.themePath + editor.options.theme + "/dialogbase.css?cache=" + Math.random(), + tag: "link", + type: "text/css", + rel: "stylesheet" }); - lang = editor.getLang(dialog.className.split( "-" )[2]); - if(lang){ - domUtils.on(window,'load',function () { + lang = editor.getLang(dialog.className.split("-")[2]); + if (lang) { + domUtils.on(window, 'load', function () { var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; //针对静态资源 - for ( var i in lang["static"] ) { - var dom = $G( i ); - if(!dom) continue; + for (var i in lang["static"]) { + var dom = $G(i); + if (!dom) continue; var tagName = dom.tagName, content = lang["static"][i]; - if(content.src){ + if (content.src) { //clone - content = utils.extend({},content,false); + content = utils.extend({}, content, false); content.src = langImgPath + content.src; } - if(content.style){ - content = utils.extend({},content,false); - content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath) + if (content.style) { + content = utils.extend({}, content, false); + content.style = content.style.replace(/url\s*\(/g, "url(" + langImgPath) } - switch ( tagName.toLowerCase() ) { + switch (tagName.toLowerCase()) { case "var": - dom.parentNode.replaceChild( document.createTextNode( content ), dom ); + dom.parentNode.replaceChild(document.createTextNode(content), dom); break; case "select": var ops = dom.options; - for ( var j = 0, oj; oj = ops[j]; ) { + for (var j = 0, oj; oj = ops[j];) { oj.innerHTML = content.options[j++]; } - for ( var p in content ) { - p != "options" && dom.setAttribute( p, content[p] ); + for (var p in content) { + p != "options" && dom.setAttribute(p, content[p]); } break; default : - domUtils.setAttributes( dom, content); + domUtils.setAttributes(dom, content); } } - } ); + }); } diff --git a/public/js/ueditor/dialogs/link/link.html b/public/js/ueditor/dialogs/link/link.html index 9c0a3d6..e75e685 100644 --- a/public/js/ueditor/dialogs/link/link.html +++ b/public/js/ueditor/dialogs/link/link.html @@ -1,127 +1,148 @@ + "http://www.w3.org/TR/html4/loose.dtd"> - + -
    - +
    +
    - - + + - - + + - - + + - + - + -
    - - - + + +
    -
    + +
    - - - - -
    - -
    - - + + #preview { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + } + + #preview * { + font-family: sans-serif; + font-size: 16px; + } + + + + + + +
    + +
    + + diff --git a/public/js/ueditor/dialogs/scrawl/scrawl.css b/public/js/ueditor/dialogs/scrawl/scrawl.css index b18430d..4a4c1b3 100644 --- a/public/js/ueditor/dialogs/scrawl/scrawl.css +++ b/public/js/ueditor/dialogs/scrawl/scrawl.css @@ -1,72 +1,324 @@ /*common */ -body{margin: 0;} -table{width:100%;} -table td{padding:2px 4px;vertical-align: middle;} -a{text-decoration: none;} -em{font-style: normal;} -.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +body { + margin: 0; +} + +table { + width: 100%; +} + +table td { + padding: 2px 4px; + vertical-align: middle; +} + +a { + text-decoration: none; +} + +em { + font-style: normal; +} + +.border_style1 { + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 2px 2px 5px #d3d6da; +} + /*module */ -.main{margin: 8px;overflow: hidden;} +.main { + margin: 8px; + overflow: hidden; +} -.hot{float:left;height:335px;} -.drawBoard{position: relative; cursor: crosshair;} -.brushBorad{position: absolute;left:0;top:0;z-index: 998;} -.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} -.operateBar{margin-top:10px;font-size:12px;text-align: center;} -.operateBar span{margin-left: 10px;} +.hot { + float: left; + height: 335px; +} -.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} -.colorBar{margin-top:10px;font-size: 12px;text-align: center;} -.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} -.sectionBar{margin-top:15px;font-size: 12px;text-align: center;} -.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} -.size1{background: url('images/size.png') 1px center no-repeat ;} -.size2{background: url('images/size.png') -10px center no-repeat;} -.size3{background: url('images/size.png') -22px center no-repeat;} -.size4{background: url('images/size.png') -35px center no-repeat;} +.drawBoard { + position: relative; + cursor: crosshair; +} + +.brushBorad { + position: absolute; + left: 0; + top: 0; + z-index: 998; +} + +.picBoard { + border: none; + text-align: center; + line-height: 300px; + cursor: default; +} + +.operateBar { + margin-top: 10px; + font-size: 12px; + text-align: center; +} + +.operateBar span { + margin-left: 10px; +} + +.drawToolbar { + float: right; + width: 110px; + height: 300px; + overflow: hidden; +} + +.colorBar { + margin-top: 10px; + font-size: 12px; + text-align: center; +} + +.colorBar a { + display: block; + width: 10px; + height: 10px; + border: 1px solid #1006F1; + border-radius: 3px; + box-shadow: 2px 2px 5px #d3d6da; + opacity: 0.3 +} + +.sectionBar { + margin-top: 15px; + font-size: 12px; + text-align: center; +} + +.sectionBar a { + display: inline-block; + width: 10px; + height: 12px; + color: #888; + text-indent: -999px; + opacity: 0.3 +} + +.size1 { + background: url('images/size.png') 1px center no-repeat; +} + +.size2 { + background: url('images/size.png') -10px center no-repeat; +} + +.size3 { + background: url('images/size.png') -22px center no-repeat; +} + +.size4 { + background: url('images/size.png') -35px center no-repeat; +} + +.addImgH { + position: relative; +} + +.addImgH_form { + position: absolute; + left: 18px; + top: -1px; + width: 75px; + height: 21px; + opacity: 0; + cursor: pointer; +} + +.addImgH_form input { + width: 100%; +} -.addImgH{position: relative;} -.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} -.addImgH_form input{width: 100%;} /*scrawl遮罩层 */ -.maskLayerNull{display: none;} -.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; - background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} +.maskLayerNull { + display: none; +} + +.maskLayer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.7; + background-color: #fff; + text-align: center; + font-weight: bold; + line-height: 300px; + z-index: 1000; +} + /*btn state */ -.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} -.previousStepH .text{color:#888;cursor:pointer;} -.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} -.previousStep .text{color:#ccc;cursor:default;} +.previousStepH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/undoH.png'); + cursor: pointer; +} -.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} -.nextStepH .text{color:#888;cursor:pointer;} -.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} -.nextStep .text{color:#ccc;cursor:default;} +.previousStepH .text { + color: #888; + cursor: pointer; +} -.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} -.clearBoardH .text{color:#888;cursor:pointer;} -.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} -.clearBoard .text{color:#ccc;cursor:default;} +.previousStep .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/undo.png'); + cursor: default; +} -.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} -.scaleBoardH .text{color:#888;cursor:pointer;} -.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} -.scaleBoard .text{color:#ccc;cursor:default;} +.previousStep .text { + color: #ccc; + cursor: default; +} -.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} -.removeImgH .text{color:#888;cursor:pointer;} -.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} -.removeImg .text{color:#ccc;cursor:default;} +.nextStepH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/redoH.png'); + cursor: pointer; +} + +.nextStepH .text { + color: #888; + cursor: pointer; +} + +.nextStep .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/redo.png'); + cursor: default; +} + +.nextStep .text { + color: #ccc; + cursor: default; +} + +.clearBoardH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/emptyH.png'); + cursor: pointer; +} + +.clearBoardH .text { + color: #888; + cursor: pointer; +} + +.clearBoard .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/empty.png'); + cursor: default; +} + +.clearBoard .text { + color: #ccc; + cursor: default; +} + +.scaleBoardH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/scaleH.png'); + cursor: pointer; +} + +.scaleBoardH .text { + color: #888; + cursor: pointer; +} + +.scaleBoard .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/scale.png'); + cursor: default; +} + +.scaleBoard .text { + color: #ccc; + cursor: default; +} + +.removeImgH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/delimgH.png'); + cursor: pointer; +} + +.removeImgH .text { + color: #888; + cursor: pointer; +} + +.removeImg .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/delimg.png'); + cursor: default; +} + +.removeImg .text { + color: #ccc; + cursor: default; +} + +.addImgH .icon { + vertical-align: top; + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/addimg.png') +} + +.addImgH .text { + color: #888; + cursor: pointer; +} -.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} -.addImgH .text{color:#888;cursor:pointer;} /*icon */ -.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} -.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} +.brushIcon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/brush.png') +} + +.eraserIcon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/eraser.png') +} diff --git a/public/js/ueditor/dialogs/scrawl/scrawl.html b/public/js/ueditor/dialogs/scrawl/scrawl.html index 4f2551a..ab67687 100644 --- a/public/js/ueditor/dialogs/scrawl/scrawl.html +++ b/public/js/ueditor/dialogs/scrawl/scrawl.html @@ -4,8 +4,8 @@ - - + +
    @@ -70,21 +70,21 @@
    - + +
    - - + + - + @@ -73,29 +100,29 @@
    : :
    - +
    - - + +
    - - + + - + - - + + @@ -112,6 +139,6 @@ - + diff --git a/public/js/ueditor/dialogs/searchreplace/searchreplace.js b/public/js/ueditor/dialogs/searchreplace/searchreplace.js index 02fa46c..c0ce80a 100644 --- a/public/js/ueditor/dialogs/searchreplace/searchreplace.js +++ b/public/js/ueditor/dialogs/searchreplace/searchreplace.js @@ -9,6 +9,7 @@ //清空上次查选的痕迹 editor.firstForSR = 0; editor.currentRangeForSR = null; + //给tab注册切换事件 /** * tab点击处理事件 @@ -16,18 +17,18 @@ editor.currentRangeForSR = null; * @param tabBodys * @param obj */ -function clickHandler( tabHeads,tabBodys,obj ) { +function clickHandler(tabHeads, tabBodys, obj) { //head样式更改 - for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + for (var k = 0, len = tabHeads.length; k < len; k++) { tabHeads[k].className = ""; } obj.className = "focus"; //body显隐 - var tabSrc = obj.getAttribute( "tabSrc" ); - for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var tabSrc = obj.getAttribute("tabSrc"); + for (var j = 0, length = tabBodys.length; j < length; j++) { var body = tabBodys[j], - id = body.getAttribute( "id" ); - if ( id != tabSrc ) { + id = body.getAttribute("id"); + if (id != tabSrc) { body.style.zIndex = 1; } else { body.style.zIndex = 200; @@ -40,27 +41,30 @@ function clickHandler( tabHeads,tabBodys,obj ) { * TAB切换 * @param tabParentId tab的父节点ID或者对象本身 */ -function switchTab( tabParentId ) { - var tabElements = $G( tabParentId ).children, +function switchTab(tabParentId) { + var tabElements = $G(tabParentId).children, tabHeads = tabElements[0].children, tabBodys = tabElements[1].children; - for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + for (var i = 0, length = tabHeads.length; i < length; i++) { var head = tabHeads[i]; - if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + if (head.className === "focus") clickHandler(tabHeads, tabBodys, head); head.onclick = function () { - clickHandler(tabHeads,tabBodys,this); + clickHandler(tabHeads, tabBodys, this); } } } -$G('searchtab').onmousedown = function(){ + +$G('searchtab').onmousedown = function () { $G('search-msg').innerHTML = ''; $G('replace-msg').innerHTML = '' } + //是否区分大小写 function getMatchCase(id) { return $G(id).checked ? true : false; } + //查找 $G("nextFindBtn").onclick = function (txt, dir, mcase) { var findtxt = $G("findtxt").value, obj; @@ -68,9 +72,9 @@ $G("nextFindBtn").onclick = function (txt, dir, mcase) { return false; } obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase") + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase") }; if (!frCommond(obj)) { var bk = editor.selection.getRange().createBookmark(); @@ -86,9 +90,9 @@ $G("nextReplaceBtn").onclick = function (txt, dir, mcase) { return false; } obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase1") + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase1") }; frCommond(obj); }; @@ -98,9 +102,9 @@ $G("preFindBtn").onclick = function (txt, dir, mcase) { return false; } obj = { - searchStr:findtxt, - dir:-1, - casesensitive:getMatchCase("matchCase") + searchStr: findtxt, + dir: -1, + casesensitive: getMatchCase("matchCase") }; if (!frCommond(obj)) { $G('search-msg').innerHTML = lang.getStart; @@ -112,9 +116,9 @@ $G("preReplaceBtn").onclick = function (txt, dir, mcase) { return false; } obj = { - searchStr:findtxt, - dir:-1, - casesensitive:getMatchCase("matchCase1") + searchStr: findtxt, + dir: -1, + casesensitive: getMatchCase("matchCase1") }; frCommond(obj); }; @@ -130,10 +134,10 @@ $G("repalceBtn").onclick = function () { return false; } obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase1"), - replaceStr:replacetxt + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase1"), + replaceStr: replacetxt }; frCommond(obj); }; @@ -148,10 +152,10 @@ $G("repalceAllBtn").onclick = function () { return false; } obj = { - searchStr:findtxt, - casesensitive:getMatchCase("matchCase1"), - replaceStr:replacetxt, - all:true + searchStr: findtxt, + casesensitive: getMatchCase("matchCase1"), + replaceStr: replacetxt, + all: true }; var num = frCommond(obj); if (num) { @@ -165,6 +169,6 @@ var frCommond = function (obj) { switchTab("searchtab"); -dialog.onclose = function(){ +dialog.onclose = function () { editor.trigger('clearLastSearchResult') -}; \ No newline at end of file +}; diff --git a/public/js/ueditor/dialogs/spechars/spechars.html b/public/js/ueditor/dialogs/spechars/spechars.html index 9eb952d..3e72035 100644 --- a/public/js/ueditor/dialogs/spechars/spechars.html +++ b/public/js/ueditor/dialogs/spechars/spechars.html @@ -1,21 +1,42 @@ + "http://www.w3.org/TR/html4/loose.dtd"> - + -
    -
    -
    - +
    +
    +
    +
    + diff --git a/public/js/ueditor/dialogs/spechars/spechars.js b/public/js/ueditor/dialogs/spechars/spechars.js index f4c155e..be1902d 100644 --- a/public/js/ueditor/dialogs/spechars/spechars.js +++ b/public/js/ueditor/dialogs/spechars/spechars.js @@ -6,22 +6,50 @@ * To change this template use File | Settings | File Templates. */ var charsContent = [ - { name:"tsfh", title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")}, - { name:"lmsz", title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, - { name:"szfh", title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")}, - { name:"rwfh", title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")}, - { name:"xlzm", title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")}, - { name:"ewzm", title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")}, - { name:"pyzm", title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, - { name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")}, - { name:"zyzf", title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} + { + name: "tsfh", + title: lang.tsfh, + content: toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞") + }, + {name: "lmsz", title: lang.lmsz, content: toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, + { + name: "szfh", + title: lang.szfh, + content: toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩") + }, + { + name: "rwfh", + title: lang.rwfh, + content: toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ") + }, + { + name: "xlzm", + title: lang.xlzm, + content: toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω") + }, + { + name: "ewzm", + title: lang.ewzm, + content: toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я") + }, + {name: "pyzm", title: lang.pyzm, content: toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, + { + name: "yyyb", + title: lang.yyyb, + content: toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,") + }, + { + name: "zyzf", + title: lang.zyzf, + content: toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ") + } ]; (function createTab(content) { for (var i = 0, ci; ci = content[i++];) { var span = document.createElement("span"); span.setAttribute("tabSrc", ci.name); span.innerHTML = ci.title; - if (i == 1)span.className = "focus"; + if (i == 1) span.className = "focus"; domUtils.on(span, "click", function () { var tmps = $G("tabHeads").children; for (var k = 0, sk; sk = tmps[k++];) { @@ -52,6 +80,7 @@ var charsContent = [ $G("tabBodys").appendChild(div); } })(charsContent); + function toArray(str) { return str.split(","); } diff --git a/public/js/ueditor/dialogs/table/edittable.css b/public/js/ueditor/dialogs/table/edittable.css index c6f9396..241849b 100644 --- a/public/js/ueditor/dialogs/table/edittable.css +++ b/public/js/ueditor/dialogs/table/edittable.css @@ -1,7 +1,8 @@ -body{ +body { overflow: hidden; width: 540px; } + .wrapper { margin: 10px auto 0; font-size: 12px; @@ -81,4 +82,4 @@ body{ border-width: 2px 1px 1px 1px; height: 22px; background-color: #F7F7F7; -} \ No newline at end of file +} diff --git a/public/js/ueditor/dialogs/table/edittable.html b/public/js/ueditor/dialogs/table/edittable.html index 6e596ce..dbc6a4f 100644 --- a/public/js/ueditor/dialogs/table/edittable.html +++ b/public/js/ueditor/dialogs/table/edittable.html @@ -2,8 +2,8 @@ - - + +
    @@ -12,18 +12,22 @@

    • - +
    • - +
    • - +
    • - +
    @@ -35,7 +39,8 @@
  • - +
  • @@ -45,7 +50,7 @@
    • - +
    @@ -59,6 +64,6 @@
    - + diff --git a/public/js/ueditor/dialogs/table/edittable.js b/public/js/ueditor/dialogs/table/edittable.js index 11dbee7..bb20953 100644 --- a/public/js/ueditor/dialogs/table/edittable.js +++ b/public/js/ueditor/dialogs/table/edittable.js @@ -21,13 +21,13 @@ me.init(); }; editTable.prototype = { - init:function () { + init: function () { var colorPiker = new UE.ui.ColorPicker({ - editor:editor + editor: editor }), colorPop = new UE.ui.Popup({ - editor:editor, - content:colorPiker + editor: editor, + content: colorPiker }); title.checked = editor.queryCommandState("inserttitle") == -1; @@ -38,9 +38,9 @@ var enablesortState = editor.queryCommandState("enablesort"), disablesortState = editor.queryCommandState("disablesort"); - sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); + sorttable.checked = !!(enablesortState < 0 && disablesortState >= 0); sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); - sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg : ''; me.createTable(title.checked, titleCol.checked, caption.checked); me.setAutoSize(); @@ -69,7 +69,7 @@ }); }, - createTable:function (hasTitle, hasTitleCol, hasCaption) { + createTable: function (hasTitle, hasTitleCol, hasCaption) { var arr = [], sortSpan = '^'; arr.push("
    : :
    : :
    - +
    - - - - + + + +
    "); @@ -78,7 +78,9 @@ } if (hasTitle) { arr.push(""); - if(hasTitleCol) { arr.push(""); } + if (hasTitleCol) { + arr.push(""); + } for (var j = 0; j < 5; j++) { arr.push(""); } @@ -86,7 +88,9 @@ } for (var i = 0; i < 6; i++) { arr.push(""); - if(hasTitleCol) { arr.push("") } + if (hasTitleCol) { + arr.push("") + } for (var k = 0; k < 5; k++) { arr.push("") } @@ -96,9 +100,9 @@ preview.innerHTML = arr.join(""); this.updateSortSpan(); }, - titleHanler:function () { + titleHanler: function () { var example = $G("J_example"), - frg=document.createDocumentFragment(), + frg = document.createDocumentFragment(), color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), colCount = example.rows[0].children.length; @@ -117,7 +121,7 @@ me.setColor(color); me.updateSortSpan(); }, - titleColHanler:function () { + titleColHanler: function () { var example = $G("J_example"), color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), colArr = example.rows, @@ -137,7 +141,7 @@ me.setColor(color); me.updateSortSpan(); }, - captionHanler:function () { + captionHanler: function () { var example = $G("J_example"); if (caption.checked) { var row = document.createElement('caption'); @@ -147,14 +151,14 @@ domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); } }, - sorttableHanler:function(){ + sorttableHanler: function () { me.updateSortSpan(); }, - autoSizeContentHanler:function () { + autoSizeContentHanler: function () { var example = $G("J_example"); example.removeAttribute("width"); }, - autoSizePageHanler:function () { + autoSizePageHanler: function () { var example = $G("J_example"); var tds = example.getElementsByTagName(example, "td"); utils.each(tds, function (td) { @@ -162,30 +166,30 @@ }); example.setAttribute('width', '100%'); }, - updateSortSpan: function(){ + updateSortSpan: function () { var example = $G("J_example"), row = example.rows[0]; - var spans = domUtils.getElementsByTagName(example,"span"); - utils.each(spans,function(span){ + var spans = domUtils.getElementsByTagName(example, "span"); + utils.each(spans, function (span) { span.parentNode.removeChild(span); }); if (sorttable.checked) { - utils.each(row.cells, function(cell, i){ + utils.each(row.cells, function (cell, i) { var span = document.createElement("span"); span.innerHTML = "^"; cell.appendChild(span); }); } }, - getColor:function () { + getColor: function () { var start = editor.selection.getStart(), color, cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); color = cell && domUtils.getComputedStyle(cell, "border-color"); - if (!color) color = "#DDDDDD"; + if (!color) color = "#DDDDDD"; return color; }, - setColor:function (color) { + setColor: function (color) { var example = $G("J_example"), arr = domUtils.getElementsByTagName(example, "td").concat( domUtils.getElementsByTagName(example, "th"), @@ -198,7 +202,7 @@ }); }, - setAutoSize:function () { + setAutoSize: function () { var me = this; autoSizePage.checked = true; me.autoSizePageHanler(); @@ -211,27 +215,27 @@ editor.__hasEnterExecCommand = true; var checks = { - title:"inserttitle deletetitle", - titleCol:"inserttitlecol deletetitlecol", - caption:"insertcaption deletecaption", - sorttable:"enablesort disablesort" + title: "inserttitle deletetitle", + titleCol: "inserttitlecol deletetitlecol", + caption: "insertcaption deletecaption", + sorttable: "enablesort disablesort" }; editor.fireEvent('saveScene'); - for(var i in checks){ + for (var i in checks) { var cmds = checks[i].split(" "), input = $G("J_" + i); - if(input["checked"]){ - editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); - }else{ - editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); + if (input["checked"]) { + editor.queryCommandState(cmds[0]) != -1 && editor.execCommand(cmds[0]); + } else { + editor.queryCommandState(cmds[1]) != -1 && editor.execCommand(cmds[1]); } } editor.execCommand("edittable", tone.value); - autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; + autoSizeContent.checked ? editor.execCommand('adaptbytext') : ""; autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; editor.fireEvent('saveScene'); editor.__hasEnterExecCommand = false; }; -})(); \ No newline at end of file +})(); diff --git a/public/js/ueditor/dialogs/table/edittd.html b/public/js/ueditor/dialogs/table/edittd.html index 70a3807..5a0be07 100644 --- a/public/js/ueditor/dialogs/table/edittd.html +++ b/public/js/ueditor/dialogs/table/edittd.html @@ -2,12 +2,13 @@ - + + .wrapper .image-manual .body { + } +
    -
    -
    - +
    +
    + +
    +
    +
    复制路径
    +
    +
    +
    +
    本地选择保存
    + +
    +
    -
    -
    复制路径
    +
    +
    +
    + Windows使用教程 +
    +
    +

    1、点击复制地址按钮

    +

    2、点击本地选择文件,粘贴剪切板的路径到文件选择路径

    +

    3、点击确定

    +
    +
    + Mac使用教程 +
    +
    +

    1、点击复制地址按钮

    +

    2、点击本地选择文件,按快捷 Command+Shift+G ,粘贴剪切板的路径到文件选择路径

    +

    3、点击确定

    +
    -
    -
    -
    本地选择保存
    - -
    -
    -
    -
    -
    -
    - Windows使用教程 -
    -
    -

    1、点击复制地址按钮

    -

    2、点击本地选择文件,粘贴剪切板的路径到文件选择路径

    -

    3、点击确定

    -
    -
    - Mac使用教程 -
    -
    -

    1、点击复制地址按钮

    -

    2、点击本地选择文件,按快捷 Command+Shift+G ,粘贴剪切板的路径到文件选择路径

    -

    3、点击确定

    -
    -
    - - - - + + + + diff --git a/public/js/ueditor/dialogs/wordimage/wordimage.js b/public/js/ueditor/dialogs/wordimage/wordimage.js index f438cc8..39dacd2 100644 --- a/public/js/ueditor/dialogs/wordimage/wordimage.js +++ b/public/js/ueditor/dialogs/wordimage/wordimage.js @@ -9,82 +9,85 @@ var wordImage = {}; var g = $G, flashObj, flashContainer; wordImage.init = function (opt, callbacks) { - showLocalPath("fileUrl"); - createCopyButton("copyButton", "fileUrl"); - addUploadButtonListener(); - addOkListener(); + showLocalPath("fileUrl"); + createCopyButton("copyButton", "fileUrl"); + addUploadButtonListener(); + addOkListener(); }; function addUploadButtonListener() { - g('saveFile').addEventListener('change', function () { - if (this.files.length !== 1) { - alert('请选择1个文件') - return; - } - $('.image-tip').html('正在转存,请稍后...'); - var file = this.files[0]; - uploader.addFile(file); - uploader.upload(); - }); + g('saveFile').addEventListener('change', function () { + $('.image-tip').html('正在转存,请稍后...'); + uploader.addFile(this.files); + uploader.upload(); + }); } function addOkListener() { - dialog.onok = function () { - //console.log('imageUrls',imageUrls); - if (!imageUrls.length) return; - var urlPrefix = editor.getOpt('imageUrlPrefix'), - images = domUtils.getElementsByTagName(editor.document, "img"); - editor.fireEvent('saveScene'); - // console.log('images',images,imageUrls); - for (var i = 0, img; img = images[i++];) { - var src = img.getAttribute("data-word-image"); - if (!src) continue; - for (var j = 0, url; url = imageUrls[j++];) { - // console.log('url',src, url); - if (src.indexOf(url.name.replace(" ", "")) != -1) { - img.src = urlPrefix + url.url; - img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 - img.setAttribute("title", url.title); - domUtils.removeAttributes(img, ["data-word-image", "style", "width", "height"]); - editor.fireEvent("selectionchange"); - break; + dialog.onok = function () { + //console.log('imageUrls',imageUrls); + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document, "img"); + editor.fireEvent('saveScene'); + // console.log('images',images,imageUrls); + for (var i = 0, img; img = images[i++];) { + var src = img.getAttribute("data-word-image"); + if (!src) continue; + for (var j = 0, url; url = imageUrls[j++];) { + // console.log('url',src, url); + if (src.indexOf(url.name.replace(" ", "")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 + img.setAttribute("title", url.title); + domUtils.removeAttributes(img, ["data-word-image", "style", "width", "height"]); + editor.fireEvent("selectionchange"); + break; + } + } } - } - } - editor.fireEvent('saveScene'); - // hideFlash(); - }; - dialog.oncancel = function () { - //hideFlash(); - }; + editor.fireEvent('saveScene'); + // hideFlash(); + }; + dialog.oncancel = function () { + //hideFlash(); + }; } function showLocalPath(id) { - //单张编辑 - var img = editor.selection.getRange().getClosedNode(); - var images = editor.execCommand('wordimage'); - if (images.length == 1 || img && img.tagName == 'IMG') { - g(id).value = images[0]; - return; - } - var path = images[0]; - var leftSlashIndex = path.lastIndexOf("/") || 0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 - rightSlashIndex = path.lastIndexOf("\\") || 0, - separater = leftSlashIndex > rightSlashIndex ? "/" : "\\"; + //单张编辑 + var img = editor.selection.getRange().getClosedNode(); + var images = editor.execCommand('wordimage'); + if (images.length == 1 || img && img.tagName == 'IMG') { + g(id).value = images[0]; + return; + } + var path = images[0]; + var leftSlashIndex = path.lastIndexOf("/") || 0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 + rightSlashIndex = path.lastIndexOf("\\") || 0, + separater = leftSlashIndex > rightSlashIndex ? "/" : "\\"; - path = path.substring(0, path.lastIndexOf(separater) + 1); - g(id).value = path; + path = path.substring(0, path.lastIndexOf(separater) + 1); + g(id).value = path; + //增提醒用户选择哪些文件 + var names = []; + for (var i = 0, len = images.length; i < len; i++) { + var img = images[i]; + names.push(img.substring(img.lastIndexOf(separater) + 1, img.length)); + } + $('.image-tip').html('请选择:' + names.join("、") + "共" + images.length + '个文件'); } function createCopyButton(id, dataFrom) { - var url = g(dataFrom).value; - if (url.startsWith("file:////")) { - url = url.substring(8); - } - g(id).setAttribute("data-clipboard-text", url); - var clipboard = new Clipboard('[data-clipboard-text]') - clipboard.on('success', function (e) { - g('copyButton').innerHTML = '复制成功'; - }); + var url = g(dataFrom).value; + if (url.startsWith("file:////")) { + url = url.substring(8); + } + url = decodeURI(url); + g(id).setAttribute("data-clipboard-text", url); + var clipboard = new Clipboard('[data-clipboard-text]') + clipboard.on('success', function (e) { + g('copyButton').innerHTML = '复制成功'; + }); } diff --git a/public/js/ueditor/index.html b/public/js/ueditor/index.html index e0cffe0..de084be 100644 --- a/public/js/ueditor/index.html +++ b/public/js/ueditor/index.html @@ -1,31 +1,36 @@ - UEditorPlus 完整演示 - - - - - - - - - - + UEditorPlus 完整演示 + + + + + + + + + + +
    -

    完整示例

    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - +
    -
    +
    +
    - +
    diff --git a/public/js/ueditor/lang/en/en.js b/public/js/ueditor/lang/en/en.js index 095d025..7ba4a56 100644 --- a/public/js/ueditor/lang/en/en.js +++ b/public/js/ueditor/lang/en/en.js @@ -6,604 +6,681 @@ * To change this template use File | Settings | File Templates. */ UE.I18N['en'] = { - 'labelMap':{ - 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', - 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', - 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', - 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', - 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', - 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', - 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', - 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', - 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", - 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', - 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', - 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', - 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', - 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', - 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', - 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', 'formula':'Formula', - 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', - 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'labelMap': { + 'anchor': 'Anchor', + 'undo': 'Undo', + 'redo': 'Redo', + 'bold': 'Bold', + 'indent': 'Indent', + 'italic': 'Italic', + 'underline': 'Underline', + 'strikethrough': 'Strikethrough', + 'subscript': 'SubScript', + 'fontborder': 'text border', + 'superscript': 'SuperScript', + 'formatmatch': 'Format Match', + 'source': 'Source', + 'blockquote': 'BlockQuote', + 'pasteplain': 'PastePlain', + 'selectall': 'SelectAll', + 'print': 'Print', + 'preview': 'Preview', + 'horizontal': 'Horizontal', + 'removeformat': 'RemoveFormat', + 'time': 'Time', + 'date': 'Date', + 'unlink': 'Unlink', + 'insertrow': 'InsertRow', + 'insertcol': 'InsertCol', + 'mergeright': 'MergeRight', + 'mergedown': 'MergeDown', + 'deleterow': 'DeleteRow', + 'deletecol': 'DeleteCol', + 'splittorows': 'SplitToRows', + 'insertcode': 'insert code', + 'splittocols': 'SplitToCols', + 'splittocells': 'SplitToCells', + 'deletecaption': 'DeleteCaption', + 'inserttitle': 'InsertTitle', + 'mergecells': 'MergeCells', + 'deletetable': 'DeleteTable', + 'cleardoc': 'Clear', + 'contentimport': 'Content Import', + 'insertparagraphbeforetable': "InsertParagraphBeforeTable", + 'fontfamily': 'FontFamily', + 'fontsize': 'FontSize', + 'paragraph': 'Paragraph', + 'simpleupload': 'Single Image', + 'insertimage': 'Multi Image', + 'edittable': 'Edit Table', + 'edittd': 'Edit Td', + 'link': 'Link', + 'emotion': 'Emotion', + 'spechars': 'Spechars', + 'searchreplace': 'SearchReplace', + 'insertvideo': 'Video', + 'help': 'Help', + 'justifyleft': 'JustifyLeft', + 'justifyright': 'JustifyRight', + 'justifycenter': 'JustifyCenter', + 'justifyjustify': 'Justify', + 'forecolor': 'FontColor', + 'backcolor': 'BackColor', + 'insertorderedlist': 'OL', + 'insertunorderedlist': 'UL', + 'fullscreen': 'FullScreen', + 'directionalityltr': 'EnterFromLeft', + 'directionalityrtl': 'EnterFromRight', + 'rowspacingtop': 'RowSpacingTop', + 'rowspacingbottom': 'RowSpacingBottom', + 'pagebreak': 'PageBreak', + 'insertframe': 'Iframe', + 'imagenone': 'Default', + 'imageleft': 'ImageLeft', + 'imageright': 'ImageRight', + 'attachment': 'Attachment', + 'imagecenter': 'ImageCenter', + 'wordimage': 'WordImage', + 'formula': 'Formula', + 'lineheight': 'LineHeight', + 'edittip': 'EditTip', + 'customstyle': 'CustomStyle', + 'scrawl': 'Scrawl', + 'autotypeset': 'AutoTypeset', + 'touppercase': 'UpperCase', + 'tolowercase': 'LowerCase', + 'template': 'Template', + 'background': 'Background', + 'inserttable': 'InsertTable', }, - 'insertorderedlist':{ - 'num':'1,2,3...', - 'num1':'1),2),3)...', - 'num2':'(1),(2),(3)...', - 'cn':'一,二,三....', - 'cn1':'一),二),三)....', - 'cn2':'(一),(二),(三)....', - 'decimal':'1,2,3...', - 'lower-alpha':'a,b,c...', - 'lower-roman':'i,ii,iii...', - 'upper-alpha':'A,B,C...', - 'upper-roman':'I,II,III...' + 'autosave': { + 'autoRestoreTip': 'Has been recovered from draft' }, - 'insertunorderedlist':{ - 'circle':'○ Circle', - 'disc':'● Circle dot', - 'square':'■ Rectangle ', - 'dash' :'- Dash', - 'dot' : '。dot' + 'insertorderedlist': { + 'num': '1,2,3...', + 'num1': '1),2),3)...', + 'num2': '(1),(2),(3)...', + 'cn': '一,二,三....', + 'cn1': '一),二),三)....', + 'cn2': '(一),(二),(三)....', + 'decimal': '1,2,3...', + 'lower-alpha': 'a,b,c...', + 'lower-roman': 'i,ii,iii...', + 'upper-alpha': 'A,B,C...', + 'upper-roman': 'I,II,III...' }, - 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, - 'fontfamily':{ - 'songti':'Sim Sun', - 'kaiti':'Sim Kai', - 'heiti':'Sim Hei', - 'lishu':'Sim Li', + 'insertunorderedlist': { + 'circle': '○ Circle', + 'disc': '● Circle dot', + 'square': '■ Rectangle ', + 'dash': '- Dash', + 'dot': '。dot' + }, + 'paragraph': { + 'p': 'Paragraph', + 'h1': 'Title 1', + 'h2': 'Title 2', + 'h3': 'Title 3', + 'h4': 'Title 4', + 'h5': 'Title 5', + 'h6': 'Title 6' + }, + 'fontfamily': { + 'default': 'Default', + 'songti': 'Sim Sun', + 'kaiti': 'Sim Kai', + 'heiti': 'Sim Hei', + 'lishu': 'Sim Li', 'yahei': 'Microsoft YaHei', - 'andaleMono':'Andale Mono', + // 'andaleMono':'Andale Mono', 'arial': 'Arial', - 'arialBlack':'Arial Black', - 'comicSansMs':'Comic Sans MS', - 'impact':'Impact', - 'timesNewRoman':'Times New Roman' + // 'arialBlack':'Arial Black', + // 'comicSansMs':'Comic Sans MS', + // 'impact':'Impact', + 'timesNewRoman': 'Times New Roman' }, - 'customstyle':{ - 'tc':'Title center', - 'tl':'Title left', - 'im':'Important', - 'hi':'Highlight' + 'customstyle': { + 'tc': 'Title center', + 'tl': 'Title left', + 'im': 'Important', + 'hi': 'Highlight' }, 'autoupload': { 'exceedSizeError': 'File Size Exceed', 'exceedTypeError': 'File Type Not Allow', 'jsonEncodeError': 'Server Return Format Error', - 'loading':"loading...", - 'loadError':"load error", + 'loading': "loading...", + 'loadError': "load error", 'errorLoadConfig': 'Server config not loaded, upload can not work.', }, - 'simpleupload':{ + 'simpleupload': { 'exceedSizeError': 'File Size Exceed', 'exceedTypeError': 'File Type Not Allow', 'jsonEncodeError': 'Server Return Format Error', - 'loading':"loading...", - 'loadError':"load error", + 'loading': "loading...", + 'loadError': "load error", 'errorLoadConfig': 'Server config not loaded, upload can not work.', }, - 'elementPathTip':"Path", - 'wordCountTip':"Word Count", - 'wordCountMsg':'{#count} characters entered,{#leave} left. ', - 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!', - 'ok':"OK", - 'cancel':"Cancel", - 'closeDialog':"closeDialog", - 'tableDrag':"You must import the file uiUtils.js before drag! ", - 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'elementPathTip': "Path", + 'wordCountTip': "Word Count", + 'wordCountMsg': '{#count} characters entered,{#leave} left. ', + 'wordOverFlowMsg': 'The number of characters has exceeded allowable maximum values, the server may refuse to save!', + 'ok': "OK", + 'cancel': "Cancel", + 'closeDialog': "closeDialog", + 'tableDrag': "You must import the file uiUtils.js before drag! ", + 'autofloatMsg': "The plugin AutoFloat depends on EditorUI!", 'loadconfigError': 'Get server config error.', 'loadconfigFormatError': 'Server config format error.', 'loadconfigHttpError': 'Get server config http error.', - 'insertcode':{ - 'as3':'ActionScript 3', - 'bash':'Bash/Shell', - 'cpp':'C/C++', - 'css':'CSS', - 'cf':'ColdFusion', - 'c#':'C#', - 'delphi':'Delphi', - 'diff':'Diff', - 'erlang':'Erlang', - 'groovy':'Groovy', - 'html':'HTML', - 'java':'Java', - 'jfx':'JavaFX', - 'js':'JavaScript', - 'pl':'Perl', - 'php':'PHP', - 'plain':'Plain Text', - 'ps':'PowerShell', - 'python':'Python', - 'ruby':'Ruby', - 'scala':'Scala', - 'sql':'SQL', - 'vb':'Visual Basic', - 'xml':'XML' + 'insertcode': { + 'as3': 'ActionScript 3', + 'bash': 'Bash/Shell', + 'cpp': 'C/C++', + 'css': 'CSS', + 'cf': 'ColdFusion', + 'c#': 'C#', + 'delphi': 'Delphi', + 'diff': 'Diff', + 'erlang': 'Erlang', + 'groovy': 'Groovy', + 'html': 'HTML', + 'java': 'Java', + 'jfx': 'JavaFX', + 'js': 'JavaScript', + 'pl': 'Perl', + 'php': 'PHP', + 'plain': 'Plain Text', + 'ps': 'PowerShell', + 'python': 'Python', + 'ruby': 'Ruby', + 'scala': 'Scala', + 'sql': 'SQL', + 'vb': 'Visual Basic', + 'xml': 'XML' }, - 'confirmClear':"Do you confirm to clear the Document?", - 'contextMenu':{ - 'delete':"Delete", - 'selectall':"Select all", - 'deletecode':"Delete Code", - 'cleardoc':"Clear Document", - 'confirmclear':"Do you confirm to clear the Document?", - 'unlink':"Unlink", - 'paragraph':"Paragraph", - 'edittable':"Table property", - 'aligncell':'Align cell', - 'aligntable':'Table alignment', - 'tableleft':'Left float', - 'tablecenter':'Center', - 'tableright':'Right float', - 'aligntd':'Cell alignment', - 'edittd':"Cell property", - 'setbordervisible':'set table edge visible', - 'table':"Table", - 'justifyleft':'Justify Left', - 'justifyright':'Justify Right', - 'justifycenter':'Justify Center', - 'justifyjustify':'Default', - 'deletetable':"Delete table", - 'insertparagraphbefore':"InsertedBeforeLine", - 'insertparagraphafter':'InsertedAfterLine', - 'inserttable':'Insert table', - 'insertcaption':'Insert caption', - 'deletecaption':'Delete Caption', - 'inserttitle':'Insert Title', - 'deletetitle':'Delete Title', - 'inserttitlecol':'Insert Title Col', - 'deletetitlecol':'Delete Title Col', - 'averageDiseRow':'AverageDise Row', - 'averageDisCol':'AverageDis Col', - 'deleterow':"Delete row", - 'deletecol':"Delete col", - 'insertrow':"Insert row", - 'insertcol':"Insert col", - 'insertrownext':'Insert Row Next', - 'insertcolnext':'Insert Col Next', - 'mergeright':"Merge right", - 'mergeleft':"Merge left", - 'mergedown':"Merge down", - 'mergecells':"Merge cells", - 'splittocells':"Split to cells", - 'splittocols':"Split to Cols", - 'splittorows':"Split to Rows", - 'tablesort':'Table sorting', - 'enablesort':'Sorting Enable', - 'disablesort':'Sorting Disable', - 'reversecurrent':'Reverse current', - 'orderbyasc':'Order By ASCII', - 'reversebyasc':'Reverse By ASCII', - 'orderbynum':'Order By Num', - 'reversebynum':'Reverse By Num', - 'borderbk':'Border shading', - 'setcolor':'interlaced color', - 'unsetcolor':'Cancel interlacedcolor', - 'setbackground':'Background interlaced', - 'unsetbackground':'Cancel Bk interlaced', - 'redandblue':'Blue and red', - 'threecolorgradient':'Three-color gradient', - 'copy':"Copy(Ctrl + c)", - 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", - 'paste':"Paste(Ctrl + v)", - 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" + 'confirmClear': "Do you confirm to clear the Document?", + 'contextMenu': { + 'delete': "Delete", + 'selectall': "Select all", + 'deletecode': "Delete Code", + 'cleardoc': "Clear Document", + 'confirmclear': "Do you confirm to clear the Document?", + 'unlink': "Unlink", + 'paragraph': "Paragraph", + 'edittable': "Table property", + 'aligncell': 'Align cell', + 'aligntable': 'Table alignment', + 'tableleft': 'Left float', + 'tablecenter': 'Center', + 'tableright': 'Right float', + 'aligntd': 'Cell alignment', + 'edittd': "Cell property", + 'setbordervisible': 'set table edge visible', + 'table': "Table", + 'justifyleft': 'Justify Left', + 'justifyright': 'Justify Right', + 'justifycenter': 'Justify Center', + 'justifyjustify': 'Default', + 'deletetable': "Delete table", + 'insertparagraphbefore': "InsertedBeforeLine", + 'insertparagraphafter': 'InsertedAfterLine', + 'inserttable': 'Insert table', + 'insertcaption': 'Insert caption', + 'deletecaption': 'Delete Caption', + 'inserttitle': 'Insert Title', + 'deletetitle': 'Delete Title', + 'inserttitlecol': 'Insert Title Col', + 'deletetitlecol': 'Delete Title Col', + 'averageDiseRow': 'AverageDise Row', + 'averageDisCol': 'AverageDis Col', + 'deleterow': "Delete row", + 'deletecol': "Delete col", + 'insertrow': "Insert row", + 'insertcol': "Insert col", + 'insertrownext': 'Insert Row Next', + 'insertcolnext': 'Insert Col Next', + 'mergeright': "Merge right", + 'mergeleft': "Merge left", + 'mergedown': "Merge down", + 'mergecells': "Merge cells", + 'splittocells': "Split to cells", + 'splittocols': "Split to Cols", + 'splittorows': "Split to Rows", + 'tablesort': 'Table sorting', + 'enablesort': 'Sorting Enable', + 'disablesort': 'Sorting Disable', + 'reversecurrent': 'Reverse current', + 'orderbyasc': 'Order By ASCII', + 'reversebyasc': 'Reverse By ASCII', + 'orderbynum': 'Order By Num', + 'reversebynum': 'Reverse By Num', + 'borderbk': 'Border shading', + 'setcolor': 'interlaced color', + 'unsetcolor': 'Cancel interlacedcolor', + 'setbackground': 'Background interlaced', + 'unsetbackground': 'Cancel Bk interlaced', + 'redandblue': 'Blue and red', + 'threecolorgradient': 'Three-color gradient', + 'copy': "Copy(Ctrl + c)", + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'paste': "Paste(Ctrl + v)", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!" }, 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", - 'anchorMsg':"Link", - 'clearColor':'Clear', - 'standardColor':'Standard color', - 'themeColor':'Theme color', - 'property':'Property', - 'default':'Default', - 'modify':'Modify', - 'save':'Save', - 'formulaedit':'FormulaEdit', - 'justifyleft':'Justify Left', - 'justifyright':'Justify Right', - 'justifycenter':'Justify Center', - 'justify':'Default', - 'clear':'Clear', - 'delete':'Delete', - 'clickToUpload':"Click to upload", - 'unset':'Language hasn\'t been set!', - 't_row':'row', - 't_col':'col', - 'pasteOpt':'Paste Option', - 'pasteSourceFormat':"Keep Source Formatting", - 'tagFormat':'Keep tag', - 'pasteTextFormat':'Keep Text only', - 'more':'More', - 'autoTypeSet':{ - 'mergeLine':"Merge empty line", - 'delLine':"Del empty line", - 'removeFormat':"Remove format", - 'indent':"Indent", - 'alignment':"Alignment", - 'imageFloat':"Image float", - 'removeFontsize':"Remove font size", - 'removeFontFamily':"Remove fontFamily", - 'removeHtml':"Remove redundant HTML code", - 'pasteFilter':"Paste filter", - 'run':"Done", - 'symbol':'Symbol Conversion', - 'bdc2sb':'Full-width to Half-width', - 'tobdc':'Half-width to Full-width' + 'anchorMsg': "Link", + 'clearColor': 'Clear', + 'standardColor': 'Standard color', + 'themeColor': 'Theme color', + 'property': 'Property', + 'default': 'Default', + 'modify': 'Modify', + 'save': 'Save', + 'justifyleft': 'Justify Left', + 'justifyright': 'Justify Right', + 'justifycenter': 'Justify Center', + 'justify': 'Default', + 'clear': 'Clear', + 'delete': 'Delete', + 'clickToUpload': "Click to upload", + 'unset': 'Language hasn\'t been set!', + 't_row': 'row', + 't_col': 'col', + 'pasteOpt': 'Paste Option', + 'pasteSourceFormat': "Keep Source Formatting", + 'tagFormat': 'Keep tag', + 'pasteTextFormat': 'Keep Text only', + 'more': 'More', + 'autoTypeSet': { + 'mergeLine': "Merge empty line", + 'delLine': "Del empty line", + 'removeFormat': "Remove format", + 'indent': "Indent", + 'alignment': "Alignment", + 'imageFloat': "Image float", + 'removeFontsize': "Remove font size", + 'removeFontFamily': "Remove fontFamily", + 'removeHtml': "Remove redundant HTML code", + 'pasteFilter': "Paste filter", + 'run': "Done", + 'symbol': 'Symbol Conversion', + 'bdc2sb': 'Full-width to Half-width', + 'tobdc': 'Half-width to Full-width' }, - 'background':{ - 'static':{ - 'lang_background_normal':'Normal', - 'lang_background_local':'Online', - 'lang_background_set':'Background Set', - 'lang_background_none':'No Background', - 'lang_background_colored':'Colored Background', - 'lang_background_color':'Color Set', - 'lang_background_netimg':'Net-Image', - 'lang_background_align':'Align Type', - 'lang_background_position':'Position', - 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} + 'background': { + 'static': { + 'lang_background_normal': 'Normal', + 'lang_background_local': 'Online', + 'lang_background_set': 'Background Set', + 'lang_background_none': 'No Background', + 'lang_background_colored': 'Colored Background', + 'lang_background_color': 'Color Set', + 'lang_background_netimg': 'Net-Image', + 'lang_background_align': 'Align Type', + 'lang_background_position': 'Position', + 'repeatType': {'options': ["Center", "Repeat-x", "Repeat-y", "Tile", "Custom"]} }, - 'noUploadImage':"No pictures has been uploaded!", - 'toggleSelect':'Change the active state by click!\n Image Size: ' + 'noUploadImage': "No pictures has been uploaded!", + 'toggleSelect': 'Change the active state by click!\n Image Size: ' }, //===============dialog i18N======================= - 'insertimage':{ - 'static':{ - 'lang_tab_remote':"Insert", - 'lang_tab_upload':"Local", - 'lang_tab_online':"Manager", - 'lang_tab_search':"Search", - 'lang_input_url':"Address:", - 'lang_input_size':"Size:", - 'lang_input_width':"Width", - 'lang_input_height':"Height", - 'lang_input_border':"Border:", - 'lang_input_vhspace':"Margins:", - 'lang_input_title':"Title:", - 'lang_input_align':'Image Float Style:', - 'lang_imgLoading':"Loading...", - 'lang_start_upload':"Start Upload", - 'lock':{'title':"Lock rate"}, - 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, - 'searchTxt':{'value':"Enter the search keyword!"}, - 'searchBtn':{'value':"Search"}, - 'searchReset':{'value':"Clear"}, - 'noneAlign':{'title':'None Float'}, - 'leftAlign':{'title':'Left Float'}, - 'rightAlign':{'title':'Right Float'}, - 'centerAlign':{'title':'Center In A Line'} + 'insertimage': { + 'static': { + 'lang_tab_remote': "Insert", + 'lang_tab_upload': "Local", + 'lang_tab_online': "Manager", + 'lang_tab_search': "Search", + 'lang_input_url': "Address:", + 'lang_input_size': "Size:", + 'lang_input_width': "Width", + 'lang_input_height': "Height", + 'lang_input_border': "Border:", + 'lang_input_vhspace': "Margins:", + 'lang_input_title': "Title:", + 'lang_input_align': 'Image Float Style:', + 'lang_imgLoading': "Loading...", + 'lang_start_upload': "Start Upload", + 'lock': {'title': "Lock rate"}, + 'searchType': {'title': "ImageType", 'options': ["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt': {'value': "Enter the search keyword!"}, + 'searchBtn': {'value': "Search"}, + 'searchReset': {'value': "Clear"}, + 'noneAlign': {'title': 'None Float'}, + 'leftAlign': {'title': 'Left Float'}, + 'rightAlign': {'title': 'Right Float'}, + 'centerAlign': {'title': 'Center In A Line'} }, - 'uploadSelectFile':'Select File', - 'uploadAddFile':'Add File', - 'uploadStart':'Start Upload', - 'uploadPause':'Pause Upload', - 'uploadContinue':'Continue Upload', - 'uploadRetry':'Retry Upload', - 'uploadDelete':'Delete', - 'uploadTurnLeft':'Turn Left', - 'uploadTurnRight':'Turn Right', - 'uploadPreview':'Doing Preview', - 'uploadNoPreview':'Can Not Preview', + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', + 'uploadNoPreview': 'Can Not Preview', 'updateStatusReady': 'Selected _ pictures, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', - 'errorExceedSize':'File Size Exceed', - 'errorFileType':'File Type Not Allow', - 'errorInterrupt':'File Upload Interrupted', - 'errorUploadRetry':'Upload Error, Please Retry.', - 'errorHttp':'Http Error', - 'errorServerUpload':'Server Result Error.', - 'remoteLockError':"Cannot Lock the Proportion between width and height", - 'numError':"Please enter the correct Num. e.g 123,400", - 'imageUrlError':"The image format may be wrong!", - 'imageLoadError':"Error,please check the network or URL!", - 'searchRemind':"Enter the search keyword!", - 'searchLoading':"Image is loading,please wait...", - 'searchRetry':" Sorry,can't find the image,please try again!" + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.', + 'remoteLockError': "Cannot Lock the Proportion between width and height", + 'numError': "Please enter the correct Num. e.g 123,400", + 'imageUrlError': "The image format may be wrong!", + 'imageLoadError': "Error,please check the network or URL!", + 'searchRemind': "Enter the search keyword!", + 'searchLoading': "Image is loading,please wait...", + 'searchRetry': " Sorry,can't find the image,please try again!" }, - 'attachment':{ - 'static':{ + 'attachment': { + 'static': { 'lang_tab_upload': 'Upload', 'lang_tab_online': 'Online', - 'lang_start_upload':"Start upload", - 'lang_drop_remind':"You can drop files here, a single maximum of 300 files" + 'lang_start_upload': "Start upload", + 'lang_drop_remind': "You can drop files here, a single maximum of 300 files" }, - 'uploadSelectFile':'Select File', - 'uploadAddFile':'Add File', - 'uploadStart':'Start Upload', - 'uploadPause':'Pause Upload', - 'uploadContinue':'Continue Upload', - 'uploadRetry':'Retry Upload', - 'uploadDelete':'Delete', - 'uploadTurnLeft':'Turn Left', - 'uploadTurnRight':'Turn Right', - 'uploadPreview':'Doing Preview', + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', 'updateStatusReady': 'Selected _ files, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', - 'errorExceedSize':'File Size Exceed', - 'errorFileType':'File Type Not Allow', - 'errorInterrupt':'File Upload Interrupted', - 'errorUploadRetry':'Upload Error, Please Retry.', - 'errorHttp':'Http Error', - 'errorServerUpload':'Server Result Error.' + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.' }, - 'insertvideo':{ - 'static':{ - 'lang_tab_insertV':"Video", - 'lang_tab_searchV':"Search", - 'lang_tab_uploadV':"Upload", - 'lang_video_url':" URL ", - 'lang_video_size':"Video Size", - 'lang_videoW':"Width", - 'lang_videoH':"Height", - 'lang_alignment':"Alignment", - 'videoSearchTxt':{'value':"Enter the search keyword!"}, - 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, - 'videoSearchBtn':{'value':"Search in Baidu"}, - 'videoSearchReset':{'value':"Clear result"}, + 'insertvideo': { + 'static': { + 'lang_tab_insertV': "Video", + 'lang_tab_searchV': "Search", + 'lang_tab_uploadV': "Upload", + 'lang_video_url': " URL ", + 'lang_video_size': "Video Size", + 'lang_videoW': "Width", + 'lang_videoH': "Height", + 'lang_alignment': "Alignment", + 'videoSearchTxt': {'value': "Enter the search keyword!"}, + 'videoType': {'options': ["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn': {'value': "Search in Baidu"}, + 'videoSearchReset': {'value': "Clear result"}, - 'lang_input_fileStatus':' No file uploaded!', - 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + 'lang_input_fileStatus': ' No file uploaded!', + 'startUpload': {'style': "background:url(upload.png) no-repeat;"}, - 'lang_upload_size':"Video Size", - 'lang_upload_width':"Width", - 'lang_upload_height':"Height", - 'lang_upload_alignment':"Alignment", - 'lang_format_advice':"Recommends mp4 format." + 'lang_upload_size': "Video Size", + 'lang_upload_width': "Width", + 'lang_upload_height': "Height", + 'lang_upload_alignment': "Alignment", + 'lang_format_advice': "Recommends mp4 format." }, - 'numError':"Please enter the correct Num. e.g 123,400", - 'floatLeft':"Float left", - 'floatRight':"Float right", - 'default':"Default", - 'block':"Display in block", - 'urlError':"The video url format may be wrong!", - 'loading':"  The video is loading, please wait…", - 'clickToSelect':"Click to select", - 'goToSource':'Visit source video ', - 'noVideo':"    Sorry,can't find the video,please try again!", + 'numError': "Please enter the correct Num. e.g 123,400", + 'floatLeft': "Float left", + 'floatRight': "Float right", + 'default': "Default", + 'block': "Display in block", + 'urlError': "The video url format may be wrong!", + 'loading': "  The video is loading, please wait…", + 'clickToSelect': "Click to select", + 'goToSource': 'Visit source video ', + 'noVideo': "    Sorry,can't find the video,please try again!", - 'browseFiles':'Open files', - 'uploadSuccess':'Upload Successful!', - 'delSuccessFile':'Remove from the success of the queue', - 'delFailSaveFile':'Remove the save failed file', - 'statusPrompt':' file(s) uploaded! ', - 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', - 'flashLoadingError':'The Flash failed loading! Please check the path or network state', - 'fileUploadReady':'Wait for uploading...', - 'delUploadQueue':'Remove from the uploading queue ', - 'limitPrompt1':'Can not choose more than single', - 'limitPrompt2':'file(s)!Please choose again!', - 'delFailFile':'Remove failure file', - 'fileSizeLimit':'File size exceeds the limit!', - 'emptyFile':'Can not upload an empty file!', - 'fileTypeError':'File type error!', - 'unknownError':'Unknown error!', - 'fileUploading':'Uploading,please wait...', - 'cancelUpload':'Cancel upload', - 'netError':'Network error', - 'failUpload':'Upload failed', - 'serverIOError':'Server IO error!', - 'noAuthority':'No Permission!', - 'fileNumLimit':'Upload limit to the number', - 'failCheck':'Authentication fails, the upload is skipped!', - 'fileCanceling':'Cancel, please wait...', - 'stopUploading':'Upload has stopped...', + 'browseFiles': 'Open files', + 'uploadSuccess': 'Upload Successful!', + 'delSuccessFile': 'Remove from the success of the queue', + 'delFailSaveFile': 'Remove the save failed file', + 'statusPrompt': ' file(s) uploaded! ', + 'flashVersionError': 'The current Flash version is too low, please update FlashPlayer,then try again!', + 'flashLoadingError': 'The Flash failed loading! Please check the path or network state', + 'fileUploadReady': 'Wait for uploading...', + 'delUploadQueue': 'Remove from the uploading queue ', + 'limitPrompt1': 'Can not choose more than single', + 'limitPrompt2': 'file(s)!Please choose again!', + 'delFailFile': 'Remove failure file', + 'fileSizeLimit': 'File size exceeds the limit!', + 'emptyFile': 'Can not upload an empty file!', + 'fileTypeError': 'File type error!', + 'unknownError': 'Unknown error!', + 'fileUploading': 'Uploading,please wait...', + 'cancelUpload': 'Cancel upload', + 'netError': 'Network error', + 'failUpload': 'Upload failed', + 'serverIOError': 'Server IO error!', + 'noAuthority': 'No Permission!', + 'fileNumLimit': 'Upload limit to the number', + 'failCheck': 'Authentication fails, the upload is skipped!', + 'fileCanceling': 'Cancel, please wait...', + 'stopUploading': 'Upload has stopped...', - 'uploadSelectFile':'Select File', - 'uploadAddFile':'Add File', - 'uploadStart':'Start Upload', - 'uploadPause':'Pause Upload', - 'uploadContinue':'Continue Upload', - 'uploadRetry':'Retry Upload', - 'uploadDelete':'Delete', - 'uploadTurnLeft':'Turn Left', - 'uploadTurnRight':'Turn Right', - 'uploadPreview':'Doing Preview', + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', 'updateStatusReady': 'Selected _ files, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', - 'errorExceedSize':'File Size Exceed', - 'errorFileType':'File Type Not Allow', - 'errorInterrupt':'File Upload Interrupted', - 'errorUploadRetry':'Upload Error, Please Retry.', - 'errorHttp':'Http Error', - 'errorServerUpload':'Server Result Error.' + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.' }, - 'template':{ - 'static':{ - 'lang_template_bkcolor':'Background Color', - 'lang_template_clear' : 'Keep Content', - 'lang_template_select':'Select Template' + 'template': { + 'static': { + 'lang_template_bkcolor': 'Background Color', + 'lang_template_clear': 'Keep Content', + 'lang_template_select': 'Select Template' }, - 'blank':"Blank", - 'blog':"Blog", - 'resume':"Resume", - 'richText':"Rich Text", - 'scrPapers':"Scientific Papers" + 'blank': "Blank", + 'blog': "Blog", + 'resume': "Resume", + 'richText': "Rich Text", + 'scrPapers': "Scientific Papers" }, - scrawl:{ - 'static':{ - 'lang_input_previousStep':"Previous", - 'lang_input_nextsStep':"Next", - 'lang_input_clear':'Clear', - 'lang_input_addPic':'AddImage', - 'lang_input_ScalePic':'ScaleImage', - 'lang_input_removePic':'RemoveImage', - 'J_imgTxt':{title:'Add background image'} + scrawl: { + 'static': { + 'lang_input_previousStep': "Previous", + 'lang_input_nextsStep': "Next", + 'lang_input_clear': 'Clear', + 'lang_input_addPic': 'AddImage', + 'lang_input_ScalePic': 'ScaleImage', + 'lang_input_removePic': 'RemoveImage', + 'J_imgTxt': {title: 'Add background image'} }, - 'noScarwl':"No paint, a white paper...", - 'scrawlUpLoading':"Image is uploading, please wait...", - 'continueBtn':"Try again", - 'imageError':"Image failed to load!", - 'backgroundUploading':'Image is uploading,please wait...' + 'noScarwl': "No paint, a white paper...", + 'scrawlUpLoading': "Image is uploading, please wait...", + 'continueBtn': "Try again", + 'imageError': "Image failed to load!", + 'backgroundUploading': 'Image is uploading,please wait...' }, - anchor:{ - 'static':{ - 'lang_input_anchorName':'Anchor Name:' + anchor: { + 'static': { + 'lang_input_anchorName': 'Anchor Name:' } }, - emotion:{ - 'static':{ - 'lang_input_choice':'Choice', - 'lang_input_Tuzki':'Tuzki', - 'lang_input_lvdouwa':'LvDouWa', - 'lang_input_BOBO':'BOBO', - 'lang_input_babyCat':'BabyCat', - 'lang_input_bubble':'Bubble', - 'lang_input_youa':'YouA' + emotion: { + 'static': { + 'lang_input_choice': 'Choice', + 'lang_input_Tuzki': 'Tuzki', + 'lang_input_lvdouwa': 'LvDouWa', + 'lang_input_BOBO': 'BOBO', + 'lang_input_babyCat': 'BabyCat', + 'lang_input_bubble': 'Bubble', + 'lang_input_youa': 'YouA' } }, - help:{ - 'static':{ - 'lang_input_about':'About UEditor Plus', - 'lang_input_shortcuts':'Shortcuts', - 'lang_input_introduction':"UEditor Plus is based on UEditor.", - 'lang_Txt_shortcuts':'Shortcuts', - 'lang_Txt_func':'Function', - 'lang_Txt_bold':'Bold', - 'lang_Txt_copy':'Copy', - 'lang_Txt_cut':'Cut', - 'lang_Txt_Paste':'Paste', - 'lang_Txt_undo':'Undo', - 'lang_Txt_redo':'Redo', - 'lang_Txt_italic':'Italic', - 'lang_Txt_underline':'Underline', - 'lang_Txt_selectAll':'Select All', - 'lang_Txt_visualEnter':'Submit', - 'lang_Txt_fullscreen':'Fullscreen' + help: { + 'static': { + 'lang_input_about': 'About UEditor Plus', + 'lang_input_shortcuts': 'Shortcuts', + 'lang_input_introduction': "UEditor Plus is based on UEditor.", + 'lang_Txt_shortcuts': 'Shortcuts', + 'lang_Txt_func': 'Function', + 'lang_Txt_bold': 'Bold', + 'lang_Txt_copy': 'Copy', + 'lang_Txt_cut': 'Cut', + 'lang_Txt_Paste': 'Paste', + 'lang_Txt_undo': 'Undo', + 'lang_Txt_redo': 'Redo', + 'lang_Txt_italic': 'Italic', + 'lang_Txt_underline': 'Underline', + 'lang_Txt_selectAll': 'Select All', + 'lang_Txt_visualEnter': 'Submit', + 'lang_Txt_fullscreen': 'Fullscreen' } }, - insertframe:{ - 'static':{ - 'lang_input_address':'Address:', - 'lang_input_width':'Width:', - 'lang_input_height':'height:', - 'lang_input_isScroll':'Enable scrollbars:', - 'lang_input_frameborder':'Show frame border:', - 'lang_input_alignMode':'Alignment:', - 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} + insertframe: { + 'static': { + 'lang_input_address': 'Address:', + 'lang_input_width': 'Width:', + 'lang_input_height': 'height:', + 'lang_input_isScroll': 'Enable scrollbars:', + 'lang_input_frameborder': 'Show frame border:', + 'lang_input_alignMode': 'Alignment:', + 'align': {title: "Alignment", options: ["Default", "Left", "Right", "Center"]} }, - 'enterAddress':'Please enter an address!' + 'enterAddress': 'Please enter an address!' }, - link:{ - 'static':{ - 'lang_input_text':'Text:', - 'lang_input_url':'URL:', - 'lang_input_title':'Title:', - 'lang_input_target':'open in new window:' + link: { + 'static': { + 'lang_input_text': 'Text:', + 'lang_input_url': 'URL:', + 'lang_input_title': 'Title:', + 'lang_input_target': 'open in new window:' }, - 'validLink':'Supports only effective when a link is selected', - 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + 'validLink': 'Supports only effective when a link is selected', + 'httpPrompt': 'The hyperlink you enter should start with "http|https|ftp://"!' }, - searchreplace:{ - 'static':{ - lang_tab_search:"Search", - lang_tab_replace:"Replace", - lang_search1:"Search", - lang_search2:"Search", - lang_replace:"Replace", - lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', - lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', - lang_case_sensitive1:"Case sense", - lang_case_sensitive2:"Case sense", - nextFindBtn:{value:"Next"}, - preFindBtn:{value:"Preview"}, - nextReplaceBtn:{value:"Next"}, - preReplaceBtn:{value:"Preview"}, - repalceBtn:{value:"Replace"}, - repalceAllBtn:{value:"Replace all"} + searchreplace: { + 'static': { + lang_tab_search: "Search", + lang_tab_replace: "Replace", + lang_search1: "Search", + lang_search2: "Search", + lang_replace: "Replace", + lang_searchReg: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_searchReg1: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_case_sensitive1: "Case sense", + lang_case_sensitive2: "Case sense", + nextFindBtn: {value: "Next"}, + preFindBtn: {value: "Preview"}, + nextReplaceBtn: {value: "Next"}, + preReplaceBtn: {value: "Preview"}, + repalceBtn: {value: "Replace"}, + repalceAllBtn: {value: "Replace all"} }, - getEnd:"Has the search to the bottom!", - getStart:"Has the search to the top!", - countMsg:"Altogether replaced {#count} character(s)!" + getEnd: "Has the search to the bottom!", + getStart: "Has the search to the top!", + countMsg: "Altogether replaced {#count} character(s)!" }, - spechars:{ - 'static':{}, - tsfh:"Special", - lmsz:"Roman", - szfh:"Numeral", - rwfh:"Japanese", - xlzm:"The Greek", - ewzm:"Russian", - pyzm:"Phonetic", - yyyb:"English", - zyzf:"Others" + spechars: { + 'static': {}, + tsfh: "Special", + lmsz: "Roman", + szfh: "Numeral", + rwfh: "Japanese", + xlzm: "The Greek", + ewzm: "Russian", + pyzm: "Phonetic", + yyyb: "English", + zyzf: "Others" }, - 'edittable':{ - 'static':{ - 'lang_tableStyle':'Table style', - 'lang_insertCaption':'Add table header row', - 'lang_insertTitle':'Add table title row', - 'lang_insertTitleCol':'Add table title col', - 'lang_tableSize':'Automatically adjust table size', - 'lang_autoSizeContent':'Adaptive by form text', - 'lang_orderbycontent':"Table of contents sortable", - 'lang_autoSizePage':'Page width adaptive', - 'lang_example':'Example', - 'lang_borderStyle':'Table Border', - 'lang_color':'Color:' + 'edittable': { + 'static': { + 'lang_tableStyle': 'Table style', + 'lang_insertCaption': 'Add table header row', + 'lang_insertTitle': 'Add table title row', + 'lang_insertTitleCol': 'Add table title col', + 'lang_tableSize': 'Automatically adjust table size', + 'lang_autoSizeContent': 'Adaptive by form text', + 'lang_orderbycontent': "Table of contents sortable", + 'lang_autoSizePage': 'Page width adaptive', + 'lang_example': 'Example', + 'lang_borderStyle': 'Table Border', + 'lang_color': 'Color:' }, - captionName:'Caption', - titleName:'Title', - cellsName:'text', - errorMsg:'There are merged cells, can not sort.' + captionName: 'Caption', + titleName: 'Title', + cellsName: 'text', + errorMsg: 'There are merged cells, can not sort.' }, - 'edittip':{ - 'static':{ - lang_delRow:'Delete entire row', - lang_delCol:'Delete entire col' + 'edittip': { + 'static': { + lang_delRow: 'Delete entire row', + lang_delCol: 'Delete entire col' } }, - 'edittd':{ - 'static':{ - lang_tdBkColor:'Background Color:' + 'edittd': { + 'static': { + lang_tdBkColor: 'Background Color:' } }, - 'formula':{ - 'static':{ - } + 'formula': { + 'static': {}, }, - wordimage:{ - 'static':{ - lang_resave:"The re-save step", - uploadBtn:{src:"upload.png", alt:"Upload"}, - clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, - lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." + wordimage: { + 'static': { + lang_resave: "The re-save step", + uploadBtn: {src: "upload.png", alt: "Upload"}, + clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"}, + lang_step: " 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." }, - fileType:"Image", - flashError:"Flash initialization failed!", - netError:"Network error! Please try again!", - copySuccess:"URL has been copied!", + fileType: "Image", + flashError: "Flash initialization failed!", + netError: "Network error! Please try again!", + copySuccess: "URL has been copied!", - 'flashI18n':{ - lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), - uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), - imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), - textEncoding:"utf-8", - addImageSkinURL:"addImage.png", - allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", - allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", - rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", - rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", - rotateRightBtnEnableSkinURL:"rotateRightEnable.png", - rotateRightBtnDisableSkinURL:"rotateRightDisable.png", - deleteBtnEnableSkinURL:"deleteEnable.png", - deleteBtnDisableSkinURL:"deleteDisable.png", - backgroundURL:'', - listBackgroundURL:'', - buttonURL:'button.png' + 'flashI18n': { + lang: encodeURI('{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}'), + uploadingTF: encodeURI('{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}'), + imageTF: encodeURI('{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}'), + textEncoding: "utf-8", + addImageSkinURL: "addImage.png", + allDeleteBtnUpSkinURL: "allDeleteBtnUpSkin.png", + allDeleteBtnHoverSkinURL: "allDeleteBtnHoverSkin.png", + rotateLeftBtnEnableSkinURL: "rotateLeftEnable.png", + rotateLeftBtnDisableSkinURL: "rotateLeftDisable.png", + rotateRightBtnEnableSkinURL: "rotateRightEnable.png", + rotateRightBtnDisableSkinURL: "rotateRightDisable.png", + deleteBtnEnableSkinURL: "deleteEnable.png", + deleteBtnDisableSkinURL: "deleteDisable.png", + backgroundURL: '', + listBackgroundURL: '', + buttonURL: 'button.png' } }, }; diff --git a/public/js/ueditor/lang/zh-cn/zh-cn.js b/public/js/ueditor/lang/zh-cn/zh-cn.js index 3d69545..a49e91d 100644 --- a/public/js/ueditor/lang/zh-cn/zh-cn.js +++ b/public/js/ueditor/lang/zh-cn/zh-cn.js @@ -6,588 +6,743 @@ * To change this template use File | Settings | File Templates. */ UE.I18N['zh-cn'] = { - 'labelMap':{ - 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', - 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', - 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', - 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', - 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', - 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', - 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', - 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题', - 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言', - 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'插入图片','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接', - 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', - 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', - 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', - 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', - 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', - 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存','formula':'公式', - 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', - 'touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦', - 'inserttable':'插入表格', + 'labelMap': { + 'anchor': '锚点', + 'undo': '撤销', + 'redo': '重做', + 'bold': '加粗', + 'indent': '首行缩进', + 'italic': '斜体', + 'underline': '下划线', + 'strikethrough': '删除线', + 'subscript': '下标', + 'fontborder': '字符边框', + 'superscript': '上标', + 'formatmatch': '格式刷', + 'source': '源代码', + 'blockquote': '引用', + 'pasteplain': '纯文本粘贴模式', + 'selectall': '全选', + 'print': '打印', + 'preview': '预览', + 'horizontal': '分隔线', + 'removeformat': '清除格式', + 'time': '时间', + 'date': '日期', + 'unlink': '取消链接', + 'insertrow': '前插入行', + 'insertcol': '前插入列', + 'mergeright': '右合并单元格', + 'mergedown': '下合并单元格', + 'deleterow': '删除行', + 'deletecol': '删除列', + 'splittorows': '拆分成行', + 'splittocols': '拆分成列', + 'splittocells': '完全拆分单元格', + 'deletecaption': '删除表格标题', + 'inserttitle': '插入标题', + 'mergecells': '合并多个单元格', + 'deletetable': '删除表格', + 'cleardoc': '清空文档', + 'contentimport': '导入内容', + 'insertparagraphbeforetable': "表格前插入行", + 'insertcode': '代码语言', + 'fontfamily': '字体', + 'fontsize': '字号', + 'paragraph': '段落格式', + 'simpleupload': '单图上传', + 'insertimage': '插入图片', + 'edittable': '表格属性', + 'edittd': '单元格属性', + 'link': '超链接', + 'emotion': '表情', + 'spechars': '特殊字符', + 'searchreplace': '查询替换', + 'insertvideo': '视频', + 'insertaudio': '音频', + 'help': '帮助', + 'justifyleft': '居左对齐', + 'justifyright': '居右对齐', + 'justifycenter': '居中对齐', + 'justifyjustify': '两端对齐', + 'forecolor': '字体颜色', + 'backcolor': '背景色', + 'insertorderedlist': '有序列表', + 'insertunorderedlist': '无序列表', + 'fullscreen': '全屏', + 'directionalityltr': '从左向右输入', + 'directionalityrtl': '从右向左输入', + 'rowspacingtop': '段前距', + 'rowspacingbottom': '段后距', + 'pagebreak': '分页', + 'insertframe': '插入Iframe', + 'imagenone': '默认', + 'imageleft': '左浮动', + 'imageright': '右浮动', + 'attachment': '附件', + 'imagecenter': '居中', + 'wordimage': '图片转存', + 'formula': '公式', + 'lineheight': '行间距', + 'edittip': '编辑提示', + 'customstyle': '自定义标题', + 'autotypeset': '自动排版', + 'touppercase': '字母大写', + 'tolowercase': '字母小写', + 'background': '背景', + 'template': '模板', + 'scrawl': '涂鸦', + 'inserttable': '插入表格', }, - 'insertorderedlist':{ - 'num':'1,2,3...', - 'num1':'1),2),3)...', - 'num2':'(1),(2),(3)...', - 'cn':'一,二,三....', - 'cn1':'一),二),三)....', - 'cn2':'(一),(二),(三)....', - 'decimal':'1,2,3...', - 'lower-alpha':'a,b,c...', - 'lower-roman':'i,ii,iii...', - 'upper-alpha':'A,B,C...', - 'upper-roman':'I,II,III...' + 'autosave': { + 'autoRestoreTip': '已自动从草稿箱恢复' }, - 'insertunorderedlist':{ - 'circle':'○ 大圆圈', - 'disc':'● 小黑点', - 'square':'■ 小方块 ', - 'dash' :'— 破折号', - 'dot':' 。 小圆圈' + 'insertorderedlist': { + // 'num': '1,2,3...', + // 'num1': '1),2),3)...', + // 'num2': '(1),(2),(3)...', + // 'cn': '一,二,三....', + // 'cn1': '一),二),三)....', + // 'cn2': '(一),(二),(三)....', + 'decimal': '1,2,3...', + 'lower-alpha': 'a,b,c...', + 'lower-roman': 'i,ii,iii...', + 'upper-alpha': 'A,B,C...', + 'upper-roman': 'I,II,III...' }, - 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, - 'fontfamily':{ - 'songti':'宋体', - 'kaiti':'楷体', - 'heiti':'黑体', - 'lishu':'隶书', - 'yahei':'微软雅黑', - 'andaleMono':'andale mono', + 'insertunorderedlist': { + 'circle': '○ 大圆圈', + 'disc': '● 小黑点', + 'square': '■ 小方块 ', + // 'dash': '— 破折号', + // 'dot': ' 。 小圆圈' + }, + 'paragraph': {'p': '段落', 'h1': '标题 1', 'h2': '标题 2', 'h3': '标题 3', 'h4': '标题 4', 'h5': '标题 5', 'h6': '标题 6'}, + 'fontfamily': { + 'default': '默认', + 'songti': '宋体', + 'kaiti': '楷体', + 'heiti': '黑体', + 'lishu': '隶书', + 'yahei': '微软雅黑', + // 'andaleMono':'andale mono', 'arial': 'arial', - 'arialBlack':'arial black', - 'comicSansMs':'comic sans ms', - 'impact':'impact', - 'timesNewRoman':'times new roman' + // 'arialBlack':'arial black', + // 'comicSansMs':'comic sans ms', + // 'impact':'impact', + 'timesNewRoman': 'times new roman' }, - 'customstyle':{ - 'tc':'标题居中', - 'tl':'标题居左', - 'im':'强调', - 'hi':'明显强调' + 'customstyle': { + 'tc': '标题居中', + 'tl': '标题居左', + 'im': '强调', + 'hi': '明显强调' }, 'autoupload': { 'exceedSizeError': '文件大小超出限制', 'exceedTypeError': '文件格式不允许', 'jsonEncodeError': '服务器返回格式错误', - 'loading':"正在上传...", - 'loadError':"上传错误", + 'loading': "正在上传...", + 'loadError': "上传错误", 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' }, - 'simpleupload':{ + 'simpleupload': { 'exceedSizeError': '文件大小超出限制', 'exceedTypeError': '文件格式不允许', 'jsonEncodeError': '服务器返回格式错误', - 'loading':"正在上传...", - 'loadError':"上传错误", + 'loading': "正在上传...", + 'loadError': "上传错误", 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' }, - 'elementPathTip':"元素路径", - 'wordCountTip':"字数统计", - 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ', - 'wordOverFlowMsg':'字数超出最大允许值,服务器可能拒绝保存!', - 'ok':"确认", - 'cancel':"取消", - 'closeDialog':"关闭对话框", - 'tableDrag':"表格拖动必须引入uiUtils.js文件!", - 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'elementPathTip': "元素路径", + 'wordCountTip': "字数统计", + 'wordCountMsg': '{#count} / {#leave}', + 'wordOverFlowMsg': '字数超出最大允许值,服务器可能拒绝保存!', + 'ok': "确认", + 'cancel': "取消", + 'closeDialog': "关闭对话框", + 'tableDrag': "表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg': "工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', - 'insertcode':{ - 'as3':'ActionScript 3', - 'bash':'Bash/Shell', - 'cpp':'C/C++', - 'css':'CSS', - 'cf':'ColdFusion', - 'c#':'C#', - 'delphi':'Delphi', - 'diff':'Diff', - 'erlang':'Erlang', - 'groovy':'Groovy', - 'html':'HTML', - 'java':'Java', - 'jfx':'JavaFX', - 'js':'JavaScript', - 'pl':'Perl', - 'php':'PHP', - 'plain':'Plain Text', - 'ps':'PowerShell', - 'python':'Python', - 'ruby':'Ruby', - 'scala':'Scala', - 'sql':'SQL', - 'vb':'Visual Basic', - 'xml':'XML' + 'insertcode': { + 'as3': 'ActionScript 3', + 'bash': 'Bash/Shell', + 'cpp': 'C/C++', + 'css': 'CSS', + 'cf': 'ColdFusion', + 'c#': 'C#', + 'delphi': 'Delphi', + 'diff': 'Diff', + 'erlang': 'Erlang', + 'groovy': 'Groovy', + 'html': 'HTML', + 'java': 'Java', + 'jfx': 'JavaFX', + 'js': 'JavaScript', + 'pl': 'Perl', + 'php': 'PHP', + 'plain': 'Plain Text', + 'ps': 'PowerShell', + 'python': 'Python', + 'ruby': 'Ruby', + 'scala': 'Scala', + 'sql': 'SQL', + 'vb': 'Visual Basic', + 'xml': 'XML' }, - 'confirmClear':"确定清空当前文档么?", - 'contextMenu':{ - 'delete':"删除", - 'selectall':"全选", - 'deletecode':"删除代码", - 'cleardoc':"清空文档", - 'confirmclear':"确定清空当前文档么?", - 'unlink':"删除超链接", - 'paragraph':"段落格式", - 'edittable':"表格属性", - 'aligntd':"单元格对齐方式", - 'aligntable':'表格对齐方式', - 'tableleft':'左浮动', - 'tablecenter':'居中显示', - 'tableright':'右浮动', - 'edittd':"单元格属性", - 'setbordervisible':'设置表格边线可见', - 'justifyleft':'左对齐', - 'justifyright':'右对齐', - 'justifycenter':'居中对齐', - 'justifyjustify':'两端对齐', - 'table':"表格", - 'inserttable':'插入表格', - 'deletetable':"删除表格", - 'insertparagraphbefore':"前插入段落", - 'insertparagraphafter':'后插入段落', - 'deleterow':"删除当前行", - 'deletecol':"删除当前列", - 'insertrow':"前插入行", - 'insertcol':"左插入列", - 'insertrownext':'后插入行', - 'insertcolnext':'右插入列', - 'insertcaption':'插入表格名称', - 'deletecaption':'删除表格名称', - 'inserttitle':'插入表格标题行', - 'deletetitle':'删除表格标题行', - 'inserttitlecol':'插入表格标题列', - 'deletetitlecol':'删除表格标题列', - 'averageDiseRow':'平均分布各行', - 'averageDisCol':'平均分布各列', - 'mergeright':"向右合并", - 'mergeleft':"向左合并", - 'mergedown':"向下合并", - 'mergecells':"合并单元格", - 'splittocells':"完全拆分单元格", - 'splittocols':"拆分成列", - 'splittorows':"拆分成行", - 'tablesort':'表格排序', - 'enablesort':'设置表格可排序', - 'disablesort':'取消表格可排序', - 'reversecurrent':'逆序当前', - 'orderbyasc':'按ASCII字符升序', - 'reversebyasc':'按ASCII字符降序', - 'orderbynum':'按数值大小升序', - 'reversebynum':'按数值大小降序', - 'borderbk':'边框底纹', - 'setcolor':'表格隔行变色', - 'unsetcolor':'取消表格隔行变色', - 'setbackground':'选区背景隔行', - 'unsetbackground':'取消选区背景', - 'redandblue':'红蓝相间', - 'threecolorgradient':'三色渐变', - 'copy':"复制(Ctrl + c)", + 'confirmClear': "确定清空当前文档么?", + 'contextMenu': { + 'delete': "删除", + 'selectall': "全选", + 'deletecode': "删除代码", + 'cleardoc': "清空文档", + 'confirmclear': "确定清空当前文档么?", + 'unlink': "删除超链接", + 'paragraph': "段落格式", + 'edittable': "表格属性", + 'aligntd': "单元格对齐方式", + 'aligntable': '表格对齐方式', + 'tableleft': '左浮动', + 'tablecenter': '居中显示', + 'tableright': '右浮动', + 'edittd': "单元格属性", + 'setbordervisible': '设置表格边线可见', + 'justifyleft': '左对齐', + 'justifyright': '右对齐', + 'justifycenter': '居中对齐', + 'justifyjustify': '两端对齐', + 'table': "表格", + 'inserttable': '插入表格', + 'deletetable': "删除表格", + 'insertparagraphbefore': "前插入段落", + 'insertparagraphafter': '后插入段落', + 'deleterow': "删除当前行", + 'deletecol': "删除当前列", + 'insertrow': "前插入行", + 'insertcol': "左插入列", + 'insertrownext': '后插入行', + 'insertcolnext': '右插入列', + 'insertcaption': '插入表格名称', + 'deletecaption': '删除表格名称', + 'inserttitle': '插入表格标题行', + 'deletetitle': '删除表格标题行', + 'inserttitlecol': '插入表格标题列', + 'deletetitlecol': '删除表格标题列', + 'averageDiseRow': '平均分布各行', + 'averageDisCol': '平均分布各列', + 'mergeright': "向右合并", + 'mergeleft': "向左合并", + 'mergedown': "向下合并", + 'mergecells': "合并单元格", + 'splittocells': "完全拆分单元格", + 'splittocols': "拆分成列", + 'splittorows': "拆分成行", + 'tablesort': '表格排序', + 'enablesort': '设置表格可排序', + 'disablesort': '取消表格可排序', + 'reversecurrent': '逆序当前', + 'orderbyasc': '按ASCII字符升序', + 'reversebyasc': '按ASCII字符降序', + 'orderbynum': '按数值大小升序', + 'reversebynum': '按数值大小降序', + 'borderbk': '边框底纹', + 'setcolor': '表格隔行变色', + 'unsetcolor': '取消表格隔行变色', + 'setbackground': '选区背景隔行', + 'unsetbackground': '取消选区背景', + 'redandblue': '红蓝相间', + 'threecolorgradient': '三色渐变', + 'copy': "复制(Ctrl + c)", 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", - 'paste':"粘贴(Ctrl + v)", - 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + 'paste': "粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" }, 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", - 'anchorMsg':"链接", - 'clearColor':'清空颜色', - 'standardColor':'标准颜色', - 'themeColor':'主题颜色', - 'property':'属性', - 'default':'默认', - 'modify':'修改', - 'save':'保存', - 'formulaedit':'公式修改', - 'justifyleft':'左对齐', - 'justifyright':'右对齐', - 'justifycenter':'居中', - 'justify':'默认', - 'clear':'清除', - 'delete':'删除', - 'clickToUpload':"点击上传", - 'unset':'尚未设置语言文件', - 't_row':'行', - 't_col':'列', - 'more':'更多', - 'pasteOpt':'粘贴选项', - 'pasteSourceFormat':"保留源格式", - 'tagFormat':'只保留标签', - 'pasteTextFormat':'只保留文本', - 'autoTypeSet':{ - 'mergeLine':"合并空行", - 'delLine':"清除空行", - 'removeFormat':"清除格式", - 'indent':"首行缩进", - 'alignment':"对齐方式", - 'imageFloat':"图片浮动", - 'removeFontsize':"清除字号", - 'removeFontFamily':"清除字体", - 'removeHtml':"清除冗余HTML代码", - 'pasteFilter':"粘贴过滤", - 'run':"执行", - 'symbol':'符号转换', - 'bdc2sb':'全角转半角', - 'tobdc':'半角转全角' + 'anchorMsg': "链接", + 'clearColor': '清空颜色', + 'standardColor': '标准颜色', + 'themeColor': '主题颜色', + 'property': '属性', + 'default': '默认', + 'modify': '修改', + 'save': '保存', + 'justifyleft': '左对齐', + 'justifyright': '右对齐', + 'justifycenter': '居中', + 'justify': '默认', + 'clear': '清除', + 'delete': '删除', + 'clickToUpload': "点击上传", + 'unset': '尚未设置语言文件', + 't_row': '行', + 't_col': '列', + 'more': '更多', + 'pasteOpt': '粘贴选项', + 'pasteSourceFormat': "保留源格式", + 'tagFormat': '只保留标签', + 'pasteTextFormat': '只保留文本', + 'autoTypeSet': { + 'mergeLine': "合并空行", + 'delLine': "清除空行", + 'removeFormat': "清除格式", + 'indent': "首行缩进", + 'alignment': "对齐方式", + 'imageFloat': "图片浮动", + 'removeFontsize': "清除字号", + 'removeFontFamily': "清除字体", + 'removeHtml': "清除冗余HTML代码", + 'pasteFilter': "粘贴过滤", + 'run': "执行", + 'symbol': '符号转换', + 'bdc2sb': '全角转半角', + 'tobdc': '半角转全角' }, - 'background':{ - 'static':{ - 'lang_background_normal':'背景设置', - 'lang_background_local':'在线图片', - 'lang_background_set':'选项', - 'lang_background_none':'无背景色', - 'lang_background_colored':'有背景色', - 'lang_background_color':'颜色设置', - 'lang_background_netimg':'网络图片', - 'lang_background_align':'对齐方式', - 'lang_background_position':'精确定位', - 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]} + 'background': { + 'static': { + 'lang_background_normal': '背景设置', + 'lang_background_local': '在线图片', + 'lang_background_set': '选项', + 'lang_background_none': '无背景色', + 'lang_background_colored': '有背景色', + 'lang_background_color': '颜色设置', + 'lang_background_netimg': '网络图片', + 'lang_background_align': '对齐方式', + 'lang_background_position': '精确定位', + 'repeatType': {'options': ["居中", "横向重复", "纵向重复", "平铺", "自定义"]} }, - 'noUploadImage':"当前未上传过任何图片!", - 'toggleSelect':"单击可切换选中状态\n原图尺寸: " + 'noUploadImage': "当前未上传过任何图片!", + 'toggleSelect': "单击可切换选中状态\n原图尺寸: " }, //===============dialog i18N======================= - 'insertimage':{ - 'static':{ - 'lang_tab_remote':"插入图片", //节点 - 'lang_tab_upload':"本地上传", - 'lang_tab_online':"在线管理", - 'lang_input_url':"地 址:", - 'lang_input_size':"大 小:", - 'lang_input_width':"宽度", - 'lang_input_height':"高度", - 'lang_input_border':"边 框:", - 'lang_input_vhspace':"边 距:", - 'lang_input_title':"描 述:", - 'lang_input_align':'图片浮动方式:', - 'lang_imgLoading':" 图片加载中……", - 'lang_start_upload':"开始上传", - 'lock':{'title':"锁定宽高比例"}, //属性 - 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option - 'searchTxt':{'value':"请输入搜索关键词"}, - 'searchBtn':{'value':"百度一下"}, - 'searchReset':{'value':"清空搜索"}, - 'noneAlign':{'title':'无浮动'}, - 'leftAlign':{'title':'左浮动'}, - 'rightAlign':{'title':'右浮动'}, - 'centerAlign':{'title':'居中独占一行'} + 'insertimage': { + 'static': { + 'lang_tab_remote': "插入图片", //节点 + 'lang_tab_upload': "本地上传", + 'lang_tab_online': "在线管理", + 'lang_input_url': "地 址:", + 'lang_input_size': "大 小:", + 'lang_input_width': "宽度", + 'lang_input_height': "高度", + 'lang_input_border': "边 框:", + 'lang_input_vhspace': "边 距:", + 'lang_input_title': "描 述:", + 'lang_input_align': '图片浮动方式:', + 'lang_imgLoading': " 图片加载中……", + 'lang_start_upload': "开始上传", + 'lock': {'title': "锁定宽高比例"}, //属性 + 'searchType': {'title': "图片类型", 'options': ["新闻", "壁纸", "表情", "头像"]}, //select的option + 'searchTxt': {'value': "请输入搜索关键词"}, + 'searchBtn': {'value': "百度一下"}, + 'searchReset': {'value': "清空搜索"}, + 'noneAlign': {'title': '无浮动'}, + 'leftAlign': {'title': '左浮动'}, + 'rightAlign': {'title': '右浮动'}, + 'centerAlign': {'title': '居中独占一行'} }, - 'uploadSelectFile':'点击选择图片', - 'uploadAddFile':'继续添加', - 'uploadStart':'开始上传', - 'uploadPause':'暂停上传', - 'uploadContinue':'继续上传', - 'uploadRetry':'重试上传', - 'uploadDelete':'删除', - 'uploadTurnLeft':'向左旋转', - 'uploadTurnRight':'向右旋转', - 'uploadPreview':'预览中', - 'uploadNoPreview':'不能预览', + 'uploadSelectFile': '点击选择图片', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', + 'uploadNoPreview': '不能预览', 'updateStatusReady': '选中_张图片,共_KB。', 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', 'updateStatusFinish': '共_张(_KB),_张上传成功', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', - 'errorExceedSize':'文件大小超出', - 'errorFileType':'文件格式不允许', - 'errorInterrupt':'文件传输中断', - 'errorUploadRetry':'上传失败,请重试', - 'errorHttp':'http请求错误', - 'errorServerUpload':'服务器返回出错', - 'remoteLockError':"宽高不正确,不能所定比例", - 'numError':"请输入正确的长度或者宽度值!例如:123,400", - 'imageUrlError':"不允许的图片格式或者图片域!", - 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!", - 'searchRemind':"请输入搜索关键词", - 'searchLoading':"图片加载中,请稍后……", - 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!" + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错', + 'remoteLockError': "宽高不正确,不能所定比例", + 'numError': "请输入正确的长度或者宽度值!例如:123,400", + 'imageUrlError': "不允许的图片格式或者图片域!", + 'imageLoadError': "图片加载失败!请检查链接地址或网络状态!", + 'searchRemind': "请输入搜索关键词", + 'searchLoading': "图片加载中,请稍后……", + 'searchRetry': " :( ,抱歉,没有找到图片!请重试一次!" }, - 'attachment':{ - 'static':{ + 'attachment': { + 'static': { 'lang_tab_upload': '上传附件', 'lang_tab_online': '在线附件', - 'lang_start_upload':"开始上传", - 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" + 'lang_start_upload': "开始上传", + 'lang_drop_remind': "可以将文件拖到这里,单次最多可选100个文件" }, - 'uploadSelectFile':'点击选择文件', - 'uploadAddFile':'继续添加', - 'uploadStart':'开始上传', - 'uploadPause':'暂停上传', - 'uploadContinue':'继续上传', - 'uploadRetry':'重试上传', - 'uploadDelete':'删除', - 'uploadTurnLeft':'向左旋转', - 'uploadTurnRight':'向右旋转', - 'uploadPreview':'预览中', + 'uploadSelectFile': '点击选择文件', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', 'updateStatusReady': '选中_个文件,共_KB。', 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', 'updateStatusFinish': '共_个(_KB),_个上传成功', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', - 'errorExceedSize':'文件大小超出', - 'errorFileType':'文件格式不允许', - 'errorInterrupt':'文件传输中断', - 'errorUploadRetry':'上传失败,请重试', - 'errorHttp':'http请求错误', - 'errorServerUpload':'服务器返回出错' + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错' }, - 'insertvideo':{ - 'static':{ - 'lang_tab_insertV':"插入视频", - 'lang_tab_searchV':"搜索视频", - 'lang_tab_uploadV':"上传视频", - 'lang_video_url':"视频网址", - 'lang_video_size':"视频尺寸", - 'lang_videoW':"宽度", - 'lang_videoH':"高度", - 'lang_alignment':"对齐方式", - 'videoSearchTxt':{'value':"请输入搜索关键字!"}, - 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, - 'videoSearchBtn':{'value':"百度一下"}, - 'videoSearchReset':{'value':"清空结果"}, + 'insertvideo': { + 'static': { + 'lang_tab_insertV': "插入视频", + 'lang_tab_searchV': "搜索视频", + 'lang_tab_uploadV': "上传视频", + 'lang_video_url': "视频网址", + 'lang_video_size': "视频尺寸", + 'lang_videoW': "宽度", + 'lang_videoH': "高度", + 'lang_alignment': "对齐方式", + 'videoSearchTxt': {'value': "请输入搜索关键字!"}, + 'videoType': {'options': ["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn': {'value': "百度一下"}, + 'videoSearchReset': {'value': "清空结果"}, - 'lang_input_fileStatus':' 当前未上传文件', - 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + 'lang_input_fileStatus': ' 当前未上传文件', + 'startUpload': {'style': "background:url(upload.png) no-repeat;"}, - 'lang_upload_size':"视频尺寸", - 'lang_upload_width':"宽度", - 'lang_upload_height':"高度", - 'lang_upload_alignment':"对齐方式", - 'lang_format_advice':"建议使用mp4格式." + 'lang_upload_size': "视频尺寸", + 'lang_upload_width': "宽度", + 'lang_upload_height': "高度", + 'lang_upload_alignment': "对齐方式", + 'lang_format_advice': "建议使用mp4格式." }, - 'numError':"请输入正确的数值,如123,400", - 'floatLeft':"左浮动", - 'floatRight':"右浮动", - '"default"':"默认", - 'block':"独占一行", - 'urlError':"输入的视频地址有误,请检查后再试!", - 'loading':"  视频加载中,请等待……", - 'clickToSelect':"点击选中", - 'goToSource':'访问源视频', - 'noVideo':"    抱歉,找不到对应的视频,请重试!", + 'numError': "请输入正确的数值,如123,400", + 'floatLeft': "左浮动", + 'floatRight': "右浮动", + 'default': "默认", + 'block': "独占一行", + 'urlError': "输入的视频地址有误,请检查后再试!", + 'loading': "  视频加载中,请等待……", + 'clickToSelect': "点击选中", + 'goToSource': '访问源视频', + 'noVideo': "    抱歉,找不到对应的视频,请重试!", - 'browseFiles':'浏览文件', - 'uploadSuccess':'上传成功!', - 'delSuccessFile':'从成功队列中移除', - 'delFailSaveFile':'移除保存失败文件', - 'statusPrompt':' 个文件已上传! ', - 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!', - 'flashLoadingError':'Flash加载失败!请检查路径或网络状态', - 'fileUploadReady':'等待上传……', - 'delUploadQueue':'从上传队列中移除', - 'limitPrompt1':'单次不能选择超过', - 'limitPrompt2':'个文件!请重新选择!', - 'delFailFile':'移除失败文件', - 'fileSizeLimit':'文件大小超出限制!', - 'emptyFile':'空文件无法上传!', - 'fileTypeError':'文件类型不允许!', - 'unknownError':'未知错误!', - 'fileUploading':'上传中,请等待……', - 'cancelUpload':'取消上传', - 'netError':'网络错误', - 'failUpload':'上传失败!', - 'serverIOError':'服务器IO错误!', - 'noAuthority':'无权限!', - 'fileNumLimit':'上传个数限制', - 'failCheck':'验证失败,本次上传被跳过!', - 'fileCanceling':'取消中,请等待……', - 'stopUploading':'上传已停止……', + 'browseFiles': '浏览文件', + 'uploadSuccess': '上传成功!', + 'delSuccessFile': '从成功队列中移除', + 'delFailSaveFile': '移除保存失败文件', + 'statusPrompt': ' 个文件已上传! ', + 'flashVersionError': '当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError': 'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady': '等待上传……', + 'delUploadQueue': '从上传队列中移除', + 'limitPrompt1': '单次不能选择超过', + 'limitPrompt2': '个文件!请重新选择!', + 'delFailFile': '移除失败文件', + 'fileSizeLimit': '文件大小超出限制!', + 'emptyFile': '空文件无法上传!', + 'fileTypeError': '文件类型不允许!', + 'unknownError': '未知错误!', + 'fileUploading': '上传中,请等待……', + 'cancelUpload': '取消上传', + 'netError': '网络错误', + 'failUpload': '上传失败!', + 'serverIOError': '服务器IO错误!', + 'noAuthority': '无权限!', + 'fileNumLimit': '上传个数限制', + 'failCheck': '验证失败,本次上传被跳过!', + 'fileCanceling': '取消中,请等待……', + 'stopUploading': '上传已停止……', - 'uploadSelectFile':'点击选择文件', - 'uploadAddFile':'继续添加', - 'uploadStart':'开始上传', - 'uploadPause':'暂停上传', - 'uploadContinue':'继续上传', - 'uploadRetry':'重试上传', - 'uploadDelete':'删除', - 'uploadTurnLeft':'向左旋转', - 'uploadTurnRight':'向右旋转', - 'uploadPreview':'预览中', + 'uploadSelectFile': '点击选择文件', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', 'updateStatusReady': '选中_个文件,共_KB。', 'updateStatusConfirm': '成功上传_个,_个失败', 'updateStatusFinish': '共_个(_KB),_个成功上传', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', - 'errorExceedSize':'文件大小超出', - 'errorFileType':'文件格式不允许', - 'errorInterrupt':'文件传输中断', - 'errorUploadRetry':'上传失败,请重试', - 'errorHttp':'http请求错误', - 'errorServerUpload':'服务器返回出错' + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错' }, - 'template':{ - 'static':{ - 'lang_template_bkcolor':'背景颜色', - 'lang_template_clear' : '保留原有内容', - 'lang_template_select' : '选择模板' + 'insertaudio': { + 'static': { + 'lang_tab_insertV': "插入音频", + 'lang_tab_searchV': "搜索音频", + 'lang_tab_uploadV': "上传音频", + 'lang_video_url': "音频网址", + 'lang_video_size': "音频尺寸", + 'lang_videoW': "宽度", + 'lang_videoH': "高度", + 'lang_alignment': "对齐方式", + 'videoSearchTxt': {'value': "请输入搜索关键字!"}, + 'videoType': {'options': ["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn': {'value': "百度一下"}, + 'videoSearchReset': {'value': "清空结果"}, + + 'lang_input_fileStatus': ' 当前未上传文件', + 'startUpload': {'style': "background:url(upload.png) no-repeat;"}, + + 'lang_upload_size': "音频尺寸", + 'lang_upload_width': "宽度", + 'lang_upload_height': "高度", + 'lang_upload_alignment': "对齐方式", + 'lang_format_advice': "建议使用mp4格式." + }, - 'blank':"空白文档", - 'blog':"博客文章", - 'resume':"个人简历", - 'richText':"图文混排", - 'sciPapers':"科技论文" + 'numError': "请输入正确的数值,如123,400", + 'floatLeft': "左浮动", + 'floatRight': "右浮动", + 'default': "默认", + 'block': "独占一行", + 'urlError': "输入的音频地址有误,请检查后再试!", + 'loading': "  音频加载中,请等待……", + 'clickToSelect': "点击选中", + 'goToSource': '访问源音频', + 'noVideo': "    抱歉,找不到对应的音频,请重试!", + + 'browseFiles': '浏览文件', + 'uploadSuccess': '上传成功!', + 'delSuccessFile': '从成功队列中移除', + 'delFailSaveFile': '移除保存失败文件', + 'statusPrompt': ' 个文件已上传! ', + 'flashVersionError': '当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError': 'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady': '等待上传……', + 'delUploadQueue': '从上传队列中移除', + 'limitPrompt1': '单次不能选择超过', + 'limitPrompt2': '个文件!请重新选择!', + 'delFailFile': '移除失败文件', + 'fileSizeLimit': '文件大小超出限制!', + 'emptyFile': '空文件无法上传!', + 'fileTypeError': '文件类型不允许!', + 'unknownError': '未知错误!', + 'fileUploading': '上传中,请等待……', + 'cancelUpload': '取消上传', + 'netError': '网络错误', + 'failUpload': '上传失败!', + 'serverIOError': '服务器IO错误!', + 'noAuthority': '无权限!', + 'fileNumLimit': '上传个数限制', + 'failCheck': '验证失败,本次上传被跳过!', + 'fileCanceling': '取消中,请等待……', + 'stopUploading': '上传已停止……', + + 'uploadSelectFile': '点击选择文件', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '成功上传_个,_个失败', + 'updateStatusFinish': '共_个(_KB),_个成功上传', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错' + }, + 'template': { + 'static': { + 'lang_template_bkcolor': '背景颜色', + 'lang_template_clear': '保留原有内容', + 'lang_template_select': '选择模板' + }, + 'blank': "空白文档", + 'blog': "博客文章", + 'resume': "个人简历", + 'richText': "图文混排", + 'sciPapers': "科技论文" }, - 'scrawl':{ - 'static':{ - 'lang_input_previousStep':"上一步", - 'lang_input_nextsStep':"下一步", - 'lang_input_clear':'清空', - 'lang_input_addPic':'添加背景', - 'lang_input_ScalePic':'缩放背景', - 'lang_input_removePic':'删除背景', - 'J_imgTxt':{title:'添加背景图片'} + 'scrawl': { + 'static': { + 'lang_input_previousStep': "上一步", + 'lang_input_nextsStep': "下一步", + 'lang_input_clear': '清空', + 'lang_input_addPic': '添加背景', + 'lang_input_ScalePic': '缩放背景', + 'lang_input_removePic': '删除背景', + 'J_imgTxt': {title: '添加背景图片'} }, - 'noScarwl':"尚未作画,白纸一张~", - 'scrawlUpLoading':"涂鸦上传中,别急哦~", - 'continueBtn':"继续", - 'imageError':"糟糕,图片读取失败了!", - 'backgroundUploading':'背景图片上传中,别急哦~' + 'noScarwl': "尚未作画,白纸一张~", + 'scrawlUpLoading': "涂鸦上传中,别急哦~", + 'continueBtn': "继续", + 'imageError': "糟糕,图片读取失败了!", + 'backgroundUploading': '背景图片上传中,别急哦~' }, - 'anchor':{ - 'static':{ - 'lang_input_anchorName':'锚点名字:' + 'anchor': { + 'static': { + 'lang_input_anchorName': '锚点名字:' } }, - 'emotion':{ - 'static':{ - 'lang_input_choice':'精选', - 'lang_input_Tuzki':'兔斯基', - 'lang_input_BOBO':'BOBO', - 'lang_input_lvdouwa':'绿豆蛙', - 'lang_input_babyCat':'baby猫', - 'lang_input_bubble':'泡泡', - 'lang_input_youa':'有啊' + 'emotion': { + 'static': { + 'lang_input_choice': '精选', + 'lang_input_Tuzki': '兔斯基', + 'lang_input_BOBO': 'BOBO', + 'lang_input_lvdouwa': '绿豆蛙', + 'lang_input_babyCat': 'baby猫', + 'lang_input_bubble': '泡泡', + 'lang_input_youa': '有啊' } }, - 'help':{ - 'static':{ - 'lang_input_about':'关于 UEditor Plus', - 'lang_input_shortcuts':'快捷键', - 'lang_input_introduction':'UEditor Plus 是基于百度UEditor二次开发的所见即所得富文本web编辑器,主要丰富也界面样式,注重用户体验等特点。基于Apache 2.0协议开源,允许自由使用和修改代码。', - 'lang_Txt_shortcuts':'快捷键', - 'lang_Txt_func':'功能', - 'lang_Txt_bold':'给选中字设置为加粗', - 'lang_Txt_copy':'复制选中内容', - 'lang_Txt_cut':'剪切选中内容', - 'lang_Txt_Paste':'粘贴', - 'lang_Txt_undo':'重新执行上次操作', - 'lang_Txt_redo':'撤销上一次操作', - 'lang_Txt_italic':'给选中字设置为斜体', - 'lang_Txt_underline':'给选中字加下划线', - 'lang_Txt_selectAll':'全部选中', - 'lang_Txt_visualEnter':'软回车', - 'lang_Txt_fullscreen':'全屏' + 'help': { + 'static': { + 'lang_input_about': '关于 UEditor Plus', + 'lang_input_shortcuts': '快捷键', + 'lang_input_introduction': 'UEditor Plus 是基于百度UEditor二次开发的所见即所得富文本web编辑器,主要丰富也界面样式,注重用户体验等特点。基于Apache 2.0协议开源,允许自由使用和修改代码。', + 'lang_Txt_shortcuts': '快捷键', + 'lang_Txt_func': '功能', + 'lang_Txt_bold': '给选中字设置为加粗', + 'lang_Txt_copy': '复制选中内容', + 'lang_Txt_cut': '剪切选中内容', + 'lang_Txt_Paste': '粘贴', + 'lang_Txt_undo': '重新执行上次操作', + 'lang_Txt_redo': '撤销上一次操作', + 'lang_Txt_italic': '给选中字设置为斜体', + 'lang_Txt_underline': '给选中字加下划线', + 'lang_Txt_selectAll': '全部选中', + 'lang_Txt_visualEnter': '软回车', + 'lang_Txt_fullscreen': '全屏' } }, - 'insertframe':{ - 'static':{ - 'lang_input_address':'地址:', - 'lang_input_width':'宽度:', - 'lang_input_height':'高度:', - 'lang_input_isScroll':'允许滚动条:', - 'lang_input_frameborder':'显示框架边框:', - 'lang_input_alignMode':'对齐方式:', - 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]} + 'insertframe': { + 'static': { + 'lang_input_address': '地址:', + 'lang_input_width': '宽度:', + 'lang_input_height': '高度:', + 'lang_input_isScroll': '允许滚动条:', + 'lang_input_frameborder': '显示框架边框:', + 'lang_input_alignMode': '对齐方式:', + 'align': {title: "对齐方式", options: ["默认", "左对齐", "右对齐", "居中"]} }, - 'enterAddress':'请输入地址!' + 'enterAddress': '请输入地址!' }, - 'link':{ - 'static':{ - 'lang_input_text':'文本内容:', - 'lang_input_url':'链接地址:', - 'lang_input_title':'标题:', - 'lang_input_target':'是否在新窗口打开:' + 'link': { + 'static': { + 'lang_input_text': '文本内容:', + 'lang_input_url': '链接地址:', + 'lang_input_title': '标题:', + 'lang_input_target': '是否在新窗口打开:' }, - 'validLink':'只支持选中一个链接时生效', - 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + 'validLink': '只支持选中一个链接时生效', + 'httpPrompt': '您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' }, - 'searchreplace':{ - 'static':{ - lang_tab_search:"查找", - lang_tab_replace:"替换", - lang_search1:"查找", - lang_search2:"查找", - lang_replace:"替换", - lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', - lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', - lang_case_sensitive1:"区分大小写", - lang_case_sensitive2:"区分大小写", - nextFindBtn:{value:"下一个"}, - preFindBtn:{value:"上一个"}, - nextReplaceBtn:{value:"下一个"}, - preReplaceBtn:{value:"上一个"}, - repalceBtn:{value:"替换"}, - repalceAllBtn:{value:"全部替换"} + 'searchreplace': { + 'static': { + lang_tab_search: "查找", + lang_tab_replace: "替换", + lang_search1: "查找", + lang_search2: "查找", + lang_replace: "替换", + lang_searchReg: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_searchReg1: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_case_sensitive1: "区分大小写", + lang_case_sensitive2: "区分大小写", + nextFindBtn: {value: "下一个"}, + preFindBtn: {value: "上一个"}, + nextReplaceBtn: {value: "下一个"}, + preReplaceBtn: {value: "上一个"}, + repalceBtn: {value: "替换"}, + repalceAllBtn: {value: "全部替换"} }, - getEnd:"已经搜索到文章末尾!", - getStart:"已经搜索到文章头部", - countMsg:"总共替换了{#count}处!" + getEnd: "已经搜索到文章末尾!", + getStart: "已经搜索到文章头部", + countMsg: "总共替换了{#count}处!" }, - 'spechars':{ - 'static':{}, - tsfh:"特殊字符", - lmsz:"罗马字符", - szfh:"数学字符", - rwfh:"日文字符", - xlzm:"希腊字母", - ewzm:"俄文字符", - pyzm:"拼音字母", - yyyb:"英语音标", - zyzf:"其他" + 'spechars': { + 'static': {}, + tsfh: "特殊字符", + lmsz: "罗马字符", + szfh: "数学字符", + rwfh: "日文字符", + xlzm: "希腊字母", + ewzm: "俄文字符", + pyzm: "拼音字母", + yyyb: "英语音标", + zyzf: "其他" }, - 'edittable':{ - 'static':{ - 'lang_tableStyle':'表格样式', - 'lang_insertCaption':'添加表格名称行', - 'lang_insertTitle':'添加表格标题行', - 'lang_insertTitleCol':'添加表格标题列', - 'lang_orderbycontent':"使表格内容可排序", - 'lang_tableSize':'自动调整表格尺寸', - 'lang_autoSizeContent':'按表格文字自适应', - 'lang_autoSizePage':'按页面宽度自适应', - 'lang_example':'示例', - 'lang_borderStyle':'表格边框', - 'lang_color':'颜色:' + 'edittable': { + 'static': { + 'lang_tableStyle': '表格样式', + 'lang_insertCaption': '添加表格名称行', + 'lang_insertTitle': '添加表格标题行', + 'lang_insertTitleCol': '添加表格标题列', + 'lang_orderbycontent': "使表格内容可排序", + 'lang_tableSize': '自动调整表格尺寸', + 'lang_autoSizeContent': '按表格文字自适应', + 'lang_autoSizePage': '按页面宽度自适应', + 'lang_example': '示例', + 'lang_borderStyle': '表格边框', + 'lang_color': '颜色:' }, - captionName:'表格名称', - titleName:'标题', - cellsName:'内容', - errorMsg:'有合并单元格,不可排序' + captionName: '表格名称', + titleName: '标题', + cellsName: '内容', + errorMsg: '有合并单元格,不可排序' }, - 'edittip':{ - 'static':{ - lang_delRow:'删除整行', - lang_delCol:'删除整列' + 'edittip': { + 'static': { + lang_delRow: '删除整行', + lang_delCol: '删除整列' } }, - 'edittd':{ - 'static':{ - lang_tdBkColor:'背景颜色:' + 'edittd': { + 'static': { + lang_tdBkColor: '背景颜色:' } }, - 'formula':{ - 'static':{ - } + 'formula': { + 'static': {}, }, - 'wordimage':{ - 'static':{ - lang_resave:"转存步骤", - uploadBtn:{src:"upload.png",alt:"上传"}, - clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, - lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" + 'wordimage': { + 'static': { + lang_resave: "转存步骤", + uploadBtn: {src: "upload.png", alt: "上传"}, + clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"}, + lang_step: "1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" }, - 'fileType':"图片", - 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", - 'netError':"网络连接错误,请重试!", - 'copySuccess':"图片地址已经复制!", - 'flashI18n':{} //留空默认中文 + 'fileType': "图片", + 'flashError': "FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError': "网络连接错误,请重试!", + 'copySuccess': "图片地址已经复制!", + 'flashI18n': {} //留空默认中文 }, }; diff --git a/public/js/ueditor/themes/default/css/ueditor.css b/public/js/ueditor/themes/default/css/ueditor.css index b948978..35a0ef8 100644 --- a/public/js/ueditor/themes/default/css/ueditor.css +++ b/public/js/ueditor/themes/default/css/ueditor.css @@ -1,139 +1,118 @@ /*基础UI构建 */ - -:root{ - --edui-color-active-bg: rgba(200,200,200,0.3); +:root { + --edui-color-active-bg: rgba(200, 200, 200, 0.3); + --edui-color-border: #EEEEEE; + --edui-bg-toolbar: #FFFFFF; + --edui-color-muted: #CCCCCC; } - @font-face { - font-family: "edui-iconfont"; /* Project id 2897874 */ - src: url('./../font/iconfont.woff2?t=1651572942270') format('woff2'), - url('./../font/iconfont.woff?t=1651572942270') format('woff'), - url('./../font/iconfont.ttf?t=1651572942270') format('truetype'); + font-family: "edui-iconfont"; + /* Project id 2897874 */ + src: url("data:font/woff2;base64,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") format('woff2'), url("data:font/woff;base64,d09GRgABAAAAADfQAAsAAAAAZUwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAARAAAAGA8QFDMY21hcAAAAYgAAANEAAAIPnIReN9nbHlmAAAEzAAALTQAAFEQtidAlWhlYWQAADIAAAAAMQAAADYmRnCAaGhlYQAAMjQAAAAgAAAAJAflA/xobXR4AAAyVAAAACIAAAGMjCb/9mxvY2EAADJ4AAAAyAAAAMjr8gAUbWF4cAAAM0AAAAAfAAAAIAGAAOZuYW1lAAAzYAAAAUwAAAKjCVMyunBvc3QAADSsAAADIQAABRXhBxgkeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGFhYJzAwMrAwNTJdIaBgaEfQjO+ZjBi5ACKMrAyM2AFAWmuKQwHnjG8/cPc8L+BgYH5DsNqoDAjiiImAILQDY54nM3VS0/UVxzG8e/AiHLxfofilbYUSumNi1WnLUWLlN5oS+83ogsTt27EhfEV1E1N+gZ0URIXxpUL0vQN6IpX8Dv/yUii0SoqiX3OPISVcdfGOfkwM38yOZk5z+/5A6uARnlVynr5OyW9ouE3XS3VrzfSUr9ebjiu98d5T5/pio7oiu7oib7oj+GoxGiMx0RMxXSciJNxOs7EubgYl2I25mI+7sSjVE6tqT0NpKE0mWbS+TSbrqebaTEtFZVipDhbXKiWqr3V27WW2qlb1YWlJ08giM6VXQbru4w9c5fFp+5yI91d3mVmZZfm+i6P8y7/+aOkX+0PLq+sP+vryjPX1aeua8wtr79W1t/1BW/xNgMMMsSPDHOAL3mHgxziMBU+5l3208WL7GEv+/iU3bxAJ7vooJ2dbGUb29nBGlYzzU9M0M/3jPARP9DKz7zBL/zKOiaVhs0cYSObaONzPqSJD/T9xjjGOH1s4E2O0sN6GviC92mmVwma4hW+5hu+5Ttl53VG2cInrOUlvuIzXqZbCXtNuVL+Sk3/w3k874+2/Kd8efnddJ4D0xkTJdNpEw2mcycaTQkgyqYsEKtMqSCaTPkgVpuSQqwxZYZoNqWHaDHliGg1JYpoM2WLWGtKGbHOlDdivSl5xAZTBomNpjQSm0y5JDabEkpsMWWV2GpKLbHNlF9iuynJxA5TpomdpnQT7aacEx1Gfu408v93Gflzu4285x4j77nXyHvuM/Ke+438+3UZ+XfttvrZ9ZimiugzzRfRb+TnQdPMEUOm6SOGTXNIVEwTSYwa+UzGTFNKHDPNKzFumlxiwjTDxJSRz2raNNfECct3gzhp5DM5bZp64oyRz/Cckc/wouXkxiVTOxCzpp4g5oycwXlTdxB3LN9tYtHI3+mhkb/TI1PHkMqmtiG1mnqH1G5qINKAqYtIQ6ZWIk2a+ok0Y2oq0nlTZ5FmTe1Fum7qMdINU6ORblq+a6a7ppYj3TP1HekfU/OR7ps6kPTA1IakRVMvkpYs35GLiqkrKUZMrUkxY+pPirOmJqW4YOpUqiVTu1LtNfUs1dumxqXWbOpeai2mFqZ2yvId/1bV1MwsPDZ1NAtLRvlftxnJAHic1XwJmBvFlXBXVR86WkerJfVoNJJG0yNpZjS3RpLHY4/HB57xgW8N+AgYH2ODc8ASzGESlAQT7GCuLCRLIDG7AfLjwJJwJJuQZAKEhCQkJFl72WzYBRLyZ8MRNoeXZEft/71qaUbjI/D/m//7v19qVb26X1W9eu9V1WsJoiCc+E92gDkFXcgIWaFfEEiyxUtCWjBOcsn+YZLXBrqJHvQSM9nSjaFhjI+TUCoZSiaIGTLzJn3NausYy2bHOsjz3G9tLjRbV4ADD7keA5Rcb13x1N7Vq1YzJ+Sblb/ycF1OeNpWZ+761rcECXD7BvsmGxGCQrswLKwXJgRBasmkM+mBYqFY6DfCRjioyIrMWtANYrgfUwYwD2uBbMNkALND3jgJQp4M9GE6MjwdmeaFuskwqUZR4coLd86bP3/ezgt/t9sGdl+1e9N4Lp/PjW96btM5uYGB3Dmb2j26q6Ozs8MViDpzUIXz3apOnI1NTVGnHnWa6ZTpfI8vwFzBoIv5o66QYYScC4eHJnb/bvfE0Pz5VWCYjUBlG3+08Rys3gYGKh+CGtp2/9XuNmdUd/aVbyj3ORcGGl3R0VVjUVcjNJM6b9d5ra514ajD3+13RIPMoXUPdGuKAB+CDr2X/g2MnZCCMRtYQPg4JEg46CMwauRG061pTzyhtXRrr2jaKx5lmzvQFXjiS1p3C0RApMKIwGAOfs6epG8JDqFBSELFA+kWORjuLxAtmU/mi0Yxo2hJzdAYAEYxlMuzzs5hfCoB8oR14KXb8997ib6xYiT/hYfy4ytoOMGTiVAJrNj20u0D33uJHLL+tILcWdmdf+ih/Dk/+YmNO7uDPikEoD2zRQHMs6RFNgjMLimk2c1LfS5rx9Mu31JJZCTgTLjIr5hIn1Arx/+kOkXrHlWle0QnViPyuu6lLwo+oHBDiApCsSWd0QYKxVR/2NBgromp5UgS+gD0fFMoTpuC9H9yr/KlQ4doztLJ65UROtkM8ZuDcUog4R7077HuJudbd9P+G6AJFcbpv9gvmQQj5hDigil0CN1CUVginC2sFcaFzdBuSDEJ/PKpJLQMywaIENaUrCBYKGbCBslDej6dKToBkkIknckSSIDFBssPCBeWnmEPPhQl+WJSgbwmOi9072Kf/lzUWkDmJXvZmCxS6ylRIcu6kk1iyHqSfe9Jqh214lYD+RBdbr0WDLnjjf772xa1tS1ag05bPJudl80et357H/3PPzmNh9+/r7Vj2827uoh3130rnu9KHv0BVCeJP/pBso892NFqPbmLDO16wkg2HSXNVsMu8qGzdlmvO6gRezOzePXitjZwMsuwynnZn1q/3XXfnzLJL+4Lids4WcJYHWcHmUvww5wAvwmZmv21+0gMhXyHPHHJxZdcXNiUz2+yfvHSS8x1SeVd9O8q7yIH85v2bM5bD37rqVpdv2c3MLVaF7AuZFxa9Zs3FIPMzW8uFDbnt8Pn6aefZmphM1bwfvpoZQV9dPttT3+rWs8j7PtMBpoDKk8ZSkY2W5C0lXCuv1DMyUCAigm8r98oaslimr706ujrm99zaMcOYu4bndj44cA2p/WVjdcGtunfuOZjO3ZYL+wb/dXro68u4hmWvmfDOnLZezbs+xxPWcp5223sQbYH1mdU6BJGhRJg3w2UjiQB3DcMTLYA3LaHhA0zHzb0oAwpaYgp5JKhYHiIsAwwZ+DN1S4DksD9FhDgYyl7HG26Mdn+lp2dxWarNdHVlaBPJLrarmlv+niq/SKnXBmWnU6Z/Cyg/tOOB8INg9su3TY4uG2wdW7kQckrGZJkfT41kk6PrEAnTW/q3tnc3tU89VRzV1czHW8uDrSl/zrWXklgLWye7DzmCVjaA9ElqblYz6Xb5mqBByWoxyvdW60EHMENfb+f/ZhthL63CQVYI2uF84Q9whXCfuFW4TPA45PdtE7QaNgLcqpQMpWW9HwCPC0cI/bo1IV0E9h/YYj0hyEAIi2N48YDUn1K7oyBWdmS9QGWqtybXdrevaqbLu9Z1d29qqfyWLQnCg9d3tTdBM9FelNTOhrVrQ8Fo9EMAP/SCUCwUweQ3DB1DH3WgW7lnpmUH86AP+BuJ1SjW9vryt41E18Se1dkqVJF4I+ADQtHu5sqf6yiojR1R3c06Z/BAp/BAjXIciBKmSgZRxzTTU/Zwfrn1vpAlR+XQRr0oSxJZ3L5JIjWZN4EqZkDXlbsRi7tJYoZyoEUBjdODFg2IIozXkLLq681j1tvMGDVx82Fi1fntqRW5q8dXbd8bE/09o8w9pHbo3vGlq8bW7xwYGXqXXvWLik1pBtKS9razcSKnlyy+bLlpVBnqLT8suZkY2P3ymSLLd9OvMU6mchlkjaQViSkj7SXxkGIFwfyWmomwLLNQavs07suWOTIv+v8eYR02ODWIUIEcjQUEUuswWfdGQou377BjK7uU93k4UXWj8LBFRhe0+euyhKQhXexGNdHuoR10PKMDjKjlxin1UaAy+s4LCHI7SNVrr8A8OsmmD1GTBAC8KXCxVvPKwwOFs7b+mINuHjLmpVdPT1dK9d8uQb0LBkxujx+w9MoG3SJ6u0IiJFmf5PbscQbbjATLDarAg4sm1UBB6zGsTFyoRQ3IrHWRp9P9AXP2qQZria1PexgctAX9Wd7GyIOhfPH59mPWB/ItEtBlsESRGz1sNyDHfCSBImjYlUs8DDvE3dAqcJEIA4ZuJYkZ9KYoRAGPQSyZ1h6GBicjvPUA7IO408DY265ze0TFy983w4i0VzDUCRKojev/fqe0oTL3dIc2Tzo64wE/P7eRp/a510w1uQR15dbWv30R+esXDd6s5sEG9zbw4bHJX9CckVC0rvFUMgpZtyqz5BbxFDQJUadHl+DZGA8C0T7tGjnsheITz24c1u79YZIaTEqhYxFyQe3zc8krliz/l3nLC0Ggx6nooa8Ttl5XTreuCDtSly94dwJVbu3OWyc84AnEhDVibBDavCSuz1hp9tjHXM5HUHXHpckqf7z3A6H7l7plGSPf9jtUIKuHmdH77Irv1CjtRfZYdbMtfIeYRlqQqAxoHQAUgFmGEOuP0RCtqSYDwJgmAD/6yaolxPQzYygnCV1RTh3RB4YYrku3WMNePSueH8s1h+HEPl+LVT5d3KD9X77d0ejXsupNzbqdEJvpPrrHl33vA7FJmP9saswcBUAk1D42Wctz++69MiVGHllRJ8MRiKgfqIO+V32GCvwdTOEUvq06vppFHs9k0d9E/oKFIAMJU2Fyye2DcFn28QbNeDyneds6M/l+jec890asO4TeqOuHxGdMLNOlp+VnQNTx2bl5wAZXvozNRhUfxNyrqW6OwLzIAPuJzjviwp52IOMCmuEjbjuAUPYKgBZdxAzjU43xQUBKwDmBtYDLnXAF51hms5002JNc5tW4ZI1YDqJCrF+b2ppIqH2mw6vcv0B2au05NRE4qyUtz82sLmve04xvHlYbVA/eI27wTO8OTxnTnf/pmI0lcqn018Fr5BKVXba/lca0+l8KkUmY41npbThs/okTZN6z1rgTy2NxEv5LZHYJVef46DE5yPUcc7Vl8QiW/Kv9o/2w3Ob7c0K2DruT9ltLC20CCNAkeuEvcKHhRuFTwiHhc8LTwv/bEuHNC5x7uVtJSTEpxJ5ngwDw1CQ87k3cujAqC0gnPOhMqOgnEUpm6mNiT6t9diSeJZ2BFkhJEOzsDGAdIXIyZYM4Rs+YBnklNrqRbzSAswpP1AEPDET4NIXtvlzRkZuhTiiWgWIZdL0J7KL6Gawg+gOQ2YD5164cYAphiNAOoKtAeKSs8s6qKw7A8QMxIN6ImDSgBKUWMeybOvAwNjAQGs4kehMJHorR1K5XIqcr7jdinU3RIZpKZxw+Vy5yja300G+JHtdkrVMon+tSNYXJZdPIqsczsoTsfb2ue3tMV8wGAuF5izF4uicHQsFgu+CbC5JdPkVdzToyoZ1UXZ5gg0GY7L4gEPevLxzIYl5zXa/f2DjADw+rcP0xMjCzuWbZQcdB9RVb2uTN1Y0hxYvHjKLLKrGWr0q4H48tywHzw2JbAKeysKBVpprzbm87kSo8iwiT77kcLkc1rLWATPsIF+W3F7JGpMAZ96NLzrC5LUOwHtux0WhGKIOiMJzXHU1+/v90Ae3W1UQe03v8KsXyi6nS1JcksPhkD1Oh8zX35vsI8wPWqMBu6oeYYGwmJ9RyDYRwE7oDDCrgyWbXKaVax12e/SIdb9DVR1kHN13AFf+jf4MA5VWcJvoI5WVZKmqud2aeiv8APq46lcBssbs4JOqg77FCzgcKn2r0gv8ROL9+QzTqv3JgTwVdI6jyfE9U8/ILLpPmww4/GUsjNVP/RpcFueeoy7KhivvcbjdDiqgG7TayPP0391+VfW7K922/1kVPZV8ETr7utPtdgKFq9Zrr8E+djauPcC7R4VzcC87C2MTXVhSiPEZYFYHK3W9Sp1mXmb36gjifQQj/jxU1+Opl8kJ7IdFcJ7I81ZbrcvWNjfOl/uWqmf33Fpl+5+1M10N0/1FPvWrHDAq1l6Ux+9wLPQcwnhYEQwXzwDX55FOotf6KWYnjcXbDMA0NJsSLMKn9AQORf3sW0OzhuLm2UNxtZ2JjtujYI+ItYoc5FsBPhaLYSwCQkiI45kQMPweUo8/M/NEs/epGlsk3ig5idWLFdHzHOr8dVYf+ZzbeRVdIUsPS4TYSwQSN+6qbKDPfdrprrxsr5XfsDugnbDQKcyBfeJW1B2gkaSGWsHswbLDGEpWfVg09cNeR4KpgR6a9hJQK6uRIJdg7wwSnF0H/VyKg+AgL/Pxizv46vgKxlm3voKj/ApEvY6OA4PWdkYukjU3lUcexLgHFshU9cu7KSPMDxX8hmi8on/h45iC+rumQ5r1m1osGatOQZM9Iy9JItsiEVWTihCblzSPdC5jtHpW8SZ7EXhiTpgHMhfP3bxU0XJ5Mz99JABDb4RgJ6Z104zBj+ZsjQQUFIPYQrElzf5tQVlb0rD75nXvfneqr6lvEH6pd7973c0XGmdp5QUtZuNV60pfK62/MmpWTrQV2+B5vbzAbFm1b0wk+9L7laF0rDcGT3pI2Z+29otj+1a1mFDnWRsPZjJt6Rs2jpLvNrW1zclkqnTzEvstS8Cuf1R4L2Ce1DIDmTyQTksWTz6UFqVP9lGZy90FRKutDD0N2oNWW2O5pGYEQVQn7ClLS30go6MElWEA9EI3KBpu2GOYfS024CW4wWAfn3qDMEopoegwJoJSD5JKkWRValGdLO1U1eUOvwjw1E8Bhm0Azy+5FQnyVQ67NLZ5neh3EwDKVPH76eXrGM4V23w19fsd7FpIpDspE4nIm8HSZYdfoq55laMwz5pKmkTRMY9mHB6PplYO20gwSS4r2gHYczZYr7o94B9w+EAEWh8nIbfH47J+SS5xKpLfYe11q1UZ8gb7e1gXIaEBaGBEOB/PjqisMDlOQJtKgmaKM51JRUkKteduvmOonhKFaquD1R8Tkd4YrAcKSbiSbY5WxM2pj4TkEPmgpIcD0i+Z7PWxFWRgBXO6REVm1nuvPwgagNtYmOpc2QlPaqGBrOOTLYMtLYNL0LF+QSibkGDY5GGymK+ExxfIxOWXL2S02aUSj7vymuJTZMeDD8oyZT7labLA+uaE29HWlOhcsXFFZ3O0DVcdSTrc1ovJubzWJXOT9CDOpDguefzygNvvLkh+lcqbqCSedoy2/AXGKDnNJ/LTHMSWgTg+uvh/ND7HyZJhmbj90gRyDLJb9rtgqKzHoc//vfHZNyD7PdI4UJhDlOgm5EpSAQZq+n6AfY/8NWr19TqHyb48dQuKDPY+BwqOj0OBahkX5zt3A9+pnaX3cP1lHozuZruWWSzZzOdSppZjuZBZk3/Am6scN5TENOBYuXaA83iNRHCZV/d79rEB5XuDdIYdmvolF2mNKMYOHap86hB+Ht2OkdvJ9Rehf5F1BZ2P0ZVnyIetK9oOkcdlTQqAIhaUNKCMOS6XzPIylZErV+UNqGcVx/42stfatn8/svm91kHw9j9A9rbtx48Vlqgc+nvM/FBYIW5NXigRKi5Q/JKgzBqPBqFJaBZagbedMhJKMt9OoZMKjIQOHdXAb4exmN0t6w/EDaiL1vFHee8O0d9WnqTzZ2P7AOD0gEWOAGZdFWrOmhNsu1PoFQZAVs4XFnKKPwkTKccpez7JaWZ1pJMaq01SEiYFUZw1KTmb5kkh05eeJTVnYW996yIYt0OHUIDB0PPZwRs/8tChWVOyB0cRpONCmRDCFirAFhQ+vLO7eXQrQlutg+ejfz5Oiz1H8KEr7JnZH0SZOCg7GZOKQNz2XAOduuvGxKyenyCdDvG9w+pTR4Xkq+SZT4aq5BmjyTyDQdIhykAfxiRZnbpkPheqV3pnDUTloWUILyN756M/3zr49dtv/zqQ0+34qXwWHLrlduvRNZi6BhbaSdT46H0whPdxByiQfBo6/un9+9tsb3/lUXDI1bamIJzUV/2Uvq45zaqEeS1Wpx7mfZocyJ/rLD+B4RlP6u1PrYPPwmbnnntg5P9H5fun6+l+FHyndPPG665rW4GhFWTvEPpDfIahl9de22Z711Yeu+6668gDbmdtrKC/OvS3BNL3d9DzqJDgvV1c1cT3CO8TrhE+Inxc+IRwn3BE+KrwDbxLmDn6x0nDjuC0YVcU6KfxDuP+X5Wl/7OyGHfY9GuKy2VtfgThR2DXHLnllsAZA6T1HefDcwSMgpB2xsARt9cND7vLpRwGNND5zNUvnBKAAjxAzb9sPnv/BfLqFvrStOxJ8LVdPM1qhlFDuaKf5BeT9ujax6VAyO+rtHh13Uv/1RPUK68+BJ83p52RqTeZJDHmB5f26h6rF880yXMe3ZpzeOSwVa45b0lsDeYEp3Zuez87xrLVfeK82dJVOhPMZR7erCdsZgsLlMtCNjl1xOnxOFkJNFLrby0BA1SAAFlZn7LSqfbJAVUuyQF5XFYDcp+HZT0BVQ14jqnoqUcBhIijHufdvYonADkxs0fpvdvpOS3e9SsndSYYT5UV2EkMAM7ctkBu6YG9h/zfwLt0Er7VTjj/tg/TS4pSwgJ9f+tEBsgv+dnf0KNAF8gNeoVBYS5wBLx35yM/a8bfJkxM+5CwRdZPA7GbK1/GmaZj6J4BrnjmJLuT8Mw5yaeTEpuD2cCxfnF6mAYNzJq0np3t2+fQ/A4Od1EeISKk+A0U3p0nMyFg05zENZvQcduHdgbVAKwAyIVfUqLZytFytpzNlkrlUgncUrlcKmMs/x2FIKRlrexF4Q54Xs2GskeypDx+tGTv38D5ECMw1lHAAE/B8fR1+l5aSqLEQB0PND8DpIuSAWnCSoFIJFAZR5eWK/cfOULHjxyxjpZ54yUmTCfeH4iUTgjjJ0A7HT9aPiGUy0R4h+2imEILDjNnKCDFMsVQsr5d0sErJQJUf6RcrfqklquYlW28qneMl7HPseuFPAQyoJDGQfPHGzvYRuBptoFb6iJEYVq3nRbnaWh6RO9YaH21Udfzo0uj5LrOROLcy/d2WhPD4VAovG/D2nXrh0nDQutXnXsvOzeR6CR3NI6O5nW90brKk2n00EEsbMdA4b2XYx4ovGHt2g37sIZqYaj1sr1YGNsZxcLRtMc+I4AxO0r/UUjCWhBIyMQzeROP4ZEVZsCB1WrkCgsoTJliSKFkD2x0RLwvwtuZDF7DhENBL1NyIIRWf+ICn0SJLDvPv2vVFZes/1zJC0Eq+cbvXHnx1eQ71rcZSfQWe5pbI4kmp2fEH+7bv75j/vwueuhsEp64IyIrHtX3yYkv3DvxMYAlR+RjE3/3yP4P+JsyC9vTTemgEW+QtTlGIDM2v22k3eww+gS0/jnxBPsGWwjU7xK8EA4LsTotd64wLCwSlgrLhVV4F6vn8txGAMgeQJPBLwUrIRXKoa0AyZu4t8tALIFYzEHgp6ExAd+IaNUy6EtAw3j8NrI92hXdvv3b/CH/sWMH6cCYypgdvx2C27dD7I3bqxE84/bt1qXkze3WMdJB/3V7tLvR+qvtlh/K88TG7ujUhzH26R10w/apV7ASyw+xkG75dljHttMvb/+25SP/AbV01Gxc/sh+wsZgLpcKQurt5hJUd373Mmsyc3w2RZhNuvqTW2EyqVQ/mbCVrk3mt61vU9bcW+itTabPyI0sXh/vLgAXO7T1TJNJPv1Bf8AFk2dPp6FUp7NlsNWMtgZhPpWqPV8S+Fcb6KdjwlphQtiLNn3pTLpQTGmK3I1784LB17cioQlOilvlSXE8o6sueMgRJ3gkVERfkU695mGZUy+glOmbp+pdEz3o0qgEEkm4VI24VPWwqoFcsv6dQVbr1x6304DNjsctSoHKs3Kjx7lcjTjdnsKv3ZjZ+jXZ214srisW272BQFMg4A2H2+e09szbddWueT2tc9rD4c5l2ULn8HBnIbtsxONUI9I4+UBaUhsiUs7h9nisEZefbWVsq2Q0qhK4XqfHp5FJiI2JbsilWx9Zw7Nvpc3Y0LpiGRtqClgXN4YGxobXD8zfNW/ervkD64fHBkLkeHZZZ8f46LJlo+Md0LQt0x9j32XvFTQhDfJiEGinn19m4TfUh3ew4RS3qRvIEFQ4UP3Ai9mUkTxFdpqpvNcd9Gpew+jKW5fLmkxSsmxdwxysyNjZb8gyGfi+tYu5psqiJIkM3csL6VCsIRYMaSTSvHBloR8ytSpQssygkJOd/TqI/ReetcZkcTMW2iyinBNPnDhxjQgcX1BhlS8RNsDanmUDVz3UxQtt+3JYto948VpveqNSyKVgwddshXDqmVYlB82u6ujcbXPnbns/mirdoxmGlpcdRrJBkfN2QGlIGg6ZHG4ZOmvINMFpGa/mfv+2uSQ7A1s8Y/50VbS1YNEWOm77lfvpODeNmlu5n/vVvpL6vpL/G31l2blVbOdu+2x9/2ahPfUH3k/e41I1N/TyL9XZ6tyW/wL9rVm9oTEYsvdUsmrtlrTreWf9rVz2Niiz8swoVE4ljlpl1rrTEkldf8v/f/T3Hc40tU5LJ9Uz/n187Sb4nY0ghQ25as3HyVFWaiSqoRFt/Vgodbc1NKrH+y4c78PKB7szLUNLh1oiXYOkc6abfUcRG3Ta2pO6Z+i8gVpnrGe8TeSCWhdjAykP2Ti7X9AbQG167enAHQv2eUlxtolhsraY6LQtIuVjbk+PbFvV6GcMlGaNNvil5nmrOziiCPBhpwLooK2ghs7ySqdOVcfqec18rmyAfCWijWsR7pwQIloZVdmyFqFZ7vEIoWrD8lF2nO2FvR3uHErClcKncO8w69a5Rl8n3ZynWkBMxOkwQ2MXfuiV60ewm3mpAfFo6cHvCXR+JcfPzblZRtCHCjOxj8iQwkFqM9sKKT2LxGcIHq+5V1COegU7Q2+tlNWg2x1U6yIDHJ76cKxboaKq+T2i1+8iqhP3506VuPxeiNVUkSrpflCqvKLoYUbbgv6l/YGoDvtK5yaZOnyui0BqewOyLJqGyy0qLQ1RrMAtQowboT3g0MmIGYHHelUNhoMqzIp1mx2z1Wxy+lW04nIyj1+Fmt1+D3NoGKU5G1qUUDYXkqVgT0cDCbX297dy7EC78KmXKAHNpUcDHikbJ35ZurmhBYrLYlmS0WSpUedrCKQnHa+tIdBxqssciRA6lil0U7M2ZakzrqFCk9d6xl4SdHzgvCGPnmyXPamBGKdETlynW05EyHTzddc3fmFfXG8a7Irw9Zc9zRpycP5GOT9vAH0ctfF1wrhw3kl8rh6vDOjfYaP2Nom9sGIkrITSmbwZkmH/puVkUNBh/WUJ383Z9m45RctpLMTN3vL1DG8G9b+74S4jbe2rri7ePUpTvce6MyeEx5q+egz6PA5bzBIuqmPwwfDJPA/69cFjvSk+aNUVd6XiqKSNu27wNj12QsiQq+uLl3BnaR3hUYLghPGYBP63ENYd7tMbhYyQA86/EM8jdNOW0jYDlOrWH5uVkqq3+zhjyp49sb7B/qam/sG+GNlDL+K73dvBfaMugR3lUQGePHXtmVLo0SYejc5oleghKhbDnLE+LzIkoP5yDEM8l9fOVb1LOjHJ7mALgFoFfokjZ/AS1kvDRhgZBGrwRf5qzQxP4DrljZIqXiDJZx+5b3TTBNmx0ZcxZP/oarJ27OyvnStRtlSkokv+L4dbYfMohaysTe/oW/jUC08vVOXmtDt/10N35ophk7rEs0S3W3Y7/ktyCa5pmlSA4+F5IZ4WDvFz4tW4f7JNJfGKQ8fzCdjskTpqgz1ClcfPJk8tTE5Dh/Qozrx1FKmgdOwYUkOpRhe0PM3j68iRVtrr6ecId49B4wLWgeWrydaVV1bpr54Qra846PgphIdz8E32KZiDLH+PAJh2D7/6rp4nD6OBBr7lFDbwhMJrW+vCHuifR+87crYsXSCqLtmtTEkuGPKljErnfu3ssbVk9ahPDKd8m3bQCfpoX4fexiAnzIk0pcBou2HUXdQMF3N3PvTpAXcqIbsWPv0Cvk7B71/LXA9ohL3HgDBfGLFtN8zaYW0ej2tg2IEpDODV/8wNpGFnGSL8zl/iV4YxYhZzChmJmZMx04yRslWm5REzNmnGXkROTkbQbca0SSKYMatMyodj5uEXJyZY2YyZsQoUHaGTk1Ac6rD3UVDYEmImEbDeEetFM3b48ET9eVOoumvKn+4lA9yQ8kOfqhEi7E11oHTKzZa9NJ1hWVwj9hGTGSHClxxhwy8rDiJ4TFxOhx2iEjDCyh7YQqNfGq8K7ar4HqeRLzlkSQuHsUiDbgkYS3Y6jZBPdDjLTiPsYw4nlxeTbJI1A8fp5va1yVCcGLlQMp+DhUfQpjapFHN4YpXTuJl+rSdmN8louWQacphKMYmv0pUrAmmNwiBORlvJVMUfnk/u9r33Jymvky0lywrlgNea9AbKhWXkA/QDzCWrW19osn6Y8XnJJJaYnITSRBgdXLt66dKRrSMjJwTIehhn5zAUJ8JZS7rbDx0anNNbPdN8iP5WMKr2VOu5JQM/blU4y+AnGNwYM07MM8Sn6kSLMcu2aoa/GvW6zrMdc/tX6a6F3R5/SOtdH2lM5H+ZHeRRPao/5O/dAFEF8p+/xduB36LknoYqL7G4J6h7p17GGBZHl8PkkYH1/fHuOYT4VZ+vP9uVT81N8KgirY+a0qM6PC8C9YEO8FItFA0Go4GZ+wO0N0Z52sY56qz9gslPd3N4uHvyMagBE06FqlgEZ+d4qQQP6Zg5BwUeREqDNXE3yNPHaSkSOGHTFmiipSNHqnj8gR1ieMtWBIl+Ce7BgWkbeLzSM21XZb+5AGNdd39RuxlFk975pJBOKTUbbjSoremDRXBlMpAHoT+tDuJ5RP8CUr2TzKRv8+iPO2O66/GPolX2MQdVHTRIX/bozzgbdeczB6qxPspIwJKf0SNB6nCJ8jGMP/CMUzcoUUCje56HH3cG4o7HQb+ihPwBw45AxPU4lpFV0QFlfm0XanROVwQFW5756EwrwYj+jCuiEzJJCPUyDD8OYWcVPzQ8Ebm9+IfYOJc7zfb8nXxaHUqecU5PPiyn49bRU2e0FNFOCPxcG6atdIQJJ08pP2s7UT0z1/lNWU5YIKzgdyLTLwIgR0sB0eDLAYjaUBVVBvKtnczc8ijJ08MsW7nf7O83QR7191c+CriWjmAYnR8cISATdcPQiRA0jOAZYCr0m1ganSPj45VSP7BjVJhPCGY/4SKuId0Az/1GxoDniO0JSt19SE3K87c7iWZqRf42Zz4pVe898Iswy5aPWkdJtgKFrDKKiNqPlDGOcglcssapUDpiDyTeA7xtW/i2ReikLymVj2Fb5Kjd2kxbZ2zJdYZ27JvO6dZ07BkSTPVH6mBsmY5AL4+Rjlexocpt9ofusf3TN07ur+EgTr/v0AKyZC6eN8NCBI0OFy7SBq7VBAmjWQ6AQDW4oI1QECgCyAqIXK8BuODrYPL5mxi7mVK2U6R0J6P0ZsZu4kERQh8QydmiaD0snuzT996E+WTRAg1QptUAeUqUo5DhbPGEIK2U4Llf5MGaferX2JNsMYxg8FR7nEIaNb6kZPOcqq1ozrZ9uqqixrPZOP19vINk4xWV/r7ynC8U8t0aioduRYAtxuh4RwfmyVrzrevo7x8Lx0PWvZhKNoXiYa773MzeZBcDB+8SCrDu1vN3Xrz8bHXaDJO/cH6G915sGQgIJmuAAdwiza2i0HANMoOOR4WdWzYeSGcy6QMbt3x3Btz57vM25YvF/Kbznq8B1u/tl0LIZts3E+duOzfhySSY2nXNDdd0ecREhl18ckU2OFWeVRUHyENYS+25Jd3envaJjRl/YWio4M80ijVZdoIdA1qq2UwL9VwlU89JzsRh7p16BN9+ZCuD0Sb9HcCJ7gQ8/2x75KvodzVXg7W7lO+ICksJTsBJKCqZooHXo6yos6ShZExDyRUNZesYua7lJvrlyk2Tv77rk+Qzcze0fP+iiWeSG4ZeJFvoejp389SJs4iLpA60rv3eA8vT18zY1I3QAaSAFMk4iUJBtcxbf7D+kH+W5HK47HI1/RLXGL4PtfR/630oPKWvytmqtKxKZChFhd21fxB4rgbsPnfFWEc22zG24qEaMOaKuC691BUJohusg5kwqygHKiOzynKAvOg6uWgVFvje60H2ZdD7W0H2nSWUQKO7UDgo3Co8LHwVe5rGjRZ/CQd3YdWjIjS6xJd7+AWNnMEbmnSGv72T5lc7BX69E+ZGy3JQdlYvK4yqrQR0vh/GA0YLbREyoPKGg7yldLWh2pFUuNqMXNeK/k4z0rPdPthruXw+F2y/fCEfuG6fzw1xvjGQSum0YVgGxIRqT5g/bHnl5fCIEQ+HadwYCceNys64EnIsX7zMQXfHHSHFWrOIPKRUely+rmassLkLCnc1Y0MApnxujHS7/3wybTwNWiEb4YeNDMfPunMWYhy2nqOAWdxYYACW6JPfxRVl+aLlSqjyc4DIFxZZaxwheonPneiCUl0JrHwaLPPGfb7KZX8+feYe/ztsTAhU5WeLwq+ccDdo2pdQzMwQowiLkm7SvZaqeh7zBqj5I7LS47G+6S1//SBJHB95a1OFjfoq/+pJeR7zbIa0tIcs8FTaDpLB4yN/3F6p2UuIAj3MZSmeAGTQXiJCkhpaC+gaaFsh2PyjeURV9+J/F1DESDRbQOMJUZgaYeWp8taR5pGR5nLzSDN/4He4PEIPVybpyIg1QraeELZuJfAbmZyE7c5tHR23EaGj44QwMsnfG3mG/QzWA/LAVtgHl4RtwnuFq4BDTNvNhIMgQOXazjLDhWz1LTUpCITegve9ReD7SOyw1NH0Hcm9dmOHW/uaAY5UX5rUVWvUNUcSt8pet3Sr7HNvdqF9r6vscvAXucChP+7d0Hug9xuqeuBOX49/g99/lyuoTvZahw/c6e/SpsPVXOSymaLWd6EqqPBXUL0qYxv3f1xy++RbwYlVM7ndVzgwj3vtkt71vX3fUIPuu3zEt8Hf5b/rgKpO9pFNrjv9PHznQQj3X9/Dsy3BUi4X6ak15jofq5WwAX7eMG0fluBvia2wT7jxnMms3mUqM9eZ/IWjt7MPShVxuNM8jnySvIhmOlYzuODPhMhbdbZirA6usLsYu0sEnJ+esfH5ftWHGh6cia1cPwPfvo852D5Rko/LUvX/S26hP5/u19taNSlvZ/V0vcUxJRzTevgM/aAv15krnTsD/+MMSD43A58e59kzQWYHc9LbWWY56rAlv5tBnJbPhPQdp0f6hjMgPf1fMbPw1k/C++Tw2+F9xamDbMP6Xwht+12sW5gGOKP1r5A6mYbxTZoc7Lspf9se9+wMD0FyusmuryfWS0sKLfxLniqbmMjIc0yZUOhzRCaiuOGBNTNGjmuUe+9VqCLSLYpS+SyRZSpab9k692fYS2wL6DTd3OIok/ZS/ocd/fz1XtRp2Jl0YFM7nbJj0jtecAZ1p0sLOf7NzWRJVD95wcbS/tZ0unV/aeMTG8dtcHzjBZdsO2/O4OCc8y/4eQ34K3LjDyXi1tzW+1wBt/SUS3LqDslNfnBy2Sd4jVPXzCr98wvOnzNY0xe/zf6BDQL/HrVHd/pkPsd3y9NaW3UHXai/3qpdv5+cxg5OvYb/ycGC4E69mhPlbMfoss8vG+3IymIOU/4JHYifN3HFxJA0E5eKZpqaMlH6mMysyfFlY+3ZbPvYsnEywmQ7BePnTcyDZyYO5CHoZT8SBdYDsrBNKPK7zo2n/68vCf8iQOPnazAn6GnDhOUN/t83+MZ2EvKY6QwPh8Iym76dgGqK9otlAwV23dTvW+Y0N89pYWpyTjI5Z+onTE109OUWvK913rlbdp19aC7tzLKBG1du27A+l1cqX491sNIdjs7GrXNyfaTjsWhPU1NPEZ0mfHO6uZl1Q2WVT9qV0t3g93UkrAPh+fk1Pb1Q5PpER2Xt3bQwr6d71drzSTZ7wcrc/Og/JDrI96J2RcWe6KfwHezOBD8vf5l9msW5PWGyNl+gj9gTZE8xStIiqc4cu8T6vR6J6GlcxBdLrh2BxsYAUWtR5GY7isUaWxudYuVjDvA5SC9D0F4jX2A/ZKuFDpiBbdAubObCclXAD+B/gdj3JXiFwt+z4G8qDePLMIptppPmGhNG8Cx4AUvThZrtLUZl8A0NI8zLpanm9yqS5LwysjSyORK50hlRtWav19+6MnolXnRtSp57bvKKJp9Paf4nj6mSlWrEVK1HPHTjdIoYMEJe5jxjHURUmjU1AsmQuhSSJUnxJpsVnz96BdaxCdu5omllq987gsa/qhmBFlSTvDKd4vIyhx42zlhH7Y7JXodb+H+QAQO2zZjQyKtYyPH/clOqJ4cFTre1vxmYmVHkOzZnwTf/+RZasV82xJ1IJs0nmv1Dk259QZaaivPjmUCoN5lLDDW6nSyaiUpGZM41SyaKXeZSSVT+A5ckuZOxZJq0RLtjzbszmkeiDZk4dTTGl9yyau+iZmBav9CbyJZgVIR9RjgejbcWGzTRF/BndBX/j8edXh4b7BkfHBvq6hE9sFppeElbMdnoVjrD+cZgXIzoPZtbVwxOLB4pSM6mqg79PD0hhIDbd/L/dgPawUsI6D/fE+HtfA54TqFq1zVM8L8Q8K8RdHIjKPzPNzaSNl97jHit12SZBF2yGjnqi6iyiwRl2XrNS2LtPtIWiVjP+96kPtLXOBYlvT6ItF6R/bL1ijve5Pc3xd0kCkEShapgFxEda7R+6COXV89fXmYLYW01C7383gdvmjLJOqY4MyfDtJsw+zS0agZTyOnT55FxCvH0Sz2N/e9dZP0EF1wr2om18qV3fmHrokjDomfMeSY8h1FA/fjH3G1bnMksJp/t+ci+FQSWniRWrhclAHrXX7R7AxlsnTc2r1USj4tSZa8kkgZRIm1L1ixpF4T/BYM2FzN4nGNgZGBgAGL937Vr4/ltvjJwszCAwMMJ04Jh9P///0NZ2Jk7gFwOBiaQKABeFQyrAAAAeJxjYGRgYG7438AQwyL7////3yzsDEARFJAMAKQVBuh4nGNhYGBgGTb4/39UDBNDl0cXJxPLottNijsxxQGDRRWWAAAAAAAAAE4A7AEQAUoBcAGkAjoCYAKEArwDOgQSBFwElgUUBcwGMgaQBxYIUAi4CQ4JlAoaCk4K2gs2C9oMbAz8DRYNng3gDmoO4A9YEFQQqBEEEWAR1BIWElISjhLsE04T0hQ2FO4VShXAFjgWsBcoF34X8hjKGSAZqBoiGmoa5BssG4ob4hw+HMgdDB2oHeweXB6SHsYfCB9qH6ogLiB4IKYguiEoIjYibCKwI2Qj0CQqJIYk4CUkJZAl9CZ8JrYnVCfYKCooiHicY2BkYGBIZrjFIMwAAkxAzAWEDAz/wXwGACm6AmcAeJx9kM1OwkAUhc/woxGiC01MZDUrXBhaIK7YGRKIiSsWJC6htFDSdprpQMLed3Dpk/gc7tz5HHpoBxMw0sncfOecOzc3BXCJTwgU3xVvwQLnVAWXcAppuUz/1nKFfG+5ijoeLJ/Qf7Jcwx2eLdc58YUTROWMqolXywINvFsu4QIflsv0vyxXyN+Wq7gWN5ZP0BCu5RrG4tFyHU3x1tf+xPgzOd3I0FNJoBKqVdjaiZE/X0UTveftibGvs1AlsuO09/yhn/h6Nzpbz7vGBDLQKpaD7YgoUjLVaul7xlkYk/ZcN7C+46kYfWj4mMCwzvhrp9iwhvCgkCDIa5Gt6Lb+JCNmc2YRZ+gjff8nY2YaGf2tlujAQftI/5BZkr853DrDmrt06Rp2S17NNzFp8LtFxKPopHm2pOPRd7DIX6XoweUJDvqdfIf4B3iaffd4nG1TZ3PcNhC9Jx3PPl6RZDtW4vRemaI4vThW4jhNcYrSywUEl0dEIAEDoM7Kr8+CPI/kGfMD523B1reDjUH/pYP7fxIb2MQQCUY4h/MYI8UEU8wwxxa2sYMLuIhLeACXsYsH8RCu4GE8gkfxGB7HE3gST+FpPINn8Ryexwt4ES/hZbyCDK/iNbyON7CHN3EVb+FtvIN38R7exwf4EB/hY1zDJ7iOfXyKz3ADn+MmvsCX+Apf4xsc4Fvcwnf4Hj/gRxziJ/yMX/ArfsPv+AN/4i/8jQX+gUAOiWIwl6YJ1IRM1da4kHjTNkXi1LIKW0ouVC2WtGitNqJIZEXyaKRKJ2ra3hfyaOmi942yJBk2dXCbLuhJqZrCkdVC0lhJ6+hY0Yoj3lZ7E2qdyfxJnRud1K1XcliRtuNKNMWicGKVWKeaMAyqpiQXqmgnN41ZasoOhPVpV0zWmIamPZRcOLm1XlMZJj3syh9LTcJlhZGpjcrckTgaiTZUxqUr44qsc54E01pLTgofsTarHqfspv7j4Qi9VZPjAIVZNZxS60kvR+i3e9xl7DQzb7UKWTCZMyt/Kkmj/fxUim/nqvHkAvuJ3BzTlb2rS51Z4cTSCVsdCLdUzb4JwdS79zMdGjtrG26EHBVa+TCNv2ytuNTn6hJlx5xGSaEvn1WeNpiKEISsah7n2Le5l05ZRqR5r4L79S0PqNdu1sKO82Vsxzg/E0WxYLgQJS9iflfKqTSOOiM3d8YYpd6YFhw9UHSfSVPnqmEcy9ow+q6NvadrGESuaaPVQ+7MJJ00ZOqZxAofaLQmaO5aX6WB7oTF7dYE2ukHHDeR5d0gd8qWc0hH1GR0xzLv5md8grHnA9XM3UAXuMpahOwMo3buUUW+XbxH09NxormXrKL4Yvd6bF1q4f0hV5XdakO0FomvleYBabVssn9bH1R5ci7GarVIRRMZH9mWSG2YiRxcyWzFxY7IMTXdsAq1HrUNx+J7bArOO+ljdXVOe7y+jl7orqPkba83N+QmT8Y8QnKxoqTrYKR43XyUXVwfnDqioTQFDflei8HgfxtJnvoAAAA=") format('woff'), url("data:font/ttf;base64,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b2plY3QuaHR0cDovL2ZvbnRlbGxvLmNvbQBDAHIAZQBhAHQAZQBkACAAYgB5ACAAaQBjAG8AbgBmAG8AbgB0AGUAZAB1AGkALQBpAGMAbwBuAGYAbwBuAHQAUgBlAGcAdQBsAGEAcgBlAGQAdQBpAC0AaQBjAG8AbgBmAG8AbgB0AGUAZAB1AGkALQBpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwAGUAZAB1AGkALQBpAGMAbwBuAGYAbwBuAHQARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAACAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQADmNvbnRlbnQtaW1wb3J0BXNvdW5kBXJpZ2h0D2ljX2ltYWdlX3VwbG9hZAVjaGVjawZpZnJhbWUQQmFja2dyb3VuZEVmZmVjdANsdHIDcnRsC2ZpbmRyZXBsYWNlCWljcHJldmlldwVyaXFpMgtldXJvLXN5bWJvbAVtdXNpYwRoZWxwCWhhbmRfZHJhdwVwcmludAR0aW1lBWJhaWR1C0dvb2dsZS1NYXBzCmltYWdlLW5vbmUMaW1hZ2UtY2VudGVyCmltYWdlLWxlZnQLaW1hZ2UtcmlnaHQJY2xlYXItZG9jCnBhZ2UtYnJlYWsGYXV0aG9yCndvcmQtaW1hZ2ULdG91cHBlcmNhc2ULdG9sb3dlcmNhc2UKaG9yaXpvbnRhbA9tZXJnZS1kb3duLWNlbGwLbWVyZ2UtY2VsbHMQbWVyZ2UtcmlnaHQtY2VsbA1zcGxpdC10by1yb3dzDXNwbGl0LXRvLWNvbHMOc3BsaXQtdG8tY2VsbHMOaW5zZXJ0cm93YWJvdmUaMjRnbC1wYXJhZ3JhcGhNYXJnaW5Cb3R0b20XMjRnbC1wYXJhZ3JhcGhNYXJnaW5Ub3ANdW5vcmRlcmVkbGlzdAxsaXN0LW9yZGVyZWQUc3BsaXQtY2VsbHMtdmVydGljYWwWc3BsaXQtY2VsbHMtaG9yaXpvbnRhbAphdHRhY2htZW50CXN1YnNjcmlwdAlzZWxlY3RhbGwLc3VwZXJzY3JpcHQDbWFwCWJnLWNvbG9ycw1hZGRfY29sX2FmdGVyDmFkZF9jb2xfYmVmb3JlDWFkZF9yb3dfYWZ0ZXIOYWRkX3Jvd19iZWZvcmUKZGVsZXRlX2NvbA1jb21iaW5lX2NlbGxzAm9sCmRlbGV0ZV9yb3cMZGVsZXRlX3RhYmxlAnVsBHJlZG8FdGFibGUEdW5kbwVwYXN0ZQZ1cGxvYWQFYnJ1c2gKdGV4dF9xdW90ZRFpbnNlcnQtcm93LWJvdHRvbRFmdWxsc2NyZWVuLWV4cGFuZA5pbnNlcnQtcm93LXRvcAh0ZW1wbGF0ZRJmb3JtYXQtaW1hZ2UtcmlnaHQRZm9ybWF0LWltYWdlLWxlZnQTZm9ybWF0LWltYWdlLWNlbnRlcgtsaW5lLWhlaWdodBdBZnRlcmNsYXNzVGV4dC1PdXRsaW5lZAVzbWlsZQ1hbGlnbi1qdXN0aWZ5B2Zvcm11bGEKYW5nbGUtZG93bgVjbG9zZQptYWdpYy13YW5kBmVyYXNlcgRodG1sBnVubGluawZpbmRlbnQLYWxpZ24tcmlnaHQMYWxpZ24tY2VudGVyCmFsaWduLWxlZnQLZm9udC1jb2xvcnMEcGxheQl1bmRlcmxpbmUFaW1hZ2UGaXRhbGljBGxpbmsGc3RyaWtlBGNvZGUEYm9sZAAAAAAA") format('truetype'); } - .edui-default { accent-color: #333; } - /* common layer */ .edui-default .edui-box { - border: none; - padding: 0; - margin: 0; - overflow: hidden; - line-height:30px; + border: none; + padding: 0; + margin: 0; + overflow: hidden; + line-height: 30px; } - .edui-default a.edui-box { - display: block; - text-decoration: none; - color: black; + display: block; + text-decoration: none; + color: black; } - .edui-default a.edui-box:hover { - text-decoration: none; + text-decoration: none; } - .edui-default a.edui-box:active { - text-decoration: none; + text-decoration: none; } - .edui-default table.edui-box { - border-collapse: collapse; + border-collapse: collapse; } - .edui-default ul.edui-box { - list-style-type: none; + list-style-type: none; } - div.edui-box { - position: relative; - display: -moz-inline-box !important; - display: inline-block !important; - vertical-align: middle; + position: relative; + display: inline-block; + vertical-align: middle; } - .edui-default .edui-clearfix { - zoom: 1 + zoom: 1; } - .edui-default .edui-clearfix:after { - content: '\20'; - display: block; - clear: both; + content: '\20'; + display: block; + clear: both; } - - * html div.edui-box { - display: inline !important; +* html div.edui-box { + display: inline !important; } - -*:first-child+html div.edui-box { - display: inline !important; +*:first-child + html div.edui-box { + display: inline !important; } - /* control layout */ -.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { - position: relative; +.edui-default .edui-button-body, +.edui-splitbutton-body, +.edui-menubutton-body, +.edui-combox-body { + position: relative; } - .edui-default .edui-popup { - position: absolute; - -webkit-user-select: none; - -moz-user-select: none; + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; } - .edui-default .edui-popup .edui-shadow { - position: absolute; - z-index: -1; + position: absolute; + z-index: -1; } - .edui-default .edui-popup .edui-bordereraser { - position: absolute; - overflow: hidden; + position: absolute; + overflow: hidden; } - .edui-default .edui-tablepicker .edui-canvas { - position: relative; + position: relative; } - .edui-default .edui-tablepicker .edui-canvas .edui-overlay { - position: absolute; + position: absolute; } - -.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; +.edui-default .edui-dialog-modalmask, +.edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; } - .edui-default .edui-toolbar { - position: relative; + position: relative; } - /* * default theme */ .edui-default .edui-label { - cursor: pointer; + cursor: pointer; } - .edui-default span.edui-clickable { - color: #666; - cursor: pointer; - text-decoration: none; + color: #666; + cursor: pointer; + text-decoration: none; } -.edui-default span.edui-clickable:hover{ - color: #333; +.edui-default span.edui-clickable:hover { + color: #333; } - .edui-default span.edui-unclickable { - color: gray; - cursor: default; + color: gray; + cursor: default; } - .edui-default span.edui-popup-action-item { margin-right: 5px; } @@ -149,8 +128,8 @@ div.edui-box { padding: 1px; overflow: hidden; /*全屏下单独一行不占位*/ zoom: 1; - width:auto; - height:auto; + width: auto; + height: auto; } .edui-default .edui-toolbar .edui-button, @@ -159,9 +138,10 @@ div.edui-box { .edui-default .edui-toolbar .edui-combox { margin: 1px; } + /*UI工具栏、编辑区域、底部*/ .edui-default .edui-editor { - border: 1px solid #d4d4d4; + border: 1px solid var(--edui-color-border); background-color: white; position: relative; overflow: visible; @@ -169,23 +149,25 @@ div.edui-box { -moz-border-radius: 4px; border-radius: 4px; } -.edui-editor div{ - width:auto; - height:auto; + +.edui-editor div { + width: auto; + height: auto; } + .edui-default .edui-editor-toolbarbox { position: relative; zoom: 1; /*-webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/ /*-moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/ /*box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/ - border-top-left-radius:2px; - border-top-right-radius:2px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; } .edui-default .edui-editor-toolbarboxouter { - border-bottom: 1px solid #d4d4d4; - background-color: #fafafa; + border-bottom: 1px solid var(--edui-color-border); + background-color: var(--edui-bg-toolbar); /*background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);*/ /*background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));*/ /*background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);*/ @@ -240,10 +222,12 @@ div.edui-box { .edui-default .edui-editor-bottomContainer td { white-space: nowrap; - border-top: 1px solid #ccc; + border-top: 1px solid var(--edui-color-border); line-height: 20px; font-size: 12px; font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; + padding: 0 5px; + color: var(--edui-color-muted); } .edui-default .edui-editor-wordcount { @@ -251,9 +235,11 @@ div.edui-box { margin-right: 5px; color: #aaa; } + .edui-default .edui-editor-scale { width: 12px; } + .edui-default .edui-editor-scale .edui-editor-icon { float: right; width: 100%; @@ -262,14 +248,15 @@ div.edui-box { background: url(../images/scale.png) no-repeat; cursor: se-resize; } + .edui-default .edui-editor-breadcrumb { margin: 2px 0 0 3px; - color: #666; + color: var(--edui-color-muted); } .edui-default .edui-editor-breadcrumb span { cursor: pointer; - color: #666; + color: var(--edui-color-muted); line-height: 16px; display: inline-block; } @@ -279,13 +266,13 @@ div.edui-box { } .edui-default .edui-bubble .edui-popup-content { - font-size: 13px; - box-shadow: 0 0 10px #0000001f; - transition: .25s; - color: #666; - background-color: #FFF; - padding: 10px; - border-radius: 5px; + font-size: 13px; + box-shadow: 0 0 10px #0000001f; + transition: .25s; + color: #666; + background-color: #FFF; + padding: 10px; + border-radius: 5px; } .edui-default .edui-bubble .edui-shadow { @@ -359,6 +346,7 @@ div.edui-box { line-height: 22px; padding-left: 5px; } + .edui-default .edui-for-insertcode .edui-listitem-label { min-width: 120px; _width: 120px; @@ -367,6 +355,7 @@ div.edui-box { line-height: 22px; padding-left: 5px; } + .edui-default .edui-for-underline .edui-listitem-label { min-width: 120px; _width: 120px; @@ -443,11 +432,11 @@ div.edui-box { text-align: center; } -.edui-default .edui-menuitem .edui-menuitem-body .edui-icon:before{ - display:none; +.edui-default .edui-menuitem .edui-menuitem-body .edui-icon:before { + display: none; } -.edui-default .edui-contextmenu .edui-popup-content .edui-menuitem-body .edui-icon:before{ +.edui-default .edui-contextmenu .edui-popup-content .edui-menuitem-body .edui-icon:before { display: inline-block; } @@ -458,14 +447,15 @@ div.edui-box { padding-left: 10px; } -.edui-default .edui-state-checked .edui-menuitem-body .edui-icon{ - line-height:20px; - text-align:center; +.edui-default .edui-state-checked .edui-menuitem-body .edui-icon { + line-height: 20px; + text-align: center; } -.edui-default .edui-state-checked .edui-menuitem-body .edui-icon:before{ + +.edui-default .edui-state-checked .edui-menuitem-body .edui-icon:before { content: "\e7fc"; font-size: 10px; - display:inline-block; + display: inline-block; } .edui-default .edui-state-disabled .edui-menuitem-label { @@ -491,14 +481,14 @@ div.edui-box { cursor: pointer; } -.edui-default .edui-toolbar .edui-combox-body .edui-arrow:before{ +.edui-default .edui-toolbar .edui-combox-body .edui-arrow:before { content: "\e9f0"; font-family: "edui-iconfont"; font-size: 8px; } .edui-default .edui-toolbar .edui-combox .edui-combox-body { - border: 1px solid #CCC; + border: 1px solid var(--edui-color-border); background-color: white; border-radius: 2px; -webkit-border-radius: 2px; @@ -514,7 +504,7 @@ div.edui-box { } .edui-default .edui-toolbar .edui-combox-body .edui-arrow { - border-left: 1px solid #CCC; + border-left: 1px solid var(--edui-color-border); } .edui-default .edui-toolbar .edui-state-hover .edui-combox-body { @@ -586,425 +576,436 @@ div.edui-box { } .edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { - background-color: #ffffff; + background-color: #F0F0EE; padding: 0; - border: 1px solid gray; + border: 1px solid var(--edui-color-border); } + .edui-default .edui-toolbar .edui-state-disabled .edui-label { color: #ccc; } + .edui-default .edui-toolbar .edui-state-disabled .edui-icon { opacity: 0.3; - filter: alpha(opacity = 30); + filter: alpha(opacity=30); } -.edui-default .edui-toolbar-button-custom{ - display: inline-block !important; - line-height: 30px; - vertical-align: middle; - padding: 0 10px; - border-radius: 3px; - margin: 0 5px; +.edui-default .edui-toolbar-button-custom { + display: inline-block !important; + line-height: 30px; + vertical-align: middle; + padding: 0 10px; + border-radius: 3px; + margin: 0 5px; } -.edui-default .edui-toolbar-button-custom:hover{ - background: #EEE; +.edui-default .edui-toolbar-button-custom:hover { + background: #EEE; } /* toolbar icons */ .edui-default .edui-for-undo .edui-icon:before { - content: "\e60f"; + content: "\e60f"; } -.edui-default .edui-for-redo .edui-icon:before { +.edui-default .edui-for-redo .edui-icon:before { content: "\e60c"; } -.edui-default .edui-for-bold .edui-icon:before { +.edui-default .edui-for-bold .edui-icon:before { content: "\e628"; } -.edui-default .edui-for-italic .edui-icon:before { +.edui-default .edui-for-italic .edui-icon:before { content: "\e62a"; } -.edui-default .edui-for-fontborder .edui-icon:before { +.edui-default .edui-for-fontborder .edui-icon:before { content: '\e62d'; } -.edui-default .edui-for-underline .edui-icon:before { + +.edui-default .edui-for-underline .edui-icon:before { content: "\e63e"; } -.edui-default .edui-for-strikethrough .edui-icon:before { +.edui-default .edui-for-strikethrough .edui-icon:before { content: "\e64a"; } -.edui-default .edui-for-subscript .edui-icon:before { +.edui-default .edui-for-subscript .edui-icon:before { content: "\ece9"; } -.edui-default .edui-for-superscript .edui-icon:before { +.edui-default .edui-for-superscript .edui-icon:before { content: "\e83e"; } -.edui-default .edui-for-blockquote .edui-icon:before { +.edui-default .edui-for-blockquote .edui-icon:before { content: "\e6d8"; } -.edui-default .edui-for-forecolor .edui-icon:before { +.edui-default .edui-for-forecolor .edui-icon:before { content: "\e7f8"; } -.edui-default .edui-for-backcolor .edui-icon:before { +.edui-default .edui-for-backcolor .edui-icon:before { content: "\e71a"; } -.edui-default .edui-for-inserttable .edui-icon:before { +.edui-default .edui-for-inserttable .edui-icon:before { content: "\e60d"; } -.edui-default .edui-for-autotypeset .edui-icon:before { +.edui-default .edui-for-autotypeset .edui-icon:before { content: "\e662"; } -.edui-default .edui-for-justifyleft .edui-icon:before { +.edui-default .edui-for-justifyleft .edui-icon:before { content: "\e7f7"; } -.edui-default .edui-for-justifycenter .edui-icon:before { +.edui-default .edui-for-justifycenter .edui-icon:before { content: "\e7f6"; } -.edui-default .edui-for-justifyright .edui-icon:before { +.edui-default .edui-for-justifyright .edui-icon:before { content: "\e7f5"; } -.edui-default .edui-for-justifyjustify .edui-icon:before { +.edui-default .edui-for-justifyjustify .edui-icon:before { content: "\e87c"; } -.edui-default .edui-for-insertorderedlist .edui-icon:before { +.edui-default .edui-for-insertorderedlist .edui-icon:before { content: "\e737"; } -.edui-default .edui-for-insertunorderedlist .edui-icon:before { +.edui-default .edui-for-insertunorderedlist .edui-icon:before { content: "\e7f4"; } -.edui-default .edui-for-lineheight .edui-icon:before { +.edui-default .edui-for-lineheight .edui-icon:before { content: "\e638"; } -.edui-default .edui-for-rowspacingbottom .edui-icon:before { +.edui-default .edui-for-rowspacingbottom .edui-icon:before { content: '\eb09'; } -.edui-default .edui-for-rowspacingtop .edui-icon:before { +.edui-default .edui-for-rowspacingtop .edui-icon:before { content: '\eb0a'; } -.edui-default .edui-for-horizontal .edui-icon:before { +.edui-default .edui-for-horizontal .edui-icon:before { content: "\e617"; } -.edui-default .edui-for-link .edui-icon:before { +.edui-default .edui-for-link .edui-icon:before { content: "\e648"; } -.edui-default .edui-for-code .edui-icon:before { +.edui-default .edui-for-code .edui-icon:before { background-position: -440px -40px; } -.edui-default .edui-for-insertimage .edui-icon:before { +.edui-default .edui-for-insertimage .edui-icon:before { content: "\e605"; } -.edui-default .edui-for-insertframe .edui-icon:before { +.edui-default .edui-for-insertframe .edui-icon:before { content: "\e6c0"; } -.edui-default .edui-for-emoticon .edui-icon:before { +.edui-default .edui-for-emoticon .edui-icon:before { content: "\e60e"; } -.edui-default .edui-for-spechars .edui-icon:before { +.edui-default .edui-for-spechars .edui-icon:before { content: "\e891"; } -.edui-default .edui-for-help .edui-icon:before { +.edui-default .edui-for-help .edui-icon:before { content: "\e752"; } -.edui-default .edui-for-print .edui-icon:before { +.edui-default .edui-for-print .edui-icon:before { content: "\e67a"; } -.edui-default .edui-for-preview .edui-icon:before { +.edui-default .edui-for-preview .edui-icon:before { content: "\e644"; } -.edui-default .edui-for-selectall .edui-icon:before { +.edui-default .edui-for-selectall .edui-icon:before { content: '\e62f'; } -.edui-default .edui-for-searchreplace .edui-icon:before { +.edui-default .edui-for-searchreplace .edui-icon:before { content: "\eb6c"; } -.edui-default .edui-for-map .edui-icon:before { +.edui-default .edui-for-contentimport .edui-icon:before { + content: "\e6f1"; +} + +.edui-default .edui-for-map .edui-icon:before { content: "\e649"; } -.edui-default .edui-for-insertvideo .edui-icon:before { +.edui-default .edui-for-insertvideo .edui-icon:before { content: "\e636"; } -.edui-default .edui-for-time .edui-icon:before { +.edui-default .edui-for-insertaudio .edui-icon:before { + content: "\e77b"; +} + +.edui-default .edui-for-time .edui-icon:before { content: "\e680"; } -.edui-default .edui-for-date .edui-icon:before { +.edui-default .edui-for-date .edui-icon:before { content: "\e697"; } -.edui-default .edui-for-cut .edui-icon:before { +.edui-default .edui-for-cut .edui-icon:before { background-position: -680px 0; } -.edui-default .edui-for-copy .edui-icon:before { +.edui-default .edui-for-copy .edui-icon:before { background-position: -700px 0; } -.edui-default .edui-for-paste .edui-icon:before { +.edui-default .edui-for-paste .edui-icon:before { background-position: -560px 0; } -.edui-default .edui-for-formatmatch .edui-icon:before { +.edui-default .edui-for-formatmatch .edui-icon:before { content: "\e637"; } -.edui-default .edui-for-pasteplain .edui-icon:before { +.edui-default .edui-for-pasteplain .edui-icon:before { content: '\edfb'; } -.edui-default .edui-for-directionalityltr .edui-icon:before { +.edui-default .edui-for-directionalityltr .edui-icon:before { content: "\e623"; } -.edui-default .edui-for-directionalityrtl .edui-icon:before { +.edui-default .edui-for-directionalityrtl .edui-icon:before { content: "\e7bc"; } -.edui-default .edui-for-source .edui-icon:before { +.edui-default .edui-for-source .edui-icon:before { content: "\e608"; } -.edui-default .edui-for-removeformat .edui-icon:before { +.edui-default .edui-for-removeformat .edui-icon:before { content: "\e782"; } -.edui-default .edui-for-unlink .edui-icon:before { +.edui-default .edui-for-unlink .edui-icon:before { content: "\e92b"; } -.edui-default .edui-for-touppercase .edui-icon:before { +.edui-default .edui-for-touppercase .edui-icon:before { content: "\e619"; } -.edui-default .edui-for-tolowercase .edui-icon:before { +.edui-default .edui-for-tolowercase .edui-icon:before { content: "\e61a"; } -.edui-default .edui-for-insertrow .edui-icon:before { +.edui-default .edui-for-insertrow .edui-icon:before { content: "\e603"; } -.edui-default .edui-for-insertrownext .edui-icon:before { +.edui-default .edui-for-insertrownext .edui-icon:before { content: "\e602"; } -.edui-default .edui-for-insertcol .edui-icon:before { +.edui-default .edui-for-insertcol .edui-icon:before { content: "\e601"; } -.edui-default .edui-for-insertcolnext .edui-icon:before { +.edui-default .edui-for-insertcolnext .edui-icon:before { content: "\e600"; } -.edui-default .edui-for-mergeright .edui-icon:before { +.edui-default .edui-for-mergeright .edui-icon:before { content: "\e615"; } -.edui-default .edui-for-mergedown .edui-icon:before { +.edui-default .edui-for-mergedown .edui-icon:before { content: "\e613"; } -.edui-default .edui-for-splittorows .edui-icon:before { +.edui-default .edui-for-splittorows .edui-icon:before { content: "\e610"; } -.edui-default .edui-for-splittocols .edui-icon:before { +.edui-default .edui-for-splittocols .edui-icon:before { content: "\e611"; } -.edui-default .edui-for-insertparagraphbeforetable .edui-icon:before { +.edui-default .edui-for-insertparagraphbeforetable .edui-icon:before { content: '\e901'; } -.edui-default .edui-for-deleterow .edui-icon:before { +.edui-default .edui-for-deleterow .edui-icon:before { content: "\e609"; } -.edui-default .edui-for-deletecol .edui-icon:before { +.edui-default .edui-for-deletecol .edui-icon:before { content: "\e604"; } -.edui-default .edui-for-splittocells .edui-icon:before { +.edui-default .edui-for-splittocells .edui-icon:before { content: "\e612"; } -.edui-default .edui-for-mergecells .edui-icon:before { +.edui-default .edui-for-mergecells .edui-icon:before { content: "\e606"; } -.edui-default .edui-for-deletetable .edui-icon:before { +.edui-default .edui-for-deletetable .edui-icon:before { content: "\e60a"; } -.edui-default .edui-for-cleardoc .edui-icon:before { +.edui-default .edui-for-cleardoc .edui-icon:before { content: "\e61e"; } -.edui-default .edui-for-fullscreen .edui-icon:before { +.edui-default .edui-for-fullscreen .edui-icon:before { content: "\e675"; } -.edui-default .edui-for-anchor .edui-icon:before { +.edui-default .edui-for-anchor .edui-icon:before { content: "\e61b"; } -.edui-default .edui-for-pagebreak .edui-icon:before { +.edui-default .edui-for-pagebreak .edui-icon:before { content: "\e61d"; } -.edui-default .edui-for-imagenone .edui-icon:before { +.edui-default .edui-for-imagenone .edui-icon:before { content: "\e61f"; } -.edui-default .edui-for-imageleft .edui-icon:before { +.edui-default .edui-for-imageleft .edui-icon:before { content: "\e621"; } -.edui-default .edui-for-wordimage .edui-icon:before { +.edui-default .edui-for-wordimage .edui-icon:before { content: "\e618"; } -.edui-default .edui-for-imageright .edui-icon:before { +.edui-default .edui-for-imageright .edui-icon:before { content: "\e622"; } -.edui-default .edui-for-imagecenter .edui-icon:before { +.edui-default .edui-for-imagecenter .edui-icon:before { content: "\e620"; } -.edui-default .edui-for-indent .edui-icon:before { +.edui-default .edui-for-indent .edui-icon:before { content: "\e7f3"; } -.edui-default .edui-for-outdent .edui-icon:before { +.edui-default .edui-for-outdent .edui-icon:before { background-position: -540px 0; } -.edui-default .edui-for-table .edui-icon:before { +.edui-default .edui-for-table .edui-icon:before { background-position: -580px -20px; } -.edui-default .edui-for-edittable .edui-icon:before { +.edui-default .edui-for-edittable .edui-icon:before { background-position: -420px -40px; } -.edui-default .edui-for-template .edui-icon:before { +.edui-default .edui-for-template .edui-icon:before { content: "\e6ad"; } -.edui-default .edui-for-delete .edui-icon:before { +.edui-default .edui-for-delete .edui-icon:before { background-position: -360px -40px; } -.edui-default .edui-for-attachment .edui-icon:before { +.edui-default .edui-for-attachment .edui-icon:before { content: "\e704"; } -.edui-default .edui-for-edittd .edui-icon:before { +.edui-default .edui-for-edittd .edui-icon:before { background-position: -700px -40px; } -.edui-default .edui-for-scrawl .edui-icon:before { +.edui-default .edui-for-scrawl .edui-icon:before { content: "\e70b"; } -.edui-default .edui-for-background .edui-icon:before { +.edui-default .edui-for-background .edui-icon:before { content: "\e624"; } -.edui-default .edui-for-formula .edui-icon:before { +.edui-default .edui-for-formula .edui-icon:before { content: "\e616"; } -.edui-default .edui-for-aligntd .edui-icon:before { +.edui-default .edui-for-aligntd .edui-icon:before { background-position: -236px -76px; } -.edui-default .edui-for-insertparagraphtrue .edui-icon:before { +.edui-default .edui-for-insertparagraphtrue .edui-icon:before { background-position: -625px -76px; } -.edui-default .edui-for-insertparagraph .edui-icon:before { +.edui-default .edui-for-insertparagraph .edui-icon:before { background-position: -602px -76px; } -.edui-default .edui-for-insertcaption .edui-icon:before { +.edui-default .edui-for-insertcaption .edui-icon:before { background-position: -336px -76px; } -.edui-default .edui-for-deletecaption .edui-icon:before { +.edui-default .edui-for-deletecaption .edui-icon:before { background-position: -362px -76px; } -.edui-default .edui-for-inserttitle .edui-icon:before { +.edui-default .edui-for-inserttitle .edui-icon:before { background-position: -286px -76px; } -.edui-default .edui-for-deletetitle .edui-icon:before { +.edui-default .edui-for-deletetitle .edui-icon:before { background-position: -311px -76px; } -.edui-default .edui-for-aligntable .edui-icon:before { +.edui-default .edui-for-aligntable .edui-icon:before { background-position: -440px 0; } -.edui-default .edui-for-tablealignment-left .edui-icon:before { +.edui-default .edui-for-tablealignment-left .edui-icon:before { background-position: -460px 0; } -.edui-default .edui-for-tablealignment-center .edui-icon:before { +.edui-default .edui-for-tablealignment-center .edui-icon:before { background-position: -420px 0; } -.edui-default .edui-for-tablealignment-right .edui-icon:before { +.edui-default .edui-for-tablealignment-right .edui-icon:before { background-position: -480px 0; } -.edui-default .edui-for-inserttitlecol .edui-icon:before { +.edui-default .edui-for-inserttitlecol .edui-icon:before { background-position: -673px -76px; } -.edui-default .edui-for-deletetitlecol .edui-icon:before { +.edui-default .edui-for-deletetitlecol .edui-icon:before { background-position: -698px -76px; } -.edui-default .edui-for-simpleupload .edui-icon:before { - content: "\edfc"; +.edui-default .edui-for-simpleupload .edui-icon:before { + content: "\edfc"; } /*splitbutton*/ @@ -1014,36 +1015,40 @@ div.edui-box { width: 13px; cursor: pointer; } + .edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow:before, .edui-default .edui-toolbar .edui-menubutton-body .edui-arrow:before { content: "\e9f0"; font-family: "edui-iconfont"; font-size: 8px; + vertical-align: middle; } .edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { padding: 1px; border-radius: 3px; + display: flex; } .edui-default .edui-toolbar .edui-splitborder { - width: 1px; + /*width: 1px;*/ + width: 0px; height: 30px; } .edui-default .edui-toolbar .edui-state-hover .edui-splitborder { - width: 1px; + /*width: 1px;*/ border-left: 0px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-active .edui-splitborder { width: 0; - border-left: 1px solid #EEE; + /*border-left: 1px solid #EEE;*/ } .edui-default .edui-toolbar .edui-state-opened .edui-splitborder { - width: 1px; + /*width: 1px;*/ border: 0; } @@ -1070,7 +1075,7 @@ div.edui-box { .edui-default .edui-state-disabled .edui-arrow { opacity: 0.3; - _filter: alpha(opacity = 30); + _filter: alpha(opacity=30); } .edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, @@ -1095,19 +1100,19 @@ div.edui-box { .edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, .edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { /*background-position: 0 -40px;*/ - background-image: none ; + background-image: none; } /* 弹出菜单 */ .edui-default .edui-popup { z-index: 3000; background-color: #ffffff; - width:auto; - height:auto; + width: auto; + height: auto; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; - margin-top:1px; + margin-top: 1px; } .edui-default .edui-popup .edui-shadow { @@ -1119,7 +1124,7 @@ div.edui-box { .edui-default .edui-popup-content { font-size: 13px; - box-shadow: 0 0 10px rgba(0,0,0,0.2); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); transition: .25s; color: #333; background-color: #FFF; @@ -1162,9 +1167,9 @@ div.edui-box { border-right: 1px solid gray; } -.edui-popup div{ - width:auto; - height:auto; +.edui-popup div { + width: auto; + height: auto; } .edui-default .edui-editor-messageholder { @@ -1179,36 +1184,41 @@ div.edui-box { right: 3px; } -.edui-default .edui-message{ +.edui-default .edui-message { min-height: 10px; - text-shadow: 0 1px 0 rgba(255,255,255,0.5); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); padding: 0; margin-bottom: 3px; position: relative; } -.edui-default .edui-message-body{ + +.edui-default .edui-message-body { border-radius: 3px; padding: 8px 15px 8px 8px; color: #c09853; background-color: #fcf8e3; border: 1px solid #fbeed5; } -.edui-default .edui-message-type-info{ + +.edui-default .edui-message-type-info { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1 } -.edui-default .edui-message-type-success{ + +.edui-default .edui-message-type-success { color: #468847; background-color: #dff0d8; border-color: #d6e9c6 } + .edui-default .edui-message-type-danger, -.edui-default .edui-message-type-error{ +.edui-default .edui-message-type-error { color: #b94a48; background-color: #f2dede; border-color: #eed3d7 } + .edui-default .edui-message .edui-message-closer { display: block; width: 16px; @@ -1226,13 +1236,15 @@ div.edui-box { font-weight: bold; color: #999; text-shadow: 0 1px 0 #fff; - font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } + .edui-default .edui-message .edui-message-content { font-size: 10pt; word-wrap: break-word; word-break: normal; } + /* 弹出对话框按钮和对话框大小 */ .edui-default .edui-dialog { z-index: 2000; @@ -1240,8 +1252,8 @@ div.edui-box { } -.edui-dialog div{ - width:auto; +.edui-dialog div { + width: auto; } .edui-default .edui-dialog-wrap { @@ -1296,8 +1308,9 @@ div.edui-box { background: #FFF; position: relative; cursor: move; - border-radius:5px 5px 0 0; + border-radius: 5px 5px 0 0; } + .edui-default .edui-dialog-caption { font-weight: bold; font-size: 14px; @@ -1307,12 +1320,13 @@ div.edui-box { .edui-default .edui-dialog-draghandle { height: 30px; + padding: 5px; } .edui-default .edui-dialog-closebutton { position: absolute !important; - right: 5px; - top: 3px; + right: 10px; + top: 10px; } .edui-default .edui-dialog-closebutton .edui-button-body { @@ -1321,22 +1335,23 @@ div.edui-box { cursor: pointer; } -.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon{ +.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon { width: 20px; height: 20px; font-family: 'edui-iconfont'; line-height: 20px; font-size: 20px; text-align: center; - color:#999; + color: #999; vertical-align: top; } -.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon:before{ + +.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon:before { content: "\e6a7"; } -.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body .edui-icon{ - color:#333; +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body .edui-icon { + color: #333; } .edui-default .edui-dialog-buttons { @@ -1348,7 +1363,7 @@ div.edui-box { margin-right: 10px; } -.edui-default .edui-dialog-buttons .edui-button .edui-button-body .edui-icon{ +.edui-default .edui-dialog-buttons .edui-button .edui-button-body .edui-icon { display: none !important; } @@ -1361,7 +1376,7 @@ div.edui-box { text-align: center; background-color: #F8F8F8; border: 1px solid #EEE; - padding:0 15px; + padding: 0 15px; } .edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { @@ -1377,7 +1392,7 @@ div.edui-box { .edui-default .edui-dialog-modalmask { opacity: 0.3; - filter: alpha(opacity = 30); + filter: alpha(opacity=30); background-color: #ccc; position: absolute; /*z-index: 1999;*/ @@ -1402,7 +1417,7 @@ div.edui-box { width: 100%; height: 100%; opacity: 0; - filter: alpha(opacity = 0); + filter: alpha(opacity=0); } /*link-dialog*/ @@ -1411,6 +1426,7 @@ div.edui-box { height: 200px; overflow: hidden; } + /*background-dialog*/ .edui-default .edui-for-background .edui-dialog-content { width: 440px; @@ -1456,16 +1472,16 @@ div.edui-box { /*wordImage-dialog*/ .edui-default .edui-for-wordimage .edui-dialog-content { - width: 620px; - height: 380px; - overflow: hidden; + width: 620px; + height: 380px; + overflow: hidden; } /*formula-dialog*/ .edui-default .edui-for-formula .edui-dialog-content { - width: 620px; - height: 300px; - overflow: hidden; + width: 800px; + height: 400px; + overflow: hidden; } /*attachment-dialog*/ @@ -1488,6 +1504,12 @@ div.edui-box { height: 420px; } +/*audio-dialog*/ +.edui-default .edui-for-insertaudio .edui-dialog-content { + width: 590px; + height: 420px; +} + /*anchor-dialog*/ .edui-default .edui-for-anchor .edui-dialog-content { width: 320px; @@ -1501,6 +1523,12 @@ div.edui-box { height: 220px; } +/*content-import-dialog*/ +.edui-default .edui-for-contentimport .edui-dialog-content { + width: 620px; + height: 400px; +} + /*help-dialog*/ .edui-default .edui-for-help .edui-dialog-content { width: 400px; @@ -1510,7 +1538,7 @@ div.edui-box { /*edittable-dialog*/ .edui-default .edui-for-edittable .edui-dialog-content { width: 540px; - _width:590px; + _width: 590px; height: 335px; } @@ -1575,12 +1603,15 @@ div.edui-box { .edui-default .edui-for-inserttable .edui-splitborder { display: none } -.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { width: 0 } -.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + +.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder { border-left: 1px solid transparent; } + .edui-default .edui-tablepicker .edui-infoarea { height: 14px; line-height: 14px; @@ -1625,7 +1656,21 @@ div.edui-box { margin-left: 1px; width: 128px; float: left; - border-radius:3px; + border-radius: 3px; + position: relative; +} + +.edui-default .edui-colorpicker-preview input { + padding: 0; + left: 0; + border: 0; + position: absolute; + top: 0; + width: 100%; + height: 100%; + border-radius: 3px; + opacity: 0; + cursor: pointer; } .edui-default .edui-colorpicker-nocolor { @@ -1638,6 +1683,7 @@ div.edui-box { padding: 0 5px; cursor: pointer; border-radius: 3px; + box-sizing: content-box; } .edui-default .edui-colorpicker-tablefirstrow { @@ -1650,7 +1696,7 @@ div.edui-box { display: block; margin: 0; cursor: pointer; - border-radius:2px; + border-radius: 2px; } .edui-default .edui-colorpicker-colorcell:hover { @@ -1658,28 +1704,34 @@ div.edui-box { height: 14px; margin: 0; } -.edui-default .edui-colorpicker-advbtn{ + +.edui-default .edui-colorpicker-advbtn { display: block; text-align: center; cursor: pointer; - height:20px; + height: 20px; } -.arrow_down{ + +.arrow_down { background: white url('../images/arrow_down.png') no-repeat center; } -.arrow_up{ + +.arrow_up { background: white url('../images/arrow_up.png') no-repeat center; } + /*高级的样式*/ -.edui-colorpicker-adv{ +.edui-colorpicker-adv { position: relative; overflow: hidden; height: 180px; display: none; } + .edui-colorpicker-plant, .edui-colorpicker-hue { border: solid 1px #666; } + .edui-colorpicker-pad { width: 150px; height: 150px; @@ -1690,7 +1742,8 @@ div.edui-box { overflow: hidden; cursor: crosshair; } -.edui-colorpicker-cover{ + +.edui-colorpicker-cover { position: absolute; top: 0; left: 0; @@ -1698,7 +1751,8 @@ div.edui-box { height: 150px; background: url("../images/tangram-colorpicker.png") -160px -200px; } -.edui-colorpicker-padDot{ + +.edui-colorpicker-padDot { position: absolute; top: 0; left: 0; @@ -1709,6 +1763,7 @@ div.edui-box { z-index: 1000; } + .edui-colorpicker-sliderMain { position: absolute; left: 171px; @@ -1718,12 +1773,14 @@ div.edui-box { background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; } + .edui-colorpicker-slider { width: 100%; height: 100%; cursor: pointer; } -.edui-colorpicker-thumb{ + +.edui-colorpicker-thumb { position: absolute; top: 0; cursor: pointer; @@ -1749,13 +1806,26 @@ div.edui-box { .edui-default .edui-autotypesetpicker-body td { font-size: 12px; - word-wrap:break-word; + word-wrap: break-word; } .edui-default .edui-autotypesetpicker-body td input { margin: 3px 3px 3px 4px; *margin: 1px 0 0 0; } + +.edui-default .edui-autotypesetpicker-body td button { + border: none; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 4rem; + -webkit-appearance: none; + cursor: pointer; + margin-bottom: 5px; + background-color: #EEE; +} + /*自动排版弹出菜单*/ .edui-default .edui-cellalignpicker .edui-cellalignpicker-body { width: 70px; @@ -1767,36 +1837,39 @@ div.edui-box { border-collapse: separate; border-spacing: 0; } -.edui-default .edui-cellalignpicker-body td{ + +.edui-default .edui-cellalignpicker-body td { padding: 1px; } -.edui-default .edui-cellalignpicker-body .edui-icon{ + +.edui-default .edui-cellalignpicker-body .edui-icon { height: 20px; width: 20px; padding: 1px; background-image: url(../images/table-cell-align.png); } -.edui-default .edui-cellalignpicker-body .edui-left{ +.edui-default .edui-cellalignpicker-body .edui-left { background-position: 0 0; } -.edui-default .edui-cellalignpicker-body .edui-center{ +.edui-default .edui-cellalignpicker-body .edui-center { background-position: -25px 0; } -.edui-default .edui-cellalignpicker-body .edui-right{ + +.edui-default .edui-cellalignpicker-body .edui-right { background-position: -51px 0; } -.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left { background-position: -73px 0; } -.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center { background-position: -98px 0; } -.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right { background-position: -124px 0; } @@ -1812,12 +1885,13 @@ div.edui-box { .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { background-position: -271px 0; } + /*分隔线*/ .edui-default .edui-toolbar .edui-separator { width: 1px; height: 20px; margin: 5px 5px; - background: #CCC; + background: var(--edui-color-border); } /*颜色按钮 */ @@ -1835,14 +1909,14 @@ div.edui-box { .edui-default .edui-for-emotion .edui-icon:before { content: "\e60e"; } -.edui-default .edui-for-emotion .edui-popup-content iframe -{ + +.edui-default .edui-for-emotion .edui-popup-content iframe { width: 514px; height: 380px; overflow: hidden; } -.edui-default .edui-for-emotion .edui-popup-content -{ + +.edui-default .edui-for-emotion .edui-popup-content { position: relative; z-index: 555 } @@ -1851,12 +1925,11 @@ div.edui-box { display: none } -.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow -{ +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow { width: 0 } -.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder -{ + +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder { border-left: 1px solid transparent; } @@ -1867,13 +1940,13 @@ div.edui-box { float: right; /*background: url("../images/icons-all.gif") no-repeat 10px -233px;*/ font-family: 'edui-iconfont'; - font-size:12px; - line-height:20px; - text-align:center; + font-size: 12px; + line-height: 20px; + text-align: center; } -.edui-default .edui-hassubmenu .edui-arrow:before{ - content: "\e665"; +.edui-default .edui-hassubmenu .edui-arrow:before { + content: "\e665"; } .edui-default .edui-menu-body .edui-menuitem { @@ -1895,39 +1968,43 @@ div.edui-box { .edui-default .edui-menu-body .edui-state-hover { padding: 0 !important; background-color: var(--edui-color-active-bg); - border-radius:3px; - border:1px solid var(--edui-color-active-bg); + border-radius: 3px; + border: 1px solid var(--edui-color-active-bg); } /*弹出菜单*/ .edui-default .edui-shortcutmenu { padding: 2px; - width: 300px; + /*width: 300px;*/ + white-space: nowrap; height: auto; background-color: #fff; - border: 1px solid #ccc; + /*border: 1px solid var(--edui-color-border);*/ border-radius: 5px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); } /*粘贴弹出菜单*/ -.edui-default .edui-wordpastepop .edui-popup-content{ +.edui-default .edui-wordpastepop .edui-popup-content { border: none; padding: 0; width: 54px; height: 21px; } -.edui-default .edui-pasteicon { + +.edui-default .edui-pasteicon { width: 100%; height: 100%; background-image: url('../images/wordpaste.png'); background-position: 0 0; + cursor: pointer; } -.edui-default .edui-pasteicon.edui-state-opened { +.edui-default .edui-pasteicon.edui-state-opened { background-position: 0 -34px; } -.edui-default .edui-pastecontainer { +.edui-default .edui-pastecontainer { position: relative; visibility: hidden; width: 97px; @@ -1935,7 +2012,7 @@ div.edui-box { border: 1px solid #ccc; } -.edui-default .edui-pastecontainer .edui-title { +.edui-default .edui-pastecontainer .edui-title { font-weight: bold; background: #F8F8FF; height: 25px; @@ -1944,14 +2021,14 @@ div.edui-box { padding-left: 5px; } -.edui-default .edui-pastecontainer .edui-button { +.edui-default .edui-pastecontainer .edui-button { overflow: hidden; margin: 3px 0; } -.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, -.edui-default .edui-pastecontainer .edui-button .edui-tagicon, -.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-default .edui-pastecontainer .edui-button .edui-tagicon, +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { float: left; cursor: pointer; width: 29px; @@ -1960,24 +2037,111 @@ div.edui-box { background-image: url('../images/wordpaste.png'); background-repeat: no-repeat; } -.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { margin-left: 0; background-position: -109px 0; } -.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { background-position: -148px 1px; } -.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { background-position: -72px 0; } -.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { background-position: -109px -34px; } -.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon { background-position: -148px -34px; } -.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon { background-position: -72px -34px; -} \ No newline at end of file +} + +.edui-quick-operate { + position: relative; + margin: -10px; + /*width: 40px;*/ + height: 40px; + background: #FFF; + width: 50px !important; + border-radius: 4px; +} + +.edui-quick-operate:hover .edui-quick-operate-menu { + display: block; +} + +.edui-quick-operate-status { + display: flex; +} + +.edui-quick-operate-icon { + display: inline-block; + line-height: 30px !important; + width: 30px !important; + text-align: center; + cursor: pointer; + color: #2A57FE; +} + +.edui-quick-operate-icon:last-child { + width: 20px !important; + font-size: 0; + color: #999; +} + +.edui-quick-operate-icon:last-child svg { + vertical-align: middle; +} + +.edui-quick-operate-menu { + border: 1px solid #CCC; + border-radius: 5px; + box-shadow: 0 0 10px #CCC; + position: absolute; + left: 50px; + top: 0; + background: #FFF; + width: 100px !important; + display: none; +} + +.edui-quick-operate-menu .item { + height: 30px; + line-height: 30px; + padding: 0 10px; + cursor: pointer; +} + +.edui-quick-operate-menu .item:hover { + background: #F5F5F5; +} + +.edui-quick-operate-menu .item i { + display: inline-block; + width: 2em; +} + +.edui-quick-operate .icon { + font-family: "edui-iconfont"; + font-style: normal; + -webkit-font-smoothing: antialiased; +} + +.edui-quick-operate .icon.icon-image:before { + content: "\e605"; +} + +.edui-quick-operate .icon.icon-list:before { + content: "\e87c"; +} + +.edui-quick-operate .icon.icon-trash:before { + content: "\e87c"; +} diff --git a/public/js/ueditor/themes/default/dialog.css b/public/js/ueditor/themes/default/dialog.css new file mode 100644 index 0000000..b7130fb --- /dev/null +++ b/public/js/ueditor/themes/default/dialog.css @@ -0,0 +1,17 @@ +input[type="text"] { + height: 30px; + border: 1px solid #EEE; + border-radius: 3px; + padding: 0 5px; + line-height: 2px; + outline: none; +} + +select { + height: 30px; + border: 1px solid #EEE; + border-radius: 3px; + padding: 0 5px; + line-height: 2px; + outline: none; +} diff --git a/public/js/ueditor/themes/default/exts/ai.svg b/public/js/ueditor/themes/default/exts/ai.svg new file mode 100644 index 0000000..80c5afe --- /dev/null +++ b/public/js/ueditor/themes/default/exts/ai.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/apk.svg b/public/js/ueditor/themes/default/exts/apk.svg new file mode 100644 index 0000000..96bef1a --- /dev/null +++ b/public/js/ueditor/themes/default/exts/apk.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/chm.svg b/public/js/ueditor/themes/default/exts/chm.svg new file mode 100644 index 0000000..8432530 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/chm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/css.svg b/public/js/ueditor/themes/default/exts/css.svg new file mode 100644 index 0000000..94361c7 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/css.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/doc.svg b/public/js/ueditor/themes/default/exts/doc.svg new file mode 100644 index 0000000..30dd860 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/doc.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/docx.svg b/public/js/ueditor/themes/default/exts/docx.svg new file mode 100644 index 0000000..30dd860 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/docx.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/dwg.svg b/public/js/ueditor/themes/default/exts/dwg.svg new file mode 100644 index 0000000..e7eff1a --- /dev/null +++ b/public/js/ueditor/themes/default/exts/dwg.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + dwg + + + diff --git a/public/js/ueditor/themes/default/exts/folder.svg b/public/js/ueditor/themes/default/exts/folder.svg new file mode 100644 index 0000000..02e8edc --- /dev/null +++ b/public/js/ueditor/themes/default/exts/folder.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/js/ueditor/themes/default/exts/gif.svg b/public/js/ueditor/themes/default/exts/gif.svg new file mode 100644 index 0000000..6b74924 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/gif.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/html.svg b/public/js/ueditor/themes/default/exts/html.svg new file mode 100644 index 0000000..2935849 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/html.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/jpeg.svg b/public/js/ueditor/themes/default/exts/jpeg.svg new file mode 100644 index 0000000..d951ef4 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/jpeg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/jpg.svg b/public/js/ueditor/themes/default/exts/jpg.svg new file mode 100644 index 0000000..b3bcb68 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/jpg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/log.svg b/public/js/ueditor/themes/default/exts/log.svg new file mode 100644 index 0000000..f1f9236 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/log.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/mp3.svg b/public/js/ueditor/themes/default/exts/mp3.svg new file mode 100644 index 0000000..6cc0e35 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/mp3.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/mp4.svg b/public/js/ueditor/themes/default/exts/mp4.svg new file mode 100644 index 0000000..20c579d --- /dev/null +++ b/public/js/ueditor/themes/default/exts/mp4.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/pdf.svg b/public/js/ueditor/themes/default/exts/pdf.svg new file mode 100644 index 0000000..335b9f7 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/pdf.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/png.svg b/public/js/ueditor/themes/default/exts/png.svg new file mode 100644 index 0000000..4f147d9 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/png.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/ppt.svg b/public/js/ueditor/themes/default/exts/ppt.svg new file mode 100644 index 0000000..4ea923e --- /dev/null +++ b/public/js/ueditor/themes/default/exts/ppt.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/pptx.svg b/public/js/ueditor/themes/default/exts/pptx.svg new file mode 100644 index 0000000..4ea923e --- /dev/null +++ b/public/js/ueditor/themes/default/exts/pptx.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/psd.svg b/public/js/ueditor/themes/default/exts/psd.svg new file mode 100644 index 0000000..52fa08c --- /dev/null +++ b/public/js/ueditor/themes/default/exts/psd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/rar.svg b/public/js/ueditor/themes/default/exts/rar.svg new file mode 100644 index 0000000..2541fec --- /dev/null +++ b/public/js/ueditor/themes/default/exts/rar.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/svg.svg b/public/js/ueditor/themes/default/exts/svg.svg new file mode 100644 index 0000000..8f7f37c --- /dev/null +++ b/public/js/ueditor/themes/default/exts/svg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/torrent.svg b/public/js/ueditor/themes/default/exts/torrent.svg new file mode 100644 index 0000000..6429687 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/torrent.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/txt.svg b/public/js/ueditor/themes/default/exts/txt.svg new file mode 100644 index 0000000..5b4c797 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/txt.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/unknown.svg b/public/js/ueditor/themes/default/exts/unknown.svg new file mode 100644 index 0000000..214a6f3 --- /dev/null +++ b/public/js/ueditor/themes/default/exts/unknown.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/xls.svg b/public/js/ueditor/themes/default/exts/xls.svg new file mode 100644 index 0000000..e4bd05f --- /dev/null +++ b/public/js/ueditor/themes/default/exts/xls.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/xlsx.svg b/public/js/ueditor/themes/default/exts/xlsx.svg new file mode 100644 index 0000000..e4bd05f --- /dev/null +++ b/public/js/ueditor/themes/default/exts/xlsx.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/js/ueditor/themes/default/exts/zip.svg b/public/js/ueditor/themes/default/exts/zip.svg new file mode 100644 index 0000000..2541fec --- /dev/null +++ b/public/js/ueditor/themes/default/exts/zip.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/public/js/ueditor/themes/default/font/iconfont.ttf b/public/js/ueditor/themes/default/font/iconfont.ttf deleted file mode 100644 index 58831d238b6f26c324082ebf42542465d8dca859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25388 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 eArE1>ft6ajW8;( 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 esM2ZEJ4BL|6n8{Sei@Jt0L_f7?5pN7PDVh+V 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 Oa|~VrhDkVV0RR9E*0<{b diff --git a/public/js/ueditor/themes/iframe.css b/public/js/ueditor/themes/iframe.css index 3e4032a..0131ced 100644 --- a/public/js/ueditor/themes/iframe.css +++ b/public/js/ueditor/themes/iframe.css @@ -1,56 +1,63 @@ body { - font-family: "Microsoft YaHei", Helvetica, "STHeiti STXihei", "Microsoft JhengHei", Tohoma, Arial; - font-size: 14px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + font-size: 14px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } a { - color: #09f; - text-decoration: none; + color: #09f; + text-decoration: none; } a:hover, a:focus { - color: #09f; - text-decoration: none; + color: #09f; + text-decoration: none; } blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #EEE; + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #EEE; } img + br { - display: block; - padding: 4px 0; - content: ' '; + display: block; + padding: 4px 0; + content: ' '; } body p { - margin-bottom: 1em; + margin-bottom: 1em; } iframe { - border: none; + border: none; } img { - max-width: 100%; + max-width: 100%; } -img[data-word-image]{ - cursor: pointer; +img[data-word-image] { + cursor: pointer; } pre { - margin: .5em 0; - padding: .4em .6em; - border-radius: 8px; - background: #f8f8f8; - line-height: 1.5; + margin: .5em 0; + padding: .4em .6em; + border-radius: 8px; + background: #f8f8f8; + line-height: 1.5; } +/*交互操作*/ +img { + cursor: pointer; +} +.edui-quick-operate-active { + background: #E6ECFF; +} diff --git a/public/js/ueditor/third-party/codemirror/codemirror.css b/public/js/ueditor/third-party/codemirror/codemirror.css index 53a6595..3aa09b4 100644 --- a/public/js/ueditor/third-party/codemirror/codemirror.css +++ b/public/js/ueditor/third-party/codemirror/codemirror.css @@ -45,6 +45,7 @@ .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; + line-height: 1.4; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; @@ -59,6 +60,7 @@ position: absolute; visibility: hidden; border-left: 1px solid black; + margin-top: -2px; } .CodeMirror-focused pre.CodeMirror-cursor { visibility: visible; diff --git a/public/js/ueditor/third-party/webuploader/webuploader.css b/public/js/ueditor/third-party/webuploader/webuploader.css index 12f451f..f9d6db2 100644 --- a/public/js/ueditor/third-party/webuploader/webuploader.css +++ b/public/js/ueditor/third-party/webuploader/webuploader.css @@ -1,28 +1,88 @@ +:root { + --webuploader-color-primary: var(--color-primary, #00B7EE); + --webuploader-color-content-bg: var(--color-content-bg, #FFFFFF); +} + .webuploader-container { - position: relative; + position: relative } + .webuploader-element-invisible { - position: absolute !important; - clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ - clip: rect(1px,1px,1px,1px); + position: absolute !important; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px) } + .webuploader-pick { - position: relative; - display: inline-block; - cursor: pointer; - background: #00b7ee; - padding: 10px 15px; - color: #fff; - text-align: center; - border-radius: 3px; - overflow: hidden; + position: relative; + display: block; + cursor: pointer; + padding: 0; + color: #666; + text-align: center; + border-radius: 2px; + overflow: hidden; } + .webuploader-pick-hover { - background: #00a2d4; } .webuploader-pick-disable { - opacity: 0.6; - pointer-events:none; + opacity: .6; + pointer-events: none } +.webuploader-list { + display: block; + margin: 0; + padding: 0; + position: static; + border: 1px solid #EEE; + border-radius: 0.2rem; + padding: 0.2rem; + background-color: var(--webuploader-color-content-bg); +} + +.webuploader-list:empty { + display: none; +} + +.webuploader-list > li { + list-style: none; + display: block; + border: 1px solid #EEE; + padding: 0px; + margin-bottom: 0.1rem; + background: var(--webuploader-color-content-bg); + border-radius: 0.2rem; +} + +.webuploader-list > li .progress-box { + background-color: #EEE; + margin: 2px; + border-radius: 4px; +} + +.webuploader-list > li .progress-box .progress-bar { + height: 3px; + background-color: var(--webuploader-color-primary); + border-radius: 4px; +} + +.webuploader-list > li .progress-info { + font-size: 12px; + line-height: 20px; + width: 100%; + word-wrap: normal; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + color: #999 +} + +.webuploader-list > li .progress-info .status { + display: inline; + line-height: 20px +} + + diff --git a/public/js/ueditor/third-party/webuploader/webuploader.custom.js b/public/js/ueditor/third-party/webuploader/webuploader.custom.js deleted file mode 100644 index 583a0b8..0000000 --- a/public/js/ueditor/third-party/webuploader/webuploader.custom.js +++ /dev/null @@ -1,5670 +0,0 @@ -/*! WebUploader 0.1.2 */ - - -/** - * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。 - * - * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。 - */ -(function( root, factory ) { - var modules = {}, - - // 内部require, 简单不完全实现。 - // https://github.com/amdjs/amdjs-api/wiki/require - _require = function( deps, callback ) { - var args, len, i; - - // 如果deps不是数组,则直接返回指定module - if ( typeof deps === 'string' ) { - return getModule( deps ); - } else { - args = []; - for( len = deps.length, i = 0; i < len; i++ ) { - args.push( getModule( deps[ i ] ) ); - } - - return callback.apply( null, args ); - } - }, - - // 内部define,暂时不支持不指定id. - _define = function( id, deps, factory ) { - if ( arguments.length === 2 ) { - factory = deps; - deps = null; - } - - _require( deps || [], function() { - setModule( id, factory, arguments ); - }); - }, - - // 设置module, 兼容CommonJs写法。 - setModule = function( id, factory, args ) { - var module = { - exports: factory - }, - returned; - - if ( typeof factory === 'function' ) { - args.length || (args = [ _require, module.exports, module ]); - returned = factory.apply( null, args ); - returned !== undefined && (module.exports = returned); - } - - modules[ id ] = module.exports; - }, - - // 根据id获取module - getModule = function( id ) { - var module = modules[ id ] || root[ id ]; - - if ( !module ) { - throw new Error( '`' + id + '` is undefined' ); - } - - return module; - }, - - // 将所有modules,将路径ids装换成对象。 - exportsTo = function( obj ) { - var key, host, parts, part, last, ucFirst; - - // make the first character upper case. - ucFirst = function( str ) { - return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 )); - }; - - for ( key in modules ) { - host = obj; - - if ( !modules.hasOwnProperty( key ) ) { - continue; - } - - parts = key.split('/'); - last = ucFirst( parts.pop() ); - - while( (part = ucFirst( parts.shift() )) ) { - host[ part ] = host[ part ] || {}; - host = host[ part ]; - } - - host[ last ] = modules[ key ]; - } - }, - - exports = factory( root, _define, _require ), - origin; - - // exports every module. - exportsTo( exports ); - - if ( typeof module === 'object' && typeof module.exports === 'object' ) { - - // For CommonJS and CommonJS-like environments where a proper window is present, - module.exports = exports; - } else if ( typeof define === 'function' && define.amd ) { - - // Allow using this built library as an AMD module - // in another project. That other project will only - // see this AMD call, not the internal modules in - // the closure below. - define([], exports ); - } else { - - // Browser globals case. Just assign the - // result to a property on the global. - origin = root.WebUploader; - root.WebUploader = exports; - root.WebUploader.noConflict = function() { - root.WebUploader = origin; - }; - } -})( this, function( window, define, require ) { - - - /** - * @fileOverview jQuery or Zepto - */ - define('dollar-third',[],function() { - return window.jQuery || window.Zepto; - }); - /** - * @fileOverview Dom 操作相关 - */ - define('dollar',[ - 'dollar-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 使用jQuery的Promise - */ - define('promise-third',[ - 'dollar' - ], function( $ ) { - return { - Deferred: $.Deferred, - when: $.when, - - isPromise: function( anything ) { - return anything && typeof anything.then === 'function'; - } - }; - }); - /** - * @fileOverview Promise/A+ - */ - define('promise',[ - 'promise-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 基础类方法。 - */ - - /** - * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。 - * - * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id. - * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: - * - * * module `base`:WebUploader.Base - * * module `file`: WebUploader.File - * * module `lib/dnd`: WebUploader.Lib.Dnd - * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd - * - * - * 以下文档将可能省略`WebUploader`前缀。 - * @module WebUploader - * @title WebUploader API文档 - */ - define('base',[ - 'dollar', - 'promise' - ], function( $, promise ) { - - var noop = function() {}, - call = Function.call; - - // http://jsperf.com/uncurrythis - // 反科里化 - function uncurryThis( fn ) { - return function() { - return call.apply( fn, arguments ); - }; - } - - function bindFn( fn, context ) { - return function() { - return fn.apply( context, arguments ); - }; - } - - function createObject( proto ) { - var f; - - if ( Object.create ) { - return Object.create( proto ); - } else { - f = function() {}; - f.prototype = proto; - return new f(); - } - } - - - /** - * 基础类,提供一些简单常用的方法。 - * @class Base - */ - return { - - /** - * @property {String} version 当前版本号。 - */ - version: '0.1.2', - - /** - * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。 - */ - $: $, - - Deferred: promise.Deferred, - - isPromise: promise.isPromise, - - when: promise.when, - - /** - * @description 简单的浏览器检查结果。 - * - * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。 - * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。 - * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+** - * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。 - * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。 - * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。 - * - * @property {Object} [browser] - */ - browser: (function( ua ) { - var ret = {}, - webkit = ua.match( /WebKit\/([\d.]+)/ ), - chrome = ua.match( /Chrome\/([\d.]+)/ ) || - ua.match( /CriOS\/([\d.]+)/ ), - - ie = ua.match( /MSIE\s([\d\.]+)/ ) || - ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i), - firefox = ua.match( /Firefox\/([\d.]+)/ ), - safari = ua.match( /Safari\/([\d.]+)/ ), - opera = ua.match( /OPR\/([\d.]+)/ ); - - webkit && (ret.webkit = parseFloat( webkit[ 1 ] )); - chrome && (ret.chrome = parseFloat( chrome[ 1 ] )); - ie && (ret.ie = parseFloat( ie[ 1 ] )); - firefox && (ret.firefox = parseFloat( firefox[ 1 ] )); - safari && (ret.safari = parseFloat( safari[ 1 ] )); - opera && (ret.opera = parseFloat( opera[ 1 ] )); - - return ret; - })( navigator.userAgent ), - - /** - * @description 操作系统检查结果。 - * - * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。 - * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。 - * @property {Object} [os] - */ - os: (function( ua ) { - var ret = {}, - - // osx = !!ua.match( /\(Macintosh\; Intel / ), - android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ), - ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ ); - - // osx && (ret.osx = true); - android && (ret.android = parseFloat( android[ 1 ] )); - ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) )); - - return ret; - })( navigator.userAgent ), - - /** - * 实现类与类之间的继承。 - * @method inherits - * @grammar Base.inherits( super ) => child - * @grammar Base.inherits( super, protos ) => child - * @grammar Base.inherits( super, protos, statics ) => child - * @param {Class} super 父类 - * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。 - * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。 - * @param {Object} [statics] 静态属性或方法。 - * @return {Class} 返回子类。 - * @example - * function Person() { - * console.log( 'Super' ); - * } - * Person.prototype.hello = function() { - * console.log( 'hello' ); - * }; - * - * var Manager = Base.inherits( Person, { - * world: function() { - * console.log( 'World' ); - * } - * }); - * - * // 因为没有指定构造器,父类的构造器将会执行。 - * var instance = new Manager(); // => Super - * - * // 继承子父类的方法 - * instance.hello(); // => hello - * instance.world(); // => World - * - * // 子类的__super__属性指向父类 - * console.log( Manager.__super__ === Person ); // => true - */ - inherits: function( Super, protos, staticProtos ) { - var child; - - if ( typeof protos === 'function' ) { - child = protos; - protos = null; - } else if ( protos && protos.hasOwnProperty('constructor') ) { - child = protos.constructor; - } else { - child = function() { - return Super.apply( this, arguments ); - }; - } - - // 复制静态方法 - $.extend( true, child, Super, staticProtos || {} ); - - /* jshint camelcase: false */ - - // 让子类的__super__属性指向父类。 - child.__super__ = Super.prototype; - - // 构建原型,添加原型方法或属性。 - // 暂时用Object.create实现。 - child.prototype = createObject( Super.prototype ); - protos && $.extend( true, child.prototype, protos ); - - return child; - }, - - /** - * 一个不做任何事情的方法。可以用来赋值给默认的callback. - * @method noop - */ - noop: noop, - - /** - * 返回一个新的方法,此方法将已指定的`context`来执行。 - * @grammar Base.bindFn( fn, context ) => Function - * @method bindFn - * @example - * var doSomething = function() { - * console.log( this.name ); - * }, - * obj = { - * name: 'Object Name' - * }, - * aliasFn = Base.bind( doSomething, obj ); - * - * aliasFn(); // => Object Name - * - */ - bindFn: bindFn, - - /** - * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。 - * @grammar Base.log( args... ) => undefined - * @method log - */ - log: (function() { - if ( window.console ) { - return bindFn( console.log, console ); - } - return noop; - })(), - - nextTick: (function() { - - return function( cb ) { - setTimeout( cb, 1 ); - }; - - // @bug 当浏览器不在当前窗口时就停了。 - // var next = window.requestAnimationFrame || - // window.webkitRequestAnimationFrame || - // window.mozRequestAnimationFrame || - // function( cb ) { - // window.setTimeout( cb, 1000 / 60 ); - // }; - - // // fix: Uncaught TypeError: Illegal invocation - // return bindFn( next, window ); - })(), - - /** - * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。 - * 将用来将非数组对象转化成数组对象。 - * @grammar Base.slice( target, start[, end] ) => Array - * @method slice - * @example - * function doSomthing() { - * var args = Base.slice( arguments, 1 ); - * console.log( args ); - * } - * - * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"] - */ - slice: uncurryThis( [].slice ), - - /** - * 生成唯一的ID - * @method guid - * @grammar Base.guid() => String - * @grammar Base.guid( prefx ) => String - */ - guid: (function() { - var counter = 0; - - return function( prefix ) { - var guid = (+new Date()).toString( 32 ), - i = 0; - - for ( ; i < 5; i++ ) { - guid += Math.floor( Math.random() * 65535 ).toString( 32 ); - } - - return (prefix || 'wu_') + guid + (counter++).toString( 32 ); - }; - })(), - - /** - * 格式化文件大小, 输出成带单位的字符串 - * @method formatSize - * @grammar Base.formatSize( size ) => String - * @grammar Base.formatSize( size, pointLength ) => String - * @grammar Base.formatSize( size, pointLength, units ) => String - * @param {Number} size 文件大小 - * @param {Number} [pointLength=2] 精确到的小数点数。 - * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. - * @example - * console.log( Base.formatSize( 100 ) ); // => 100B - * console.log( Base.formatSize( 1024 ) ); // => 1.00K - * console.log( Base.formatSize( 1024, 0 ) ); // => 1K - * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M - * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G - * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB - */ - formatSize: function( size, pointLength, units ) { - var unit; - - units = units || [ 'B', 'K', 'M', 'G', 'TB' ]; - - while ( (unit = units.shift()) && size > 1024 ) { - size = size / 1024; - } - - return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) + - unit; - } - }; - }); - /** - * 事件处理类,可以独立使用,也可以扩展给对象使用。 - * @fileOverview Mediator - */ - define('mediator',[ - 'base' - ], function( Base ) { - var $ = Base.$, - slice = [].slice, - separator = /\s+/, - protos; - - // 根据条件过滤出事件handlers. - function findHandlers( arr, name, callback, context ) { - return $.grep( arr, function( handler ) { - return handler && - (!name || handler.e === name) && - (!callback || handler.cb === callback || - handler.cb._cb === callback) && - (!context || handler.ctx === context); - }); - } - - function eachEvent( events, callback, iterator ) { - // 不支持对象,只支持多个event用空格隔开 - $.each( (events || '').split( separator ), function( _, key ) { - iterator( key, callback ); - }); - } - - function triggerHanders( events, args ) { - var stoped = false, - i = -1, - len = events.length, - handler; - - while ( ++i < len ) { - handler = events[ i ]; - - if ( handler.cb.apply( handler.ctx2, args ) === false ) { - stoped = true; - break; - } - } - - return !stoped; - } - - protos = { - - /** - * 绑定事件。 - * - * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如 - * ```javascript - * var obj = {}; - * - * // 使得obj有事件行为 - * Mediator.installTo( obj ); - * - * obj.on( 'testa', function( arg1, arg2 ) { - * console.log( arg1, arg2 ); // => 'arg1', 'arg2' - * }); - * - * obj.trigger( 'testa', 'arg1', 'arg2' ); - * ``` - * - * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。 - * 切会影响到`trigger`方法的返回值,为`false`。 - * - * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处, - * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。 - * ```javascript - * obj.on( 'all', function( type, arg1, arg2 ) { - * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2' - * }); - * ``` - * - * @method on - * @grammar on( name, callback[, context] ) => self - * @param {String} name 事件名,支持多个事件用空格隔开 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - * @class Mediator - */ - on: function( name, callback, context ) { - var me = this, - set; - - if ( !callback ) { - return this; - } - - set = this._events || (this._events = []); - - eachEvent( name, callback, function( name, callback ) { - var handler = { e: name }; - - handler.cb = callback; - handler.ctx = context; - handler.ctx2 = context || me; - handler.id = set.length; - - set.push( handler ); - }); - - return this; - }, - - /** - * 绑定事件,且当handler执行完后,自动解除绑定。 - * @method once - * @grammar once( name, callback[, context] ) => self - * @param {String} name 事件名 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - once: function( name, callback, context ) { - var me = this; - - if ( !callback ) { - return me; - } - - eachEvent( name, callback, function( name, callback ) { - var once = function() { - me.off( name, once ); - return callback.apply( context || me, arguments ); - }; - - once._cb = callback; - me.on( name, once, context ); - }); - - return me; - }, - - /** - * 解除事件绑定 - * @method off - * @grammar off( [name[, callback[, context] ] ] ) => self - * @param {String} [name] 事件名 - * @param {Function} [callback] 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - off: function( name, cb, ctx ) { - var events = this._events; - - if ( !events ) { - return this; - } - - if ( !name && !cb && !ctx ) { - this._events = []; - return this; - } - - eachEvent( name, cb, function( name, cb ) { - $.each( findHandlers( events, name, cb, ctx ), function() { - delete events[ this.id ]; - }); - }); - - return this; - }, - - /** - * 触发事件 - * @method trigger - * @grammar trigger( name[, args...] ) => self - * @param {String} type 事件名 - * @param {*} [...] 任意参数 - * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true - */ - trigger: function( type ) { - var args, events, allEvents; - - if ( !this._events || !type ) { - return this; - } - - args = slice.call( arguments, 1 ); - events = findHandlers( this._events, type ); - allEvents = findHandlers( this._events, 'all' ); - - return triggerHanders( events, args ) && - triggerHanders( allEvents, arguments ); - } - }; - - /** - * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。 - * 主要目的是负责模块与模块之间的合作,降低耦合度。 - * - * @class Mediator - */ - return $.extend({ - - /** - * 可以通过这个接口,使任何对象具备事件功能。 - * @method installTo - * @param {Object} obj 需要具备事件行为的对象。 - * @return {Object} 返回obj. - */ - installTo: function( obj ) { - return $.extend( obj, protos ); - } - - }, protos ); - }); - /** - * @fileOverview Uploader上传类 - */ - define('uploader',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$; - - /** - * 上传入口类。 - * @class Uploader - * @constructor - * @grammar new Uploader( opts ) => Uploader - * @example - * var uploader = WebUploader.Uploader({ - * swf: 'path_of_swf/Uploader.swf', - * - * // 开起分片上传。 - * chunked: true - * }); - */ - function Uploader( opts ) { - this.options = $.extend( true, {}, Uploader.options, opts ); - this._init( this.options ); - } - - // default Options - // widgets中有相应扩展 - Uploader.options = {}; - Mediator.installTo( Uploader.prototype ); - - // 批量添加纯命令式方法。 - $.each({ - upload: 'start-upload', - stop: 'stop-upload', - getFile: 'get-file', - getFiles: 'get-files', - addFile: 'add-file', - addFiles: 'add-file', - sort: 'sort-files', - removeFile: 'remove-file', - skipFile: 'skip-file', - retry: 'retry', - isInProgress: 'is-in-progress', - makeThumb: 'make-thumb', - getDimension: 'get-dimension', - addButton: 'add-btn', - getRuntimeType: 'get-runtime-type', - refresh: 'refresh', - disable: 'disable', - enable: 'enable', - reset: 'reset' - }, function( fn, command ) { - Uploader.prototype[ fn ] = function() { - return this.request( command, arguments ); - }; - }); - - $.extend( Uploader.prototype, { - state: 'pending', - - _init: function( opts ) { - var me = this; - - me.request( 'init', opts, function() { - me.state = 'ready'; - me.trigger('ready'); - }); - }, - - /** - * 获取或者设置Uploader配置项。 - * @method option - * @grammar option( key ) => * - * @grammar option( key, val ) => self - * @example - * - * // 初始状态图片上传前不会压缩 - * var uploader = new WebUploader.Uploader({ - * resize: null; - * }); - * - * // 修改后图片上传前,尝试将图片压缩到1600 * 1600 - * uploader.options( 'resize', { - * width: 1600, - * height: 1600 - * }); - */ - option: function( key, val ) { - var opts = this.options; - - // setter - if ( arguments.length > 1 ) { - - if ( $.isPlainObject( val ) && - $.isPlainObject( opts[ key ] ) ) { - $.extend( opts[ key ], val ); - } else { - opts[ key ] = val; - } - - } else { // getter - return key ? opts[ key ] : opts; - } - }, - - /** - * 获取文件统计信息。返回一个包含一下信息的对象。 - * * `successNum` 上传成功的文件数 - * * `uploadFailNum` 上传失败的文件数 - * * `cancelNum` 被删除的文件数 - * * `invalidNum` 无效的文件数 - * * `queueNum` 还在队列中的文件数 - * @method getStats - * @grammar getStats() => Object - */ - getStats: function() { - // return this._mgr.getStats.apply( this._mgr, arguments ); - var stats = this.request('get-stats'); - - return { - successNum: stats.numOfSuccess, - - // who care? - // queueFailNum: 0, - cancelNum: stats.numOfCancel, - invalidNum: stats.numOfInvalid, - uploadFailNum: stats.numOfUploadFailed, - queueNum: stats.numOfQueue - }; - }, - - // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器 - trigger: function( type/*, args...*/ ) { - var args = [].slice.call( arguments, 1 ), - opts = this.options, - name = 'on' + type.substring( 0, 1 ).toUpperCase() + - type.substring( 1 ); - - if ( - // 调用通过on方法注册的handler. - Mediator.trigger.apply( this, arguments ) === false || - - // 调用opts.onEvent - $.isFunction( opts[ name ] ) && - opts[ name ].apply( this, args ) === false || - - // 调用this.onEvent - $.isFunction( this[ name ] ) && - this[ name ].apply( this, args ) === false || - - // 广播所有uploader的事件。 - Mediator.trigger.apply( Mediator, - [ this, type ].concat( args ) ) === false ) { - - return false; - } - - return true; - }, - - // widgets/widget.js将补充此方法的详细文档。 - request: Base.noop - }); - - /** - * 创建Uploader实例,等同于new Uploader( opts ); - * @method create - * @class Base - * @static - * @grammar Base.create( opts ) => Uploader - */ - Base.create = Uploader.create = function( opts ) { - return new Uploader( opts ); - }; - - // 暴露Uploader,可以通过它来扩展业务逻辑。 - Base.Uploader = Uploader; - - return Uploader; - }); - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/runtime',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - factories = {}, - - // 获取对象的第一个key - getFirstKey = function( obj ) { - for ( var key in obj ) { - if ( obj.hasOwnProperty( key ) ) { - return key; - } - } - return null; - }; - - // 接口类。 - function Runtime( options ) { - this.options = $.extend({ - container: document.body - }, options ); - this.uid = Base.guid('rt_'); - } - - $.extend( Runtime.prototype, { - - getContainer: function() { - var opts = this.options, - parent, container; - - if ( this._container ) { - return this._container; - } - - parent = $( opts.container || document.body ); - container = $( document.createElement('div') ); - - container.attr( 'id', 'rt_' + this.uid ); - container.css({ - position: 'absolute', - top: '0px', - left: '0px', - width: '1px', - height: '1px', - overflow: 'hidden' - }); - - parent.append( container ); - parent.addClass('webuploader-container'); - this._container = container; - return container; - }, - - init: Base.noop, - exec: Base.noop, - - destroy: function() { - if ( this._container ) { - this._container.parentNode.removeChild( this.__container ); - } - - this.off(); - } - }); - - Runtime.orders = 'html5,flash'; - - - /** - * 添加Runtime实现。 - * @param {String} type 类型 - * @param {Runtime} factory 具体Runtime实现。 - */ - Runtime.addRuntime = function( type, factory ) { - factories[ type ] = factory; - }; - - Runtime.hasRuntime = function( type ) { - return !!(type ? factories[ type ] : getFirstKey( factories )); - }; - - Runtime.create = function( opts, orders ) { - var type, runtime; - - orders = orders || Runtime.orders; - $.each( orders.split( /\s*,\s*/g ), function() { - if ( factories[ this ] ) { - type = this; - return false; - } - }); - - type = type || getFirstKey( factories ); - - if ( !type ) { - throw new Error('Runtime Error'); - } - - runtime = new factories[ type ]( opts ); - return runtime; - }; - - Mediator.installTo( Runtime.prototype ); - return Runtime; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/client',[ - 'base', - 'mediator', - 'runtime/runtime' - ], function( Base, Mediator, Runtime ) { - - var cache; - - cache = (function() { - var obj = {}; - - return { - add: function( runtime ) { - obj[ runtime.uid ] = runtime; - }, - - get: function( ruid, standalone ) { - var i; - - if ( ruid ) { - return obj[ ruid ]; - } - - for ( i in obj ) { - // 有些类型不能重用,比如filepicker. - if ( standalone && obj[ i ].__standalone ) { - continue; - } - - return obj[ i ]; - } - - return null; - }, - - remove: function( runtime ) { - delete obj[ runtime.uid ]; - } - }; - })(); - - function RuntimeClient( component, standalone ) { - var deferred = Base.Deferred(), - runtime; - - this.uid = Base.guid('client_'); - - // 允许runtime没有初始化之前,注册一些方法在初始化后执行。 - this.runtimeReady = function( cb ) { - return deferred.done( cb ); - }; - - this.connectRuntime = function( opts, cb ) { - - // already connected. - if ( runtime ) { - throw new Error('already connected!'); - } - - deferred.done( cb ); - - if ( typeof opts === 'string' && cache.get( opts ) ) { - runtime = cache.get( opts ); - } - - // 像filePicker只能独立存在,不能公用。 - runtime = runtime || cache.get( null, standalone ); - - // 需要创建 - if ( !runtime ) { - runtime = Runtime.create( opts, opts.runtimeOrder ); - runtime.__promise = deferred.promise(); - runtime.once( 'ready', deferred.resolve ); - runtime.init(); - cache.add( runtime ); - runtime.__client = 1; - } else { - // 来自cache - Base.$.extend( runtime.options, opts ); - runtime.__promise.then( deferred.resolve ); - runtime.__client++; - } - - standalone && (runtime.__standalone = standalone); - return runtime; - }; - - this.getRuntime = function() { - return runtime; - }; - - this.disconnectRuntime = function() { - if ( !runtime ) { - return; - } - - runtime.__client--; - - if ( runtime.__client <= 0 ) { - cache.remove( runtime ); - delete runtime.__promise; - runtime.destroy(); - } - - runtime = null; - }; - - this.exec = function() { - if ( !runtime ) { - return; - } - - var args = Base.slice( arguments ); - component && args.unshift( component ); - - return runtime.exec.apply( this, args ); - }; - - this.getRuid = function() { - return runtime && runtime.uid; - }; - - this.destroy = (function( destroy ) { - return function() { - destroy && destroy.apply( this, arguments ); - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }; - })( this.destroy ); - } - - Mediator.installTo( RuntimeClient.prototype ); - return RuntimeClient; - }); - /** - * @fileOverview Blob - */ - define('lib/blob',[ - 'base', - 'runtime/client' - ], function( Base, RuntimeClient ) { - - function Blob( ruid, source ) { - var me = this; - - me.source = source; - me.ruid = ruid; - - RuntimeClient.call( me, 'Blob' ); - - this.uid = source.uid || this.uid; - this.type = source.type || ''; - this.size = source.size || 0; - - if ( ruid ) { - me.connectRuntime( ruid ); - } - } - - Base.inherits( RuntimeClient, { - constructor: Blob, - - slice: function( start, end ) { - return this.exec( 'slice', start, end ); - }, - - getSource: function() { - return this.source; - } - }); - - return Blob; - }); - /** - * 为了统一化Flash的File和HTML5的File而存在。 - * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。 - * @fileOverview File - */ - define('lib/file',[ - 'base', - 'lib/blob' - ], function( Base, Blob ) { - - var uid = 1, - rExt = /\.([^.]+)$/; - - function File( ruid, file ) { - var ext; - - Blob.apply( this, arguments ); - this.name = file.name || ('untitled' + uid++); - ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : ''; - - // todo 支持其他类型文件的转换。 - - // 如果有mimetype, 但是文件名里面没有找出后缀规律 - if ( !ext && this.type ) { - ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ? - RegExp.$1.toLowerCase() : ''; - this.name += '.' + ext; - } - - // 如果没有指定mimetype, 但是知道文件后缀。 - if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) { - this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext); - } - - this.ext = ext; - this.lastModifiedDate = file.lastModifiedDate || - (new Date()).toLocaleString(); - } - - return Base.inherits( Blob, File ); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepicker',[ - 'base', - 'runtime/client', - 'lib/file' - ], function( Base, RuntimeClent, File ) { - - var $ = Base.$; - - function FilePicker( opts ) { - opts = this.options = $.extend({}, FilePicker.options, opts ); - - opts.container = $( opts.id ); - - if ( !opts.container.length ) { - throw new Error('按钮指定错误'); - } - - opts.innerHTML = opts.innerHTML || opts.label || - opts.container.html() || ''; - - opts.button = $( opts.button || document.createElement('div') ); - opts.button.html( opts.innerHTML ); - opts.container.html( opts.button ); - - RuntimeClent.call( this, 'FilePicker', true ); - } - - FilePicker.options = { - button: null, - container: null, - label: null, - innerHTML: null, - multiple: true, - accept: null, - name: 'file' - }; - - Base.inherits( RuntimeClent, { - constructor: FilePicker, - - init: function() { - var me = this, - opts = me.options, - button = opts.button; - - button.addClass('webuploader-pick'); - - me.on( 'all', function( type ) { - var files; - - switch ( type ) { - case 'mouseenter': - button.addClass('webuploader-pick-hover'); - break; - - case 'mouseleave': - button.removeClass('webuploader-pick-hover'); - break; - - case 'change': - files = me.exec('getFiles'); - me.trigger( 'select', $.map( files, function( file ) { - file = new File( me.getRuid(), file ); - - // 记录来源。 - file._refer = opts.container; - return file; - }), opts.container ); - break; - } - }); - - me.connectRuntime( opts, function() { - me.refresh(); - me.exec( 'init', opts ); - me.trigger('ready'); - }); - - $( window ).on( 'resize', function() { - me.refresh(); - }); - }, - - refresh: function() { - var shimContainer = this.getRuntime().getContainer(), - button = this.options.button, - width = button.outerWidth ? - button.outerWidth() : button.width(), - - height = button.outerHeight ? - button.outerHeight() : button.height(), - - pos = button.offset(); - - width && height && shimContainer.css({ - bottom: 'auto', - right: 'auto', - width: width + 'px', - height: height + 'px' - }).offset( pos ); - }, - - enable: function() { - var btn = this.options.button; - - btn.removeClass('webuploader-pick-disable'); - this.refresh(); - }, - - disable: function() { - var btn = this.options.button; - - this.getRuntime().getContainer().css({ - top: '-99999px' - }); - - btn.addClass('webuploader-pick-disable'); - }, - - destroy: function() { - if ( this.runtime ) { - this.exec('destroy'); - this.disconnectRuntime(); - } - } - }); - - return FilePicker; - }); - - /** - * @fileOverview 组件基类。 - */ - define('widgets/widget',[ - 'base', - 'uploader' - ], function( Base, Uploader ) { - - var $ = Base.$, - _init = Uploader.prototype._init, - IGNORE = {}, - widgetClass = []; - - function isArrayLike( obj ) { - if ( !obj ) { - return false; - } - - var length = obj.length, - type = $.type( obj ); - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === 'array' || type !== 'function' && type !== 'string' && - (length === 0 || typeof length === 'number' && length > 0 && - (length - 1) in obj); - } - - function Widget( uploader ) { - this.owner = uploader; - this.options = uploader.options; - } - - $.extend( Widget.prototype, { - - init: Base.noop, - - // 类Backbone的事件监听声明,监听uploader实例上的事件 - // widget直接无法监听事件,事件只能通过uploader来传递 - invoke: function( apiName, args ) { - - /* - { - 'make-thumb': 'makeThumb' - } - */ - var map = this.responseMap; - - // 如果无API响应声明则忽略 - if ( !map || !(apiName in map) || !(map[ apiName ] in this) || - !$.isFunction( this[ map[ apiName ] ] ) ) { - - return IGNORE; - } - - return this[ map[ apiName ] ].apply( this, args ); - - }, - - /** - * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。 - * @method request - * @grammar request( command, args ) => * | Promise - * @grammar request( command, args, callback ) => Promise - * @for Uploader - */ - request: function() { - return this.owner.request.apply( this.owner, arguments ); - } - }); - - // 扩展Uploader. - $.extend( Uploader.prototype, { - - // 覆写_init用来初始化widgets - _init: function() { - var me = this, - widgets = me._widgets = []; - - $.each( widgetClass, function( _, klass ) { - widgets.push( new klass( me ) ); - }); - - return _init.apply( me, arguments ); - }, - - request: function( apiName, args, callback ) { - var i = 0, - widgets = this._widgets, - len = widgets.length, - rlts = [], - dfds = [], - widget, rlt, promise, key; - - args = isArrayLike( args ) ? args : [ args ]; - - for ( ; i < len; i++ ) { - widget = widgets[ i ]; - rlt = widget.invoke( apiName, args ); - - if ( rlt !== IGNORE ) { - - // Deferred对象 - if ( Base.isPromise( rlt ) ) { - dfds.push( rlt ); - } else { - rlts.push( rlt ); - } - } - } - - // 如果有callback,则用异步方式。 - if ( callback || dfds.length ) { - promise = Base.when.apply( Base, dfds ); - key = promise.pipe ? 'pipe' : 'then'; - - // 很重要不能删除。删除了会死循环。 - // 保证执行顺序。让callback总是在下一个tick中执行。 - return promise[ key ](function() { - var deferred = Base.Deferred(), - args = arguments; - - setTimeout(function() { - deferred.resolve.apply( deferred, args ); - }, 1 ); - - return deferred.promise(); - })[ key ]( callback || Base.noop ); - } else { - return rlts[ 0 ]; - } - } - }); - - /** - * 添加组件 - * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义 - * @param {object} responseMap API名称与函数实现的映射 - * @example - * Uploader.register( { - * init: function( options ) {}, - * makeThumb: function() {} - * }, { - * 'make-thumb': 'makeThumb' - * } ); - */ - Uploader.register = Widget.register = function( responseMap, widgetProto ) { - var map = { init: 'init' }, - klass; - - if ( arguments.length === 1 ) { - widgetProto = responseMap; - widgetProto.responseMap = map; - } else { - widgetProto.responseMap = $.extend( map, responseMap ); - } - - klass = Base.inherits( Widget, widgetProto ); - widgetClass.push( klass ); - - return klass; - }; - - return Widget; - }); - /** - * @fileOverview 文件选择相关 - */ - define('widgets/filepicker',[ - 'base', - 'uploader', - 'lib/filepicker', - 'widgets/widget' - ], function( Base, Uploader, FilePicker ) { - var $ = Base.$; - - $.extend( Uploader.options, { - - /** - * @property {Selector | Object} [pick=undefined] - * @namespace options - * @for Uploader - * @description 指定选择文件的按钮容器,不指定则不创建按钮。 - * - * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。 - * * `label` {String} 请采用 `innerHTML` 代替 - * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。 - * * `multiple` {Boolean} 是否开起同时选择多个文件能力。 - */ - pick: null, - - /** - * @property {Arroy} [accept=null] - * @namespace options - * @for Uploader - * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。 - * - * * `title` {String} 文字描述 - * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。 - * * `mimeTypes` {String} 多个用逗号分割。 - * - * 如: - * - * ``` - * { - * title: 'Images', - * extensions: 'gif,jpg,jpeg,bmp,png', - * mimeTypes: 'image/*' - * } - * ``` - */ - accept: null/*{ - title: 'Images', - extensions: 'gif,jpg,jpeg,bmp,png', - mimeTypes: 'image/*' - }*/ - }); - - return Uploader.register({ - 'add-btn': 'addButton', - refresh: 'refresh', - disable: 'disable', - enable: 'enable' - }, { - - init: function( opts ) { - this.pickers = []; - return opts.pick && this.addButton( opts.pick ); - }, - - refresh: function() { - $.each( this.pickers, function() { - this.refresh(); - }); - }, - - /** - * @method addButton - * @for Uploader - * @grammar addButton( pick ) => Promise - * @description - * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。 - * @example - * uploader.addButton({ - * id: '#btnContainer', - * innerHTML: '选择文件' - * }); - */ - addButton: function( pick ) { - var me = this, - opts = me.options, - accept = opts.accept, - options, picker, deferred; - - if ( !pick ) { - return; - } - - deferred = Base.Deferred(); - $.isPlainObject( pick ) || (pick = { - id: pick - }); - - options = $.extend({}, pick, { - accept: $.isPlainObject( accept ) ? [ accept ] : accept, - swf: opts.swf, - runtimeOrder: opts.runtimeOrder - }); - - picker = new FilePicker( options ); - - picker.once( 'ready', deferred.resolve ); - picker.on( 'select', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - picker.init(); - - this.pickers.push( picker ); - - return deferred.promise(); - }, - - disable: function() { - $.each( this.pickers, function() { - this.disable(); - }); - }, - - enable: function() { - $.each( this.pickers, function() { - this.enable(); - }); - } - }); - }); - /** - * @fileOverview Image - */ - define('lib/image',[ - 'base', - 'runtime/client', - 'lib/blob' - ], function( Base, RuntimeClient, Blob ) { - var $ = Base.$; - - // 构造器。 - function Image( opts ) { - this.options = $.extend({}, Image.options, opts ); - RuntimeClient.call( this, 'Image' ); - - this.on( 'load', function() { - this._info = this.exec('info'); - this._meta = this.exec('meta'); - }); - } - - // 默认选项。 - Image.options = { - - // 默认的图片处理质量 - quality: 90, - - // 是否裁剪 - crop: false, - - // 是否保留头部信息 - preserveHeaders: true, - - // 是否允许放大。 - allowMagnify: true - }; - - // 继承RuntimeClient. - Base.inherits( RuntimeClient, { - constructor: Image, - - info: function( val ) { - - // setter - if ( val ) { - this._info = val; - return this; - } - - // getter - return this._info; - }, - - meta: function( val ) { - - // setter - if ( val ) { - this._meta = val; - return this; - } - - // getter - return this._meta; - }, - - loadFromBlob: function( blob ) { - var me = this, - ruid = blob.getRuid(); - - this.connectRuntime( ruid, function() { - me.exec( 'init', me.options ); - me.exec( 'loadFromBlob', blob ); - }); - }, - - resize: function() { - var args = Base.slice( arguments ); - return this.exec.apply( this, [ 'resize' ].concat( args ) ); - }, - - getAsDataUrl: function( type ) { - return this.exec( 'getAsDataUrl', type ); - }, - - getAsBlob: function( type ) { - var blob = this.exec( 'getAsBlob', type ); - - return new Blob( this.getRuid(), blob ); - } - }); - - return Image; - }); - /** - * @fileOverview 图片操作, 负责预览图片和上传前压缩图片 - */ - define('widgets/image',[ - 'base', - 'uploader', - 'lib/image', - 'widgets/widget' - ], function( Base, Uploader, Image ) { - - var $ = Base.$, - throttle; - - // 根据要处理的文件大小来节流,一次不能处理太多,会卡。 - throttle = (function( max ) { - var occupied = 0, - waiting = [], - tick = function() { - var item; - - while ( waiting.length && occupied < max ) { - item = waiting.shift(); - occupied += item[ 0 ]; - item[ 1 ](); - } - }; - - return function( emiter, size, cb ) { - waiting.push([ size, cb ]); - emiter.once( 'destroy', function() { - occupied -= size; - setTimeout( tick, 1 ); - }); - setTimeout( tick, 1 ); - }; - })( 5 * 1024 * 1024 ); - - $.extend( Uploader.options, { - - /** - * @property {Object} [thumb] - * @namespace options - * @for Uploader - * @description 配置生成缩略图的选项。 - * - * 默认为: - * - * ```javascript - * { - * width: 110, - * height: 110, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 70, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: true, - * - * // 是否允许裁剪。 - * crop: true, - * - * // 是否保留头部meta信息。 - * preserveHeaders: false, - * - * // 为空的话则保留原有图片格式。 - * // 否则强制转换成指定的类型。 - * type: 'image/jpeg' - * } - * ``` - */ - thumb: { - width: 110, - height: 110, - quality: 70, - allowMagnify: true, - crop: true, - preserveHeaders: false, - - // 为空的话则保留原有图片格式。 - // 否则强制转换成指定的类型。 - // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可 - // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg - type: 'image/jpeg' - }, - - /** - * @property {Object} [compress] - * @namespace options - * @for Uploader - * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。 - * - * 默认为: - * - * ```javascript - * { - * width: 1600, - * height: 1600, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 90, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: false, - * - * // 是否允许裁剪。 - * crop: false, - * - * // 是否保留头部meta信息。 - * preserveHeaders: true - * } - * ``` - */ - compress: { - width: 1600, - height: 1600, - quality: 90, - allowMagnify: false, - crop: false, - preserveHeaders: true - } - }); - - return Uploader.register({ - 'make-thumb': 'makeThumb', - 'before-send-file': 'compressImage' - }, { - - - /** - * 生成缩略图,此过程为异步,所以需要传入`callback`。 - * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。 - * - * `callback`中可以接收到两个参数。 - * * 第一个为error,如果生成缩略图有错误,此error将为真。 - * * 第二个为ret, 缩略图的Data URL值。 - * - * **注意** - * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。 - * - * - * @method makeThumb - * @grammar makeThumb( file, callback ) => undefined - * @grammar makeThumb( file, callback, width, height ) => undefined - * @for Uploader - * @example - * - * uploader.on( 'fileQueued', function( file ) { - * var $li = ...; - * - * uploader.makeThumb( file, function( error, ret ) { - * if ( error ) { - * $li.text('预览错误'); - * } else { - * $li.append(''); - * } - * }); - * - * }); - */ - makeThumb: function( file, cb, width, height ) { - var opts, image; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !file.type.match( /^image/ ) ) { - cb( true ); - return; - } - - opts = $.extend({}, this.options.thumb ); - - // 如果传入的是object. - if ( $.isPlainObject( width ) ) { - opts = $.extend( opts, width ); - width = null; - } - - width = width || opts.width; - height = height || opts.height; - - image = new Image( opts ); - - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( width, height ); - }); - - image.once( 'complete', function() { - cb( false, image.getAsDataUrl( opts.type ) ); - image.destroy(); - }); - - image.once( 'error', function() { - cb( true ); - image.destroy(); - }); - - throttle( image, file.source.size, function() { - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - image.loadFromBlob( file.source ); - }); - }, - - compressImage: function( file ) { - var opts = this.options.compress || this.options.resize, - compressSize = opts && opts.compressSize || 300 * 1024, - image, deferred; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) || - file.size < compressSize || - file._compressed ) { - return; - } - - opts = $.extend({}, opts ); - deferred = Base.Deferred(); - - image = new Image( opts ); - - deferred.always(function() { - image.destroy(); - image = null; - }); - image.once( 'error', deferred.reject ); - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( opts.width, opts.height ); - }); - - image.once( 'complete', function() { - var blob, size; - - // 移动端 UC / qq 浏览器的无图模式下 - // ctx.getImageData 处理大图的时候会报 Exception - // INDEX_SIZE_ERR: DOM Exception 1 - try { - blob = image.getAsBlob( opts.type ); - - size = file.size; - - // 如果压缩后,比原来还大则不用压缩后的。 - if ( blob.size < size ) { - // file.source.destroy && file.source.destroy(); - file.source = blob; - file.size = blob.size; - - file.trigger( 'resize', blob.size, size ); - } - - // 标记,避免重复压缩。 - file._compressed = true; - deferred.resolve(); - } catch ( e ) { - // 出错了直接继续,让其上传原始图片 - deferred.resolve(); - } - }); - - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - - image.loadFromBlob( file.source ); - return deferred.promise(); - } - }); - }); - /** - * @fileOverview 文件属性封装 - */ - define('file',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - idPrefix = 'WU_FILE_', - idSuffix = 0, - rExt = /\.([^.]+)$/, - statusMap = {}; - - function gid() { - return idPrefix + idSuffix++; - } - - /** - * 文件类 - * @class File - * @constructor 构造函数 - * @grammar new File( source ) => File - * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。 - */ - function WUFile( source ) { - - /** - * 文件名,包括扩展名(后缀) - * @property name - * @type {string} - */ - this.name = source.name || 'Untitled'; - - /** - * 文件体积(字节) - * @property size - * @type {uint} - * @default 0 - */ - this.size = source.size || 0; - - /** - * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny) - * @property type - * @type {string} - * @default 'application' - */ - this.type = source.type || 'application'; - - /** - * 文件最后修改日期 - * @property lastModifiedDate - * @type {int} - * @default 当前时间戳 - */ - this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1); - - /** - * 文件ID,每个对象具有唯一ID,与文件名无关 - * @property id - * @type {string} - */ - this.id = gid(); - - /** - * 文件扩展名,通过文件名获取,例如test.png的扩展名为png - * @property ext - * @type {string} - */ - this.ext = rExt.exec( this.name ) ? RegExp.$1 : ''; - - - /** - * 状态文字说明。在不同的status语境下有不同的用途。 - * @property statusText - * @type {string} - */ - this.statusText = ''; - - // 存储文件状态,防止通过属性直接修改 - statusMap[ this.id ] = WUFile.Status.INITED; - - this.source = source; - this.loaded = 0; - - this.on( 'error', function( msg ) { - this.setStatus( WUFile.Status.ERROR, msg ); - }); - } - - $.extend( WUFile.prototype, { - - /** - * 设置状态,状态变化时会触发`change`事件。 - * @method setStatus - * @grammar setStatus( status[, statusText] ); - * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status) - * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。 - */ - setStatus: function( status, text ) { - - var prevStatus = statusMap[ this.id ]; - - typeof text !== 'undefined' && (this.statusText = text); - - if ( status !== prevStatus ) { - statusMap[ this.id ] = status; - /** - * 文件状态变化 - * @event statuschange - */ - this.trigger( 'statuschange', status, prevStatus ); - } - - }, - - /** - * 获取文件状态 - * @return {File.Status} - * @example - 文件状态具体包括以下几种类型: - { - // 初始化 - INITED: 0, - // 已入队列 - QUEUED: 1, - // 正在上传 - PROGRESS: 2, - // 上传出错 - ERROR: 3, - // 上传成功 - COMPLETE: 4, - // 上传取消 - CANCELLED: 5 - } - */ - getStatus: function() { - return statusMap[ this.id ]; - }, - - /** - * 获取文件原始信息。 - * @return {*} - */ - getSource: function() { - return this.source; - }, - - destory: function() { - delete statusMap[ this.id ]; - } - }); - - Mediator.installTo( WUFile.prototype ); - - /** - * 文件状态值,具体包括以下几种类型: - * * `inited` 初始状态 - * * `queued` 已经进入队列, 等待上传 - * * `progress` 上传中 - * * `complete` 上传完成。 - * * `error` 上传出错,可重试 - * * `interrupt` 上传中断,可续传。 - * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。 - * * `cancelled` 文件被移除。 - * @property {Object} Status - * @namespace File - * @class File - * @static - */ - WUFile.Status = { - INITED: 'inited', // 初始状态 - QUEUED: 'queued', // 已经进入队列, 等待上传 - PROGRESS: 'progress', // 上传中 - ERROR: 'error', // 上传出错,可重试 - COMPLETE: 'complete', // 上传完成。 - CANCELLED: 'cancelled', // 上传取消。 - INTERRUPT: 'interrupt', // 上传中断,可续传。 - INVALID: 'invalid' // 文件不合格,不能重试上传。 - }; - - return WUFile; - }); - - /** - * @fileOverview 文件队列 - */ - define('queue',[ - 'base', - 'mediator', - 'file' - ], function( Base, Mediator, WUFile ) { - - var $ = Base.$, - STATUS = WUFile.Status; - - /** - * 文件队列, 用来存储各个状态中的文件。 - * @class Queue - * @extends Mediator - */ - function Queue() { - - /** - * 统计文件数。 - * * `numOfQueue` 队列中的文件数。 - * * `numOfSuccess` 上传成功的文件数 - * * `numOfCancel` 被移除的文件数 - * * `numOfProgress` 正在上传中的文件数 - * * `numOfUploadFailed` 上传错误的文件数。 - * * `numOfInvalid` 无效的文件数。 - * @property {Object} stats - */ - this.stats = { - numOfQueue: 0, - numOfSuccess: 0, - numOfCancel: 0, - numOfProgress: 0, - numOfUploadFailed: 0, - numOfInvalid: 0 - }; - - // 上传队列,仅包括等待上传的文件 - this._queue = []; - - // 存储所有文件 - this._map = {}; - } - - $.extend( Queue.prototype, { - - /** - * 将新文件加入对队列尾部 - * - * @method append - * @param {File} file 文件对象 - */ - append: function( file ) { - this._queue.push( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 将新文件加入对队列头部 - * - * @method prepend - * @param {File} file 文件对象 - */ - prepend: function( file ) { - this._queue.unshift( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 获取文件对象 - * - * @method getFile - * @param {String} fileId 文件ID - * @return {File} - */ - getFile: function( fileId ) { - if ( typeof fileId !== 'string' ) { - return fileId; - } - return this._map[ fileId ]; - }, - - /** - * 从队列中取出一个指定状态的文件。 - * @grammar fetch( status ) => File - * @method fetch - * @param {String} status [文件状态值](#WebUploader:File:File.Status) - * @return {File} [File](#WebUploader:File) - */ - fetch: function( status ) { - var len = this._queue.length, - i, file; - - status = status || STATUS.QUEUED; - - for ( i = 0; i < len; i++ ) { - file = this._queue[ i ]; - - if ( status === file.getStatus() ) { - return file; - } - } - - return null; - }, - - /** - * 对队列进行排序,能够控制文件上传顺序。 - * @grammar sort( fn ) => undefined - * @method sort - * @param {Function} fn 排序方法 - */ - sort: function( fn ) { - if ( typeof fn === 'function' ) { - this._queue.sort( fn ); - } - }, - - /** - * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。 - * @grammar getFiles( [status1[, status2 ...]] ) => Array - * @method getFiles - * @param {String} [status] [文件状态值](#WebUploader:File:File.Status) - */ - getFiles: function() { - var sts = [].slice.call( arguments, 0 ), - ret = [], - i = 0, - len = this._queue.length, - file; - - for ( ; i < len; i++ ) { - file = this._queue[ i ]; - - if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) { - continue; - } - - ret.push( file ); - } - - return ret; - }, - - _fileAdded: function( file ) { - var me = this, - existing = this._map[ file.id ]; - - if ( !existing ) { - this._map[ file.id ] = file; - - file.on( 'statuschange', function( cur, pre ) { - me._onFileStatusChange( cur, pre ); - }); - } - - file.setStatus( STATUS.QUEUED ); - }, - - _onFileStatusChange: function( curStatus, preStatus ) { - var stats = this.stats; - - switch ( preStatus ) { - case STATUS.PROGRESS: - stats.numOfProgress--; - break; - - case STATUS.QUEUED: - stats.numOfQueue --; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed--; - break; - - case STATUS.INVALID: - stats.numOfInvalid--; - break; - } - - switch ( curStatus ) { - case STATUS.QUEUED: - stats.numOfQueue++; - break; - - case STATUS.PROGRESS: - stats.numOfProgress++; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed++; - break; - - case STATUS.COMPLETE: - stats.numOfSuccess++; - break; - - case STATUS.CANCELLED: - stats.numOfCancel++; - break; - - case STATUS.INVALID: - stats.numOfInvalid++; - break; - } - } - - }); - - Mediator.installTo( Queue.prototype ); - - return Queue; - }); - /** - * @fileOverview 队列 - */ - define('widgets/queue',[ - 'base', - 'uploader', - 'queue', - 'file', - 'lib/file', - 'runtime/client', - 'widgets/widget' - ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) { - - var $ = Base.$, - rExt = /\.\w+$/, - Status = WUFile.Status; - - return Uploader.register({ - 'sort-files': 'sortFiles', - 'add-file': 'addFiles', - 'get-file': 'getFile', - 'fetch-file': 'fetchFile', - 'get-stats': 'getStats', - 'get-files': 'getFiles', - 'remove-file': 'removeFile', - 'retry': 'retry', - 'reset': 'reset', - 'accept-file': 'acceptFile' - }, { - - init: function( opts ) { - var me = this, - deferred, len, i, item, arr, accept, runtime; - - if ( $.isPlainObject( opts.accept ) ) { - opts.accept = [ opts.accept ]; - } - - // accept中的中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].extensions; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = '\\.' + arr.join(',') - .replace( /,/g, '$|\\.' ) - .replace( /\*/g, '.*' ) + '$'; - } - - me.accept = new RegExp( accept, 'i' ); - } - - me.queue = new Queue(); - me.stats = me.queue.stats; - - // 如果当前不是html5运行时,那就算了。 - // 不执行后续操作 - if ( this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - // 创建一个 html5 运行时的 placeholder - // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。 - deferred = Base.Deferred(); - runtime = new RuntimeClient('Placeholder'); - runtime.connectRuntime({ - runtimeOrder: 'html5' - }, function() { - me._ruid = runtime.getRuid(); - deferred.resolve(); - }); - return deferred.promise(); - }, - - - // 为了支持外部直接添加一个原生File对象。 - _wrapFile: function( file ) { - if ( !(file instanceof WUFile) ) { - - if ( !(file instanceof File) ) { - if ( !this._ruid ) { - throw new Error('Can\'t add external files.'); - } - file = new File( this._ruid, file ); - } - - file = new WUFile( file ); - } - - return file; - }, - - // 判断文件是否可以被加入队列 - acceptFile: function( file ) { - var invalid = !file || file.size < 6 || this.accept && - - // 如果名字中有后缀,才做后缀白名单处理。 - rExt.exec( file.name ) && !this.accept.test( file.name ); - - return !invalid; - }, - - - /** - * @event beforeFileQueued - * @param {File} file File对象 - * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。 - * @for Uploader - */ - - /** - * @event fileQueued - * @param {File} file File对象 - * @description 当文件被加入队列以后触发。 - * @for Uploader - */ - - _addFile: function( file ) { - var me = this; - - file = me._wrapFile( file ); - - // 不过类型判断允许不允许,先派送 `beforeFileQueued` - if ( !me.owner.trigger( 'beforeFileQueued', file ) ) { - return; - } - - // 类型不匹配,则派送错误事件,并返回。 - if ( !me.acceptFile( file ) ) { - me.owner.trigger( 'error', 'Q_TYPE_DENIED', file ); - return; - } - - me.queue.append( file ); - me.owner.trigger( 'fileQueued', file ); - return file; - }, - - getFile: function( fileId ) { - return this.queue.getFile( fileId ); - }, - - /** - * @event filesQueued - * @param {File} files 数组,内容为原始File(lib/File)对象。 - * @description 当一批文件添加进队列以后触发。 - * @for Uploader - */ - - /** - * @method addFiles - * @grammar addFiles( file ) => undefined - * @grammar addFiles( [file1, file2 ...] ) => undefined - * @param {Array of File or File} [files] Files 对象 数组 - * @description 添加文件到队列 - * @for Uploader - */ - addFiles: function( files ) { - var me = this; - - if ( !files.length ) { - files = [ files ]; - } - - files = $.map( files, function( file ) { - return me._addFile( file ); - }); - - me.owner.trigger( 'filesQueued', files ); - - if ( me.options.auto ) { - me.request('start-upload'); - } - }, - - getStats: function() { - return this.stats; - }, - - /** - * @event fileDequeued - * @param {File} file File对象 - * @description 当文件被移除队列后触发。 - * @for Uploader - */ - - /** - * @method removeFile - * @grammar removeFile( file ) => undefined - * @grammar removeFile( id ) => undefined - * @param {File|id} file File对象或这File对象的id - * @description 移除某一文件。 - * @for Uploader - * @example - * - * $li.on('click', '.remove-this', function() { - * uploader.removeFile( file ); - * }) - */ - removeFile: function( file ) { - var me = this; - - file = file.id ? file : me.queue.getFile( file ); - - file.setStatus( Status.CANCELLED ); - me.owner.trigger( 'fileDequeued', file ); - }, - - /** - * @method getFiles - * @grammar getFiles() => Array - * @grammar getFiles( status1, status2, status... ) => Array - * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。 - * @for Uploader - * @example - * console.log( uploader.getFiles() ); // => all files - * console.log( uploader.getFiles('error') ) // => all error files. - */ - getFiles: function() { - return this.queue.getFiles.apply( this.queue, arguments ); - }, - - fetchFile: function() { - return this.queue.fetch.apply( this.queue, arguments ); - }, - - /** - * @method retry - * @grammar retry() => undefined - * @grammar retry( file ) => undefined - * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。 - * @for Uploader - * @example - * function retry() { - * uploader.retry(); - * } - */ - retry: function( file, noForceStart ) { - var me = this, - files, i, len; - - if ( file ) { - file = file.id ? file : me.queue.getFile( file ); - file.setStatus( Status.QUEUED ); - noForceStart || me.request('start-upload'); - return; - } - - files = me.queue.getFiles( Status.ERROR ); - i = 0; - len = files.length; - - for ( ; i < len; i++ ) { - file = files[ i ]; - file.setStatus( Status.QUEUED ); - } - - me.request('start-upload'); - }, - - /** - * @method sort - * @grammar sort( fn ) => undefined - * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。 - * @for Uploader - */ - sortFiles: function() { - return this.queue.sort.apply( this.queue, arguments ); - }, - - /** - * @method reset - * @grammar reset() => undefined - * @description 重置uploader。目前只重置了队列。 - * @for Uploader - * @example - * uploader.reset(); - */ - reset: function() { - this.queue = new Queue(); - this.stats = this.queue.stats; - } - }); - - }); - /** - * @fileOverview 添加获取Runtime相关信息的方法。 - */ - define('widgets/runtime',[ - 'uploader', - 'runtime/runtime', - 'widgets/widget' - ], function( Uploader, Runtime ) { - - Uploader.support = function() { - return Runtime.hasRuntime.apply( Runtime, arguments ); - }; - - return Uploader.register({ - 'predict-runtime-type': 'predictRuntmeType' - }, { - - init: function() { - if ( !this.predictRuntmeType() ) { - throw Error('Runtime Error'); - } - }, - - /** - * 预测Uploader将采用哪个`Runtime` - * @grammar predictRuntmeType() => String - * @method predictRuntmeType - * @for Uploader - */ - predictRuntmeType: function() { - var orders = this.options.runtimeOrder || Runtime.orders, - type = this.type, - i, len; - - if ( !type ) { - orders = orders.split( /\s*,\s*/g ); - - for ( i = 0, len = orders.length; i < len; i++ ) { - if ( Runtime.hasRuntime( orders[ i ] ) ) { - this.type = type = orders[ i ]; - break; - } - } - } - - return type; - } - }); - }); - /** - * @fileOverview Transport - */ - define('lib/transport',[ - 'base', - 'runtime/client', - 'mediator' - ], function( Base, RuntimeClient, Mediator ) { - - var $ = Base.$; - - function Transport( opts ) { - var me = this; - - opts = me.options = $.extend( true, {}, Transport.options, opts || {} ); - RuntimeClient.call( this, 'Transport' ); - - this._blob = null; - this._formData = opts.formData || {}; - this._headers = opts.headers || {}; - - this.on( 'progress', this._timeout ); - this.on( 'load error', function() { - me.trigger( 'progress', 1 ); - clearTimeout( me._timer ); - }); - } - - Transport.options = { - server: '', - method: 'POST', - - // 跨域时,是否允许携带cookie, 只有html5 runtime才有效 - withCredentials: false, - fileVal: 'file', - timeout: 2 * 60 * 1000, // 2分钟 - formData: {}, - headers: {}, - sendAsBinary: false - }; - - $.extend( Transport.prototype, { - - // 添加Blob, 只能添加一次,最后一次有效。 - appendBlob: function( key, blob, filename ) { - var me = this, - opts = me.options; - - if ( me.getRuid() ) { - me.disconnectRuntime(); - } - - // 连接到blob归属的同一个runtime. - me.connectRuntime( blob.ruid, function() { - me.exec('init'); - }); - - me._blob = blob; - opts.fileVal = key || opts.fileVal; - opts.filename = filename || opts.filename; - }, - - // 添加其他字段 - append: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._formData, key ); - } else { - this._formData[ key ] = value; - } - }, - - setRequestHeader: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._headers, key ); - } else { - this._headers[ key ] = value; - } - }, - - send: function( method ) { - this.exec( 'send', method ); - this._timeout(); - }, - - abort: function() { - clearTimeout( this._timer ); - return this.exec('abort'); - }, - - destroy: function() { - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }, - - getResponse: function() { - return this.exec('getResponse'); - }, - - getResponseAsJson: function() { - return this.exec('getResponseAsJson'); - }, - - getStatus: function() { - return this.exec('getStatus'); - }, - - _timeout: function() { - var me = this, - duration = me.options.timeout; - - if ( !duration ) { - return; - } - - clearTimeout( me._timer ); - me._timer = setTimeout(function() { - me.abort(); - me.trigger( 'error', 'timeout' ); - }, duration ); - } - - }); - - // 让Transport具备事件功能。 - Mediator.installTo( Transport.prototype ); - - return Transport; - }); - /** - * @fileOverview 负责文件上传相关。 - */ - define('widgets/upload',[ - 'base', - 'uploader', - 'file', - 'lib/transport', - 'widgets/widget' - ], function( Base, Uploader, WUFile, Transport ) { - - var $ = Base.$, - isPromise = Base.isPromise, - Status = WUFile.Status; - - // 添加默认配置项 - $.extend( Uploader.options, { - - - /** - * @property {Boolean} [prepareNextFile=false] - * @namespace options - * @for Uploader - * @description 是否允许在文件传输时提前把下一个文件准备好。 - * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 - * 如果能提前在当前文件传输期处理,可以节省总体耗时。 - */ - prepareNextFile: false, - - /** - * @property {Boolean} [chunked=false] - * @namespace options - * @for Uploader - * @description 是否要分片处理大文件上传。 - */ - chunked: false, - - /** - * @property {Boolean} [chunkSize=5242880] - * @namespace options - * @for Uploader - * @description 如果要分片,分多大一片? 默认大小为5M. - */ - chunkSize: 5 * 1024 * 1024, - - /** - * @property {Boolean} [chunkRetry=2] - * @namespace options - * @for Uploader - * @description 如果某个分片由于网络问题出错,允许自动重传多少次? - */ - chunkRetry: 2, - - /** - * @property {Boolean} [threads=3] - * @namespace options - * @for Uploader - * @description 上传并发数。允许同时最大上传进程数。 - */ - threads: 3, - - - /** - * @property {Object} [formData] - * @namespace options - * @for Uploader - * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。 - */ - formData: null - - /** - * @property {Object} [fileVal='file'] - * @namespace options - * @for Uploader - * @description 设置文件上传域的name。 - */ - - /** - * @property {Object} [method='POST'] - * @namespace options - * @for Uploader - * @description 文件上传方式,`POST`或者`GET`。 - */ - - /** - * @property {Object} [sendAsBinary=false] - * @namespace options - * @for Uploader - * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容, - * 其他参数在$_GET数组中。 - */ - }); - - // 负责将文件切片。 - function CuteFile( file, chunkSize ) { - var pending = [], - blob = file.source, - total = blob.size, - chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1, - start = 0, - index = 0, - len; - - while ( index < chunks ) { - len = Math.min( chunkSize, total - start ); - - pending.push({ - file: file, - start: start, - end: chunkSize ? (start + len) : total, - total: total, - chunks: chunks, - chunk: index++ - }); - start += len; - } - - file.blocks = pending.concat(); - file.remaning = pending.length; - - return { - file: file, - - has: function() { - return !!pending.length; - }, - - fetch: function() { - return pending.shift(); - } - }; - } - - Uploader.register({ - 'start-upload': 'start', - 'stop-upload': 'stop', - 'skip-file': 'skipFile', - 'is-in-progress': 'isInProgress' - }, { - - init: function() { - var owner = this.owner; - - this.runing = false; - - // 记录当前正在传的数据,跟threads相关 - this.pool = []; - - // 缓存即将上传的文件。 - this.pending = []; - - // 跟踪还有多少分片没有完成上传。 - this.remaning = 0; - this.__tick = Base.bindFn( this._tick, this ); - - owner.on( 'uploadComplete', function( file ) { - // 把其他块取消了。 - file.blocks && $.each( file.blocks, function( _, v ) { - v.transport && (v.transport.abort(), v.transport.destroy()); - delete v.transport; - }); - - delete file.blocks; - delete file.remaning; - }); - }, - - /** - * @event startUpload - * @description 当开始上传流程时触发。 - * @for Uploader - */ - - /** - * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。 - * @grammar upload() => undefined - * @method upload - * @for Uploader - */ - start: function() { - var me = this; - - // 移出invalid的文件 - $.each( me.request( 'get-files', Status.INVALID ), function() { - me.request( 'remove-file', this ); - }); - - if ( me.runing ) { - return; - } - - me.runing = true; - - // 如果有暂停的,则续传 - $.each( me.pool, function( _, v ) { - var file = v.file; - - if ( file.getStatus() === Status.INTERRUPT ) { - file.setStatus( Status.PROGRESS ); - me._trigged = false; - v.transport && v.transport.send(); - } - }); - - me._trigged = false; - me.owner.trigger('startUpload'); - Base.nextTick( me.__tick ); - }, - - /** - * @event stopUpload - * @description 当开始上传流程暂停时触发。 - * @for Uploader - */ - - /** - * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。 - * @grammar stop() => undefined - * @grammar stop( true ) => undefined - * @method stop - * @for Uploader - */ - stop: function( interrupt ) { - var me = this; - - if ( me.runing === false ) { - return; - } - - me.runing = false; - - interrupt && $.each( me.pool, function( _, v ) { - v.transport && v.transport.abort(); - v.file.setStatus( Status.INTERRUPT ); - }); - - me.owner.trigger('stopUpload'); - }, - - /** - * 判断`Uplaode`r是否正在上传中。 - * @grammar isInProgress() => Boolean - * @method isInProgress - * @for Uploader - */ - isInProgress: function() { - return !!this.runing; - }, - - getStats: function() { - return this.request('get-stats'); - }, - - /** - * 掉过一个文件上传,直接标记指定文件为已上传状态。 - * @grammar skipFile( file ) => undefined - * @method skipFile - * @for Uploader - */ - skipFile: function( file, status ) { - file = this.request( 'get-file', file ); - - file.setStatus( status || Status.COMPLETE ); - file.skipped = true; - - // 如果正在上传。 - file.blocks && $.each( file.blocks, function( _, v ) { - var _tr = v.transport; - - if ( _tr ) { - _tr.abort(); - _tr.destroy(); - delete v.transport; - } - }); - - this.owner.trigger( 'uploadSkip', file ); - }, - - /** - * @event uploadFinished - * @description 当所有文件上传结束时触发。 - * @for Uploader - */ - _tick: function() { - var me = this, - opts = me.options, - fn, val; - - // 上一个promise还没有结束,则等待完成后再执行。 - if ( me._promise ) { - return me._promise.always( me.__tick ); - } - - // 还有位置,且还有文件要处理的话。 - if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) { - me._trigged = false; - - fn = function( val ) { - me._promise = null; - - // 有可能是reject过来的,所以要检测val的类型。 - val && val.file && me._startSend( val ); - Base.nextTick( me.__tick ); - }; - - me._promise = isPromise( val ) ? val.always( fn ) : fn( val ); - - // 没有要上传的了,且没有正在传输的了。 - } else if ( !me.remaning && !me.getStats().numOfQueue ) { - me.runing = false; - - me._trigged || Base.nextTick(function() { - me.owner.trigger('uploadFinished'); - }); - me._trigged = true; - } - }, - - _nextBlock: function() { - var me = this, - act = me._act, - opts = me.options, - next, done; - - // 如果当前文件还有没有需要传输的,则直接返回剩下的。 - if ( act && act.has() && - act.file.getStatus() === Status.PROGRESS ) { - - // 是否提前准备下一个文件 - if ( opts.prepareNextFile && !me.pending.length ) { - me._prepareNextFile(); - } - - return act.fetch(); - - // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。 - } else if ( me.runing ) { - - // 如果缓存中有,则直接在缓存中取,没有则去queue中取。 - if ( !me.pending.length && me.getStats().numOfQueue ) { - me._prepareNextFile(); - } - - next = me.pending.shift(); - done = function( file ) { - if ( !file ) { - return null; - } - - act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 ); - me._act = act; - return act.fetch(); - }; - - // 文件可能还在prepare中,也有可能已经完全准备好了。 - return isPromise( next ) ? - next[ next.pipe ? 'pipe' : 'then']( done ) : - done( next ); - } - }, - - - /** - * @event uploadStart - * @param {File} file File对象 - * @description 某个文件开始上传前触发,一个文件只会触发一次。 - * @for Uploader - */ - _prepareNextFile: function() { - var me = this, - file = me.request('fetch-file'), - pending = me.pending, - promise; - - if ( file ) { - promise = me.request( 'before-send-file', file, function() { - - // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued. - if ( file.getStatus() === Status.QUEUED ) { - me.owner.trigger( 'uploadStart', file ); - file.setStatus( Status.PROGRESS ); - return file; - } - - return me._finishFile( file ); - }); - - // 如果还在pending中,则替换成文件本身。 - promise.done(function() { - var idx = $.inArray( promise, pending ); - - ~idx && pending.splice( idx, 1, file ); - }); - - // befeore-send-file的钩子就有错误发生。 - promise.fail(function( reason ) { - file.setStatus( Status.ERROR, reason ); - me.owner.trigger( 'uploadError', file, reason ); - me.owner.trigger( 'uploadComplete', file ); - }); - - pending.push( promise ); - } - }, - - // 让出位置了,可以让其他分片开始上传 - _popBlock: function( block ) { - var idx = $.inArray( block, this.pool ); - - this.pool.splice( idx, 1 ); - block.file.remaning--; - this.remaning--; - }, - - // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。 - _startSend: function( block ) { - var me = this, - file = block.file, - promise; - - me.pool.push( block ); - me.remaning++; - - // 如果没有分片,则直接使用原始的。 - // 不会丢失content-type信息。 - block.blob = block.chunks === 1 ? file.source : - file.source.slice( block.start, block.end ); - - // hook, 每个分片发送之前可能要做些异步的事情。 - promise = me.request( 'before-send', block, function() { - - // 有可能文件已经上传出错了,所以不需要再传输了。 - if ( file.getStatus() === Status.PROGRESS ) { - me._doSend( block ); - } else { - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - - // 如果为fail了,则跳过此分片。 - promise.fail(function() { - if ( file.remaning === 1 ) { - me._finishFile( file ).always(function() { - block.percentage = 1; - me._popBlock( block ); - me.owner.trigger( 'uploadComplete', file ); - Base.nextTick( me.__tick ); - }); - } else { - block.percentage = 1; - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - }, - - - /** - * @event uploadBeforeSend - * @param {Object} object - * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。 - * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 - * @for Uploader - */ - - /** - * @event uploadAccept - * @param {Object} object - * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。 - * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。 - * @for Uploader - */ - - /** - * @event uploadProgress - * @param {File} file File对象 - * @param {Number} percentage 上传进度 - * @description 上传过程中触发,携带上传进度。 - * @for Uploader - */ - - - /** - * @event uploadError - * @param {File} file File对象 - * @param {String} reason 出错的code - * @description 当文件上传出错时触发。 - * @for Uploader - */ - - /** - * @event uploadSuccess - * @param {File} file File对象 - * @param {Object} response 服务端返回的数据 - * @description 当文件上传成功时触发。 - * @for Uploader - */ - - /** - * @event uploadComplete - * @param {File} [file] File对象 - * @description 不管成功或者失败,文件上传完成时触发。 - * @for Uploader - */ - - // 做上传操作。 - _doSend: function( block ) { - var me = this, - owner = me.owner, - opts = me.options, - file = block.file, - tr = new Transport( opts ), - data = $.extend({}, opts.formData ), - headers = $.extend({}, opts.headers ), - requestAccept, ret; - - block.transport = tr; - - tr.on( 'destroy', function() { - delete block.transport; - me._popBlock( block ); - Base.nextTick( me.__tick ); - }); - - // 广播上传进度。以文件为单位。 - tr.on( 'progress', function( percentage ) { - var totalPercent = 0, - uploaded = 0; - - // 可能没有abort掉,progress还是执行进来了。 - // if ( !file.blocks ) { - // return; - // } - - totalPercent = block.percentage = percentage; - - if ( block.chunks > 1 ) { // 计算文件的整体速度。 - $.each( file.blocks, function( _, v ) { - uploaded += (v.percentage || 0) * (v.end - v.start); - }); - - totalPercent = uploaded / file.size; - } - - owner.trigger( 'uploadProgress', file, totalPercent || 0 ); - }); - - // 用来询问,是否返回的结果是有错误的。 - requestAccept = function( reject ) { - var fn; - - ret = tr.getResponseAsJson() || {}; - ret._raw = tr.getResponse(); - fn = function( value ) { - reject = value; - }; - - // 服务端响应了,不代表成功了,询问是否响应正确。 - if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) { - reject = reject || 'server'; - } - - return reject; - }; - - // 尝试重试,然后广播文件上传出错。 - tr.on( 'error', function( type, flag ) { - block.retried = block.retried || 0; - - // 自动重试 - if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) && - block.retried < opts.chunkRetry ) { - - block.retried++; - tr.send(); - - } else { - - // http status 500 ~ 600 - if ( !flag && type === 'server' ) { - type = requestAccept( type ); - } - - file.setStatus( Status.ERROR, type ); - owner.trigger( 'uploadError', file, type ); - owner.trigger( 'uploadComplete', file ); - } - }); - - // 上传成功 - tr.on( 'load', function() { - var reason; - - // 如果非预期,转向上传出错。 - if ( (reason = requestAccept()) ) { - tr.trigger( 'error', reason, true ); - return; - } - - // 全部上传完成。 - if ( file.remaning === 1 ) { - me._finishFile( file, ret ); - } else { - tr.destroy(); - } - }); - - // 配置默认的上传字段。 - data = $.extend( data, { - id: file.id, - name: file.name, - type: file.type, - lastModifiedDate: file.lastModifiedDate, - size: file.size - }); - - block.chunks > 1 && $.extend( data, { - chunks: block.chunks, - chunk: block.chunk - }); - - // 在发送之间可以添加字段什么的。。。 - // 如果默认的字段不够使用,可以通过监听此事件来扩展 - owner.trigger( 'uploadBeforeSend', block, data, headers ); - - // 开始发送。 - tr.appendBlob( opts.fileVal, block.blob, file.name ); - tr.append( data ); - tr.setRequestHeader( headers ); - tr.send(); - }, - - // 完成上传。 - _finishFile: function( file, ret, hds ) { - var owner = this.owner; - - return owner - .request( 'after-send-file', arguments, function() { - file.setStatus( Status.COMPLETE ); - owner.trigger( 'uploadSuccess', file, ret, hds ); - }) - .fail(function( reason ) { - - // 如果外部已经标记为invalid什么的,不再改状态。 - if ( file.getStatus() === Status.PROGRESS ) { - file.setStatus( Status.ERROR, reason ); - } - - owner.trigger( 'uploadError', file, reason ); - }) - .always(function() { - owner.trigger( 'uploadComplete', file ); - }); - } - - }); - }); - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/compbase',[],function() { - - function CompBase( owner, runtime ) { - - this.owner = owner; - this.options = owner.options; - - this.getRuntime = function() { - return runtime; - }; - - this.getRuid = function() { - return runtime.uid; - }; - - this.trigger = function() { - return owner.trigger.apply( owner, arguments ); - }; - } - - return CompBase; - }); - /** - * @fileOverview Html5Runtime - */ - define('runtime/html5/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - - var type = 'html5', - components = {}; - - function Html5Runtime() { - var pool = {}, - me = this, - destory = this.destory; - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - if ( components[ comp ] ) { - instance = pool[ uid ] = pool[ uid ] || - new components[ comp ]( client, me ); - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - }; - - me.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - } - - Base.inherits( Runtime, { - constructor: Html5Runtime, - - // 不需要连接其他程序,直接执行callback - init: function() { - var me = this; - setTimeout(function() { - me.trigger('ready'); - }, 1 ); - } - - }); - - // 注册Components - Html5Runtime.register = function( name, component ) { - var klass = components[ name ] = Base.inherits( CompBase, component ); - return klass; - }; - - // 注册html5运行时。 - // 只有在支持的前提下注册。 - if ( window.Blob && window.FileReader && window.DataView ) { - Runtime.addRuntime( type, Html5Runtime ); - } - - return Html5Runtime; - }); - /** - * @fileOverview Blob Html实现 - */ - define('runtime/html5/blob',[ - 'runtime/html5/runtime', - 'lib/blob' - ], function( Html5Runtime, Blob ) { - - return Html5Runtime.register( 'Blob', { - slice: function( start, end ) { - var blob = this.owner.source, - slice = blob.slice || blob.webkitSlice || blob.mozSlice; - - blob = slice.call( blob, start, end ); - - return new Blob( this.getRuid(), blob ); - } - }); - }); - /** - * @fileOverview FilePicker - */ - define('runtime/html5/filepicker',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var $ = Base.$; - - return Html5Runtime.register( 'FilePicker', { - init: function() { - var container = this.getRuntime().getContainer(), - me = this, - owner = me.owner, - opts = me.options, - lable = $( document.createElement('label') ), - input = $( document.createElement('input') ), - arr, i, len, mouseHandler; - - input.attr( 'type', 'file' ); - input.attr( 'name', opts.name ); - input.addClass('webuploader-element-invisible'); - - lable.on( 'click', function() { - input.trigger('click'); - }); - - lable.css({ - opacity: 0, - width: '100%', - height: '100%', - display: 'block', - cursor: 'pointer', - background: '#ffffff' - }); - - if ( opts.multiple ) { - input.attr( 'multiple', 'multiple' ); - } - - // @todo Firefox不支持单独指定后缀 - if ( opts.accept && opts.accept.length > 0 ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - arr.push( opts.accept[ i ].mimeTypes ); - } - - input.attr( 'accept', arr.join(',') ); - } - - container.append( input ); - container.append( lable ); - - mouseHandler = function( e ) { - owner.trigger( e.type ); - }; - - input.on( 'change', function( e ) { - var fn = arguments.callee, - clone; - - me.files = e.target.files; - - // reset input - clone = this.cloneNode( true ); - this.parentNode.replaceChild( clone, this ); - - input.off(); - input = $( clone ).on( 'change', fn ) - .on( 'mouseenter mouseleave', mouseHandler ); - - owner.trigger('change'); - }); - - lable.on( 'mouseenter mouseleave', mouseHandler ); - - }, - - - getFiles: function() { - return this.files; - }, - - destroy: function() { - // todo - } - }); - }); - /** - * Terms: - * - * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer - * @fileOverview Image控件 - */ - define('runtime/html5/util',[ - 'base' - ], function( Base ) { - - var urlAPI = window.createObjectURL && window || - window.URL && URL.revokeObjectURL && URL || - window.webkitURL, - createObjectURL = Base.noop, - revokeObjectURL = createObjectURL; - - if ( urlAPI ) { - - // 更安全的方式调用,比如android里面就能把context改成其他的对象。 - createObjectURL = function() { - return urlAPI.createObjectURL.apply( urlAPI, arguments ); - }; - - revokeObjectURL = function() { - return urlAPI.revokeObjectURL.apply( urlAPI, arguments ); - }; - } - - return { - createObjectURL: createObjectURL, - revokeObjectURL: revokeObjectURL, - - dataURL2Blob: function( dataURI ) { - var byteStr, intArray, ab, i, mimetype, parts; - - parts = dataURI.split(','); - - if ( ~parts[ 0 ].indexOf('base64') ) { - byteStr = atob( parts[ 1 ] ); - } else { - byteStr = decodeURIComponent( parts[ 1 ] ); - } - - ab = new ArrayBuffer( byteStr.length ); - intArray = new Uint8Array( ab ); - - for ( i = 0; i < byteStr.length; i++ ) { - intArray[ i ] = byteStr.charCodeAt( i ); - } - - mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ]; - - return this.arrayBufferToBlob( ab, mimetype ); - }, - - dataURL2ArrayBuffer: function( dataURI ) { - var byteStr, intArray, i, parts; - - parts = dataURI.split(','); - - if ( ~parts[ 0 ].indexOf('base64') ) { - byteStr = atob( parts[ 1 ] ); - } else { - byteStr = decodeURIComponent( parts[ 1 ] ); - } - - intArray = new Uint8Array( byteStr.length ); - - for ( i = 0; i < byteStr.length; i++ ) { - intArray[ i ] = byteStr.charCodeAt( i ); - } - - return intArray.buffer; - }, - - arrayBufferToBlob: function( buffer, type ) { - var builder = window.BlobBuilder || window.WebKitBlobBuilder, - bb; - - // android不支持直接new Blob, 只能借助blobbuilder. - if ( builder ) { - bb = new builder(); - bb.append( buffer ); - return bb.getBlob( type ); - } - - return new Blob([ buffer ], type ? { type: type } : {} ); - }, - - // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg. - // 你得到的结果是png. - canvasToDataUrl: function( canvas, type, quality ) { - return canvas.toDataURL( type, quality / 100 ); - }, - - // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。 - parseMeta: function( blob, callback ) { - callback( false, {}); - }, - - // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。 - updateImageHead: function( data ) { - return data; - } - }; - }); - /** - * Terms: - * - * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer - * @fileOverview Image控件 - */ - define('runtime/html5/imagemeta',[ - 'runtime/html5/util' - ], function( Util ) { - - var api; - - api = { - parsers: { - 0xffe1: [] - }, - - maxMetaDataSize: 262144, - - parse: function( blob, cb ) { - var me = this, - fr = new FileReader(); - - fr.onload = function() { - cb( false, me._parse( this.result ) ); - fr = fr.onload = fr.onerror = null; - }; - - fr.onerror = function( e ) { - cb( e.message ); - fr = fr.onload = fr.onerror = null; - }; - - blob = blob.slice( 0, me.maxMetaDataSize ); - fr.readAsArrayBuffer( blob.getSource() ); - }, - - _parse: function( buffer, noParse ) { - if ( buffer.byteLength < 6 ) { - return; - } - - var dataview = new DataView( buffer ), - offset = 2, - maxOffset = dataview.byteLength - 4, - headLength = offset, - ret = {}, - markerBytes, markerLength, parsers, i; - - if ( dataview.getUint16( 0 ) === 0xffd8 ) { - - while ( offset < maxOffset ) { - markerBytes = dataview.getUint16( offset ); - - if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef || - markerBytes === 0xfffe ) { - - markerLength = dataview.getUint16( offset + 2 ) + 2; - - if ( offset + markerLength > dataview.byteLength ) { - break; - } - - parsers = api.parsers[ markerBytes ]; - - if ( !noParse && parsers ) { - for ( i = 0; i < parsers.length; i += 1 ) { - parsers[ i ].call( api, dataview, offset, - markerLength, ret ); - } - } - - offset += markerLength; - headLength = offset; - } else { - break; - } - } - - if ( headLength > 6 ) { - if ( buffer.slice ) { - ret.imageHead = buffer.slice( 2, headLength ); - } else { - // Workaround for IE10, which does not yet - // support ArrayBuffer.slice: - ret.imageHead = new Uint8Array( buffer ) - .subarray( 2, headLength ); - } - } - } - - return ret; - }, - - updateImageHead: function( buffer, head ) { - var data = this._parse( buffer, true ), - buf1, buf2, bodyoffset; - - - bodyoffset = 2; - if ( data.imageHead ) { - bodyoffset = 2 + data.imageHead.byteLength; - } - - if ( buffer.slice ) { - buf2 = buffer.slice( bodyoffset ); - } else { - buf2 = new Uint8Array( buffer ).subarray( bodyoffset ); - } - - buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength ); - - buf1[ 0 ] = 0xFF; - buf1[ 1 ] = 0xD8; - buf1.set( new Uint8Array( head ), 2 ); - buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 ); - - return buf1.buffer; - } - }; - - Util.parseMeta = function() { - return api.parse.apply( api, arguments ); - }; - - Util.updateImageHead = function() { - return api.updateImageHead.apply( api, arguments ); - }; - - return api; - }); - /** - * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image - * 暂时项目中只用了orientation. - * - * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail. - * @fileOverview EXIF解析 - */ - - // Sample - // ==================================== - // Make : Apple - // Model : iPhone 4S - // Orientation : 1 - // XResolution : 72 [72/1] - // YResolution : 72 [72/1] - // ResolutionUnit : 2 - // Software : QuickTime 7.7.1 - // DateTime : 2013:09:01 22:53:55 - // ExifIFDPointer : 190 - // ExposureTime : 0.058823529411764705 [1/17] - // FNumber : 2.4 [12/5] - // ExposureProgram : Normal program - // ISOSpeedRatings : 800 - // ExifVersion : 0220 - // DateTimeOriginal : 2013:09:01 22:52:51 - // DateTimeDigitized : 2013:09:01 22:52:51 - // ComponentsConfiguration : YCbCr - // ShutterSpeedValue : 4.058893515764426 - // ApertureValue : 2.5260688216892597 [4845/1918] - // BrightnessValue : -0.3126686601998395 - // MeteringMode : Pattern - // Flash : Flash did not fire, compulsory flash mode - // FocalLength : 4.28 [107/25] - // SubjectArea : [4 values] - // FlashpixVersion : 0100 - // ColorSpace : 1 - // PixelXDimension : 2448 - // PixelYDimension : 3264 - // SensingMethod : One-chip color area sensor - // ExposureMode : 0 - // WhiteBalance : Auto white balance - // FocalLengthIn35mmFilm : 35 - // SceneCaptureType : Standard - define('runtime/html5/imagemeta/exif',[ - 'base', - 'runtime/html5/imagemeta' - ], function( Base, ImageMeta ) { - - var EXIF = {}; - - EXIF.ExifMap = function() { - return this; - }; - - EXIF.ExifMap.prototype.map = { - 'Orientation': 0x0112 - }; - - EXIF.ExifMap.prototype.get = function( id ) { - return this[ id ] || this[ this.map[ id ] ]; - }; - - EXIF.exifTagTypes = { - // byte, 8-bit unsigned int: - 1: { - getValue: function( dataView, dataOffset ) { - return dataView.getUint8( dataOffset ); - }, - size: 1 - }, - - // ascii, 8-bit byte: - 2: { - getValue: function( dataView, dataOffset ) { - return String.fromCharCode( dataView.getUint8( dataOffset ) ); - }, - size: 1, - ascii: true - }, - - // short, 16 bit int: - 3: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint16( dataOffset, littleEndian ); - }, - size: 2 - }, - - // long, 32 bit int: - 4: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint32( dataOffset, littleEndian ); - }, - size: 4 - }, - - // rational = two long values, - // first is numerator, second is denominator: - 5: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint32( dataOffset, littleEndian ) / - dataView.getUint32( dataOffset + 4, littleEndian ); - }, - size: 8 - }, - - // slong, 32 bit signed int: - 9: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getInt32( dataOffset, littleEndian ); - }, - size: 4 - }, - - // srational, two slongs, first is numerator, second is denominator: - 10: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getInt32( dataOffset, littleEndian ) / - dataView.getInt32( dataOffset + 4, littleEndian ); - }, - size: 8 - } - }; - - // undefined, 8-bit byte, value depending on field: - EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ]; - - EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length, - littleEndian ) { - - var tagType = EXIF.exifTagTypes[ type ], - tagSize, dataOffset, values, i, str, c; - - if ( !tagType ) { - Base.log('Invalid Exif data: Invalid tag type.'); - return; - } - - tagSize = tagType.size * length; - - // Determine if the value is contained in the dataOffset bytes, - // or if the value at the dataOffset is a pointer to the actual data: - dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8, - littleEndian ) : (offset + 8); - - if ( dataOffset + tagSize > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid data offset.'); - return; - } - - if ( length === 1 ) { - return tagType.getValue( dataView, dataOffset, littleEndian ); - } - - values = []; - - for ( i = 0; i < length; i += 1 ) { - values[ i ] = tagType.getValue( dataView, - dataOffset + i * tagType.size, littleEndian ); - } - - if ( tagType.ascii ) { - str = ''; - - // Concatenate the chars: - for ( i = 0; i < values.length; i += 1 ) { - c = values[ i ]; - - // Ignore the terminating NULL byte(s): - if ( c === '\u0000' ) { - break; - } - str += c; - } - - return str; - } - return values; - }; - - EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian, - data ) { - - var tag = dataView.getUint16( offset, littleEndian ); - data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset, - dataView.getUint16( offset + 2, littleEndian ), // tag type - dataView.getUint32( offset + 4, littleEndian ), // tag length - littleEndian ); - }; - - EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset, - littleEndian, data ) { - - var tagsNumber, dirEndOffset, i; - - if ( dirOffset + 6 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid directory offset.'); - return; - } - - tagsNumber = dataView.getUint16( dirOffset, littleEndian ); - dirEndOffset = dirOffset + 2 + 12 * tagsNumber; - - if ( dirEndOffset + 4 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid directory size.'); - return; - } - - for ( i = 0; i < tagsNumber; i += 1 ) { - this.parseExifTag( dataView, tiffOffset, - dirOffset + 2 + 12 * i, // tag offset - littleEndian, data ); - } - - // Return the offset to the next directory: - return dataView.getUint32( dirEndOffset, littleEndian ); - }; - - // EXIF.getExifThumbnail = function(dataView, offset, length) { - // var hexData, - // i, - // b; - // if (!length || offset + length > dataView.byteLength) { - // Base.log('Invalid Exif data: Invalid thumbnail data.'); - // return; - // } - // hexData = []; - // for (i = 0; i < length; i += 1) { - // b = dataView.getUint8(offset + i); - // hexData.push((b < 16 ? '0' : '') + b.toString(16)); - // } - // return 'data:image/jpeg,%' + hexData.join('%'); - // }; - - EXIF.parseExifData = function( dataView, offset, length, data ) { - - var tiffOffset = offset + 10, - littleEndian, dirOffset; - - // Check for the ASCII code for "Exif" (0x45786966): - if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) { - // No Exif data, might be XMP data instead - return; - } - if ( tiffOffset + 8 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid segment size.'); - return; - } - - // Check for the two null bytes: - if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) { - Base.log('Invalid Exif data: Missing byte alignment offset.'); - return; - } - - // Check the byte alignment: - switch ( dataView.getUint16( tiffOffset ) ) { - case 0x4949: - littleEndian = true; - break; - - case 0x4D4D: - littleEndian = false; - break; - - default: - Base.log('Invalid Exif data: Invalid byte alignment marker.'); - return; - } - - // Check for the TIFF tag marker (0x002A): - if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) { - Base.log('Invalid Exif data: Missing TIFF marker.'); - return; - } - - // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal: - dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian ); - // Create the exif object to store the tags: - data.exif = new EXIF.ExifMap(); - // Parse the tags of the main image directory and retrieve the - // offset to the next directory, usually the thumbnail directory: - dirOffset = EXIF.parseExifTags( dataView, tiffOffset, - tiffOffset + dirOffset, littleEndian, data ); - - // 尝试读取缩略图 - // if ( dirOffset ) { - // thumbnailData = {exif: {}}; - // dirOffset = EXIF.parseExifTags( - // dataView, - // tiffOffset, - // tiffOffset + dirOffset, - // littleEndian, - // thumbnailData - // ); - - // // Check for JPEG Thumbnail offset: - // if (thumbnailData.exif[0x0201]) { - // data.exif.Thumbnail = EXIF.getExifThumbnail( - // dataView, - // tiffOffset + thumbnailData.exif[0x0201], - // thumbnailData.exif[0x0202] // Thumbnail data length - // ); - // } - // } - }; - - ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData ); - return EXIF; - }); - /** - * @fileOverview Image - */ - define('runtime/html5/image',[ - 'base', - 'runtime/html5/runtime', - 'runtime/html5/util' - ], function( Base, Html5Runtime, Util ) { - - var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D'; - - return Html5Runtime.register( 'Image', { - - // flag: 标记是否被修改过。 - modified: false, - - init: function() { - var me = this, - img = new Image(); - - img.onload = function() { - - me._info = { - type: me.type, - width: this.width, - height: this.height - }; - - // 读取meta信息。 - if ( !me._metas && 'image/jpeg' === me.type ) { - Util.parseMeta( me._blob, function( error, ret ) { - me._metas = ret; - me.owner.trigger('load'); - }); - } else { - me.owner.trigger('load'); - } - }; - - img.onerror = function() { - me.owner.trigger('error'); - }; - - me._img = img; - }, - - loadFromBlob: function( blob ) { - var me = this, - img = me._img; - - me._blob = blob; - me.type = blob.type; - img.src = Util.createObjectURL( blob.getSource() ); - me.owner.once( 'load', function() { - Util.revokeObjectURL( img.src ); - }); - }, - - resize: function( width, height ) { - var canvas = this._canvas || - (this._canvas = document.createElement('canvas')); - - this._resize( this._img, canvas, width, height ); - this._blob = null; // 没用了,可以删掉了。 - this.modified = true; - this.owner.trigger('complete'); - }, - - getAsBlob: function( type ) { - var blob = this._blob, - opts = this.options, - canvas; - - type = type || this.type; - - // blob需要重新生成。 - if ( this.modified || this.type !== type ) { - canvas = this._canvas; - - if ( type === 'image/jpeg' ) { - - blob = Util.canvasToDataUrl( canvas, 'image/jpeg', - opts.quality ); - - if ( opts.preserveHeaders && this._metas && - this._metas.imageHead ) { - - blob = Util.dataURL2ArrayBuffer( blob ); - blob = Util.updateImageHead( blob, - this._metas.imageHead ); - blob = Util.arrayBufferToBlob( blob, type ); - return blob; - } - } else { - blob = Util.canvasToDataUrl( canvas, type ); - } - - blob = Util.dataURL2Blob( blob ); - } - - return blob; - }, - - getAsDataUrl: function( type ) { - var opts = this.options; - - type = type || this.type; - - if ( type === 'image/jpeg' ) { - return Util.canvasToDataUrl( this._canvas, type, opts.quality ); - } else { - return this._canvas.toDataURL( type ); - } - }, - - getOrientation: function() { - return this._metas && this._metas.exif && - this._metas.exif.get('Orientation') || 1; - }, - - info: function( val ) { - - // setter - if ( val ) { - this._info = val; - return this; - } - - // getter - return this._info; - }, - - meta: function( val ) { - - // setter - if ( val ) { - this._meta = val; - return this; - } - - // getter - return this._meta; - }, - - destroy: function() { - var canvas = this._canvas; - this._img.onload = null; - - if ( canvas ) { - canvas.getContext('2d') - .clearRect( 0, 0, canvas.width, canvas.height ); - canvas.width = canvas.height = 0; - this._canvas = null; - } - - // 释放内存。非常重要,否则释放不了image的内存。 - this._img.src = BLANK; - this._img = this._blob = null; - }, - - _resize: function( img, cvs, width, height ) { - var opts = this.options, - naturalWidth = img.width, - naturalHeight = img.height, - orientation = this.getOrientation(), - scale, w, h, x, y; - - // values that require 90 degree rotation - if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) { - - // 交换width, height的值。 - width ^= height; - height ^= width; - width ^= height; - } - - scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth, - height / naturalHeight ); - - // 不允许放大。 - opts.allowMagnify || (scale = Math.min( 1, scale )); - - w = naturalWidth * scale; - h = naturalHeight * scale; - - if ( opts.crop ) { - cvs.width = width; - cvs.height = height; - } else { - cvs.width = w; - cvs.height = h; - } - - x = (cvs.width - w) / 2; - y = (cvs.height - h) / 2; - - opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation ); - - this._renderImageToCanvas( cvs, img, x, y, w, h ); - }, - - _rotate2Orientaion: function( canvas, orientation ) { - var width = canvas.width, - height = canvas.height, - ctx = canvas.getContext('2d'); - - switch ( orientation ) { - case 5: - case 6: - case 7: - case 8: - canvas.width = height; - canvas.height = width; - break; - } - - switch ( orientation ) { - case 2: // horizontal flip - ctx.translate( width, 0 ); - ctx.scale( -1, 1 ); - break; - - case 3: // 180 rotate left - ctx.translate( width, height ); - ctx.rotate( Math.PI ); - break; - - case 4: // vertical flip - ctx.translate( 0, height ); - ctx.scale( 1, -1 ); - break; - - case 5: // vertical flip + 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.scale( 1, -1 ); - break; - - case 6: // 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.translate( 0, -height ); - break; - - case 7: // horizontal flip + 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.translate( width, -height ); - ctx.scale( -1, 1 ); - break; - - case 8: // 90 rotate left - ctx.rotate( -0.5 * Math.PI ); - ctx.translate( -width, 0 ); - break; - } - }, - - // https://github.com/stomita/ios-imagefile-megapixel/ - // blob/master/src/megapix-image.js - _renderImageToCanvas: (function() { - - // 如果不是ios, 不需要这么复杂! - if ( !Base.os.ios ) { - return function( canvas, img, x, y, w, h ) { - canvas.getContext('2d').drawImage( img, x, y, w, h ); - }; - } - - /** - * Detecting vertical squash in loaded image. - * Fixes a bug which squash image vertically while drawing into - * canvas for some images. - */ - function detectVerticalSquash( img, iw, ih ) { - var canvas = document.createElement('canvas'), - ctx = canvas.getContext('2d'), - sy = 0, - ey = ih, - py = ih, - data, alpha, ratio; - - - canvas.width = 1; - canvas.height = ih; - ctx.drawImage( img, 0, 0 ); - data = ctx.getImageData( 0, 0, 1, ih ).data; - - // search image edge pixel position in case - // it is squashed vertically. - while ( py > sy ) { - alpha = data[ (py - 1) * 4 + 3 ]; - - if ( alpha === 0 ) { - ey = py; - } else { - sy = py; - } - - py = (ey + sy) >> 1; - } - - ratio = (py / ih); - return (ratio === 0) ? 1 : ratio; - } - - // fix ie7 bug - // http://stackoverflow.com/questions/11929099/ - // html5-canvas-drawimage-ratio-bug-ios - if ( Base.os.ios >= 7 ) { - return function( canvas, img, x, y, w, h ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - vertSquashRatio = detectVerticalSquash( img, iw, ih ); - - return canvas.getContext('2d').drawImage( img, 0, 0, - iw * vertSquashRatio, ih * vertSquashRatio, - x, y, w, h ); - }; - } - - /** - * Detect subsampling in loaded image. - * In iOS, larger images than 2M pixels may be - * subsampled in rendering. - */ - function detectSubsampling( img ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - canvas, ctx; - - // subsampling may happen overmegapixel image - if ( iw * ih > 1024 * 1024 ) { - canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - ctx = canvas.getContext('2d'); - ctx.drawImage( img, -iw + 1, 0 ); - - // subsampled image becomes half smaller in rendering size. - // check alpha channel value to confirm image is covering - // edge pixel or not. if alpha value is 0 - // image is not covering, hence subsampled. - return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0; - } else { - return false; - } - } - - - return function( canvas, img, x, y, width, height ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - ctx = canvas.getContext('2d'), - subsampled = detectSubsampling( img ), - doSquash = this.type === 'image/jpeg', - d = 1024, - sy = 0, - dy = 0, - tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx; - - if ( subsampled ) { - iw /= 2; - ih /= 2; - } - - ctx.save(); - tmpCanvas = document.createElement('canvas'); - tmpCanvas.width = tmpCanvas.height = d; - - tmpCtx = tmpCanvas.getContext('2d'); - vertSquashRatio = doSquash ? - detectVerticalSquash( img, iw, ih ) : 1; - - dw = Math.ceil( d * width / iw ); - dh = Math.ceil( d * height / ih / vertSquashRatio ); - - while ( sy < ih ) { - sx = 0; - dx = 0; - while ( sx < iw ) { - tmpCtx.clearRect( 0, 0, d, d ); - tmpCtx.drawImage( img, -sx, -sy ); - ctx.drawImage( tmpCanvas, 0, 0, d, d, - x + dx, y + dy, dw, dh ); - sx += d; - dx += dw; - } - sy += d; - dy += dh; - } - ctx.restore(); - tmpCanvas = tmpCtx = null; - }; - })() - }); - }); - /** - * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug - * android里面toDataUrl('image/jpege')得到的结果却是png. - * - * 所以这里没辙,只能借助这个工具 - * @fileOverview jpeg encoder - */ - define('runtime/html5/jpegencoder',[], function( require, exports, module ) { - - /* - Copyright (c) 2008, Adobe Systems Incorporated - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of Adobe Systems Incorporated nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - /* - JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009 - - Basic GUI blocking jpeg encoder - */ - - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - - var ZigZag = [ - 0, 1, 5, 6,14,15,27,28, - 2, 4, 7,13,16,26,29,42, - 3, 8,12,17,25,30,41,43, - 9,11,18,24,31,40,44,53, - 10,19,23,32,39,45,52,54, - 20,22,33,38,46,51,55,60, - 21,34,37,47,50,56,59,61, - 35,36,48,49,57,58,62,63 - ]; - - var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0]; - var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11]; - var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d]; - var std_ac_luminance_values = [ - 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12, - 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07, - 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, - 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0, - 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16, - 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39, - 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49, - 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69, - 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79, - 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, - 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98, - 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, - 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, - 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5, - 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4, - 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, - 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea, - 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, - 0xf9,0xfa - ]; - - var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0]; - var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11]; - var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77]; - var std_ac_chrominance_values = [ - 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21, - 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71, - 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, - 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0, - 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34, - 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, - 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38, - 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48, - 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, - 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68, - 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78, - 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96, - 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5, - 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, - 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3, - 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2, - 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, - 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9, - 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, - 0xf9,0xfa - ]; - - function initQuantTables(sf){ - var YQT = [ - 16, 11, 10, 16, 24, 40, 51, 61, - 12, 12, 14, 19, 26, 58, 60, 55, - 14, 13, 16, 24, 40, 57, 69, 56, - 14, 17, 22, 29, 51, 87, 80, 62, - 18, 22, 37, 56, 68,109,103, 77, - 24, 35, 55, 64, 81,104,113, 92, - 49, 64, 78, 87,103,121,120,101, - 72, 92, 95, 98,112,100,103, 99 - ]; - - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i]*sf+50)/100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, 18, 24, 47, 99, 99, 99, 99, - 18, 21, 26, 66, 99, 99, 99, 99, - 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j]*sf+50)/100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) - { - for (var col = 0; col < 8; col++) - { - fdtbl_Y[k] = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0)); - fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0)); - k++; - } - } - } - - function computeHuffmanTbl(nrcodes, std_table){ - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue*=2; - } - return HT; - } - - function initHuffmanTbl() - { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values); - } - - function initCategoryNumber() - { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - //Positive numbers - for (var nr = nrlower; nr>0] = 38470 * i; - RGB_YUV_TABLE[(i+ 512)>>0] = 7471 * i + 0x8000; - RGB_YUV_TABLE[(i+ 768)>>0] = -11059 * i; - RGB_YUV_TABLE[(i+1024)>>0] = -21709 * i; - RGB_YUV_TABLE[(i+1280)>>0] = 32768 * i + 0x807FFF; - RGB_YUV_TABLE[(i+1536)>>0] = -27439 * i; - RGB_YUV_TABLE[(i+1792)>>0] = - 5329 * i; - } - } - - // IO functions - function writeBits(bs) - { - var value = bs[0]; - var posval = bs[1]-1; - while ( posval >= 0 ) { - if (value & (1 << posval) ) { - bytenew |= (1 << bytepos); - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 0xFF) { - writeByte(0xFF); - writeByte(0); - } - else { - writeByte(bytenew); - } - bytepos=7; - bytenew=0; - } - } - } - - function writeByte(value) - { - byteout.push(clt[value]); // write char directly instead of converting later - } - - function writeWord(value) - { - writeByte((value>>8)&0xFF); - writeByte((value )&0xFF); - } - - // DCT & quantization core - function fDCTQuant(data, fdtbl) - { - var d0, d1, d2, d3, d4, d5, d6, d7; - /* Pass 1: process rows. */ - var dataOff=0; - var i; - var I8 = 8; - var I64 = 64; - for (i=0; i 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0); - //outputfDCTQuant[i] = fround(fDCTQuant); - - } - return outputfDCTQuant; - } - - function writeAPP0() - { - writeWord(0xFFE0); // marker - writeWord(16); // length - writeByte(0x4A); // J - writeByte(0x46); // F - writeByte(0x49); // I - writeByte(0x46); // F - writeByte(0); // = "JFIF",'\0' - writeByte(1); // versionhi - writeByte(1); // versionlo - writeByte(0); // xyunits - writeWord(1); // xdensity - writeWord(1); // ydensity - writeByte(0); // thumbnwidth - writeByte(0); // thumbnheight - } - - function writeSOF0(width, height) - { - writeWord(0xFFC0); // marker - writeWord(17); // length, truecolor YUV JPG - writeByte(8); // precision - writeWord(height); - writeWord(width); - writeByte(3); // nrofcomponents - writeByte(1); // IdY - writeByte(0x11); // HVY - writeByte(0); // QTY - writeByte(2); // IdU - writeByte(0x11); // HVU - writeByte(1); // QTU - writeByte(3); // IdV - writeByte(0x11); // HVV - writeByte(1); // QTV - } - - function writeDQT() - { - writeWord(0xFFDB); // marker - writeWord(132); // length - writeByte(0); - for (var i=0; i<64; i++) { - writeByte(YTable[i]); - } - writeByte(1); - for (var j=0; j<64; j++) { - writeByte(UVTable[j]); - } - } - - function writeDHT() - { - writeWord(0xFFC4); // marker - writeWord(0x01A2); // length - - writeByte(0); // HTYDCinfo - for (var i=0; i<16; i++) { - writeByte(std_dc_luminance_nrcodes[i+1]); - } - for (var j=0; j<=11; j++) { - writeByte(std_dc_luminance_values[j]); - } - - writeByte(0x10); // HTYACinfo - for (var k=0; k<16; k++) { - writeByte(std_ac_luminance_nrcodes[k+1]); - } - for (var l=0; l<=161; l++) { - writeByte(std_ac_luminance_values[l]); - } - - writeByte(1); // HTUDCinfo - for (var m=0; m<16; m++) { - writeByte(std_dc_chrominance_nrcodes[m+1]); - } - for (var n=0; n<=11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - - writeByte(0x11); // HTUACinfo - for (var o=0; o<16; o++) { - writeByte(std_ac_chrominance_nrcodes[o+1]); - } - for (var p=0; p<=161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - - function writeSOS() - { - writeWord(0xFFDA); // marker - writeWord(12); // length - writeByte(3); // nrofcomponents - writeByte(1); // IdY - writeByte(0); // HTY - writeByte(2); // IdU - writeByte(0x11); // HTU - writeByte(3); // IdV - writeByte(0x11); // HTV - writeByte(0); // Ss - writeByte(0x3f); // Se - writeByte(0); // Bf - } - - function processDU(CDU, fdtbl, DC, HTDC, HTAC){ - var EOB = HTAC[0x00]; - var M16zeroes = HTAC[0xF0]; - var pos; - var I16 = 16; - var I63 = 63; - var I64 = 64; - var DU_DCT = fDCTQuant(CDU, fdtbl); - //ZigZag reorder - for (var j=0;j0)&&(DU[end0pos]==0); end0pos--) {}; - //end0pos = first element in reverse order !=0 - if ( end0pos == 0) { - writeBits(EOB); - return DC; - } - var i = 1; - var lng; - while ( i <= end0pos ) { - var startpos = i; - for (; (DU[i]==0) && (i<=end0pos); ++i) {} - var nrzeroes = i-startpos; - if ( nrzeroes >= I16 ) { - lng = nrzeroes>>4; - for (var nrmarker=1; nrmarker <= lng; ++nrmarker) - writeBits(M16zeroes); - nrzeroes = nrzeroes&0xF; - } - pos = 32767+DU[i]; - writeBits(HTAC[(nrzeroes<<4)+category[pos]]); - writeBits(bitcode[pos]); - i++; - } - if ( end0pos != I63 ) { - writeBits(EOB); - } - return DC; - } - - function initCharLookupTable(){ - var sfcc = String.fromCharCode; - for(var i=0; i < 256; i++){ ///// ACHTUNG // 255 - clt[i] = sfcc(i); - } - } - - this.encode = function(image,quality) // image data object - { - // var time_start = new Date().getTime(); - - if(quality) setQuality(quality); - - // Initialize bit writer - byteout = new Array(); - bytenew=0; - bytepos=7; - - // Add JPEG headers - writeWord(0xFFD8); // SOI - writeAPP0(); - writeDQT(); - writeSOF0(image.width,image.height); - writeDHT(); - writeSOS(); - - - // Encode 8x8 macroblocks - var DCY=0; - var DCU=0; - var DCV=0; - - bytenew=0; - bytepos=7; - - - this.encode.displayName = "_encode_"; - - var imageData = image.data; - var width = image.width; - var height = image.height; - - var quadWidth = width*4; - var tripleWidth = width*3; - - var x, y = 0; - var r, g, b; - var start,p, col,row,pos; - while(y < height){ - x = 0; - while(x < quadWidth){ - start = quadWidth * y + x; - p = start; - col = -1; - row = 0; - - for(pos=0; pos < 64; pos++){ - row = pos >> 3;// /8 - col = ( pos & 7 ) * 4; // %8 - p = start + ( row * quadWidth ) + col; - - if(y+row >= height){ // padding bottom - p-= (quadWidth*(y+1+row-height)); - } - - if(x+col >= quadWidth){ // padding right - p-= ((x+col) - quadWidth +4) - } - - r = imageData[ p++ ]; - g = imageData[ p++ ]; - b = imageData[ p++ ]; - - - /* // calculate YUV values dynamically - YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80 - UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b)); - VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b)); - */ - - // use lookup table (slightly faster) - YDU[pos] = ((RGB_YUV_TABLE[r] + RGB_YUV_TABLE[(g + 256)>>0] + RGB_YUV_TABLE[(b + 512)>>0]) >> 16)-128; - UDU[pos] = ((RGB_YUV_TABLE[(r + 768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128; - VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128; - - } - - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - x+=32; - } - y+=8; - } - - - //////////////////////////////////////////////////////////////// - - // Do the bit alignment of the EOI marker - if ( bytepos >= 0 ) { - var fillbits = []; - fillbits[1] = bytepos+1; - fillbits[0] = (1<<(bytepos+1))-1; - writeBits(fillbits); - } - - writeWord(0xFFD9); //EOI - - var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join('')); - - byteout = []; - - // benchmarking - // var duration = new Date().getTime() - time_start; - // console.log('Encoding time: '+ currentQuality + 'ms'); - // - - return jpegDataUri - } - - function setQuality(quality){ - if (quality <= 0) { - quality = 1; - } - if (quality > 100) { - quality = 100; - } - - if(currentQuality == quality) return // don't recalc if unchanged - - var sf = 0; - if (quality < 50) { - sf = Math.floor(5000 / quality); - } else { - sf = Math.floor(200 - quality*2); - } - - initQuantTables(sf); - currentQuality = quality; - // console.log('Quality set to: '+quality +'%'); - } - - function init(){ - // var time_start = new Date().getTime(); - if(!quality) quality = 50; - // Create tables - initCharLookupTable() - initHuffmanTbl(); - initCategoryNumber(); - initRGBYUVTable(); - - setQuality(quality); - // var duration = new Date().getTime() - time_start; - // console.log('Initialization '+ duration + 'ms'); - } - - init(); - - }; - - JPEGEncoder.encode = function( data, quality ) { - var encoder = new JPEGEncoder( quality ); - - return encoder.encode( data ); - } - - return JPEGEncoder; - }); - /** - * @fileOverview Fix android canvas.toDataUrl bug. - */ - define('runtime/html5/androidpatch',[ - 'runtime/html5/util', - 'runtime/html5/jpegencoder', - 'base' - ], function( Util, encoder, Base ) { - var origin = Util.canvasToDataUrl, - supportJpeg; - - Util.canvasToDataUrl = function( canvas, type, quality ) { - var ctx, w, h, fragement, parts; - - // 非android手机直接跳过。 - if ( !Base.os.android ) { - return origin.apply( null, arguments ); - } - - // 检测是否canvas支持jpeg导出,根据数据格式来判断。 - // JPEG 前两位分别是:255, 216 - if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) { - fragement = origin.apply( null, arguments ); - - parts = fragement.split(','); - - if ( ~parts[ 0 ].indexOf('base64') ) { - fragement = atob( parts[ 1 ] ); - } else { - fragement = decodeURIComponent( parts[ 1 ] ); - } - - fragement = fragement.substring( 0, 2 ); - - supportJpeg = fragement.charCodeAt( 0 ) === 255 && - fragement.charCodeAt( 1 ) === 216; - } - - // 只有在android环境下才修复 - if ( type === 'image/jpeg' && !supportJpeg ) { - w = canvas.width; - h = canvas.height; - ctx = canvas.getContext('2d'); - - return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality ); - } - - return origin.apply( null, arguments ); - }; - }); - /** - * @fileOverview Transport - * @todo 支持chunked传输,优势: - * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分, - * 而不需要重头再传一次。另外断点续传也需要用chunked方式。 - */ - define('runtime/html5/transport',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var noop = Base.noop, - $ = Base.$; - - return Html5Runtime.register( 'Transport', { - init: function() { - this._status = 0; - this._response = null; - }, - - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - formData, binary, fr; - - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); - - binary = blob.getSource(); - } else { - formData = new FormData(); - $.each( owner._formData, function( k, v ) { - formData.append( k, v ); - }); - - formData.append( opts.fileVal, blob.getSource(), - opts.filename || owner._formData.name || '' ); - } - - if ( opts.withCredentials && 'withCredentials' in xhr ) { - xhr.open( opts.method, server, true ); - xhr.withCredentials = true; - } else { - xhr.open( opts.method, server ); - } - - this._setRequestHeader( xhr, opts.headers ); - - if ( binary ) { - xhr.overrideMimeType('application/octet-stream'); - - // android直接发送blob会导致服务端接收到的是空文件。 - // bug详情。 - // https://code.google.com/p/android/issues/detail?id=39882 - // 所以先用fileReader读取出来再通过arraybuffer的方式发送。 - if ( Base.os.android ) { - fr = new FileReader(); - - fr.onload = function() { - xhr.send( this.result ); - fr = fr.onload = null; - }; - - fr.readAsArrayBuffer( binary ); - } else { - xhr.send( binary ); - } - } else { - xhr.send( formData ); - } - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._parseJson( this._response ); - }, - - getStatus: function() { - return this._status; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - xhr.abort(); - - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new XMLHttpRequest(), - opts = this.options; - - if ( opts.withCredentials && !('withCredentials' in xhr) && - typeof XDomainRequest !== 'undefined' ) { - xhr = new XDomainRequest(); - } - - xhr.upload.onprogress = function( e ) { - var percentage = 0; - - if ( e.lengthComputable ) { - percentage = e.loaded / e.total; - } - - return me.trigger( 'progress', percentage ); - }; - - xhr.onreadystatechange = function() { - - if ( xhr.readyState !== 4 ) { - return; - } - - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - me._xhr = null; - me._status = xhr.status; - - if ( xhr.status >= 200 && xhr.status < 300 ) { - me._response = xhr.responseText; - return me.trigger('load'); - } else if ( xhr.status >= 500 && xhr.status < 600 ) { - me._response = xhr.responseText; - return me.trigger( 'error', 'server' ); - } - - - return me.trigger( 'error', me._status ? 'http' : 'abort' ); - }; - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.setRequestHeader( key, val ); - }); - }, - - _parseJson: function( str ) { - var json; - - try { - json = JSON.parse( str ); - } catch ( ex ) { - json = {}; - } - - return json; - } - }); - }); - define('webuploader',[ - 'base', - 'widgets/filepicker', - 'widgets/image', - 'widgets/queue', - 'widgets/runtime', - 'widgets/upload', - 'runtime/html5/blob', - 'runtime/html5/filepicker', - 'runtime/html5/imagemeta/exif', - 'runtime/html5/image', - 'runtime/html5/androidpatch', - 'runtime/html5/transport' - ], function( Base ) { - return Base; - }); - return require('webuploader'); -}); diff --git a/public/js/ueditor/third-party/webuploader/webuploader.flashonly.js b/public/js/ueditor/third-party/webuploader/webuploader.flashonly.js deleted file mode 100644 index 10f4496..0000000 --- a/public/js/ueditor/third-party/webuploader/webuploader.flashonly.js +++ /dev/null @@ -1,4176 +0,0 @@ -/*! WebUploader 0.1.2 */ - - -/** - * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。 - * - * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。 - */ -(function( root, factory ) { - var modules = {}, - - // 内部require, 简单不完全实现。 - // https://github.com/amdjs/amdjs-api/wiki/require - _require = function( deps, callback ) { - var args, len, i; - - // 如果deps不是数组,则直接返回指定module - if ( typeof deps === 'string' ) { - return getModule( deps ); - } else { - args = []; - for( len = deps.length, i = 0; i < len; i++ ) { - args.push( getModule( deps[ i ] ) ); - } - - return callback.apply( null, args ); - } - }, - - // 内部define,暂时不支持不指定id. - _define = function( id, deps, factory ) { - if ( arguments.length === 2 ) { - factory = deps; - deps = null; - } - - _require( deps || [], function() { - setModule( id, factory, arguments ); - }); - }, - - // 设置module, 兼容CommonJs写法。 - setModule = function( id, factory, args ) { - var module = { - exports: factory - }, - returned; - - if ( typeof factory === 'function' ) { - args.length || (args = [ _require, module.exports, module ]); - returned = factory.apply( null, args ); - returned !== undefined && (module.exports = returned); - } - - modules[ id ] = module.exports; - }, - - // 根据id获取module - getModule = function( id ) { - var module = modules[ id ] || root[ id ]; - - if ( !module ) { - throw new Error( '`' + id + '` is undefined' ); - } - - return module; - }, - - // 将所有modules,将路径ids装换成对象。 - exportsTo = function( obj ) { - var key, host, parts, part, last, ucFirst; - - // make the first character upper case. - ucFirst = function( str ) { - return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 )); - }; - - for ( key in modules ) { - host = obj; - - if ( !modules.hasOwnProperty( key ) ) { - continue; - } - - parts = key.split('/'); - last = ucFirst( parts.pop() ); - - while( (part = ucFirst( parts.shift() )) ) { - host[ part ] = host[ part ] || {}; - host = host[ part ]; - } - - host[ last ] = modules[ key ]; - } - }, - - exports = factory( root, _define, _require ), - origin; - - // exports every module. - exportsTo( exports ); - - if ( typeof module === 'object' && typeof module.exports === 'object' ) { - - // For CommonJS and CommonJS-like environments where a proper window is present, - module.exports = exports; - } else if ( typeof define === 'function' && define.amd ) { - - // Allow using this built library as an AMD module - // in another project. That other project will only - // see this AMD call, not the internal modules in - // the closure below. - define([], exports ); - } else { - - // Browser globals case. Just assign the - // result to a property on the global. - origin = root.WebUploader; - root.WebUploader = exports; - root.WebUploader.noConflict = function() { - root.WebUploader = origin; - }; - } -})( this, function( window, define, require ) { - - - /** - * @fileOverview jQuery or Zepto - */ - define('dollar-third',[],function() { - return window.jQuery || window.Zepto; - }); - /** - * @fileOverview Dom 操作相关 - */ - define('dollar',[ - 'dollar-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 使用jQuery的Promise - */ - define('promise-third',[ - 'dollar' - ], function( $ ) { - return { - Deferred: $.Deferred, - when: $.when, - - isPromise: function( anything ) { - return anything && typeof anything.then === 'function'; - } - }; - }); - /** - * @fileOverview Promise/A+ - */ - define('promise',[ - 'promise-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 基础类方法。 - */ - - /** - * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。 - * - * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id. - * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: - * - * * module `base`:WebUploader.Base - * * module `file`: WebUploader.File - * * module `lib/dnd`: WebUploader.Lib.Dnd - * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd - * - * - * 以下文档将可能省略`WebUploader`前缀。 - * @module WebUploader - * @title WebUploader API文档 - */ - define('base',[ - 'dollar', - 'promise' - ], function( $, promise ) { - - var noop = function() {}, - call = Function.call; - - // http://jsperf.com/uncurrythis - // 反科里化 - function uncurryThis( fn ) { - return function() { - return call.apply( fn, arguments ); - }; - } - - function bindFn( fn, context ) { - return function() { - return fn.apply( context, arguments ); - }; - } - - function createObject( proto ) { - var f; - - if ( Object.create ) { - return Object.create( proto ); - } else { - f = function() {}; - f.prototype = proto; - return new f(); - } - } - - - /** - * 基础类,提供一些简单常用的方法。 - * @class Base - */ - return { - - /** - * @property {String} version 当前版本号。 - */ - version: '0.1.2', - - /** - * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。 - */ - $: $, - - Deferred: promise.Deferred, - - isPromise: promise.isPromise, - - when: promise.when, - - /** - * @description 简单的浏览器检查结果。 - * - * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。 - * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。 - * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+** - * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。 - * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。 - * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。 - * - * @property {Object} [browser] - */ - browser: (function( ua ) { - var ret = {}, - webkit = ua.match( /WebKit\/([\d.]+)/ ), - chrome = ua.match( /Chrome\/([\d.]+)/ ) || - ua.match( /CriOS\/([\d.]+)/ ), - - ie = ua.match( /MSIE\s([\d\.]+)/ ) || - ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i), - firefox = ua.match( /Firefox\/([\d.]+)/ ), - safari = ua.match( /Safari\/([\d.]+)/ ), - opera = ua.match( /OPR\/([\d.]+)/ ); - - webkit && (ret.webkit = parseFloat( webkit[ 1 ] )); - chrome && (ret.chrome = parseFloat( chrome[ 1 ] )); - ie && (ret.ie = parseFloat( ie[ 1 ] )); - firefox && (ret.firefox = parseFloat( firefox[ 1 ] )); - safari && (ret.safari = parseFloat( safari[ 1 ] )); - opera && (ret.opera = parseFloat( opera[ 1 ] )); - - return ret; - })( navigator.userAgent ), - - /** - * @description 操作系统检查结果。 - * - * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。 - * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。 - * @property {Object} [os] - */ - os: (function( ua ) { - var ret = {}, - - // osx = !!ua.match( /\(Macintosh\; Intel / ), - android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ), - ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ ); - - // osx && (ret.osx = true); - android && (ret.android = parseFloat( android[ 1 ] )); - ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) )); - - return ret; - })( navigator.userAgent ), - - /** - * 实现类与类之间的继承。 - * @method inherits - * @grammar Base.inherits( super ) => child - * @grammar Base.inherits( super, protos ) => child - * @grammar Base.inherits( super, protos, statics ) => child - * @param {Class} super 父类 - * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。 - * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。 - * @param {Object} [statics] 静态属性或方法。 - * @return {Class} 返回子类。 - * @example - * function Person() { - * console.log( 'Super' ); - * } - * Person.prototype.hello = function() { - * console.log( 'hello' ); - * }; - * - * var Manager = Base.inherits( Person, { - * world: function() { - * console.log( 'World' ); - * } - * }); - * - * // 因为没有指定构造器,父类的构造器将会执行。 - * var instance = new Manager(); // => Super - * - * // 继承子父类的方法 - * instance.hello(); // => hello - * instance.world(); // => World - * - * // 子类的__super__属性指向父类 - * console.log( Manager.__super__ === Person ); // => true - */ - inherits: function( Super, protos, staticProtos ) { - var child; - - if ( typeof protos === 'function' ) { - child = protos; - protos = null; - } else if ( protos && protos.hasOwnProperty('constructor') ) { - child = protos.constructor; - } else { - child = function() { - return Super.apply( this, arguments ); - }; - } - - // 复制静态方法 - $.extend( true, child, Super, staticProtos || {} ); - - /* jshint camelcase: false */ - - // 让子类的__super__属性指向父类。 - child.__super__ = Super.prototype; - - // 构建原型,添加原型方法或属性。 - // 暂时用Object.create实现。 - child.prototype = createObject( Super.prototype ); - protos && $.extend( true, child.prototype, protos ); - - return child; - }, - - /** - * 一个不做任何事情的方法。可以用来赋值给默认的callback. - * @method noop - */ - noop: noop, - - /** - * 返回一个新的方法,此方法将已指定的`context`来执行。 - * @grammar Base.bindFn( fn, context ) => Function - * @method bindFn - * @example - * var doSomething = function() { - * console.log( this.name ); - * }, - * obj = { - * name: 'Object Name' - * }, - * aliasFn = Base.bind( doSomething, obj ); - * - * aliasFn(); // => Object Name - * - */ - bindFn: bindFn, - - /** - * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。 - * @grammar Base.log( args... ) => undefined - * @method log - */ - log: (function() { - if ( window.console ) { - return bindFn( console.log, console ); - } - return noop; - })(), - - nextTick: (function() { - - return function( cb ) { - setTimeout( cb, 1 ); - }; - - // @bug 当浏览器不在当前窗口时就停了。 - // var next = window.requestAnimationFrame || - // window.webkitRequestAnimationFrame || - // window.mozRequestAnimationFrame || - // function( cb ) { - // window.setTimeout( cb, 1000 / 60 ); - // }; - - // // fix: Uncaught TypeError: Illegal invocation - // return bindFn( next, window ); - })(), - - /** - * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。 - * 将用来将非数组对象转化成数组对象。 - * @grammar Base.slice( target, start[, end] ) => Array - * @method slice - * @example - * function doSomthing() { - * var args = Base.slice( arguments, 1 ); - * console.log( args ); - * } - * - * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"] - */ - slice: uncurryThis( [].slice ), - - /** - * 生成唯一的ID - * @method guid - * @grammar Base.guid() => String - * @grammar Base.guid( prefx ) => String - */ - guid: (function() { - var counter = 0; - - return function( prefix ) { - var guid = (+new Date()).toString( 32 ), - i = 0; - - for ( ; i < 5; i++ ) { - guid += Math.floor( Math.random() * 65535 ).toString( 32 ); - } - - return (prefix || 'wu_') + guid + (counter++).toString( 32 ); - }; - })(), - - /** - * 格式化文件大小, 输出成带单位的字符串 - * @method formatSize - * @grammar Base.formatSize( size ) => String - * @grammar Base.formatSize( size, pointLength ) => String - * @grammar Base.formatSize( size, pointLength, units ) => String - * @param {Number} size 文件大小 - * @param {Number} [pointLength=2] 精确到的小数点数。 - * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. - * @example - * console.log( Base.formatSize( 100 ) ); // => 100B - * console.log( Base.formatSize( 1024 ) ); // => 1.00K - * console.log( Base.formatSize( 1024, 0 ) ); // => 1K - * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M - * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G - * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB - */ - formatSize: function( size, pointLength, units ) { - var unit; - - units = units || [ 'B', 'K', 'M', 'G', 'TB' ]; - - while ( (unit = units.shift()) && size > 1024 ) { - size = size / 1024; - } - - return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) + - unit; - } - }; - }); - /** - * 事件处理类,可以独立使用,也可以扩展给对象使用。 - * @fileOverview Mediator - */ - define('mediator',[ - 'base' - ], function( Base ) { - var $ = Base.$, - slice = [].slice, - separator = /\s+/, - protos; - - // 根据条件过滤出事件handlers. - function findHandlers( arr, name, callback, context ) { - return $.grep( arr, function( handler ) { - return handler && - (!name || handler.e === name) && - (!callback || handler.cb === callback || - handler.cb._cb === callback) && - (!context || handler.ctx === context); - }); - } - - function eachEvent( events, callback, iterator ) { - // 不支持对象,只支持多个event用空格隔开 - $.each( (events || '').split( separator ), function( _, key ) { - iterator( key, callback ); - }); - } - - function triggerHanders( events, args ) { - var stoped = false, - i = -1, - len = events.length, - handler; - - while ( ++i < len ) { - handler = events[ i ]; - - if ( handler.cb.apply( handler.ctx2, args ) === false ) { - stoped = true; - break; - } - } - - return !stoped; - } - - protos = { - - /** - * 绑定事件。 - * - * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如 - * ```javascript - * var obj = {}; - * - * // 使得obj有事件行为 - * Mediator.installTo( obj ); - * - * obj.on( 'testa', function( arg1, arg2 ) { - * console.log( arg1, arg2 ); // => 'arg1', 'arg2' - * }); - * - * obj.trigger( 'testa', 'arg1', 'arg2' ); - * ``` - * - * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。 - * 切会影响到`trigger`方法的返回值,为`false`。 - * - * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处, - * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。 - * ```javascript - * obj.on( 'all', function( type, arg1, arg2 ) { - * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2' - * }); - * ``` - * - * @method on - * @grammar on( name, callback[, context] ) => self - * @param {String} name 事件名,支持多个事件用空格隔开 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - * @class Mediator - */ - on: function( name, callback, context ) { - var me = this, - set; - - if ( !callback ) { - return this; - } - - set = this._events || (this._events = []); - - eachEvent( name, callback, function( name, callback ) { - var handler = { e: name }; - - handler.cb = callback; - handler.ctx = context; - handler.ctx2 = context || me; - handler.id = set.length; - - set.push( handler ); - }); - - return this; - }, - - /** - * 绑定事件,且当handler执行完后,自动解除绑定。 - * @method once - * @grammar once( name, callback[, context] ) => self - * @param {String} name 事件名 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - once: function( name, callback, context ) { - var me = this; - - if ( !callback ) { - return me; - } - - eachEvent( name, callback, function( name, callback ) { - var once = function() { - me.off( name, once ); - return callback.apply( context || me, arguments ); - }; - - once._cb = callback; - me.on( name, once, context ); - }); - - return me; - }, - - /** - * 解除事件绑定 - * @method off - * @grammar off( [name[, callback[, context] ] ] ) => self - * @param {String} [name] 事件名 - * @param {Function} [callback] 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - off: function( name, cb, ctx ) { - var events = this._events; - - if ( !events ) { - return this; - } - - if ( !name && !cb && !ctx ) { - this._events = []; - return this; - } - - eachEvent( name, cb, function( name, cb ) { - $.each( findHandlers( events, name, cb, ctx ), function() { - delete events[ this.id ]; - }); - }); - - return this; - }, - - /** - * 触发事件 - * @method trigger - * @grammar trigger( name[, args...] ) => self - * @param {String} type 事件名 - * @param {*} [...] 任意参数 - * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true - */ - trigger: function( type ) { - var args, events, allEvents; - - if ( !this._events || !type ) { - return this; - } - - args = slice.call( arguments, 1 ); - events = findHandlers( this._events, type ); - allEvents = findHandlers( this._events, 'all' ); - - return triggerHanders( events, args ) && - triggerHanders( allEvents, arguments ); - } - }; - - /** - * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。 - * 主要目的是负责模块与模块之间的合作,降低耦合度。 - * - * @class Mediator - */ - return $.extend({ - - /** - * 可以通过这个接口,使任何对象具备事件功能。 - * @method installTo - * @param {Object} obj 需要具备事件行为的对象。 - * @return {Object} 返回obj. - */ - installTo: function( obj ) { - return $.extend( obj, protos ); - } - - }, protos ); - }); - /** - * @fileOverview Uploader上传类 - */ - define('uploader',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$; - - /** - * 上传入口类。 - * @class Uploader - * @constructor - * @grammar new Uploader( opts ) => Uploader - * @example - * var uploader = WebUploader.Uploader({ - * swf: 'path_of_swf/Uploader.swf', - * - * // 开起分片上传。 - * chunked: true - * }); - */ - function Uploader( opts ) { - this.options = $.extend( true, {}, Uploader.options, opts ); - this._init( this.options ); - } - - // default Options - // widgets中有相应扩展 - Uploader.options = {}; - Mediator.installTo( Uploader.prototype ); - - // 批量添加纯命令式方法。 - $.each({ - upload: 'start-upload', - stop: 'stop-upload', - getFile: 'get-file', - getFiles: 'get-files', - addFile: 'add-file', - addFiles: 'add-file', - sort: 'sort-files', - removeFile: 'remove-file', - skipFile: 'skip-file', - retry: 'retry', - isInProgress: 'is-in-progress', - makeThumb: 'make-thumb', - getDimension: 'get-dimension', - addButton: 'add-btn', - getRuntimeType: 'get-runtime-type', - refresh: 'refresh', - disable: 'disable', - enable: 'enable', - reset: 'reset' - }, function( fn, command ) { - Uploader.prototype[ fn ] = function() { - return this.request( command, arguments ); - }; - }); - - $.extend( Uploader.prototype, { - state: 'pending', - - _init: function( opts ) { - var me = this; - - me.request( 'init', opts, function() { - me.state = 'ready'; - me.trigger('ready'); - }); - }, - - /** - * 获取或者设置Uploader配置项。 - * @method option - * @grammar option( key ) => * - * @grammar option( key, val ) => self - * @example - * - * // 初始状态图片上传前不会压缩 - * var uploader = new WebUploader.Uploader({ - * resize: null; - * }); - * - * // 修改后图片上传前,尝试将图片压缩到1600 * 1600 - * uploader.options( 'resize', { - * width: 1600, - * height: 1600 - * }); - */ - option: function( key, val ) { - var opts = this.options; - - // setter - if ( arguments.length > 1 ) { - - if ( $.isPlainObject( val ) && - $.isPlainObject( opts[ key ] ) ) { - $.extend( opts[ key ], val ); - } else { - opts[ key ] = val; - } - - } else { // getter - return key ? opts[ key ] : opts; - } - }, - - /** - * 获取文件统计信息。返回一个包含一下信息的对象。 - * * `successNum` 上传成功的文件数 - * * `uploadFailNum` 上传失败的文件数 - * * `cancelNum` 被删除的文件数 - * * `invalidNum` 无效的文件数 - * * `queueNum` 还在队列中的文件数 - * @method getStats - * @grammar getStats() => Object - */ - getStats: function() { - // return this._mgr.getStats.apply( this._mgr, arguments ); - var stats = this.request('get-stats'); - - return { - successNum: stats.numOfSuccess, - - // who care? - // queueFailNum: 0, - cancelNum: stats.numOfCancel, - invalidNum: stats.numOfInvalid, - uploadFailNum: stats.numOfUploadFailed, - queueNum: stats.numOfQueue - }; - }, - - // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器 - trigger: function( type/*, args...*/ ) { - var args = [].slice.call( arguments, 1 ), - opts = this.options, - name = 'on' + type.substring( 0, 1 ).toUpperCase() + - type.substring( 1 ); - - if ( - // 调用通过on方法注册的handler. - Mediator.trigger.apply( this, arguments ) === false || - - // 调用opts.onEvent - $.isFunction( opts[ name ] ) && - opts[ name ].apply( this, args ) === false || - - // 调用this.onEvent - $.isFunction( this[ name ] ) && - this[ name ].apply( this, args ) === false || - - // 广播所有uploader的事件。 - Mediator.trigger.apply( Mediator, - [ this, type ].concat( args ) ) === false ) { - - return false; - } - - return true; - }, - - // widgets/widget.js将补充此方法的详细文档。 - request: Base.noop - }); - - /** - * 创建Uploader实例,等同于new Uploader( opts ); - * @method create - * @class Base - * @static - * @grammar Base.create( opts ) => Uploader - */ - Base.create = Uploader.create = function( opts ) { - return new Uploader( opts ); - }; - - // 暴露Uploader,可以通过它来扩展业务逻辑。 - Base.Uploader = Uploader; - - return Uploader; - }); - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/runtime',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - factories = {}, - - // 获取对象的第一个key - getFirstKey = function( obj ) { - for ( var key in obj ) { - if ( obj.hasOwnProperty( key ) ) { - return key; - } - } - return null; - }; - - // 接口类。 - function Runtime( options ) { - this.options = $.extend({ - container: document.body - }, options ); - this.uid = Base.guid('rt_'); - } - - $.extend( Runtime.prototype, { - - getContainer: function() { - var opts = this.options, - parent, container; - - if ( this._container ) { - return this._container; - } - - parent = $( opts.container || document.body ); - container = $( document.createElement('div') ); - - container.attr( 'id', 'rt_' + this.uid ); - container.css({ - position: 'absolute', - top: '0px', - left: '0px', - width: '1px', - height: '1px', - overflow: 'hidden' - }); - - parent.append( container ); - parent.addClass('webuploader-container'); - this._container = container; - return container; - }, - - init: Base.noop, - exec: Base.noop, - - destroy: function() { - if ( this._container ) { - this._container.parentNode.removeChild( this.__container ); - } - - this.off(); - } - }); - - Runtime.orders = 'html5,flash'; - - - /** - * 添加Runtime实现。 - * @param {String} type 类型 - * @param {Runtime} factory 具体Runtime实现。 - */ - Runtime.addRuntime = function( type, factory ) { - factories[ type ] = factory; - }; - - Runtime.hasRuntime = function( type ) { - return !!(type ? factories[ type ] : getFirstKey( factories )); - }; - - Runtime.create = function( opts, orders ) { - var type, runtime; - - orders = orders || Runtime.orders; - $.each( orders.split( /\s*,\s*/g ), function() { - if ( factories[ this ] ) { - type = this; - return false; - } - }); - - type = type || getFirstKey( factories ); - - if ( !type ) { - throw new Error('Runtime Error'); - } - - runtime = new factories[ type ]( opts ); - return runtime; - }; - - Mediator.installTo( Runtime.prototype ); - return Runtime; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/client',[ - 'base', - 'mediator', - 'runtime/runtime' - ], function( Base, Mediator, Runtime ) { - - var cache; - - cache = (function() { - var obj = {}; - - return { - add: function( runtime ) { - obj[ runtime.uid ] = runtime; - }, - - get: function( ruid, standalone ) { - var i; - - if ( ruid ) { - return obj[ ruid ]; - } - - for ( i in obj ) { - // 有些类型不能重用,比如filepicker. - if ( standalone && obj[ i ].__standalone ) { - continue; - } - - return obj[ i ]; - } - - return null; - }, - - remove: function( runtime ) { - delete obj[ runtime.uid ]; - } - }; - })(); - - function RuntimeClient( component, standalone ) { - var deferred = Base.Deferred(), - runtime; - - this.uid = Base.guid('client_'); - - // 允许runtime没有初始化之前,注册一些方法在初始化后执行。 - this.runtimeReady = function( cb ) { - return deferred.done( cb ); - }; - - this.connectRuntime = function( opts, cb ) { - - // already connected. - if ( runtime ) { - throw new Error('already connected!'); - } - - deferred.done( cb ); - - if ( typeof opts === 'string' && cache.get( opts ) ) { - runtime = cache.get( opts ); - } - - // 像filePicker只能独立存在,不能公用。 - runtime = runtime || cache.get( null, standalone ); - - // 需要创建 - if ( !runtime ) { - runtime = Runtime.create( opts, opts.runtimeOrder ); - runtime.__promise = deferred.promise(); - runtime.once( 'ready', deferred.resolve ); - runtime.init(); - cache.add( runtime ); - runtime.__client = 1; - } else { - // 来自cache - Base.$.extend( runtime.options, opts ); - runtime.__promise.then( deferred.resolve ); - runtime.__client++; - } - - standalone && (runtime.__standalone = standalone); - return runtime; - }; - - this.getRuntime = function() { - return runtime; - }; - - this.disconnectRuntime = function() { - if ( !runtime ) { - return; - } - - runtime.__client--; - - if ( runtime.__client <= 0 ) { - cache.remove( runtime ); - delete runtime.__promise; - runtime.destroy(); - } - - runtime = null; - }; - - this.exec = function() { - if ( !runtime ) { - return; - } - - var args = Base.slice( arguments ); - component && args.unshift( component ); - - return runtime.exec.apply( this, args ); - }; - - this.getRuid = function() { - return runtime && runtime.uid; - }; - - this.destroy = (function( destroy ) { - return function() { - destroy && destroy.apply( this, arguments ); - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }; - })( this.destroy ); - } - - Mediator.installTo( RuntimeClient.prototype ); - return RuntimeClient; - }); - /** - * @fileOverview Blob - */ - define('lib/blob',[ - 'base', - 'runtime/client' - ], function( Base, RuntimeClient ) { - - function Blob( ruid, source ) { - var me = this; - - me.source = source; - me.ruid = ruid; - - RuntimeClient.call( me, 'Blob' ); - - this.uid = source.uid || this.uid; - this.type = source.type || ''; - this.size = source.size || 0; - - if ( ruid ) { - me.connectRuntime( ruid ); - } - } - - Base.inherits( RuntimeClient, { - constructor: Blob, - - slice: function( start, end ) { - return this.exec( 'slice', start, end ); - }, - - getSource: function() { - return this.source; - } - }); - - return Blob; - }); - /** - * 为了统一化Flash的File和HTML5的File而存在。 - * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。 - * @fileOverview File - */ - define('lib/file',[ - 'base', - 'lib/blob' - ], function( Base, Blob ) { - - var uid = 1, - rExt = /\.([^.]+)$/; - - function File( ruid, file ) { - var ext; - - Blob.apply( this, arguments ); - this.name = file.name || ('untitled' + uid++); - ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : ''; - - // todo 支持其他类型文件的转换。 - - // 如果有mimetype, 但是文件名里面没有找出后缀规律 - if ( !ext && this.type ) { - ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ? - RegExp.$1.toLowerCase() : ''; - this.name += '.' + ext; - } - - // 如果没有指定mimetype, 但是知道文件后缀。 - if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) { - this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext); - } - - this.ext = ext; - this.lastModifiedDate = file.lastModifiedDate || - (new Date()).toLocaleString(); - } - - return Base.inherits( Blob, File ); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepicker',[ - 'base', - 'runtime/client', - 'lib/file' - ], function( Base, RuntimeClent, File ) { - - var $ = Base.$; - - function FilePicker( opts ) { - opts = this.options = $.extend({}, FilePicker.options, opts ); - - opts.container = $( opts.id ); - - if ( !opts.container.length ) { - throw new Error('按钮指定错误'); - } - - opts.innerHTML = opts.innerHTML || opts.label || - opts.container.html() || ''; - - opts.button = $( opts.button || document.createElement('div') ); - opts.button.html( opts.innerHTML ); - opts.container.html( opts.button ); - - RuntimeClent.call( this, 'FilePicker', true ); - } - - FilePicker.options = { - button: null, - container: null, - label: null, - innerHTML: null, - multiple: true, - accept: null, - name: 'file' - }; - - Base.inherits( RuntimeClent, { - constructor: FilePicker, - - init: function() { - var me = this, - opts = me.options, - button = opts.button; - - button.addClass('webuploader-pick'); - - me.on( 'all', function( type ) { - var files; - - switch ( type ) { - case 'mouseenter': - button.addClass('webuploader-pick-hover'); - break; - - case 'mouseleave': - button.removeClass('webuploader-pick-hover'); - break; - - case 'change': - files = me.exec('getFiles'); - me.trigger( 'select', $.map( files, function( file ) { - file = new File( me.getRuid(), file ); - - // 记录来源。 - file._refer = opts.container; - return file; - }), opts.container ); - break; - } - }); - - me.connectRuntime( opts, function() { - me.refresh(); - me.exec( 'init', opts ); - me.trigger('ready'); - }); - - $( window ).on( 'resize', function() { - me.refresh(); - }); - }, - - refresh: function() { - var shimContainer = this.getRuntime().getContainer(), - button = this.options.button, - width = button.outerWidth ? - button.outerWidth() : button.width(), - - height = button.outerHeight ? - button.outerHeight() : button.height(), - - pos = button.offset(); - - width && height && shimContainer.css({ - bottom: 'auto', - right: 'auto', - width: width + 'px', - height: height + 'px' - }).offset( pos ); - }, - - enable: function() { - var btn = this.options.button; - - btn.removeClass('webuploader-pick-disable'); - this.refresh(); - }, - - disable: function() { - var btn = this.options.button; - - this.getRuntime().getContainer().css({ - top: '-99999px' - }); - - btn.addClass('webuploader-pick-disable'); - }, - - destroy: function() { - if ( this.runtime ) { - this.exec('destroy'); - this.disconnectRuntime(); - } - } - }); - - return FilePicker; - }); - - /** - * @fileOverview 组件基类。 - */ - define('widgets/widget',[ - 'base', - 'uploader' - ], function( Base, Uploader ) { - - var $ = Base.$, - _init = Uploader.prototype._init, - IGNORE = {}, - widgetClass = []; - - function isArrayLike( obj ) { - if ( !obj ) { - return false; - } - - var length = obj.length, - type = $.type( obj ); - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === 'array' || type !== 'function' && type !== 'string' && - (length === 0 || typeof length === 'number' && length > 0 && - (length - 1) in obj); - } - - function Widget( uploader ) { - this.owner = uploader; - this.options = uploader.options; - } - - $.extend( Widget.prototype, { - - init: Base.noop, - - // 类Backbone的事件监听声明,监听uploader实例上的事件 - // widget直接无法监听事件,事件只能通过uploader来传递 - invoke: function( apiName, args ) { - - /* - { - 'make-thumb': 'makeThumb' - } - */ - var map = this.responseMap; - - // 如果无API响应声明则忽略 - if ( !map || !(apiName in map) || !(map[ apiName ] in this) || - !$.isFunction( this[ map[ apiName ] ] ) ) { - - return IGNORE; - } - - return this[ map[ apiName ] ].apply( this, args ); - - }, - - /** - * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。 - * @method request - * @grammar request( command, args ) => * | Promise - * @grammar request( command, args, callback ) => Promise - * @for Uploader - */ - request: function() { - return this.owner.request.apply( this.owner, arguments ); - } - }); - - // 扩展Uploader. - $.extend( Uploader.prototype, { - - // 覆写_init用来初始化widgets - _init: function() { - var me = this, - widgets = me._widgets = []; - - $.each( widgetClass, function( _, klass ) { - widgets.push( new klass( me ) ); - }); - - return _init.apply( me, arguments ); - }, - - request: function( apiName, args, callback ) { - var i = 0, - widgets = this._widgets, - len = widgets.length, - rlts = [], - dfds = [], - widget, rlt, promise, key; - - args = isArrayLike( args ) ? args : [ args ]; - - for ( ; i < len; i++ ) { - widget = widgets[ i ]; - rlt = widget.invoke( apiName, args ); - - if ( rlt !== IGNORE ) { - - // Deferred对象 - if ( Base.isPromise( rlt ) ) { - dfds.push( rlt ); - } else { - rlts.push( rlt ); - } - } - } - - // 如果有callback,则用异步方式。 - if ( callback || dfds.length ) { - promise = Base.when.apply( Base, dfds ); - key = promise.pipe ? 'pipe' : 'then'; - - // 很重要不能删除。删除了会死循环。 - // 保证执行顺序。让callback总是在下一个tick中执行。 - return promise[ key ](function() { - var deferred = Base.Deferred(), - args = arguments; - - setTimeout(function() { - deferred.resolve.apply( deferred, args ); - }, 1 ); - - return deferred.promise(); - })[ key ]( callback || Base.noop ); - } else { - return rlts[ 0 ]; - } - } - }); - - /** - * 添加组件 - * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义 - * @param {object} responseMap API名称与函数实现的映射 - * @example - * Uploader.register( { - * init: function( options ) {}, - * makeThumb: function() {} - * }, { - * 'make-thumb': 'makeThumb' - * } ); - */ - Uploader.register = Widget.register = function( responseMap, widgetProto ) { - var map = { init: 'init' }, - klass; - - if ( arguments.length === 1 ) { - widgetProto = responseMap; - widgetProto.responseMap = map; - } else { - widgetProto.responseMap = $.extend( map, responseMap ); - } - - klass = Base.inherits( Widget, widgetProto ); - widgetClass.push( klass ); - - return klass; - }; - - return Widget; - }); - /** - * @fileOverview 文件选择相关 - */ - define('widgets/filepicker',[ - 'base', - 'uploader', - 'lib/filepicker', - 'widgets/widget' - ], function( Base, Uploader, FilePicker ) { - var $ = Base.$; - - $.extend( Uploader.options, { - - /** - * @property {Selector | Object} [pick=undefined] - * @namespace options - * @for Uploader - * @description 指定选择文件的按钮容器,不指定则不创建按钮。 - * - * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。 - * * `label` {String} 请采用 `innerHTML` 代替 - * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。 - * * `multiple` {Boolean} 是否开起同时选择多个文件能力。 - */ - pick: null, - - /** - * @property {Arroy} [accept=null] - * @namespace options - * @for Uploader - * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。 - * - * * `title` {String} 文字描述 - * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。 - * * `mimeTypes` {String} 多个用逗号分割。 - * - * 如: - * - * ``` - * { - * title: 'Images', - * extensions: 'gif,jpg,jpeg,bmp,png', - * mimeTypes: 'image/*' - * } - * ``` - */ - accept: null/*{ - title: 'Images', - extensions: 'gif,jpg,jpeg,bmp,png', - mimeTypes: 'image/*' - }*/ - }); - - return Uploader.register({ - 'add-btn': 'addButton', - refresh: 'refresh', - disable: 'disable', - enable: 'enable' - }, { - - init: function( opts ) { - this.pickers = []; - return opts.pick && this.addButton( opts.pick ); - }, - - refresh: function() { - $.each( this.pickers, function() { - this.refresh(); - }); - }, - - /** - * @method addButton - * @for Uploader - * @grammar addButton( pick ) => Promise - * @description - * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。 - * @example - * uploader.addButton({ - * id: '#btnContainer', - * innerHTML: '选择文件' - * }); - */ - addButton: function( pick ) { - var me = this, - opts = me.options, - accept = opts.accept, - options, picker, deferred; - - if ( !pick ) { - return; - } - - deferred = Base.Deferred(); - $.isPlainObject( pick ) || (pick = { - id: pick - }); - - options = $.extend({}, pick, { - accept: $.isPlainObject( accept ) ? [ accept ] : accept, - swf: opts.swf, - runtimeOrder: opts.runtimeOrder - }); - - picker = new FilePicker( options ); - - picker.once( 'ready', deferred.resolve ); - picker.on( 'select', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - picker.init(); - - this.pickers.push( picker ); - - return deferred.promise(); - }, - - disable: function() { - $.each( this.pickers, function() { - this.disable(); - }); - }, - - enable: function() { - $.each( this.pickers, function() { - this.enable(); - }); - } - }); - }); - /** - * @fileOverview Image - */ - define('lib/image',[ - 'base', - 'runtime/client', - 'lib/blob' - ], function( Base, RuntimeClient, Blob ) { - var $ = Base.$; - - // 构造器。 - function Image( opts ) { - this.options = $.extend({}, Image.options, opts ); - RuntimeClient.call( this, 'Image' ); - - this.on( 'load', function() { - this._info = this.exec('info'); - this._meta = this.exec('meta'); - }); - } - - // 默认选项。 - Image.options = { - - // 默认的图片处理质量 - quality: 90, - - // 是否裁剪 - crop: false, - - // 是否保留头部信息 - preserveHeaders: true, - - // 是否允许放大。 - allowMagnify: true - }; - - // 继承RuntimeClient. - Base.inherits( RuntimeClient, { - constructor: Image, - - info: function( val ) { - - // setter - if ( val ) { - this._info = val; - return this; - } - - // getter - return this._info; - }, - - meta: function( val ) { - - // setter - if ( val ) { - this._meta = val; - return this; - } - - // getter - return this._meta; - }, - - loadFromBlob: function( blob ) { - var me = this, - ruid = blob.getRuid(); - - this.connectRuntime( ruid, function() { - me.exec( 'init', me.options ); - me.exec( 'loadFromBlob', blob ); - }); - }, - - resize: function() { - var args = Base.slice( arguments ); - return this.exec.apply( this, [ 'resize' ].concat( args ) ); - }, - - getAsDataUrl: function( type ) { - return this.exec( 'getAsDataUrl', type ); - }, - - getAsBlob: function( type ) { - var blob = this.exec( 'getAsBlob', type ); - - return new Blob( this.getRuid(), blob ); - } - }); - - return Image; - }); - /** - * @fileOverview 图片操作, 负责预览图片和上传前压缩图片 - */ - define('widgets/image',[ - 'base', - 'uploader', - 'lib/image', - 'widgets/widget' - ], function( Base, Uploader, Image ) { - - var $ = Base.$, - throttle; - - // 根据要处理的文件大小来节流,一次不能处理太多,会卡。 - throttle = (function( max ) { - var occupied = 0, - waiting = [], - tick = function() { - var item; - - while ( waiting.length && occupied < max ) { - item = waiting.shift(); - occupied += item[ 0 ]; - item[ 1 ](); - } - }; - - return function( emiter, size, cb ) { - waiting.push([ size, cb ]); - emiter.once( 'destroy', function() { - occupied -= size; - setTimeout( tick, 1 ); - }); - setTimeout( tick, 1 ); - }; - })( 5 * 1024 * 1024 ); - - $.extend( Uploader.options, { - - /** - * @property {Object} [thumb] - * @namespace options - * @for Uploader - * @description 配置生成缩略图的选项。 - * - * 默认为: - * - * ```javascript - * { - * width: 110, - * height: 110, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 70, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: true, - * - * // 是否允许裁剪。 - * crop: true, - * - * // 是否保留头部meta信息。 - * preserveHeaders: false, - * - * // 为空的话则保留原有图片格式。 - * // 否则强制转换成指定的类型。 - * type: 'image/jpeg' - * } - * ``` - */ - thumb: { - width: 110, - height: 110, - quality: 70, - allowMagnify: true, - crop: true, - preserveHeaders: false, - - // 为空的话则保留原有图片格式。 - // 否则强制转换成指定的类型。 - // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可 - // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg - type: 'image/jpeg' - }, - - /** - * @property {Object} [compress] - * @namespace options - * @for Uploader - * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。 - * - * 默认为: - * - * ```javascript - * { - * width: 1600, - * height: 1600, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 90, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: false, - * - * // 是否允许裁剪。 - * crop: false, - * - * // 是否保留头部meta信息。 - * preserveHeaders: true - * } - * ``` - */ - compress: { - width: 1600, - height: 1600, - quality: 90, - allowMagnify: false, - crop: false, - preserveHeaders: true - } - }); - - return Uploader.register({ - 'make-thumb': 'makeThumb', - 'before-send-file': 'compressImage' - }, { - - - /** - * 生成缩略图,此过程为异步,所以需要传入`callback`。 - * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。 - * - * `callback`中可以接收到两个参数。 - * * 第一个为error,如果生成缩略图有错误,此error将为真。 - * * 第二个为ret, 缩略图的Data URL值。 - * - * **注意** - * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。 - * - * - * @method makeThumb - * @grammar makeThumb( file, callback ) => undefined - * @grammar makeThumb( file, callback, width, height ) => undefined - * @for Uploader - * @example - * - * uploader.on( 'fileQueued', function( file ) { - * var $li = ...; - * - * uploader.makeThumb( file, function( error, ret ) { - * if ( error ) { - * $li.text('预览错误'); - * } else { - * $li.append(''); - * } - * }); - * - * }); - */ - makeThumb: function( file, cb, width, height ) { - var opts, image; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !file.type.match( /^image/ ) ) { - cb( true ); - return; - } - - opts = $.extend({}, this.options.thumb ); - - // 如果传入的是object. - if ( $.isPlainObject( width ) ) { - opts = $.extend( opts, width ); - width = null; - } - - width = width || opts.width; - height = height || opts.height; - - image = new Image( opts ); - - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( width, height ); - }); - - image.once( 'complete', function() { - cb( false, image.getAsDataUrl( opts.type ) ); - image.destroy(); - }); - - image.once( 'error', function() { - cb( true ); - image.destroy(); - }); - - throttle( image, file.source.size, function() { - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - image.loadFromBlob( file.source ); - }); - }, - - compressImage: function( file ) { - var opts = this.options.compress || this.options.resize, - compressSize = opts && opts.compressSize || 300 * 1024, - image, deferred; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) || - file.size < compressSize || - file._compressed ) { - return; - } - - opts = $.extend({}, opts ); - deferred = Base.Deferred(); - - image = new Image( opts ); - - deferred.always(function() { - image.destroy(); - image = null; - }); - image.once( 'error', deferred.reject ); - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( opts.width, opts.height ); - }); - - image.once( 'complete', function() { - var blob, size; - - // 移动端 UC / qq 浏览器的无图模式下 - // ctx.getImageData 处理大图的时候会报 Exception - // INDEX_SIZE_ERR: DOM Exception 1 - try { - blob = image.getAsBlob( opts.type ); - - size = file.size; - - // 如果压缩后,比原来还大则不用压缩后的。 - if ( blob.size < size ) { - // file.source.destroy && file.source.destroy(); - file.source = blob; - file.size = blob.size; - - file.trigger( 'resize', blob.size, size ); - } - - // 标记,避免重复压缩。 - file._compressed = true; - deferred.resolve(); - } catch ( e ) { - // 出错了直接继续,让其上传原始图片 - deferred.resolve(); - } - }); - - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - - image.loadFromBlob( file.source ); - return deferred.promise(); - } - }); - }); - /** - * @fileOverview 文件属性封装 - */ - define('file',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - idPrefix = 'WU_FILE_', - idSuffix = 0, - rExt = /\.([^.]+)$/, - statusMap = {}; - - function gid() { - return idPrefix + idSuffix++; - } - - /** - * 文件类 - * @class File - * @constructor 构造函数 - * @grammar new File( source ) => File - * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。 - */ - function WUFile( source ) { - - /** - * 文件名,包括扩展名(后缀) - * @property name - * @type {string} - */ - this.name = source.name || 'Untitled'; - - /** - * 文件体积(字节) - * @property size - * @type {uint} - * @default 0 - */ - this.size = source.size || 0; - - /** - * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny) - * @property type - * @type {string} - * @default 'application' - */ - this.type = source.type || 'application'; - - /** - * 文件最后修改日期 - * @property lastModifiedDate - * @type {int} - * @default 当前时间戳 - */ - this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1); - - /** - * 文件ID,每个对象具有唯一ID,与文件名无关 - * @property id - * @type {string} - */ - this.id = gid(); - - /** - * 文件扩展名,通过文件名获取,例如test.png的扩展名为png - * @property ext - * @type {string} - */ - this.ext = rExt.exec( this.name ) ? RegExp.$1 : ''; - - - /** - * 状态文字说明。在不同的status语境下有不同的用途。 - * @property statusText - * @type {string} - */ - this.statusText = ''; - - // 存储文件状态,防止通过属性直接修改 - statusMap[ this.id ] = WUFile.Status.INITED; - - this.source = source; - this.loaded = 0; - - this.on( 'error', function( msg ) { - this.setStatus( WUFile.Status.ERROR, msg ); - }); - } - - $.extend( WUFile.prototype, { - - /** - * 设置状态,状态变化时会触发`change`事件。 - * @method setStatus - * @grammar setStatus( status[, statusText] ); - * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status) - * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。 - */ - setStatus: function( status, text ) { - - var prevStatus = statusMap[ this.id ]; - - typeof text !== 'undefined' && (this.statusText = text); - - if ( status !== prevStatus ) { - statusMap[ this.id ] = status; - /** - * 文件状态变化 - * @event statuschange - */ - this.trigger( 'statuschange', status, prevStatus ); - } - - }, - - /** - * 获取文件状态 - * @return {File.Status} - * @example - 文件状态具体包括以下几种类型: - { - // 初始化 - INITED: 0, - // 已入队列 - QUEUED: 1, - // 正在上传 - PROGRESS: 2, - // 上传出错 - ERROR: 3, - // 上传成功 - COMPLETE: 4, - // 上传取消 - CANCELLED: 5 - } - */ - getStatus: function() { - return statusMap[ this.id ]; - }, - - /** - * 获取文件原始信息。 - * @return {*} - */ - getSource: function() { - return this.source; - }, - - destory: function() { - delete statusMap[ this.id ]; - } - }); - - Mediator.installTo( WUFile.prototype ); - - /** - * 文件状态值,具体包括以下几种类型: - * * `inited` 初始状态 - * * `queued` 已经进入队列, 等待上传 - * * `progress` 上传中 - * * `complete` 上传完成。 - * * `error` 上传出错,可重试 - * * `interrupt` 上传中断,可续传。 - * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。 - * * `cancelled` 文件被移除。 - * @property {Object} Status - * @namespace File - * @class File - * @static - */ - WUFile.Status = { - INITED: 'inited', // 初始状态 - QUEUED: 'queued', // 已经进入队列, 等待上传 - PROGRESS: 'progress', // 上传中 - ERROR: 'error', // 上传出错,可重试 - COMPLETE: 'complete', // 上传完成。 - CANCELLED: 'cancelled', // 上传取消。 - INTERRUPT: 'interrupt', // 上传中断,可续传。 - INVALID: 'invalid' // 文件不合格,不能重试上传。 - }; - - return WUFile; - }); - - /** - * @fileOverview 文件队列 - */ - define('queue',[ - 'base', - 'mediator', - 'file' - ], function( Base, Mediator, WUFile ) { - - var $ = Base.$, - STATUS = WUFile.Status; - - /** - * 文件队列, 用来存储各个状态中的文件。 - * @class Queue - * @extends Mediator - */ - function Queue() { - - /** - * 统计文件数。 - * * `numOfQueue` 队列中的文件数。 - * * `numOfSuccess` 上传成功的文件数 - * * `numOfCancel` 被移除的文件数 - * * `numOfProgress` 正在上传中的文件数 - * * `numOfUploadFailed` 上传错误的文件数。 - * * `numOfInvalid` 无效的文件数。 - * @property {Object} stats - */ - this.stats = { - numOfQueue: 0, - numOfSuccess: 0, - numOfCancel: 0, - numOfProgress: 0, - numOfUploadFailed: 0, - numOfInvalid: 0 - }; - - // 上传队列,仅包括等待上传的文件 - this._queue = []; - - // 存储所有文件 - this._map = {}; - } - - $.extend( Queue.prototype, { - - /** - * 将新文件加入对队列尾部 - * - * @method append - * @param {File} file 文件对象 - */ - append: function( file ) { - this._queue.push( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 将新文件加入对队列头部 - * - * @method prepend - * @param {File} file 文件对象 - */ - prepend: function( file ) { - this._queue.unshift( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 获取文件对象 - * - * @method getFile - * @param {String} fileId 文件ID - * @return {File} - */ - getFile: function( fileId ) { - if ( typeof fileId !== 'string' ) { - return fileId; - } - return this._map[ fileId ]; - }, - - /** - * 从队列中取出一个指定状态的文件。 - * @grammar fetch( status ) => File - * @method fetch - * @param {String} status [文件状态值](#WebUploader:File:File.Status) - * @return {File} [File](#WebUploader:File) - */ - fetch: function( status ) { - var len = this._queue.length, - i, file; - - status = status || STATUS.QUEUED; - - for ( i = 0; i < len; i++ ) { - file = this._queue[ i ]; - - if ( status === file.getStatus() ) { - return file; - } - } - - return null; - }, - - /** - * 对队列进行排序,能够控制文件上传顺序。 - * @grammar sort( fn ) => undefined - * @method sort - * @param {Function} fn 排序方法 - */ - sort: function( fn ) { - if ( typeof fn === 'function' ) { - this._queue.sort( fn ); - } - }, - - /** - * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。 - * @grammar getFiles( [status1[, status2 ...]] ) => Array - * @method getFiles - * @param {String} [status] [文件状态值](#WebUploader:File:File.Status) - */ - getFiles: function() { - var sts = [].slice.call( arguments, 0 ), - ret = [], - i = 0, - len = this._queue.length, - file; - - for ( ; i < len; i++ ) { - file = this._queue[ i ]; - - if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) { - continue; - } - - ret.push( file ); - } - - return ret; - }, - - _fileAdded: function( file ) { - var me = this, - existing = this._map[ file.id ]; - - if ( !existing ) { - this._map[ file.id ] = file; - - file.on( 'statuschange', function( cur, pre ) { - me._onFileStatusChange( cur, pre ); - }); - } - - file.setStatus( STATUS.QUEUED ); - }, - - _onFileStatusChange: function( curStatus, preStatus ) { - var stats = this.stats; - - switch ( preStatus ) { - case STATUS.PROGRESS: - stats.numOfProgress--; - break; - - case STATUS.QUEUED: - stats.numOfQueue --; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed--; - break; - - case STATUS.INVALID: - stats.numOfInvalid--; - break; - } - - switch ( curStatus ) { - case STATUS.QUEUED: - stats.numOfQueue++; - break; - - case STATUS.PROGRESS: - stats.numOfProgress++; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed++; - break; - - case STATUS.COMPLETE: - stats.numOfSuccess++; - break; - - case STATUS.CANCELLED: - stats.numOfCancel++; - break; - - case STATUS.INVALID: - stats.numOfInvalid++; - break; - } - } - - }); - - Mediator.installTo( Queue.prototype ); - - return Queue; - }); - /** - * @fileOverview 队列 - */ - define('widgets/queue',[ - 'base', - 'uploader', - 'queue', - 'file', - 'lib/file', - 'runtime/client', - 'widgets/widget' - ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) { - - var $ = Base.$, - rExt = /\.\w+$/, - Status = WUFile.Status; - - return Uploader.register({ - 'sort-files': 'sortFiles', - 'add-file': 'addFiles', - 'get-file': 'getFile', - 'fetch-file': 'fetchFile', - 'get-stats': 'getStats', - 'get-files': 'getFiles', - 'remove-file': 'removeFile', - 'retry': 'retry', - 'reset': 'reset', - 'accept-file': 'acceptFile' - }, { - - init: function( opts ) { - var me = this, - deferred, len, i, item, arr, accept, runtime; - - if ( $.isPlainObject( opts.accept ) ) { - opts.accept = [ opts.accept ]; - } - - // accept中的中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].extensions; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = '\\.' + arr.join(',') - .replace( /,/g, '$|\\.' ) - .replace( /\*/g, '.*' ) + '$'; - } - - me.accept = new RegExp( accept, 'i' ); - } - - me.queue = new Queue(); - me.stats = me.queue.stats; - - // 如果当前不是html5运行时,那就算了。 - // 不执行后续操作 - if ( this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - // 创建一个 html5 运行时的 placeholder - // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。 - deferred = Base.Deferred(); - runtime = new RuntimeClient('Placeholder'); - runtime.connectRuntime({ - runtimeOrder: 'html5' - }, function() { - me._ruid = runtime.getRuid(); - deferred.resolve(); - }); - return deferred.promise(); - }, - - - // 为了支持外部直接添加一个原生File对象。 - _wrapFile: function( file ) { - if ( !(file instanceof WUFile) ) { - - if ( !(file instanceof File) ) { - if ( !this._ruid ) { - throw new Error('Can\'t add external files.'); - } - file = new File( this._ruid, file ); - } - - file = new WUFile( file ); - } - - return file; - }, - - // 判断文件是否可以被加入队列 - acceptFile: function( file ) { - var invalid = !file || file.size < 6 || this.accept && - - // 如果名字中有后缀,才做后缀白名单处理。 - rExt.exec( file.name ) && !this.accept.test( file.name ); - - return !invalid; - }, - - - /** - * @event beforeFileQueued - * @param {File} file File对象 - * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。 - * @for Uploader - */ - - /** - * @event fileQueued - * @param {File} file File对象 - * @description 当文件被加入队列以后触发。 - * @for Uploader - */ - - _addFile: function( file ) { - var me = this; - - file = me._wrapFile( file ); - - // 不过类型判断允许不允许,先派送 `beforeFileQueued` - if ( !me.owner.trigger( 'beforeFileQueued', file ) ) { - return; - } - - // 类型不匹配,则派送错误事件,并返回。 - if ( !me.acceptFile( file ) ) { - me.owner.trigger( 'error', 'Q_TYPE_DENIED', file ); - return; - } - - me.queue.append( file ); - me.owner.trigger( 'fileQueued', file ); - return file; - }, - - getFile: function( fileId ) { - return this.queue.getFile( fileId ); - }, - - /** - * @event filesQueued - * @param {File} files 数组,内容为原始File(lib/File)对象。 - * @description 当一批文件添加进队列以后触发。 - * @for Uploader - */ - - /** - * @method addFiles - * @grammar addFiles( file ) => undefined - * @grammar addFiles( [file1, file2 ...] ) => undefined - * @param {Array of File or File} [files] Files 对象 数组 - * @description 添加文件到队列 - * @for Uploader - */ - addFiles: function( files ) { - var me = this; - - if ( !files.length ) { - files = [ files ]; - } - - files = $.map( files, function( file ) { - return me._addFile( file ); - }); - - me.owner.trigger( 'filesQueued', files ); - - if ( me.options.auto ) { - me.request('start-upload'); - } - }, - - getStats: function() { - return this.stats; - }, - - /** - * @event fileDequeued - * @param {File} file File对象 - * @description 当文件被移除队列后触发。 - * @for Uploader - */ - - /** - * @method removeFile - * @grammar removeFile( file ) => undefined - * @grammar removeFile( id ) => undefined - * @param {File|id} file File对象或这File对象的id - * @description 移除某一文件。 - * @for Uploader - * @example - * - * $li.on('click', '.remove-this', function() { - * uploader.removeFile( file ); - * }) - */ - removeFile: function( file ) { - var me = this; - - file = file.id ? file : me.queue.getFile( file ); - - file.setStatus( Status.CANCELLED ); - me.owner.trigger( 'fileDequeued', file ); - }, - - /** - * @method getFiles - * @grammar getFiles() => Array - * @grammar getFiles( status1, status2, status... ) => Array - * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。 - * @for Uploader - * @example - * console.log( uploader.getFiles() ); // => all files - * console.log( uploader.getFiles('error') ) // => all error files. - */ - getFiles: function() { - return this.queue.getFiles.apply( this.queue, arguments ); - }, - - fetchFile: function() { - return this.queue.fetch.apply( this.queue, arguments ); - }, - - /** - * @method retry - * @grammar retry() => undefined - * @grammar retry( file ) => undefined - * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。 - * @for Uploader - * @example - * function retry() { - * uploader.retry(); - * } - */ - retry: function( file, noForceStart ) { - var me = this, - files, i, len; - - if ( file ) { - file = file.id ? file : me.queue.getFile( file ); - file.setStatus( Status.QUEUED ); - noForceStart || me.request('start-upload'); - return; - } - - files = me.queue.getFiles( Status.ERROR ); - i = 0; - len = files.length; - - for ( ; i < len; i++ ) { - file = files[ i ]; - file.setStatus( Status.QUEUED ); - } - - me.request('start-upload'); - }, - - /** - * @method sort - * @grammar sort( fn ) => undefined - * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。 - * @for Uploader - */ - sortFiles: function() { - return this.queue.sort.apply( this.queue, arguments ); - }, - - /** - * @method reset - * @grammar reset() => undefined - * @description 重置uploader。目前只重置了队列。 - * @for Uploader - * @example - * uploader.reset(); - */ - reset: function() { - this.queue = new Queue(); - this.stats = this.queue.stats; - } - }); - - }); - /** - * @fileOverview 添加获取Runtime相关信息的方法。 - */ - define('widgets/runtime',[ - 'uploader', - 'runtime/runtime', - 'widgets/widget' - ], function( Uploader, Runtime ) { - - Uploader.support = function() { - return Runtime.hasRuntime.apply( Runtime, arguments ); - }; - - return Uploader.register({ - 'predict-runtime-type': 'predictRuntmeType' - }, { - - init: function() { - if ( !this.predictRuntmeType() ) { - throw Error('Runtime Error'); - } - }, - - /** - * 预测Uploader将采用哪个`Runtime` - * @grammar predictRuntmeType() => String - * @method predictRuntmeType - * @for Uploader - */ - predictRuntmeType: function() { - var orders = this.options.runtimeOrder || Runtime.orders, - type = this.type, - i, len; - - if ( !type ) { - orders = orders.split( /\s*,\s*/g ); - - for ( i = 0, len = orders.length; i < len; i++ ) { - if ( Runtime.hasRuntime( orders[ i ] ) ) { - this.type = type = orders[ i ]; - break; - } - } - } - - return type; - } - }); - }); - /** - * @fileOverview Transport - */ - define('lib/transport',[ - 'base', - 'runtime/client', - 'mediator' - ], function( Base, RuntimeClient, Mediator ) { - - var $ = Base.$; - - function Transport( opts ) { - var me = this; - - opts = me.options = $.extend( true, {}, Transport.options, opts || {} ); - RuntimeClient.call( this, 'Transport' ); - - this._blob = null; - this._formData = opts.formData || {}; - this._headers = opts.headers || {}; - - this.on( 'progress', this._timeout ); - this.on( 'load error', function() { - me.trigger( 'progress', 1 ); - clearTimeout( me._timer ); - }); - } - - Transport.options = { - server: '', - method: 'POST', - - // 跨域时,是否允许携带cookie, 只有html5 runtime才有效 - withCredentials: false, - fileVal: 'file', - timeout: 2 * 60 * 1000, // 2分钟 - formData: {}, - headers: {}, - sendAsBinary: false - }; - - $.extend( Transport.prototype, { - - // 添加Blob, 只能添加一次,最后一次有效。 - appendBlob: function( key, blob, filename ) { - var me = this, - opts = me.options; - - if ( me.getRuid() ) { - me.disconnectRuntime(); - } - - // 连接到blob归属的同一个runtime. - me.connectRuntime( blob.ruid, function() { - me.exec('init'); - }); - - me._blob = blob; - opts.fileVal = key || opts.fileVal; - opts.filename = filename || opts.filename; - }, - - // 添加其他字段 - append: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._formData, key ); - } else { - this._formData[ key ] = value; - } - }, - - setRequestHeader: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._headers, key ); - } else { - this._headers[ key ] = value; - } - }, - - send: function( method ) { - this.exec( 'send', method ); - this._timeout(); - }, - - abort: function() { - clearTimeout( this._timer ); - return this.exec('abort'); - }, - - destroy: function() { - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }, - - getResponse: function() { - return this.exec('getResponse'); - }, - - getResponseAsJson: function() { - return this.exec('getResponseAsJson'); - }, - - getStatus: function() { - return this.exec('getStatus'); - }, - - _timeout: function() { - var me = this, - duration = me.options.timeout; - - if ( !duration ) { - return; - } - - clearTimeout( me._timer ); - me._timer = setTimeout(function() { - me.abort(); - me.trigger( 'error', 'timeout' ); - }, duration ); - } - - }); - - // 让Transport具备事件功能。 - Mediator.installTo( Transport.prototype ); - - return Transport; - }); - /** - * @fileOverview 负责文件上传相关。 - */ - define('widgets/upload',[ - 'base', - 'uploader', - 'file', - 'lib/transport', - 'widgets/widget' - ], function( Base, Uploader, WUFile, Transport ) { - - var $ = Base.$, - isPromise = Base.isPromise, - Status = WUFile.Status; - - // 添加默认配置项 - $.extend( Uploader.options, { - - - /** - * @property {Boolean} [prepareNextFile=false] - * @namespace options - * @for Uploader - * @description 是否允许在文件传输时提前把下一个文件准备好。 - * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 - * 如果能提前在当前文件传输期处理,可以节省总体耗时。 - */ - prepareNextFile: false, - - /** - * @property {Boolean} [chunked=false] - * @namespace options - * @for Uploader - * @description 是否要分片处理大文件上传。 - */ - chunked: false, - - /** - * @property {Boolean} [chunkSize=5242880] - * @namespace options - * @for Uploader - * @description 如果要分片,分多大一片? 默认大小为5M. - */ - chunkSize: 5 * 1024 * 1024, - - /** - * @property {Boolean} [chunkRetry=2] - * @namespace options - * @for Uploader - * @description 如果某个分片由于网络问题出错,允许自动重传多少次? - */ - chunkRetry: 2, - - /** - * @property {Boolean} [threads=3] - * @namespace options - * @for Uploader - * @description 上传并发数。允许同时最大上传进程数。 - */ - threads: 3, - - - /** - * @property {Object} [formData] - * @namespace options - * @for Uploader - * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。 - */ - formData: null - - /** - * @property {Object} [fileVal='file'] - * @namespace options - * @for Uploader - * @description 设置文件上传域的name。 - */ - - /** - * @property {Object} [method='POST'] - * @namespace options - * @for Uploader - * @description 文件上传方式,`POST`或者`GET`。 - */ - - /** - * @property {Object} [sendAsBinary=false] - * @namespace options - * @for Uploader - * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容, - * 其他参数在$_GET数组中。 - */ - }); - - // 负责将文件切片。 - function CuteFile( file, chunkSize ) { - var pending = [], - blob = file.source, - total = blob.size, - chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1, - start = 0, - index = 0, - len; - - while ( index < chunks ) { - len = Math.min( chunkSize, total - start ); - - pending.push({ - file: file, - start: start, - end: chunkSize ? (start + len) : total, - total: total, - chunks: chunks, - chunk: index++ - }); - start += len; - } - - file.blocks = pending.concat(); - file.remaning = pending.length; - - return { - file: file, - - has: function() { - return !!pending.length; - }, - - fetch: function() { - return pending.shift(); - } - }; - } - - Uploader.register({ - 'start-upload': 'start', - 'stop-upload': 'stop', - 'skip-file': 'skipFile', - 'is-in-progress': 'isInProgress' - }, { - - init: function() { - var owner = this.owner; - - this.runing = false; - - // 记录当前正在传的数据,跟threads相关 - this.pool = []; - - // 缓存即将上传的文件。 - this.pending = []; - - // 跟踪还有多少分片没有完成上传。 - this.remaning = 0; - this.__tick = Base.bindFn( this._tick, this ); - - owner.on( 'uploadComplete', function( file ) { - // 把其他块取消了。 - file.blocks && $.each( file.blocks, function( _, v ) { - v.transport && (v.transport.abort(), v.transport.destroy()); - delete v.transport; - }); - - delete file.blocks; - delete file.remaning; - }); - }, - - /** - * @event startUpload - * @description 当开始上传流程时触发。 - * @for Uploader - */ - - /** - * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。 - * @grammar upload() => undefined - * @method upload - * @for Uploader - */ - start: function() { - var me = this; - - // 移出invalid的文件 - $.each( me.request( 'get-files', Status.INVALID ), function() { - me.request( 'remove-file', this ); - }); - - if ( me.runing ) { - return; - } - - me.runing = true; - - // 如果有暂停的,则续传 - $.each( me.pool, function( _, v ) { - var file = v.file; - - if ( file.getStatus() === Status.INTERRUPT ) { - file.setStatus( Status.PROGRESS ); - me._trigged = false; - v.transport && v.transport.send(); - } - }); - - me._trigged = false; - me.owner.trigger('startUpload'); - Base.nextTick( me.__tick ); - }, - - /** - * @event stopUpload - * @description 当开始上传流程暂停时触发。 - * @for Uploader - */ - - /** - * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。 - * @grammar stop() => undefined - * @grammar stop( true ) => undefined - * @method stop - * @for Uploader - */ - stop: function( interrupt ) { - var me = this; - - if ( me.runing === false ) { - return; - } - - me.runing = false; - - interrupt && $.each( me.pool, function( _, v ) { - v.transport && v.transport.abort(); - v.file.setStatus( Status.INTERRUPT ); - }); - - me.owner.trigger('stopUpload'); - }, - - /** - * 判断`Uplaode`r是否正在上传中。 - * @grammar isInProgress() => Boolean - * @method isInProgress - * @for Uploader - */ - isInProgress: function() { - return !!this.runing; - }, - - getStats: function() { - return this.request('get-stats'); - }, - - /** - * 掉过一个文件上传,直接标记指定文件为已上传状态。 - * @grammar skipFile( file ) => undefined - * @method skipFile - * @for Uploader - */ - skipFile: function( file, status ) { - file = this.request( 'get-file', file ); - - file.setStatus( status || Status.COMPLETE ); - file.skipped = true; - - // 如果正在上传。 - file.blocks && $.each( file.blocks, function( _, v ) { - var _tr = v.transport; - - if ( _tr ) { - _tr.abort(); - _tr.destroy(); - delete v.transport; - } - }); - - this.owner.trigger( 'uploadSkip', file ); - }, - - /** - * @event uploadFinished - * @description 当所有文件上传结束时触发。 - * @for Uploader - */ - _tick: function() { - var me = this, - opts = me.options, - fn, val; - - // 上一个promise还没有结束,则等待完成后再执行。 - if ( me._promise ) { - return me._promise.always( me.__tick ); - } - - // 还有位置,且还有文件要处理的话。 - if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) { - me._trigged = false; - - fn = function( val ) { - me._promise = null; - - // 有可能是reject过来的,所以要检测val的类型。 - val && val.file && me._startSend( val ); - Base.nextTick( me.__tick ); - }; - - me._promise = isPromise( val ) ? val.always( fn ) : fn( val ); - - // 没有要上传的了,且没有正在传输的了。 - } else if ( !me.remaning && !me.getStats().numOfQueue ) { - me.runing = false; - - me._trigged || Base.nextTick(function() { - me.owner.trigger('uploadFinished'); - }); - me._trigged = true; - } - }, - - _nextBlock: function() { - var me = this, - act = me._act, - opts = me.options, - next, done; - - // 如果当前文件还有没有需要传输的,则直接返回剩下的。 - if ( act && act.has() && - act.file.getStatus() === Status.PROGRESS ) { - - // 是否提前准备下一个文件 - if ( opts.prepareNextFile && !me.pending.length ) { - me._prepareNextFile(); - } - - return act.fetch(); - - // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。 - } else if ( me.runing ) { - - // 如果缓存中有,则直接在缓存中取,没有则去queue中取。 - if ( !me.pending.length && me.getStats().numOfQueue ) { - me._prepareNextFile(); - } - - next = me.pending.shift(); - done = function( file ) { - if ( !file ) { - return null; - } - - act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 ); - me._act = act; - return act.fetch(); - }; - - // 文件可能还在prepare中,也有可能已经完全准备好了。 - return isPromise( next ) ? - next[ next.pipe ? 'pipe' : 'then']( done ) : - done( next ); - } - }, - - - /** - * @event uploadStart - * @param {File} file File对象 - * @description 某个文件开始上传前触发,一个文件只会触发一次。 - * @for Uploader - */ - _prepareNextFile: function() { - var me = this, - file = me.request('fetch-file'), - pending = me.pending, - promise; - - if ( file ) { - promise = me.request( 'before-send-file', file, function() { - - // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued. - if ( file.getStatus() === Status.QUEUED ) { - me.owner.trigger( 'uploadStart', file ); - file.setStatus( Status.PROGRESS ); - return file; - } - - return me._finishFile( file ); - }); - - // 如果还在pending中,则替换成文件本身。 - promise.done(function() { - var idx = $.inArray( promise, pending ); - - ~idx && pending.splice( idx, 1, file ); - }); - - // befeore-send-file的钩子就有错误发生。 - promise.fail(function( reason ) { - file.setStatus( Status.ERROR, reason ); - me.owner.trigger( 'uploadError', file, reason ); - me.owner.trigger( 'uploadComplete', file ); - }); - - pending.push( promise ); - } - }, - - // 让出位置了,可以让其他分片开始上传 - _popBlock: function( block ) { - var idx = $.inArray( block, this.pool ); - - this.pool.splice( idx, 1 ); - block.file.remaning--; - this.remaning--; - }, - - // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。 - _startSend: function( block ) { - var me = this, - file = block.file, - promise; - - me.pool.push( block ); - me.remaning++; - - // 如果没有分片,则直接使用原始的。 - // 不会丢失content-type信息。 - block.blob = block.chunks === 1 ? file.source : - file.source.slice( block.start, block.end ); - - // hook, 每个分片发送之前可能要做些异步的事情。 - promise = me.request( 'before-send', block, function() { - - // 有可能文件已经上传出错了,所以不需要再传输了。 - if ( file.getStatus() === Status.PROGRESS ) { - me._doSend( block ); - } else { - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - - // 如果为fail了,则跳过此分片。 - promise.fail(function() { - if ( file.remaning === 1 ) { - me._finishFile( file ).always(function() { - block.percentage = 1; - me._popBlock( block ); - me.owner.trigger( 'uploadComplete', file ); - Base.nextTick( me.__tick ); - }); - } else { - block.percentage = 1; - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - }, - - - /** - * @event uploadBeforeSend - * @param {Object} object - * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。 - * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 - * @for Uploader - */ - - /** - * @event uploadAccept - * @param {Object} object - * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。 - * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。 - * @for Uploader - */ - - /** - * @event uploadProgress - * @param {File} file File对象 - * @param {Number} percentage 上传进度 - * @description 上传过程中触发,携带上传进度。 - * @for Uploader - */ - - - /** - * @event uploadError - * @param {File} file File对象 - * @param {String} reason 出错的code - * @description 当文件上传出错时触发。 - * @for Uploader - */ - - /** - * @event uploadSuccess - * @param {File} file File对象 - * @param {Object} response 服务端返回的数据 - * @description 当文件上传成功时触发。 - * @for Uploader - */ - - /** - * @event uploadComplete - * @param {File} [file] File对象 - * @description 不管成功或者失败,文件上传完成时触发。 - * @for Uploader - */ - - // 做上传操作。 - _doSend: function( block ) { - var me = this, - owner = me.owner, - opts = me.options, - file = block.file, - tr = new Transport( opts ), - data = $.extend({}, opts.formData ), - headers = $.extend({}, opts.headers ), - requestAccept, ret; - - block.transport = tr; - - tr.on( 'destroy', function() { - delete block.transport; - me._popBlock( block ); - Base.nextTick( me.__tick ); - }); - - // 广播上传进度。以文件为单位。 - tr.on( 'progress', function( percentage ) { - var totalPercent = 0, - uploaded = 0; - - // 可能没有abort掉,progress还是执行进来了。 - // if ( !file.blocks ) { - // return; - // } - - totalPercent = block.percentage = percentage; - - if ( block.chunks > 1 ) { // 计算文件的整体速度。 - $.each( file.blocks, function( _, v ) { - uploaded += (v.percentage || 0) * (v.end - v.start); - }); - - totalPercent = uploaded / file.size; - } - - owner.trigger( 'uploadProgress', file, totalPercent || 0 ); - }); - - // 用来询问,是否返回的结果是有错误的。 - requestAccept = function( reject ) { - var fn; - - ret = tr.getResponseAsJson() || {}; - ret._raw = tr.getResponse(); - fn = function( value ) { - reject = value; - }; - - // 服务端响应了,不代表成功了,询问是否响应正确。 - if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) { - reject = reject || 'server'; - } - - return reject; - }; - - // 尝试重试,然后广播文件上传出错。 - tr.on( 'error', function( type, flag ) { - block.retried = block.retried || 0; - - // 自动重试 - if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) && - block.retried < opts.chunkRetry ) { - - block.retried++; - tr.send(); - - } else { - - // http status 500 ~ 600 - if ( !flag && type === 'server' ) { - type = requestAccept( type ); - } - - file.setStatus( Status.ERROR, type ); - owner.trigger( 'uploadError', file, type ); - owner.trigger( 'uploadComplete', file ); - } - }); - - // 上传成功 - tr.on( 'load', function() { - var reason; - - // 如果非预期,转向上传出错。 - if ( (reason = requestAccept()) ) { - tr.trigger( 'error', reason, true ); - return; - } - - // 全部上传完成。 - if ( file.remaning === 1 ) { - me._finishFile( file, ret ); - } else { - tr.destroy(); - } - }); - - // 配置默认的上传字段。 - data = $.extend( data, { - id: file.id, - name: file.name, - type: file.type, - lastModifiedDate: file.lastModifiedDate, - size: file.size - }); - - block.chunks > 1 && $.extend( data, { - chunks: block.chunks, - chunk: block.chunk - }); - - // 在发送之间可以添加字段什么的。。。 - // 如果默认的字段不够使用,可以通过监听此事件来扩展 - owner.trigger( 'uploadBeforeSend', block, data, headers ); - - // 开始发送。 - tr.appendBlob( opts.fileVal, block.blob, file.name ); - tr.append( data ); - tr.setRequestHeader( headers ); - tr.send(); - }, - - // 完成上传。 - _finishFile: function( file, ret, hds ) { - var owner = this.owner; - - return owner - .request( 'after-send-file', arguments, function() { - file.setStatus( Status.COMPLETE ); - owner.trigger( 'uploadSuccess', file, ret, hds ); - }) - .fail(function( reason ) { - - // 如果外部已经标记为invalid什么的,不再改状态。 - if ( file.getStatus() === Status.PROGRESS ) { - file.setStatus( Status.ERROR, reason ); - } - - owner.trigger( 'uploadError', file, reason ); - }) - .always(function() { - owner.trigger( 'uploadComplete', file ); - }); - } - - }); - }); - /** - * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。 - */ - - define('widgets/validator',[ - 'base', - 'uploader', - 'file', - 'widgets/widget' - ], function( Base, Uploader, WUFile ) { - - var $ = Base.$, - validators = {}, - api; - - /** - * @event error - * @param {String} type 错误类型。 - * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。 - * - * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。 - * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。 - * @for Uploader - */ - - // 暴露给外面的api - api = { - - // 添加验证器 - addValidator: function( type, cb ) { - validators[ type ] = cb; - }, - - // 移除验证器 - removeValidator: function( type ) { - delete validators[ type ]; - } - }; - - // 在Uploader初始化的时候启动Validators的初始化 - Uploader.register({ - init: function() { - var me = this; - $.each( validators, function() { - this.call( me.owner ); - }); - } - }); - - /** - * @property {int} [fileNumLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总数量, 超出则不允许加入队列。 - */ - api.addValidator( 'fileNumLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileNumLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( count >= max && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return count >= max ? false : true; - }); - - uploader.on( 'fileQueued', function() { - count++; - }); - - uploader.on( 'fileDequeued', function() { - count--; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - - /** - * @property {int} [fileSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSizeLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileSizeLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var invalid = count + file.size > max; - - if ( invalid && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return invalid ? false : true; - }); - - uploader.on( 'fileQueued', function( file ) { - count += file.size; - }); - - uploader.on( 'fileDequeued', function( file ) { - count -= file.size; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - /** - * @property {int} [fileSingleSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSingleSizeLimit', function() { - var uploader = this, - opts = uploader.options, - max = opts.fileSingleSizeLimit; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( file.size > max ) { - file.setStatus( WUFile.Status.INVALID, 'exceed_size' ); - this.trigger( 'error', 'F_EXCEED_SIZE', file ); - return false; - } - - }); - - }); - - /** - * @property {int} [duplicate=undefined] - * @namespace options - * @for Uploader - * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key. - */ - api.addValidator( 'duplicate', function() { - var uploader = this, - opts = uploader.options, - mapping = {}; - - if ( opts.duplicate ) { - return; - } - - function hashString( str ) { - var hash = 0, - i = 0, - len = str.length, - _char; - - for ( ; i < len; i++ ) { - _char = str.charCodeAt( i ); - hash = _char + (hash << 6) + (hash << 16) - hash; - } - - return hash; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var hash = file.__hash || (file.__hash = hashString( file.name + - file.size + file.lastModifiedDate )); - - // 已经重复了 - if ( mapping[ hash ] ) { - this.trigger( 'error', 'F_DUPLICATE', file ); - return false; - } - }); - - uploader.on( 'fileQueued', function( file ) { - var hash = file.__hash; - - hash && (mapping[ hash ] = true); - }); - - uploader.on( 'fileDequeued', function( file ) { - var hash = file.__hash; - - hash && (delete mapping[ hash ]); - }); - }); - - return api; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/compbase',[],function() { - - function CompBase( owner, runtime ) { - - this.owner = owner; - this.options = owner.options; - - this.getRuntime = function() { - return runtime; - }; - - this.getRuid = function() { - return runtime.uid; - }; - - this.trigger = function() { - return owner.trigger.apply( owner, arguments ); - }; - } - - return CompBase; - }); - /** - * @fileOverview FlashRuntime - */ - define('runtime/flash/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - - var $ = Base.$, - type = 'flash', - components = {}; - - - function getFlashVersion() { - var version; - - try { - version = navigator.plugins[ 'Shockwave Flash' ]; - version = version.description; - } catch ( ex ) { - try { - version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash') - .GetVariable('$version'); - } catch ( ex2 ) { - version = '0.0'; - } - } - version = version.match( /\d+/g ); - return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 ); - } - - function FlashRuntime() { - var pool = {}, - clients = {}, - destory = this.destory, - me = this, - jsreciver = Base.guid('webuploader_'); - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/ ) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - clients[ uid ] = client; - - if ( components[ comp ] ) { - if ( !pool[ uid ] ) { - pool[ uid ] = new components[ comp ]( client, me ); - } - - instance = pool[ uid ]; - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - - return me.flashExec.apply( client, arguments ); - }; - - function handler( evt, obj ) { - var type = evt.type || evt, - parts, uid; - - parts = type.split('::'); - uid = parts[ 0 ]; - type = parts[ 1 ]; - - // console.log.apply( console, arguments ); - - if ( type === 'Ready' && uid === me.uid ) { - me.trigger('ready'); - } else if ( clients[ uid ] ) { - clients[ uid ].trigger( type.toLowerCase(), evt, obj ); - } - - // Base.log( evt, obj ); - } - - // flash的接受器。 - window[ jsreciver ] = function() { - var args = arguments; - - // 为了能捕获得到。 - setTimeout(function() { - handler.apply( null, args ); - }, 1 ); - }; - - this.jsreciver = jsreciver; - - this.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - - this.flashExec = function( comp, fn ) { - var flash = me.getFlash(), - args = Base.slice( arguments, 2 ); - - return flash.exec( this.uid, comp, fn, args ); - }; - - // @todo - } - - Base.inherits( Runtime, { - constructor: FlashRuntime, - - init: function() { - var container = this.getContainer(), - opts = this.options, - html; - - // if not the minimal height, shims are not initialized - // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc) - container.css({ - position: 'absolute', - top: '-8px', - left: '-8px', - width: '9px', - height: '9px', - overflow: 'hidden' - }); - - // insert flash object - html = '' + - '' + - '' + - '' + - ''; - - container.html( html ); - }, - - getFlash: function() { - if ( this._flash ) { - return this._flash; - } - - this._flash = $( '#' + this.uid ).get( 0 ); - return this._flash; - } - - }); - - FlashRuntime.register = function( name, component ) { - component = components[ name ] = Base.inherits( CompBase, $.extend({ - - // @todo fix this later - flashExec: function() { - var owner = this.owner, - runtime = this.getRuntime(); - - return runtime.flashExec.apply( owner, arguments ); - } - }, component ) ); - - return component; - }; - - if ( getFlashVersion() >= 11.4 ) { - Runtime.addRuntime( type, FlashRuntime ); - } - - return FlashRuntime; - }); - /** - * @fileOverview FilePicker - */ - define('runtime/flash/filepicker',[ - 'base', - 'runtime/flash/runtime' - ], function( Base, FlashRuntime ) { - var $ = Base.$; - - return FlashRuntime.register( 'FilePicker', { - init: function( opts ) { - var copy = $.extend({}, opts ), - len, i; - - // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug. - len = copy.accept && copy.accept.length; - for ( i = 0; i < len; i++ ) { - if ( !copy.accept[ i ].title ) { - copy.accept[ i ].title = 'Files'; - } - } - - delete copy.button; - delete copy.container; - - this.flashExec( 'FilePicker', 'init', copy ); - }, - - destroy: function() { - // todo - } - }); - }); - /** - * @fileOverview 图片压缩 - */ - define('runtime/flash/image',[ - 'runtime/flash/runtime' - ], function( FlashRuntime ) { - - return FlashRuntime.register( 'Image', { - // init: function( options ) { - // var owner = this.owner; - - // this.flashExec( 'Image', 'init', options ); - // owner.on( 'load', function() { - // debugger; - // }); - // }, - - loadFromBlob: function( blob ) { - var owner = this.owner; - - owner.info() && this.flashExec( 'Image', 'info', owner.info() ); - owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() ); - - this.flashExec( 'Image', 'loadFromBlob', blob.uid ); - } - }); - }); - /** - * @fileOverview Transport flash实现 - */ - define('runtime/flash/transport',[ - 'base', - 'runtime/flash/runtime', - 'runtime/client' - ], function( Base, FlashRuntime, RuntimeClient ) { - var $ = Base.$; - - return FlashRuntime.register( 'Transport', { - init: function() { - this._status = 0; - this._response = null; - this._responseJson = null; - }, - - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - binary; - - xhr.connectRuntime( blob.ruid ); - - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); - - binary = blob.uid; - } else { - $.each( owner._formData, function( k, v ) { - xhr.exec( 'append', k, v ); - }); - - xhr.exec( 'appendBlob', opts.fileVal, blob.uid, - opts.filename || owner._formData.name || '' ); - } - - this._setRequestHeader( xhr, opts.headers ); - xhr.exec( 'send', { - method: opts.method, - url: server - }, binary ); - }, - - getStatus: function() { - return this._status; - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._responseJson; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.exec('abort'); - xhr.destroy(); - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new RuntimeClient('XMLHttpRequest'); - - xhr.on( 'uploadprogress progress', function( e ) { - return me.trigger( 'progress', e.loaded / e.total ); - }); - - xhr.on( 'load', function() { - var status = xhr.exec('getStatus'), - err = ''; - - xhr.off(); - me._xhr = null; - - if ( status >= 200 && status < 300 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - } else if ( status >= 500 && status < 600 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - err = 'server'; - } else { - err = 'http'; - } - - xhr.destroy(); - xhr = null; - - return err ? me.trigger( 'error', err ) : me.trigger('load'); - }); - - xhr.on( 'error', function() { - xhr.off(); - me._xhr = null; - me.trigger( 'error', 'http' ); - }); - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.exec( 'setRequestHeader', key, val ); - }); - } - }); - }); - /** - * @fileOverview 只有flash实现的文件版本。 - */ - define('preset/flashonly',[ - 'base', - - // widgets - 'widgets/filepicker', - 'widgets/image', - 'widgets/queue', - 'widgets/runtime', - 'widgets/upload', - 'widgets/validator', - - // runtimes - - // flash - 'runtime/flash/filepicker', - 'runtime/flash/image', - 'runtime/flash/transport' - ], function( Base ) { - return Base; - }); - define('webuploader',[ - 'preset/flashonly' - ], function( preset ) { - return preset; - }); - return require('webuploader'); -}); diff --git a/public/js/ueditor/third-party/webuploader/webuploader.html5only.js b/public/js/ueditor/third-party/webuploader/webuploader.html5only.js deleted file mode 100644 index 5dd4813..0000000 --- a/public/js/ueditor/third-party/webuploader/webuploader.html5only.js +++ /dev/null @@ -1,5559 +0,0 @@ -/*! WebUploader 0.1.2 */ - - -/** - * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。 - * - * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。 - */ -(function( root, factory ) { - var modules = {}, - - // 内部require, 简单不完全实现。 - // https://github.com/amdjs/amdjs-api/wiki/require - _require = function( deps, callback ) { - var args, len, i; - - // 如果deps不是数组,则直接返回指定module - if ( typeof deps === 'string' ) { - return getModule( deps ); - } else { - args = []; - for( len = deps.length, i = 0; i < len; i++ ) { - args.push( getModule( deps[ i ] ) ); - } - - return callback.apply( null, args ); - } - }, - - // 内部define,暂时不支持不指定id. - _define = function( id, deps, factory ) { - if ( arguments.length === 2 ) { - factory = deps; - deps = null; - } - - _require( deps || [], function() { - setModule( id, factory, arguments ); - }); - }, - - // 设置module, 兼容CommonJs写法。 - setModule = function( id, factory, args ) { - var module = { - exports: factory - }, - returned; - - if ( typeof factory === 'function' ) { - args.length || (args = [ _require, module.exports, module ]); - returned = factory.apply( null, args ); - returned !== undefined && (module.exports = returned); - } - - modules[ id ] = module.exports; - }, - - // 根据id获取module - getModule = function( id ) { - var module = modules[ id ] || root[ id ]; - - if ( !module ) { - throw new Error( '`' + id + '` is undefined' ); - } - - return module; - }, - - // 将所有modules,将路径ids装换成对象。 - exportsTo = function( obj ) { - var key, host, parts, part, last, ucFirst; - - // make the first character upper case. - ucFirst = function( str ) { - return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 )); - }; - - for ( key in modules ) { - host = obj; - - if ( !modules.hasOwnProperty( key ) ) { - continue; - } - - parts = key.split('/'); - last = ucFirst( parts.pop() ); - - while( (part = ucFirst( parts.shift() )) ) { - host[ part ] = host[ part ] || {}; - host = host[ part ]; - } - - host[ last ] = modules[ key ]; - } - }, - - exports = factory( root, _define, _require ), - origin; - - // exports every module. - exportsTo( exports ); - - if ( typeof module === 'object' && typeof module.exports === 'object' ) { - - // For CommonJS and CommonJS-like environments where a proper window is present, - module.exports = exports; - } else if ( typeof define === 'function' && define.amd ) { - - // Allow using this built library as an AMD module - // in another project. That other project will only - // see this AMD call, not the internal modules in - // the closure below. - define([], exports ); - } else { - - // Browser globals case. Just assign the - // result to a property on the global. - origin = root.WebUploader; - root.WebUploader = exports; - root.WebUploader.noConflict = function() { - root.WebUploader = origin; - }; - } -})( this, function( window, define, require ) { - - - /** - * @fileOverview jQuery or Zepto - */ - define('dollar-third',[],function() { - return window.jQuery || window.Zepto; - }); - /** - * @fileOverview Dom 操作相关 - */ - define('dollar',[ - 'dollar-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 使用jQuery的Promise - */ - define('promise-third',[ - 'dollar' - ], function( $ ) { - return { - Deferred: $.Deferred, - when: $.when, - - isPromise: function( anything ) { - return anything && typeof anything.then === 'function'; - } - }; - }); - /** - * @fileOverview Promise/A+ - */ - define('promise',[ - 'promise-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 基础类方法。 - */ - - /** - * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。 - * - * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id. - * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: - * - * * module `base`:WebUploader.Base - * * module `file`: WebUploader.File - * * module `lib/dnd`: WebUploader.Lib.Dnd - * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd - * - * - * 以下文档将可能省略`WebUploader`前缀。 - * @module WebUploader - * @title WebUploader API文档 - */ - define('base',[ - 'dollar', - 'promise' - ], function( $, promise ) { - - var noop = function() {}, - call = Function.call; - - // http://jsperf.com/uncurrythis - // 反科里化 - function uncurryThis( fn ) { - return function() { - return call.apply( fn, arguments ); - }; - } - - function bindFn( fn, context ) { - return function() { - return fn.apply( context, arguments ); - }; - } - - function createObject( proto ) { - var f; - - if ( Object.create ) { - return Object.create( proto ); - } else { - f = function() {}; - f.prototype = proto; - return new f(); - } - } - - - /** - * 基础类,提供一些简单常用的方法。 - * @class Base - */ - return { - - /** - * @property {String} version 当前版本号。 - */ - version: '0.1.2', - - /** - * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。 - */ - $: $, - - Deferred: promise.Deferred, - - isPromise: promise.isPromise, - - when: promise.when, - - /** - * @description 简单的浏览器检查结果。 - * - * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。 - * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。 - * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+** - * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。 - * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。 - * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。 - * - * @property {Object} [browser] - */ - browser: (function( ua ) { - var ret = {}, - webkit = ua.match( /WebKit\/([\d.]+)/ ), - chrome = ua.match( /Chrome\/([\d.]+)/ ) || - ua.match( /CriOS\/([\d.]+)/ ), - - ie = ua.match( /MSIE\s([\d\.]+)/ ) || - ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i), - firefox = ua.match( /Firefox\/([\d.]+)/ ), - safari = ua.match( /Safari\/([\d.]+)/ ), - opera = ua.match( /OPR\/([\d.]+)/ ); - - webkit && (ret.webkit = parseFloat( webkit[ 1 ] )); - chrome && (ret.chrome = parseFloat( chrome[ 1 ] )); - ie && (ret.ie = parseFloat( ie[ 1 ] )); - firefox && (ret.firefox = parseFloat( firefox[ 1 ] )); - safari && (ret.safari = parseFloat( safari[ 1 ] )); - opera && (ret.opera = parseFloat( opera[ 1 ] )); - - return ret; - })( navigator.userAgent ), - - /** - * @description 操作系统检查结果。 - * - * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。 - * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。 - * @property {Object} [os] - */ - os: (function( ua ) { - var ret = {}, - - // osx = !!ua.match( /\(Macintosh\; Intel / ), - android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ), - ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ ); - - // osx && (ret.osx = true); - android && (ret.android = parseFloat( android[ 1 ] )); - ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) )); - - return ret; - })( navigator.userAgent ), - - /** - * 实现类与类之间的继承。 - * @method inherits - * @grammar Base.inherits( super ) => child - * @grammar Base.inherits( super, protos ) => child - * @grammar Base.inherits( super, protos, statics ) => child - * @param {Class} super 父类 - * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。 - * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。 - * @param {Object} [statics] 静态属性或方法。 - * @return {Class} 返回子类。 - * @example - * function Person() { - * console.log( 'Super' ); - * } - * Person.prototype.hello = function() { - * console.log( 'hello' ); - * }; - * - * var Manager = Base.inherits( Person, { - * world: function() { - * console.log( 'World' ); - * } - * }); - * - * // 因为没有指定构造器,父类的构造器将会执行。 - * var instance = new Manager(); // => Super - * - * // 继承子父类的方法 - * instance.hello(); // => hello - * instance.world(); // => World - * - * // 子类的__super__属性指向父类 - * console.log( Manager.__super__ === Person ); // => true - */ - inherits: function( Super, protos, staticProtos ) { - var child; - - if ( typeof protos === 'function' ) { - child = protos; - protos = null; - } else if ( protos && protos.hasOwnProperty('constructor') ) { - child = protos.constructor; - } else { - child = function() { - return Super.apply( this, arguments ); - }; - } - - // 复制静态方法 - $.extend( true, child, Super, staticProtos || {} ); - - /* jshint camelcase: false */ - - // 让子类的__super__属性指向父类。 - child.__super__ = Super.prototype; - - // 构建原型,添加原型方法或属性。 - // 暂时用Object.create实现。 - child.prototype = createObject( Super.prototype ); - protos && $.extend( true, child.prototype, protos ); - - return child; - }, - - /** - * 一个不做任何事情的方法。可以用来赋值给默认的callback. - * @method noop - */ - noop: noop, - - /** - * 返回一个新的方法,此方法将已指定的`context`来执行。 - * @grammar Base.bindFn( fn, context ) => Function - * @method bindFn - * @example - * var doSomething = function() { - * console.log( this.name ); - * }, - * obj = { - * name: 'Object Name' - * }, - * aliasFn = Base.bind( doSomething, obj ); - * - * aliasFn(); // => Object Name - * - */ - bindFn: bindFn, - - /** - * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。 - * @grammar Base.log( args... ) => undefined - * @method log - */ - log: (function() { - if ( window.console ) { - return bindFn( console.log, console ); - } - return noop; - })(), - - nextTick: (function() { - - return function( cb ) { - setTimeout( cb, 1 ); - }; - - // @bug 当浏览器不在当前窗口时就停了。 - // var next = window.requestAnimationFrame || - // window.webkitRequestAnimationFrame || - // window.mozRequestAnimationFrame || - // function( cb ) { - // window.setTimeout( cb, 1000 / 60 ); - // }; - - // // fix: Uncaught TypeError: Illegal invocation - // return bindFn( next, window ); - })(), - - /** - * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。 - * 将用来将非数组对象转化成数组对象。 - * @grammar Base.slice( target, start[, end] ) => Array - * @method slice - * @example - * function doSomthing() { - * var args = Base.slice( arguments, 1 ); - * console.log( args ); - * } - * - * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"] - */ - slice: uncurryThis( [].slice ), - - /** - * 生成唯一的ID - * @method guid - * @grammar Base.guid() => String - * @grammar Base.guid( prefx ) => String - */ - guid: (function() { - var counter = 0; - - return function( prefix ) { - var guid = (+new Date()).toString( 32 ), - i = 0; - - for ( ; i < 5; i++ ) { - guid += Math.floor( Math.random() * 65535 ).toString( 32 ); - } - - return (prefix || 'wu_') + guid + (counter++).toString( 32 ); - }; - })(), - - /** - * 格式化文件大小, 输出成带单位的字符串 - * @method formatSize - * @grammar Base.formatSize( size ) => String - * @grammar Base.formatSize( size, pointLength ) => String - * @grammar Base.formatSize( size, pointLength, units ) => String - * @param {Number} size 文件大小 - * @param {Number} [pointLength=2] 精确到的小数点数。 - * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. - * @example - * console.log( Base.formatSize( 100 ) ); // => 100B - * console.log( Base.formatSize( 1024 ) ); // => 1.00K - * console.log( Base.formatSize( 1024, 0 ) ); // => 1K - * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M - * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G - * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB - */ - formatSize: function( size, pointLength, units ) { - var unit; - - units = units || [ 'B', 'K', 'M', 'G', 'TB' ]; - - while ( (unit = units.shift()) && size > 1024 ) { - size = size / 1024; - } - - return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) + - unit; - } - }; - }); - /** - * 事件处理类,可以独立使用,也可以扩展给对象使用。 - * @fileOverview Mediator - */ - define('mediator',[ - 'base' - ], function( Base ) { - var $ = Base.$, - slice = [].slice, - separator = /\s+/, - protos; - - // 根据条件过滤出事件handlers. - function findHandlers( arr, name, callback, context ) { - return $.grep( arr, function( handler ) { - return handler && - (!name || handler.e === name) && - (!callback || handler.cb === callback || - handler.cb._cb === callback) && - (!context || handler.ctx === context); - }); - } - - function eachEvent( events, callback, iterator ) { - // 不支持对象,只支持多个event用空格隔开 - $.each( (events || '').split( separator ), function( _, key ) { - iterator( key, callback ); - }); - } - - function triggerHanders( events, args ) { - var stoped = false, - i = -1, - len = events.length, - handler; - - while ( ++i < len ) { - handler = events[ i ]; - - if ( handler.cb.apply( handler.ctx2, args ) === false ) { - stoped = true; - break; - } - } - - return !stoped; - } - - protos = { - - /** - * 绑定事件。 - * - * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如 - * ```javascript - * var obj = {}; - * - * // 使得obj有事件行为 - * Mediator.installTo( obj ); - * - * obj.on( 'testa', function( arg1, arg2 ) { - * console.log( arg1, arg2 ); // => 'arg1', 'arg2' - * }); - * - * obj.trigger( 'testa', 'arg1', 'arg2' ); - * ``` - * - * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。 - * 切会影响到`trigger`方法的返回值,为`false`。 - * - * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处, - * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。 - * ```javascript - * obj.on( 'all', function( type, arg1, arg2 ) { - * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2' - * }); - * ``` - * - * @method on - * @grammar on( name, callback[, context] ) => self - * @param {String} name 事件名,支持多个事件用空格隔开 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - * @class Mediator - */ - on: function( name, callback, context ) { - var me = this, - set; - - if ( !callback ) { - return this; - } - - set = this._events || (this._events = []); - - eachEvent( name, callback, function( name, callback ) { - var handler = { e: name }; - - handler.cb = callback; - handler.ctx = context; - handler.ctx2 = context || me; - handler.id = set.length; - - set.push( handler ); - }); - - return this; - }, - - /** - * 绑定事件,且当handler执行完后,自动解除绑定。 - * @method once - * @grammar once( name, callback[, context] ) => self - * @param {String} name 事件名 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - once: function( name, callback, context ) { - var me = this; - - if ( !callback ) { - return me; - } - - eachEvent( name, callback, function( name, callback ) { - var once = function() { - me.off( name, once ); - return callback.apply( context || me, arguments ); - }; - - once._cb = callback; - me.on( name, once, context ); - }); - - return me; - }, - - /** - * 解除事件绑定 - * @method off - * @grammar off( [name[, callback[, context] ] ] ) => self - * @param {String} [name] 事件名 - * @param {Function} [callback] 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - off: function( name, cb, ctx ) { - var events = this._events; - - if ( !events ) { - return this; - } - - if ( !name && !cb && !ctx ) { - this._events = []; - return this; - } - - eachEvent( name, cb, function( name, cb ) { - $.each( findHandlers( events, name, cb, ctx ), function() { - delete events[ this.id ]; - }); - }); - - return this; - }, - - /** - * 触发事件 - * @method trigger - * @grammar trigger( name[, args...] ) => self - * @param {String} type 事件名 - * @param {*} [...] 任意参数 - * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true - */ - trigger: function( type ) { - var args, events, allEvents; - - if ( !this._events || !type ) { - return this; - } - - args = slice.call( arguments, 1 ); - events = findHandlers( this._events, type ); - allEvents = findHandlers( this._events, 'all' ); - - return triggerHanders( events, args ) && - triggerHanders( allEvents, arguments ); - } - }; - - /** - * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。 - * 主要目的是负责模块与模块之间的合作,降低耦合度。 - * - * @class Mediator - */ - return $.extend({ - - /** - * 可以通过这个接口,使任何对象具备事件功能。 - * @method installTo - * @param {Object} obj 需要具备事件行为的对象。 - * @return {Object} 返回obj. - */ - installTo: function( obj ) { - return $.extend( obj, protos ); - } - - }, protos ); - }); - /** - * @fileOverview Uploader上传类 - */ - define('uploader',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$; - - /** - * 上传入口类。 - * @class Uploader - * @constructor - * @grammar new Uploader( opts ) => Uploader - * @example - * var uploader = WebUploader.Uploader({ - * swf: 'path_of_swf/Uploader.swf', - * - * // 开起分片上传。 - * chunked: true - * }); - */ - function Uploader( opts ) { - this.options = $.extend( true, {}, Uploader.options, opts ); - this._init( this.options ); - } - - // default Options - // widgets中有相应扩展 - Uploader.options = {}; - Mediator.installTo( Uploader.prototype ); - - // 批量添加纯命令式方法。 - $.each({ - upload: 'start-upload', - stop: 'stop-upload', - getFile: 'get-file', - getFiles: 'get-files', - addFile: 'add-file', - addFiles: 'add-file', - sort: 'sort-files', - removeFile: 'remove-file', - skipFile: 'skip-file', - retry: 'retry', - isInProgress: 'is-in-progress', - makeThumb: 'make-thumb', - getDimension: 'get-dimension', - addButton: 'add-btn', - getRuntimeType: 'get-runtime-type', - refresh: 'refresh', - disable: 'disable', - enable: 'enable', - reset: 'reset' - }, function( fn, command ) { - Uploader.prototype[ fn ] = function() { - return this.request( command, arguments ); - }; - }); - - $.extend( Uploader.prototype, { - state: 'pending', - - _init: function( opts ) { - var me = this; - - me.request( 'init', opts, function() { - me.state = 'ready'; - me.trigger('ready'); - }); - }, - - /** - * 获取或者设置Uploader配置项。 - * @method option - * @grammar option( key ) => * - * @grammar option( key, val ) => self - * @example - * - * // 初始状态图片上传前不会压缩 - * var uploader = new WebUploader.Uploader({ - * resize: null; - * }); - * - * // 修改后图片上传前,尝试将图片压缩到1600 * 1600 - * uploader.options( 'resize', { - * width: 1600, - * height: 1600 - * }); - */ - option: function( key, val ) { - var opts = this.options; - - // setter - if ( arguments.length > 1 ) { - - if ( $.isPlainObject( val ) && - $.isPlainObject( opts[ key ] ) ) { - $.extend( opts[ key ], val ); - } else { - opts[ key ] = val; - } - - } else { // getter - return key ? opts[ key ] : opts; - } - }, - - /** - * 获取文件统计信息。返回一个包含一下信息的对象。 - * * `successNum` 上传成功的文件数 - * * `uploadFailNum` 上传失败的文件数 - * * `cancelNum` 被删除的文件数 - * * `invalidNum` 无效的文件数 - * * `queueNum` 还在队列中的文件数 - * @method getStats - * @grammar getStats() => Object - */ - getStats: function() { - // return this._mgr.getStats.apply( this._mgr, arguments ); - var stats = this.request('get-stats'); - - return { - successNum: stats.numOfSuccess, - - // who care? - // queueFailNum: 0, - cancelNum: stats.numOfCancel, - invalidNum: stats.numOfInvalid, - uploadFailNum: stats.numOfUploadFailed, - queueNum: stats.numOfQueue - }; - }, - - // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器 - trigger: function( type/*, args...*/ ) { - var args = [].slice.call( arguments, 1 ), - opts = this.options, - name = 'on' + type.substring( 0, 1 ).toUpperCase() + - type.substring( 1 ); - - if ( - // 调用通过on方法注册的handler. - Mediator.trigger.apply( this, arguments ) === false || - - // 调用opts.onEvent - $.isFunction( opts[ name ] ) && - opts[ name ].apply( this, args ) === false || - - // 调用this.onEvent - $.isFunction( this[ name ] ) && - this[ name ].apply( this, args ) === false || - - // 广播所有uploader的事件。 - Mediator.trigger.apply( Mediator, - [ this, type ].concat( args ) ) === false ) { - - return false; - } - - return true; - }, - - // widgets/widget.js将补充此方法的详细文档。 - request: Base.noop - }); - - /** - * 创建Uploader实例,等同于new Uploader( opts ); - * @method create - * @class Base - * @static - * @grammar Base.create( opts ) => Uploader - */ - Base.create = Uploader.create = function( opts ) { - return new Uploader( opts ); - }; - - // 暴露Uploader,可以通过它来扩展业务逻辑。 - Base.Uploader = Uploader; - - return Uploader; - }); - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/runtime',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - factories = {}, - - // 获取对象的第一个key - getFirstKey = function( obj ) { - for ( var key in obj ) { - if ( obj.hasOwnProperty( key ) ) { - return key; - } - } - return null; - }; - - // 接口类。 - function Runtime( options ) { - this.options = $.extend({ - container: document.body - }, options ); - this.uid = Base.guid('rt_'); - } - - $.extend( Runtime.prototype, { - - getContainer: function() { - var opts = this.options, - parent, container; - - if ( this._container ) { - return this._container; - } - - parent = $( opts.container || document.body ); - container = $( document.createElement('div') ); - - container.attr( 'id', 'rt_' + this.uid ); - container.css({ - position: 'absolute', - top: '0px', - left: '0px', - width: '1px', - height: '1px', - overflow: 'hidden' - }); - - parent.append( container ); - parent.addClass('webuploader-container'); - this._container = container; - return container; - }, - - init: Base.noop, - exec: Base.noop, - - destroy: function() { - if ( this._container ) { - this._container.parentNode.removeChild( this.__container ); - } - - this.off(); - } - }); - - Runtime.orders = 'html5,flash'; - - - /** - * 添加Runtime实现。 - * @param {String} type 类型 - * @param {Runtime} factory 具体Runtime实现。 - */ - Runtime.addRuntime = function( type, factory ) { - factories[ type ] = factory; - }; - - Runtime.hasRuntime = function( type ) { - return !!(type ? factories[ type ] : getFirstKey( factories )); - }; - - Runtime.create = function( opts, orders ) { - var type, runtime; - - orders = orders || Runtime.orders; - $.each( orders.split( /\s*,\s*/g ), function() { - if ( factories[ this ] ) { - type = this; - return false; - } - }); - - type = type || getFirstKey( factories ); - - if ( !type ) { - throw new Error('Runtime Error'); - } - - runtime = new factories[ type ]( opts ); - return runtime; - }; - - Mediator.installTo( Runtime.prototype ); - return Runtime; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/client',[ - 'base', - 'mediator', - 'runtime/runtime' - ], function( Base, Mediator, Runtime ) { - - var cache; - - cache = (function() { - var obj = {}; - - return { - add: function( runtime ) { - obj[ runtime.uid ] = runtime; - }, - - get: function( ruid, standalone ) { - var i; - - if ( ruid ) { - return obj[ ruid ]; - } - - for ( i in obj ) { - // 有些类型不能重用,比如filepicker. - if ( standalone && obj[ i ].__standalone ) { - continue; - } - - return obj[ i ]; - } - - return null; - }, - - remove: function( runtime ) { - delete obj[ runtime.uid ]; - } - }; - })(); - - function RuntimeClient( component, standalone ) { - var deferred = Base.Deferred(), - runtime; - - this.uid = Base.guid('client_'); - - // 允许runtime没有初始化之前,注册一些方法在初始化后执行。 - this.runtimeReady = function( cb ) { - return deferred.done( cb ); - }; - - this.connectRuntime = function( opts, cb ) { - - // already connected. - if ( runtime ) { - throw new Error('already connected!'); - } - - deferred.done( cb ); - - if ( typeof opts === 'string' && cache.get( opts ) ) { - runtime = cache.get( opts ); - } - - // 像filePicker只能独立存在,不能公用。 - runtime = runtime || cache.get( null, standalone ); - - // 需要创建 - if ( !runtime ) { - runtime = Runtime.create( opts, opts.runtimeOrder ); - runtime.__promise = deferred.promise(); - runtime.once( 'ready', deferred.resolve ); - runtime.init(); - cache.add( runtime ); - runtime.__client = 1; - } else { - // 来自cache - Base.$.extend( runtime.options, opts ); - runtime.__promise.then( deferred.resolve ); - runtime.__client++; - } - - standalone && (runtime.__standalone = standalone); - return runtime; - }; - - this.getRuntime = function() { - return runtime; - }; - - this.disconnectRuntime = function() { - if ( !runtime ) { - return; - } - - runtime.__client--; - - if ( runtime.__client <= 0 ) { - cache.remove( runtime ); - delete runtime.__promise; - runtime.destroy(); - } - - runtime = null; - }; - - this.exec = function() { - if ( !runtime ) { - return; - } - - var args = Base.slice( arguments ); - component && args.unshift( component ); - - return runtime.exec.apply( this, args ); - }; - - this.getRuid = function() { - return runtime && runtime.uid; - }; - - this.destroy = (function( destroy ) { - return function() { - destroy && destroy.apply( this, arguments ); - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }; - })( this.destroy ); - } - - Mediator.installTo( RuntimeClient.prototype ); - return RuntimeClient; - }); - /** - * @fileOverview 错误信息 - */ - define('lib/dnd',[ - 'base', - 'mediator', - 'runtime/client' - ], function( Base, Mediator, RuntimeClent ) { - - var $ = Base.$; - - function DragAndDrop( opts ) { - opts = this.options = $.extend({}, DragAndDrop.options, opts ); - - opts.container = $( opts.container ); - - if ( !opts.container.length ) { - return; - } - - RuntimeClent.call( this, 'DragAndDrop' ); - } - - DragAndDrop.options = { - accept: null, - disableGlobalDnd: false - }; - - Base.inherits( RuntimeClent, { - constructor: DragAndDrop, - - init: function() { - var me = this; - - me.connectRuntime( me.options, function() { - me.exec('init'); - me.trigger('ready'); - }); - }, - - destroy: function() { - this.disconnectRuntime(); - } - }); - - Mediator.installTo( DragAndDrop.prototype ); - - return DragAndDrop; - }); - /** - * @fileOverview 组件基类。 - */ - define('widgets/widget',[ - 'base', - 'uploader' - ], function( Base, Uploader ) { - - var $ = Base.$, - _init = Uploader.prototype._init, - IGNORE = {}, - widgetClass = []; - - function isArrayLike( obj ) { - if ( !obj ) { - return false; - } - - var length = obj.length, - type = $.type( obj ); - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === 'array' || type !== 'function' && type !== 'string' && - (length === 0 || typeof length === 'number' && length > 0 && - (length - 1) in obj); - } - - function Widget( uploader ) { - this.owner = uploader; - this.options = uploader.options; - } - - $.extend( Widget.prototype, { - - init: Base.noop, - - // 类Backbone的事件监听声明,监听uploader实例上的事件 - // widget直接无法监听事件,事件只能通过uploader来传递 - invoke: function( apiName, args ) { - - /* - { - 'make-thumb': 'makeThumb' - } - */ - var map = this.responseMap; - - // 如果无API响应声明则忽略 - if ( !map || !(apiName in map) || !(map[ apiName ] in this) || - !$.isFunction( this[ map[ apiName ] ] ) ) { - - return IGNORE; - } - - return this[ map[ apiName ] ].apply( this, args ); - - }, - - /** - * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。 - * @method request - * @grammar request( command, args ) => * | Promise - * @grammar request( command, args, callback ) => Promise - * @for Uploader - */ - request: function() { - return this.owner.request.apply( this.owner, arguments ); - } - }); - - // 扩展Uploader. - $.extend( Uploader.prototype, { - - // 覆写_init用来初始化widgets - _init: function() { - var me = this, - widgets = me._widgets = []; - - $.each( widgetClass, function( _, klass ) { - widgets.push( new klass( me ) ); - }); - - return _init.apply( me, arguments ); - }, - - request: function( apiName, args, callback ) { - var i = 0, - widgets = this._widgets, - len = widgets.length, - rlts = [], - dfds = [], - widget, rlt, promise, key; - - args = isArrayLike( args ) ? args : [ args ]; - - for ( ; i < len; i++ ) { - widget = widgets[ i ]; - rlt = widget.invoke( apiName, args ); - - if ( rlt !== IGNORE ) { - - // Deferred对象 - if ( Base.isPromise( rlt ) ) { - dfds.push( rlt ); - } else { - rlts.push( rlt ); - } - } - } - - // 如果有callback,则用异步方式。 - if ( callback || dfds.length ) { - promise = Base.when.apply( Base, dfds ); - key = promise.pipe ? 'pipe' : 'then'; - - // 很重要不能删除。删除了会死循环。 - // 保证执行顺序。让callback总是在下一个tick中执行。 - return promise[ key ](function() { - var deferred = Base.Deferred(), - args = arguments; - - setTimeout(function() { - deferred.resolve.apply( deferred, args ); - }, 1 ); - - return deferred.promise(); - })[ key ]( callback || Base.noop ); - } else { - return rlts[ 0 ]; - } - } - }); - - /** - * 添加组件 - * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义 - * @param {object} responseMap API名称与函数实现的映射 - * @example - * Uploader.register( { - * init: function( options ) {}, - * makeThumb: function() {} - * }, { - * 'make-thumb': 'makeThumb' - * } ); - */ - Uploader.register = Widget.register = function( responseMap, widgetProto ) { - var map = { init: 'init' }, - klass; - - if ( arguments.length === 1 ) { - widgetProto = responseMap; - widgetProto.responseMap = map; - } else { - widgetProto.responseMap = $.extend( map, responseMap ); - } - - klass = Base.inherits( Widget, widgetProto ); - widgetClass.push( klass ); - - return klass; - }; - - return Widget; - }); - /** - * @fileOverview DragAndDrop Widget。 - */ - define('widgets/filednd',[ - 'base', - 'uploader', - 'lib/dnd', - 'widgets/widget' - ], function( Base, Uploader, Dnd ) { - var $ = Base.$; - - Uploader.options.dnd = ''; - - /** - * @property {Selector} [dnd=undefined] 指定Drag And Drop拖拽的容器,如果不指定,则不启动。 - * @namespace options - * @for Uploader - */ - - /** - * @event dndAccept - * @param {DataTransferItemList} items DataTransferItem - * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。 - * @for Uploader - */ - return Uploader.register({ - init: function( opts ) { - - if ( !opts.dnd || - this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - var me = this, - deferred = Base.Deferred(), - options = $.extend({}, { - disableGlobalDnd: opts.disableGlobalDnd, - container: opts.dnd, - accept: opts.accept - }), - dnd; - - dnd = new Dnd( options ); - - dnd.once( 'ready', deferred.resolve ); - dnd.on( 'drop', function( files ) { - me.request( 'add-file', [ files ]); - }); - - // 检测文件是否全部允许添加。 - dnd.on( 'accept', function( items ) { - return me.owner.trigger( 'dndAccept', items ); - }); - - dnd.init(); - - return deferred.promise(); - } - }); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepaste',[ - 'base', - 'mediator', - 'runtime/client' - ], function( Base, Mediator, RuntimeClent ) { - - var $ = Base.$; - - function FilePaste( opts ) { - opts = this.options = $.extend({}, opts ); - opts.container = $( opts.container || document.body ); - RuntimeClent.call( this, 'FilePaste' ); - } - - Base.inherits( RuntimeClent, { - constructor: FilePaste, - - init: function() { - var me = this; - - me.connectRuntime( me.options, function() { - me.exec('init'); - me.trigger('ready'); - }); - }, - - destroy: function() { - this.exec('destroy'); - this.disconnectRuntime(); - this.off(); - } - }); - - Mediator.installTo( FilePaste.prototype ); - - return FilePaste; - }); - /** - * @fileOverview 组件基类。 - */ - define('widgets/filepaste',[ - 'base', - 'uploader', - 'lib/filepaste', - 'widgets/widget' - ], function( Base, Uploader, FilePaste ) { - var $ = Base.$; - - /** - * @property {Selector} [paste=undefined] 指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`. - * @namespace options - * @for Uploader - */ - return Uploader.register({ - init: function( opts ) { - - if ( !opts.paste || - this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - var me = this, - deferred = Base.Deferred(), - options = $.extend({}, { - container: opts.paste, - accept: opts.accept - }), - paste; - - paste = new FilePaste( options ); - - paste.once( 'ready', deferred.resolve ); - paste.on( 'paste', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - paste.init(); - - return deferred.promise(); - } - }); - }); - /** - * @fileOverview Blob - */ - define('lib/blob',[ - 'base', - 'runtime/client' - ], function( Base, RuntimeClient ) { - - function Blob( ruid, source ) { - var me = this; - - me.source = source; - me.ruid = ruid; - - RuntimeClient.call( me, 'Blob' ); - - this.uid = source.uid || this.uid; - this.type = source.type || ''; - this.size = source.size || 0; - - if ( ruid ) { - me.connectRuntime( ruid ); - } - } - - Base.inherits( RuntimeClient, { - constructor: Blob, - - slice: function( start, end ) { - return this.exec( 'slice', start, end ); - }, - - getSource: function() { - return this.source; - } - }); - - return Blob; - }); - /** - * 为了统一化Flash的File和HTML5的File而存在。 - * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。 - * @fileOverview File - */ - define('lib/file',[ - 'base', - 'lib/blob' - ], function( Base, Blob ) { - - var uid = 1, - rExt = /\.([^.]+)$/; - - function File( ruid, file ) { - var ext; - - Blob.apply( this, arguments ); - this.name = file.name || ('untitled' + uid++); - ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : ''; - - // todo 支持其他类型文件的转换。 - - // 如果有mimetype, 但是文件名里面没有找出后缀规律 - if ( !ext && this.type ) { - ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ? - RegExp.$1.toLowerCase() : ''; - this.name += '.' + ext; - } - - // 如果没有指定mimetype, 但是知道文件后缀。 - if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) { - this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext); - } - - this.ext = ext; - this.lastModifiedDate = file.lastModifiedDate || - (new Date()).toLocaleString(); - } - - return Base.inherits( Blob, File ); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepicker',[ - 'base', - 'runtime/client', - 'lib/file' - ], function( Base, RuntimeClent, File ) { - - var $ = Base.$; - - function FilePicker( opts ) { - opts = this.options = $.extend({}, FilePicker.options, opts ); - - opts.container = $( opts.id ); - - if ( !opts.container.length ) { - throw new Error('按钮指定错误'); - } - - opts.innerHTML = opts.innerHTML || opts.label || - opts.container.html() || ''; - - opts.button = $( opts.button || document.createElement('div') ); - opts.button.html( opts.innerHTML ); - opts.container.html( opts.button ); - - RuntimeClent.call( this, 'FilePicker', true ); - } - - FilePicker.options = { - button: null, - container: null, - label: null, - innerHTML: null, - multiple: true, - accept: null, - name: 'file' - }; - - Base.inherits( RuntimeClent, { - constructor: FilePicker, - - init: function() { - var me = this, - opts = me.options, - button = opts.button; - - button.addClass('webuploader-pick'); - - me.on( 'all', function( type ) { - var files; - - switch ( type ) { - case 'mouseenter': - button.addClass('webuploader-pick-hover'); - break; - - case 'mouseleave': - button.removeClass('webuploader-pick-hover'); - break; - - case 'change': - files = me.exec('getFiles'); - me.trigger( 'select', $.map( files, function( file ) { - file = new File( me.getRuid(), file ); - - // 记录来源。 - file._refer = opts.container; - return file; - }), opts.container ); - break; - } - }); - - me.connectRuntime( opts, function() { - me.refresh(); - me.exec( 'init', opts ); - me.trigger('ready'); - }); - - $( window ).on( 'resize', function() { - me.refresh(); - }); - }, - - refresh: function() { - var shimContainer = this.getRuntime().getContainer(), - button = this.options.button, - width = button.outerWidth ? - button.outerWidth() : button.width(), - - height = button.outerHeight ? - button.outerHeight() : button.height(), - - pos = button.offset(); - - width && height && shimContainer.css({ - bottom: 'auto', - right: 'auto', - width: width + 'px', - height: height + 'px' - }).offset( pos ); - }, - - enable: function() { - var btn = this.options.button; - - btn.removeClass('webuploader-pick-disable'); - this.refresh(); - }, - - disable: function() { - var btn = this.options.button; - - this.getRuntime().getContainer().css({ - top: '-99999px' - }); - - btn.addClass('webuploader-pick-disable'); - }, - - destroy: function() { - if ( this.runtime ) { - this.exec('destroy'); - this.disconnectRuntime(); - } - } - }); - - return FilePicker; - }); - - /** - * @fileOverview 文件选择相关 - */ - define('widgets/filepicker',[ - 'base', - 'uploader', - 'lib/filepicker', - 'widgets/widget' - ], function( Base, Uploader, FilePicker ) { - var $ = Base.$; - - $.extend( Uploader.options, { - - /** - * @property {Selector | Object} [pick=undefined] - * @namespace options - * @for Uploader - * @description 指定选择文件的按钮容器,不指定则不创建按钮。 - * - * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。 - * * `label` {String} 请采用 `innerHTML` 代替 - * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。 - * * `multiple` {Boolean} 是否开起同时选择多个文件能力。 - */ - pick: null, - - /** - * @property {Arroy} [accept=null] - * @namespace options - * @for Uploader - * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。 - * - * * `title` {String} 文字描述 - * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。 - * * `mimeTypes` {String} 多个用逗号分割。 - * - * 如: - * - * ``` - * { - * title: 'Images', - * extensions: 'gif,jpg,jpeg,bmp,png', - * mimeTypes: 'image/*' - * } - * ``` - */ - accept: null/*{ - title: 'Images', - extensions: 'gif,jpg,jpeg,bmp,png', - mimeTypes: 'image/*' - }*/ - }); - - return Uploader.register({ - 'add-btn': 'addButton', - refresh: 'refresh', - disable: 'disable', - enable: 'enable' - }, { - - init: function( opts ) { - this.pickers = []; - return opts.pick && this.addButton( opts.pick ); - }, - - refresh: function() { - $.each( this.pickers, function() { - this.refresh(); - }); - }, - - /** - * @method addButton - * @for Uploader - * @grammar addButton( pick ) => Promise - * @description - * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。 - * @example - * uploader.addButton({ - * id: '#btnContainer', - * innerHTML: '选择文件' - * }); - */ - addButton: function( pick ) { - var me = this, - opts = me.options, - accept = opts.accept, - options, picker, deferred; - - if ( !pick ) { - return; - } - - deferred = Base.Deferred(); - $.isPlainObject( pick ) || (pick = { - id: pick - }); - - options = $.extend({}, pick, { - accept: $.isPlainObject( accept ) ? [ accept ] : accept, - swf: opts.swf, - runtimeOrder: opts.runtimeOrder - }); - - picker = new FilePicker( options ); - - picker.once( 'ready', deferred.resolve ); - picker.on( 'select', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - picker.init(); - - this.pickers.push( picker ); - - return deferred.promise(); - }, - - disable: function() { - $.each( this.pickers, function() { - this.disable(); - }); - }, - - enable: function() { - $.each( this.pickers, function() { - this.enable(); - }); - } - }); - }); - /** - * @fileOverview Image - */ - define('lib/image',[ - 'base', - 'runtime/client', - 'lib/blob' - ], function( Base, RuntimeClient, Blob ) { - var $ = Base.$; - - // 构造器。 - function Image( opts ) { - this.options = $.extend({}, Image.options, opts ); - RuntimeClient.call( this, 'Image' ); - - this.on( 'load', function() { - this._info = this.exec('info'); - this._meta = this.exec('meta'); - }); - } - - // 默认选项。 - Image.options = { - - // 默认的图片处理质量 - quality: 90, - - // 是否裁剪 - crop: false, - - // 是否保留头部信息 - preserveHeaders: true, - - // 是否允许放大。 - allowMagnify: true - }; - - // 继承RuntimeClient. - Base.inherits( RuntimeClient, { - constructor: Image, - - info: function( val ) { - - // setter - if ( val ) { - this._info = val; - return this; - } - - // getter - return this._info; - }, - - meta: function( val ) { - - // setter - if ( val ) { - this._meta = val; - return this; - } - - // getter - return this._meta; - }, - - loadFromBlob: function( blob ) { - var me = this, - ruid = blob.getRuid(); - - this.connectRuntime( ruid, function() { - me.exec( 'init', me.options ); - me.exec( 'loadFromBlob', blob ); - }); - }, - - resize: function() { - var args = Base.slice( arguments ); - return this.exec.apply( this, [ 'resize' ].concat( args ) ); - }, - - getAsDataUrl: function( type ) { - return this.exec( 'getAsDataUrl', type ); - }, - - getAsBlob: function( type ) { - var blob = this.exec( 'getAsBlob', type ); - - return new Blob( this.getRuid(), blob ); - } - }); - - return Image; - }); - /** - * @fileOverview 图片操作, 负责预览图片和上传前压缩图片 - */ - define('widgets/image',[ - 'base', - 'uploader', - 'lib/image', - 'widgets/widget' - ], function( Base, Uploader, Image ) { - - var $ = Base.$, - throttle; - - // 根据要处理的文件大小来节流,一次不能处理太多,会卡。 - throttle = (function( max ) { - var occupied = 0, - waiting = [], - tick = function() { - var item; - - while ( waiting.length && occupied < max ) { - item = waiting.shift(); - occupied += item[ 0 ]; - item[ 1 ](); - } - }; - - return function( emiter, size, cb ) { - waiting.push([ size, cb ]); - emiter.once( 'destroy', function() { - occupied -= size; - setTimeout( tick, 1 ); - }); - setTimeout( tick, 1 ); - }; - })( 5 * 1024 * 1024 ); - - $.extend( Uploader.options, { - - /** - * @property {Object} [thumb] - * @namespace options - * @for Uploader - * @description 配置生成缩略图的选项。 - * - * 默认为: - * - * ```javascript - * { - * width: 110, - * height: 110, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 70, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: true, - * - * // 是否允许裁剪。 - * crop: true, - * - * // 是否保留头部meta信息。 - * preserveHeaders: false, - * - * // 为空的话则保留原有图片格式。 - * // 否则强制转换成指定的类型。 - * type: 'image/jpeg' - * } - * ``` - */ - thumb: { - width: 110, - height: 110, - quality: 70, - allowMagnify: true, - crop: true, - preserveHeaders: false, - - // 为空的话则保留原有图片格式。 - // 否则强制转换成指定的类型。 - // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可 - // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg - type: 'image/jpeg' - }, - - /** - * @property {Object} [compress] - * @namespace options - * @for Uploader - * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。 - * - * 默认为: - * - * ```javascript - * { - * width: 1600, - * height: 1600, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 90, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: false, - * - * // 是否允许裁剪。 - * crop: false, - * - * // 是否保留头部meta信息。 - * preserveHeaders: true - * } - * ``` - */ - compress: { - width: 1600, - height: 1600, - quality: 90, - allowMagnify: false, - crop: false, - preserveHeaders: true - } - }); - - return Uploader.register({ - 'make-thumb': 'makeThumb', - 'before-send-file': 'compressImage' - }, { - - - /** - * 生成缩略图,此过程为异步,所以需要传入`callback`。 - * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。 - * - * `callback`中可以接收到两个参数。 - * * 第一个为error,如果生成缩略图有错误,此error将为真。 - * * 第二个为ret, 缩略图的Data URL值。 - * - * **注意** - * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。 - * - * - * @method makeThumb - * @grammar makeThumb( file, callback ) => undefined - * @grammar makeThumb( file, callback, width, height ) => undefined - * @for Uploader - * @example - * - * uploader.on( 'fileQueued', function( file ) { - * var $li = ...; - * - * uploader.makeThumb( file, function( error, ret ) { - * if ( error ) { - * $li.text('预览错误'); - * } else { - * $li.append(''); - * } - * }); - * - * }); - */ - makeThumb: function( file, cb, width, height ) { - var opts, image; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !file.type.match( /^image/ ) ) { - cb( true ); - return; - } - - opts = $.extend({}, this.options.thumb ); - - // 如果传入的是object. - if ( $.isPlainObject( width ) ) { - opts = $.extend( opts, width ); - width = null; - } - - width = width || opts.width; - height = height || opts.height; - - image = new Image( opts ); - - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( width, height ); - }); - - image.once( 'complete', function() { - cb( false, image.getAsDataUrl( opts.type ) ); - image.destroy(); - }); - - image.once( 'error', function() { - cb( true ); - image.destroy(); - }); - - throttle( image, file.source.size, function() { - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - image.loadFromBlob( file.source ); - }); - }, - - compressImage: function( file ) { - var opts = this.options.compress || this.options.resize, - compressSize = opts && opts.compressSize || 300 * 1024, - image, deferred; - - file = this.request( 'get-file', file ); - - // 只预览图片格式。 - if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) || - file.size < compressSize || - file._compressed ) { - return; - } - - opts = $.extend({}, opts ); - deferred = Base.Deferred(); - - image = new Image( opts ); - - deferred.always(function() { - image.destroy(); - image = null; - }); - image.once( 'error', deferred.reject ); - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( opts.width, opts.height ); - }); - - image.once( 'complete', function() { - var blob, size; - - // 移动端 UC / qq 浏览器的无图模式下 - // ctx.getImageData 处理大图的时候会报 Exception - // INDEX_SIZE_ERR: DOM Exception 1 - try { - blob = image.getAsBlob( opts.type ); - - size = file.size; - - // 如果压缩后,比原来还大则不用压缩后的。 - if ( blob.size < size ) { - // file.source.destroy && file.source.destroy(); - file.source = blob; - file.size = blob.size; - - file.trigger( 'resize', blob.size, size ); - } - - // 标记,避免重复压缩。 - file._compressed = true; - deferred.resolve(); - } catch ( e ) { - // 出错了直接继续,让其上传原始图片 - deferred.resolve(); - } - }); - - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - - image.loadFromBlob( file.source ); - return deferred.promise(); - } - }); - }); - /** - * @fileOverview 文件属性封装 - */ - define('file',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - idPrefix = 'WU_FILE_', - idSuffix = 0, - rExt = /\.([^.]+)$/, - statusMap = {}; - - function gid() { - return idPrefix + idSuffix++; - } - - /** - * 文件类 - * @class File - * @constructor 构造函数 - * @grammar new File( source ) => File - * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。 - */ - function WUFile( source ) { - - /** - * 文件名,包括扩展名(后缀) - * @property name - * @type {string} - */ - this.name = source.name || 'Untitled'; - - /** - * 文件体积(字节) - * @property size - * @type {uint} - * @default 0 - */ - this.size = source.size || 0; - - /** - * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny) - * @property type - * @type {string} - * @default 'application' - */ - this.type = source.type || 'application'; - - /** - * 文件最后修改日期 - * @property lastModifiedDate - * @type {int} - * @default 当前时间戳 - */ - this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1); - - /** - * 文件ID,每个对象具有唯一ID,与文件名无关 - * @property id - * @type {string} - */ - this.id = gid(); - - /** - * 文件扩展名,通过文件名获取,例如test.png的扩展名为png - * @property ext - * @type {string} - */ - this.ext = rExt.exec( this.name ) ? RegExp.$1 : ''; - - - /** - * 状态文字说明。在不同的status语境下有不同的用途。 - * @property statusText - * @type {string} - */ - this.statusText = ''; - - // 存储文件状态,防止通过属性直接修改 - statusMap[ this.id ] = WUFile.Status.INITED; - - this.source = source; - this.loaded = 0; - - this.on( 'error', function( msg ) { - this.setStatus( WUFile.Status.ERROR, msg ); - }); - } - - $.extend( WUFile.prototype, { - - /** - * 设置状态,状态变化时会触发`change`事件。 - * @method setStatus - * @grammar setStatus( status[, statusText] ); - * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status) - * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。 - */ - setStatus: function( status, text ) { - - var prevStatus = statusMap[ this.id ]; - - typeof text !== 'undefined' && (this.statusText = text); - - if ( status !== prevStatus ) { - statusMap[ this.id ] = status; - /** - * 文件状态变化 - * @event statuschange - */ - this.trigger( 'statuschange', status, prevStatus ); - } - - }, - - /** - * 获取文件状态 - * @return {File.Status} - * @example - 文件状态具体包括以下几种类型: - { - // 初始化 - INITED: 0, - // 已入队列 - QUEUED: 1, - // 正在上传 - PROGRESS: 2, - // 上传出错 - ERROR: 3, - // 上传成功 - COMPLETE: 4, - // 上传取消 - CANCELLED: 5 - } - */ - getStatus: function() { - return statusMap[ this.id ]; - }, - - /** - * 获取文件原始信息。 - * @return {*} - */ - getSource: function() { - return this.source; - }, - - destory: function() { - delete statusMap[ this.id ]; - } - }); - - Mediator.installTo( WUFile.prototype ); - - /** - * 文件状态值,具体包括以下几种类型: - * * `inited` 初始状态 - * * `queued` 已经进入队列, 等待上传 - * * `progress` 上传中 - * * `complete` 上传完成。 - * * `error` 上传出错,可重试 - * * `interrupt` 上传中断,可续传。 - * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。 - * * `cancelled` 文件被移除。 - * @property {Object} Status - * @namespace File - * @class File - * @static - */ - WUFile.Status = { - INITED: 'inited', // 初始状态 - QUEUED: 'queued', // 已经进入队列, 等待上传 - PROGRESS: 'progress', // 上传中 - ERROR: 'error', // 上传出错,可重试 - COMPLETE: 'complete', // 上传完成。 - CANCELLED: 'cancelled', // 上传取消。 - INTERRUPT: 'interrupt', // 上传中断,可续传。 - INVALID: 'invalid' // 文件不合格,不能重试上传。 - }; - - return WUFile; - }); - - /** - * @fileOverview 文件队列 - */ - define('queue',[ - 'base', - 'mediator', - 'file' - ], function( Base, Mediator, WUFile ) { - - var $ = Base.$, - STATUS = WUFile.Status; - - /** - * 文件队列, 用来存储各个状态中的文件。 - * @class Queue - * @extends Mediator - */ - function Queue() { - - /** - * 统计文件数。 - * * `numOfQueue` 队列中的文件数。 - * * `numOfSuccess` 上传成功的文件数 - * * `numOfCancel` 被移除的文件数 - * * `numOfProgress` 正在上传中的文件数 - * * `numOfUploadFailed` 上传错误的文件数。 - * * `numOfInvalid` 无效的文件数。 - * @property {Object} stats - */ - this.stats = { - numOfQueue: 0, - numOfSuccess: 0, - numOfCancel: 0, - numOfProgress: 0, - numOfUploadFailed: 0, - numOfInvalid: 0 - }; - - // 上传队列,仅包括等待上传的文件 - this._queue = []; - - // 存储所有文件 - this._map = {}; - } - - $.extend( Queue.prototype, { - - /** - * 将新文件加入对队列尾部 - * - * @method append - * @param {File} file 文件对象 - */ - append: function( file ) { - this._queue.push( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 将新文件加入对队列头部 - * - * @method prepend - * @param {File} file 文件对象 - */ - prepend: function( file ) { - this._queue.unshift( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 获取文件对象 - * - * @method getFile - * @param {String} fileId 文件ID - * @return {File} - */ - getFile: function( fileId ) { - if ( typeof fileId !== 'string' ) { - return fileId; - } - return this._map[ fileId ]; - }, - - /** - * 从队列中取出一个指定状态的文件。 - * @grammar fetch( status ) => File - * @method fetch - * @param {String} status [文件状态值](#WebUploader:File:File.Status) - * @return {File} [File](#WebUploader:File) - */ - fetch: function( status ) { - var len = this._queue.length, - i, file; - - status = status || STATUS.QUEUED; - - for ( i = 0; i < len; i++ ) { - file = this._queue[ i ]; - - if ( status === file.getStatus() ) { - return file; - } - } - - return null; - }, - - /** - * 对队列进行排序,能够控制文件上传顺序。 - * @grammar sort( fn ) => undefined - * @method sort - * @param {Function} fn 排序方法 - */ - sort: function( fn ) { - if ( typeof fn === 'function' ) { - this._queue.sort( fn ); - } - }, - - /** - * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。 - * @grammar getFiles( [status1[, status2 ...]] ) => Array - * @method getFiles - * @param {String} [status] [文件状态值](#WebUploader:File:File.Status) - */ - getFiles: function() { - var sts = [].slice.call( arguments, 0 ), - ret = [], - i = 0, - len = this._queue.length, - file; - - for ( ; i < len; i++ ) { - file = this._queue[ i ]; - - if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) { - continue; - } - - ret.push( file ); - } - - return ret; - }, - - _fileAdded: function( file ) { - var me = this, - existing = this._map[ file.id ]; - - if ( !existing ) { - this._map[ file.id ] = file; - - file.on( 'statuschange', function( cur, pre ) { - me._onFileStatusChange( cur, pre ); - }); - } - - file.setStatus( STATUS.QUEUED ); - }, - - _onFileStatusChange: function( curStatus, preStatus ) { - var stats = this.stats; - - switch ( preStatus ) { - case STATUS.PROGRESS: - stats.numOfProgress--; - break; - - case STATUS.QUEUED: - stats.numOfQueue --; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed--; - break; - - case STATUS.INVALID: - stats.numOfInvalid--; - break; - } - - switch ( curStatus ) { - case STATUS.QUEUED: - stats.numOfQueue++; - break; - - case STATUS.PROGRESS: - stats.numOfProgress++; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed++; - break; - - case STATUS.COMPLETE: - stats.numOfSuccess++; - break; - - case STATUS.CANCELLED: - stats.numOfCancel++; - break; - - case STATUS.INVALID: - stats.numOfInvalid++; - break; - } - } - - }); - - Mediator.installTo( Queue.prototype ); - - return Queue; - }); - /** - * @fileOverview 队列 - */ - define('widgets/queue',[ - 'base', - 'uploader', - 'queue', - 'file', - 'lib/file', - 'runtime/client', - 'widgets/widget' - ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) { - - var $ = Base.$, - rExt = /\.\w+$/, - Status = WUFile.Status; - - return Uploader.register({ - 'sort-files': 'sortFiles', - 'add-file': 'addFiles', - 'get-file': 'getFile', - 'fetch-file': 'fetchFile', - 'get-stats': 'getStats', - 'get-files': 'getFiles', - 'remove-file': 'removeFile', - 'retry': 'retry', - 'reset': 'reset', - 'accept-file': 'acceptFile' - }, { - - init: function( opts ) { - var me = this, - deferred, len, i, item, arr, accept, runtime; - - if ( $.isPlainObject( opts.accept ) ) { - opts.accept = [ opts.accept ]; - } - - // accept中的中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].extensions; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = '\\.' + arr.join(',') - .replace( /,/g, '$|\\.' ) - .replace( /\*/g, '.*' ) + '$'; - } - - me.accept = new RegExp( accept, 'i' ); - } - - me.queue = new Queue(); - me.stats = me.queue.stats; - - // 如果当前不是html5运行时,那就算了。 - // 不执行后续操作 - if ( this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - // 创建一个 html5 运行时的 placeholder - // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。 - deferred = Base.Deferred(); - runtime = new RuntimeClient('Placeholder'); - runtime.connectRuntime({ - runtimeOrder: 'html5' - }, function() { - me._ruid = runtime.getRuid(); - deferred.resolve(); - }); - return deferred.promise(); - }, - - - // 为了支持外部直接添加一个原生File对象。 - _wrapFile: function( file ) { - if ( !(file instanceof WUFile) ) { - - if ( !(file instanceof File) ) { - if ( !this._ruid ) { - throw new Error('Can\'t add external files.'); - } - file = new File( this._ruid, file ); - } - - file = new WUFile( file ); - } - - return file; - }, - - // 判断文件是否可以被加入队列 - acceptFile: function( file ) { - var invalid = !file || file.size < 6 || this.accept && - - // 如果名字中有后缀,才做后缀白名单处理。 - rExt.exec( file.name ) && !this.accept.test( file.name ); - - return !invalid; - }, - - - /** - * @event beforeFileQueued - * @param {File} file File对象 - * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。 - * @for Uploader - */ - - /** - * @event fileQueued - * @param {File} file File对象 - * @description 当文件被加入队列以后触发。 - * @for Uploader - */ - - _addFile: function( file ) { - var me = this; - - file = me._wrapFile( file ); - - // 不过类型判断允许不允许,先派送 `beforeFileQueued` - if ( !me.owner.trigger( 'beforeFileQueued', file ) ) { - return; - } - - // 类型不匹配,则派送错误事件,并返回。 - if ( !me.acceptFile( file ) ) { - me.owner.trigger( 'error', 'Q_TYPE_DENIED', file ); - return; - } - - me.queue.append( file ); - me.owner.trigger( 'fileQueued', file ); - return file; - }, - - getFile: function( fileId ) { - return this.queue.getFile( fileId ); - }, - - /** - * @event filesQueued - * @param {File} files 数组,内容为原始File(lib/File)对象。 - * @description 当一批文件添加进队列以后触发。 - * @for Uploader - */ - - /** - * @method addFiles - * @grammar addFiles( file ) => undefined - * @grammar addFiles( [file1, file2 ...] ) => undefined - * @param {Array of File or File} [files] Files 对象 数组 - * @description 添加文件到队列 - * @for Uploader - */ - addFiles: function( files ) { - var me = this; - - if ( !files.length ) { - files = [ files ]; - } - - files = $.map( files, function( file ) { - return me._addFile( file ); - }); - - me.owner.trigger( 'filesQueued', files ); - - if ( me.options.auto ) { - me.request('start-upload'); - } - }, - - getStats: function() { - return this.stats; - }, - - /** - * @event fileDequeued - * @param {File} file File对象 - * @description 当文件被移除队列后触发。 - * @for Uploader - */ - - /** - * @method removeFile - * @grammar removeFile( file ) => undefined - * @grammar removeFile( id ) => undefined - * @param {File|id} file File对象或这File对象的id - * @description 移除某一文件。 - * @for Uploader - * @example - * - * $li.on('click', '.remove-this', function() { - * uploader.removeFile( file ); - * }) - */ - removeFile: function( file ) { - var me = this; - - file = file.id ? file : me.queue.getFile( file ); - - file.setStatus( Status.CANCELLED ); - me.owner.trigger( 'fileDequeued', file ); - }, - - /** - * @method getFiles - * @grammar getFiles() => Array - * @grammar getFiles( status1, status2, status... ) => Array - * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。 - * @for Uploader - * @example - * console.log( uploader.getFiles() ); // => all files - * console.log( uploader.getFiles('error') ) // => all error files. - */ - getFiles: function() { - return this.queue.getFiles.apply( this.queue, arguments ); - }, - - fetchFile: function() { - return this.queue.fetch.apply( this.queue, arguments ); - }, - - /** - * @method retry - * @grammar retry() => undefined - * @grammar retry( file ) => undefined - * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。 - * @for Uploader - * @example - * function retry() { - * uploader.retry(); - * } - */ - retry: function( file, noForceStart ) { - var me = this, - files, i, len; - - if ( file ) { - file = file.id ? file : me.queue.getFile( file ); - file.setStatus( Status.QUEUED ); - noForceStart || me.request('start-upload'); - return; - } - - files = me.queue.getFiles( Status.ERROR ); - i = 0; - len = files.length; - - for ( ; i < len; i++ ) { - file = files[ i ]; - file.setStatus( Status.QUEUED ); - } - - me.request('start-upload'); - }, - - /** - * @method sort - * @grammar sort( fn ) => undefined - * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。 - * @for Uploader - */ - sortFiles: function() { - return this.queue.sort.apply( this.queue, arguments ); - }, - - /** - * @method reset - * @grammar reset() => undefined - * @description 重置uploader。目前只重置了队列。 - * @for Uploader - * @example - * uploader.reset(); - */ - reset: function() { - this.queue = new Queue(); - this.stats = this.queue.stats; - } - }); - - }); - /** - * @fileOverview 添加获取Runtime相关信息的方法。 - */ - define('widgets/runtime',[ - 'uploader', - 'runtime/runtime', - 'widgets/widget' - ], function( Uploader, Runtime ) { - - Uploader.support = function() { - return Runtime.hasRuntime.apply( Runtime, arguments ); - }; - - return Uploader.register({ - 'predict-runtime-type': 'predictRuntmeType' - }, { - - init: function() { - if ( !this.predictRuntmeType() ) { - throw Error('Runtime Error'); - } - }, - - /** - * 预测Uploader将采用哪个`Runtime` - * @grammar predictRuntmeType() => String - * @method predictRuntmeType - * @for Uploader - */ - predictRuntmeType: function() { - var orders = this.options.runtimeOrder || Runtime.orders, - type = this.type, - i, len; - - if ( !type ) { - orders = orders.split( /\s*,\s*/g ); - - for ( i = 0, len = orders.length; i < len; i++ ) { - if ( Runtime.hasRuntime( orders[ i ] ) ) { - this.type = type = orders[ i ]; - break; - } - } - } - - return type; - } - }); - }); - /** - * @fileOverview Transport - */ - define('lib/transport',[ - 'base', - 'runtime/client', - 'mediator' - ], function( Base, RuntimeClient, Mediator ) { - - var $ = Base.$; - - function Transport( opts ) { - var me = this; - - opts = me.options = $.extend( true, {}, Transport.options, opts || {} ); - RuntimeClient.call( this, 'Transport' ); - - this._blob = null; - this._formData = opts.formData || {}; - this._headers = opts.headers || {}; - - this.on( 'progress', this._timeout ); - this.on( 'load error', function() { - me.trigger( 'progress', 1 ); - clearTimeout( me._timer ); - }); - } - - Transport.options = { - server: '', - method: 'POST', - - // 跨域时,是否允许携带cookie, 只有html5 runtime才有效 - withCredentials: false, - fileVal: 'file', - timeout: 2 * 60 * 1000, // 2分钟 - formData: {}, - headers: {}, - sendAsBinary: false - }; - - $.extend( Transport.prototype, { - - // 添加Blob, 只能添加一次,最后一次有效。 - appendBlob: function( key, blob, filename ) { - var me = this, - opts = me.options; - - if ( me.getRuid() ) { - me.disconnectRuntime(); - } - - // 连接到blob归属的同一个runtime. - me.connectRuntime( blob.ruid, function() { - me.exec('init'); - }); - - me._blob = blob; - opts.fileVal = key || opts.fileVal; - opts.filename = filename || opts.filename; - }, - - // 添加其他字段 - append: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._formData, key ); - } else { - this._formData[ key ] = value; - } - }, - - setRequestHeader: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._headers, key ); - } else { - this._headers[ key ] = value; - } - }, - - send: function( method ) { - this.exec( 'send', method ); - this._timeout(); - }, - - abort: function() { - clearTimeout( this._timer ); - return this.exec('abort'); - }, - - destroy: function() { - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }, - - getResponse: function() { - return this.exec('getResponse'); - }, - - getResponseAsJson: function() { - return this.exec('getResponseAsJson'); - }, - - getStatus: function() { - return this.exec('getStatus'); - }, - - _timeout: function() { - var me = this, - duration = me.options.timeout; - - if ( !duration ) { - return; - } - - clearTimeout( me._timer ); - me._timer = setTimeout(function() { - me.abort(); - me.trigger( 'error', 'timeout' ); - }, duration ); - } - - }); - - // 让Transport具备事件功能。 - Mediator.installTo( Transport.prototype ); - - return Transport; - }); - /** - * @fileOverview 负责文件上传相关。 - */ - define('widgets/upload',[ - 'base', - 'uploader', - 'file', - 'lib/transport', - 'widgets/widget' - ], function( Base, Uploader, WUFile, Transport ) { - - var $ = Base.$, - isPromise = Base.isPromise, - Status = WUFile.Status; - - // 添加默认配置项 - $.extend( Uploader.options, { - - - /** - * @property {Boolean} [prepareNextFile=false] - * @namespace options - * @for Uploader - * @description 是否允许在文件传输时提前把下一个文件准备好。 - * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 - * 如果能提前在当前文件传输期处理,可以节省总体耗时。 - */ - prepareNextFile: false, - - /** - * @property {Boolean} [chunked=false] - * @namespace options - * @for Uploader - * @description 是否要分片处理大文件上传。 - */ - chunked: false, - - /** - * @property {Boolean} [chunkSize=5242880] - * @namespace options - * @for Uploader - * @description 如果要分片,分多大一片? 默认大小为5M. - */ - chunkSize: 5 * 1024 * 1024, - - /** - * @property {Boolean} [chunkRetry=2] - * @namespace options - * @for Uploader - * @description 如果某个分片由于网络问题出错,允许自动重传多少次? - */ - chunkRetry: 2, - - /** - * @property {Boolean} [threads=3] - * @namespace options - * @for Uploader - * @description 上传并发数。允许同时最大上传进程数。 - */ - threads: 3, - - - /** - * @property {Object} [formData] - * @namespace options - * @for Uploader - * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。 - */ - formData: null - - /** - * @property {Object} [fileVal='file'] - * @namespace options - * @for Uploader - * @description 设置文件上传域的name。 - */ - - /** - * @property {Object} [method='POST'] - * @namespace options - * @for Uploader - * @description 文件上传方式,`POST`或者`GET`。 - */ - - /** - * @property {Object} [sendAsBinary=false] - * @namespace options - * @for Uploader - * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容, - * 其他参数在$_GET数组中。 - */ - }); - - // 负责将文件切片。 - function CuteFile( file, chunkSize ) { - var pending = [], - blob = file.source, - total = blob.size, - chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1, - start = 0, - index = 0, - len; - - while ( index < chunks ) { - len = Math.min( chunkSize, total - start ); - - pending.push({ - file: file, - start: start, - end: chunkSize ? (start + len) : total, - total: total, - chunks: chunks, - chunk: index++ - }); - start += len; - } - - file.blocks = pending.concat(); - file.remaning = pending.length; - - return { - file: file, - - has: function() { - return !!pending.length; - }, - - fetch: function() { - return pending.shift(); - } - }; - } - - Uploader.register({ - 'start-upload': 'start', - 'stop-upload': 'stop', - 'skip-file': 'skipFile', - 'is-in-progress': 'isInProgress' - }, { - - init: function() { - var owner = this.owner; - - this.runing = false; - - // 记录当前正在传的数据,跟threads相关 - this.pool = []; - - // 缓存即将上传的文件。 - this.pending = []; - - // 跟踪还有多少分片没有完成上传。 - this.remaning = 0; - this.__tick = Base.bindFn( this._tick, this ); - - owner.on( 'uploadComplete', function( file ) { - // 把其他块取消了。 - file.blocks && $.each( file.blocks, function( _, v ) { - v.transport && (v.transport.abort(), v.transport.destroy()); - delete v.transport; - }); - - delete file.blocks; - delete file.remaning; - }); - }, - - /** - * @event startUpload - * @description 当开始上传流程时触发。 - * @for Uploader - */ - - /** - * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。 - * @grammar upload() => undefined - * @method upload - * @for Uploader - */ - start: function() { - var me = this; - - // 移出invalid的文件 - $.each( me.request( 'get-files', Status.INVALID ), function() { - me.request( 'remove-file', this ); - }); - - if ( me.runing ) { - return; - } - - me.runing = true; - - // 如果有暂停的,则续传 - $.each( me.pool, function( _, v ) { - var file = v.file; - - if ( file.getStatus() === Status.INTERRUPT ) { - file.setStatus( Status.PROGRESS ); - me._trigged = false; - v.transport && v.transport.send(); - } - }); - - me._trigged = false; - me.owner.trigger('startUpload'); - Base.nextTick( me.__tick ); - }, - - /** - * @event stopUpload - * @description 当开始上传流程暂停时触发。 - * @for Uploader - */ - - /** - * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。 - * @grammar stop() => undefined - * @grammar stop( true ) => undefined - * @method stop - * @for Uploader - */ - stop: function( interrupt ) { - var me = this; - - if ( me.runing === false ) { - return; - } - - me.runing = false; - - interrupt && $.each( me.pool, function( _, v ) { - v.transport && v.transport.abort(); - v.file.setStatus( Status.INTERRUPT ); - }); - - me.owner.trigger('stopUpload'); - }, - - /** - * 判断`Uplaode`r是否正在上传中。 - * @grammar isInProgress() => Boolean - * @method isInProgress - * @for Uploader - */ - isInProgress: function() { - return !!this.runing; - }, - - getStats: function() { - return this.request('get-stats'); - }, - - /** - * 掉过一个文件上传,直接标记指定文件为已上传状态。 - * @grammar skipFile( file ) => undefined - * @method skipFile - * @for Uploader - */ - skipFile: function( file, status ) { - file = this.request( 'get-file', file ); - - file.setStatus( status || Status.COMPLETE ); - file.skipped = true; - - // 如果正在上传。 - file.blocks && $.each( file.blocks, function( _, v ) { - var _tr = v.transport; - - if ( _tr ) { - _tr.abort(); - _tr.destroy(); - delete v.transport; - } - }); - - this.owner.trigger( 'uploadSkip', file ); - }, - - /** - * @event uploadFinished - * @description 当所有文件上传结束时触发。 - * @for Uploader - */ - _tick: function() { - var me = this, - opts = me.options, - fn, val; - - // 上一个promise还没有结束,则等待完成后再执行。 - if ( me._promise ) { - return me._promise.always( me.__tick ); - } - - // 还有位置,且还有文件要处理的话。 - if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) { - me._trigged = false; - - fn = function( val ) { - me._promise = null; - - // 有可能是reject过来的,所以要检测val的类型。 - val && val.file && me._startSend( val ); - Base.nextTick( me.__tick ); - }; - - me._promise = isPromise( val ) ? val.always( fn ) : fn( val ); - - // 没有要上传的了,且没有正在传输的了。 - } else if ( !me.remaning && !me.getStats().numOfQueue ) { - me.runing = false; - - me._trigged || Base.nextTick(function() { - me.owner.trigger('uploadFinished'); - }); - me._trigged = true; - } - }, - - _nextBlock: function() { - var me = this, - act = me._act, - opts = me.options, - next, done; - - // 如果当前文件还有没有需要传输的,则直接返回剩下的。 - if ( act && act.has() && - act.file.getStatus() === Status.PROGRESS ) { - - // 是否提前准备下一个文件 - if ( opts.prepareNextFile && !me.pending.length ) { - me._prepareNextFile(); - } - - return act.fetch(); - - // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。 - } else if ( me.runing ) { - - // 如果缓存中有,则直接在缓存中取,没有则去queue中取。 - if ( !me.pending.length && me.getStats().numOfQueue ) { - me._prepareNextFile(); - } - - next = me.pending.shift(); - done = function( file ) { - if ( !file ) { - return null; - } - - act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 ); - me._act = act; - return act.fetch(); - }; - - // 文件可能还在prepare中,也有可能已经完全准备好了。 - return isPromise( next ) ? - next[ next.pipe ? 'pipe' : 'then']( done ) : - done( next ); - } - }, - - - /** - * @event uploadStart - * @param {File} file File对象 - * @description 某个文件开始上传前触发,一个文件只会触发一次。 - * @for Uploader - */ - _prepareNextFile: function() { - var me = this, - file = me.request('fetch-file'), - pending = me.pending, - promise; - - if ( file ) { - promise = me.request( 'before-send-file', file, function() { - - // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued. - if ( file.getStatus() === Status.QUEUED ) { - me.owner.trigger( 'uploadStart', file ); - file.setStatus( Status.PROGRESS ); - return file; - } - - return me._finishFile( file ); - }); - - // 如果还在pending中,则替换成文件本身。 - promise.done(function() { - var idx = $.inArray( promise, pending ); - - ~idx && pending.splice( idx, 1, file ); - }); - - // befeore-send-file的钩子就有错误发生。 - promise.fail(function( reason ) { - file.setStatus( Status.ERROR, reason ); - me.owner.trigger( 'uploadError', file, reason ); - me.owner.trigger( 'uploadComplete', file ); - }); - - pending.push( promise ); - } - }, - - // 让出位置了,可以让其他分片开始上传 - _popBlock: function( block ) { - var idx = $.inArray( block, this.pool ); - - this.pool.splice( idx, 1 ); - block.file.remaning--; - this.remaning--; - }, - - // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。 - _startSend: function( block ) { - var me = this, - file = block.file, - promise; - - me.pool.push( block ); - me.remaning++; - - // 如果没有分片,则直接使用原始的。 - // 不会丢失content-type信息。 - block.blob = block.chunks === 1 ? file.source : - file.source.slice( block.start, block.end ); - - // hook, 每个分片发送之前可能要做些异步的事情。 - promise = me.request( 'before-send', block, function() { - - // 有可能文件已经上传出错了,所以不需要再传输了。 - if ( file.getStatus() === Status.PROGRESS ) { - me._doSend( block ); - } else { - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - - // 如果为fail了,则跳过此分片。 - promise.fail(function() { - if ( file.remaning === 1 ) { - me._finishFile( file ).always(function() { - block.percentage = 1; - me._popBlock( block ); - me.owner.trigger( 'uploadComplete', file ); - Base.nextTick( me.__tick ); - }); - } else { - block.percentage = 1; - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - }, - - - /** - * @event uploadBeforeSend - * @param {Object} object - * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。 - * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 - * @for Uploader - */ - - /** - * @event uploadAccept - * @param {Object} object - * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。 - * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。 - * @for Uploader - */ - - /** - * @event uploadProgress - * @param {File} file File对象 - * @param {Number} percentage 上传进度 - * @description 上传过程中触发,携带上传进度。 - * @for Uploader - */ - - - /** - * @event uploadError - * @param {File} file File对象 - * @param {String} reason 出错的code - * @description 当文件上传出错时触发。 - * @for Uploader - */ - - /** - * @event uploadSuccess - * @param {File} file File对象 - * @param {Object} response 服务端返回的数据 - * @description 当文件上传成功时触发。 - * @for Uploader - */ - - /** - * @event uploadComplete - * @param {File} [file] File对象 - * @description 不管成功或者失败,文件上传完成时触发。 - * @for Uploader - */ - - // 做上传操作。 - _doSend: function( block ) { - var me = this, - owner = me.owner, - opts = me.options, - file = block.file, - tr = new Transport( opts ), - data = $.extend({}, opts.formData ), - headers = $.extend({}, opts.headers ), - requestAccept, ret; - - block.transport = tr; - - tr.on( 'destroy', function() { - delete block.transport; - me._popBlock( block ); - Base.nextTick( me.__tick ); - }); - - // 广播上传进度。以文件为单位。 - tr.on( 'progress', function( percentage ) { - var totalPercent = 0, - uploaded = 0; - - // 可能没有abort掉,progress还是执行进来了。 - // if ( !file.blocks ) { - // return; - // } - - totalPercent = block.percentage = percentage; - - if ( block.chunks > 1 ) { // 计算文件的整体速度。 - $.each( file.blocks, function( _, v ) { - uploaded += (v.percentage || 0) * (v.end - v.start); - }); - - totalPercent = uploaded / file.size; - } - - owner.trigger( 'uploadProgress', file, totalPercent || 0 ); - }); - - // 用来询问,是否返回的结果是有错误的。 - requestAccept = function( reject ) { - var fn; - - ret = tr.getResponseAsJson() || {}; - ret._raw = tr.getResponse(); - fn = function( value ) { - reject = value; - }; - - // 服务端响应了,不代表成功了,询问是否响应正确。 - if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) { - reject = reject || 'server'; - } - - return reject; - }; - - // 尝试重试,然后广播文件上传出错。 - tr.on( 'error', function( type, flag ) { - block.retried = block.retried || 0; - - // 自动重试 - if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) && - block.retried < opts.chunkRetry ) { - - block.retried++; - tr.send(); - - } else { - - // http status 500 ~ 600 - if ( !flag && type === 'server' ) { - type = requestAccept( type ); - } - - file.setStatus( Status.ERROR, type ); - owner.trigger( 'uploadError', file, type ); - owner.trigger( 'uploadComplete', file ); - } - }); - - // 上传成功 - tr.on( 'load', function() { - var reason; - - // 如果非预期,转向上传出错。 - if ( (reason = requestAccept()) ) { - tr.trigger( 'error', reason, true ); - return; - } - - // 全部上传完成。 - if ( file.remaning === 1 ) { - me._finishFile( file, ret ); - } else { - tr.destroy(); - } - }); - - // 配置默认的上传字段。 - data = $.extend( data, { - id: file.id, - name: file.name, - type: file.type, - lastModifiedDate: file.lastModifiedDate, - size: file.size - }); - - block.chunks > 1 && $.extend( data, { - chunks: block.chunks, - chunk: block.chunk - }); - - // 在发送之间可以添加字段什么的。。。 - // 如果默认的字段不够使用,可以通过监听此事件来扩展 - owner.trigger( 'uploadBeforeSend', block, data, headers ); - - // 开始发送。 - tr.appendBlob( opts.fileVal, block.blob, file.name ); - tr.append( data ); - tr.setRequestHeader( headers ); - tr.send(); - }, - - // 完成上传。 - _finishFile: function( file, ret, hds ) { - var owner = this.owner; - - return owner - .request( 'after-send-file', arguments, function() { - file.setStatus( Status.COMPLETE ); - owner.trigger( 'uploadSuccess', file, ret, hds ); - }) - .fail(function( reason ) { - - // 如果外部已经标记为invalid什么的,不再改状态。 - if ( file.getStatus() === Status.PROGRESS ) { - file.setStatus( Status.ERROR, reason ); - } - - owner.trigger( 'uploadError', file, reason ); - }) - .always(function() { - owner.trigger( 'uploadComplete', file ); - }); - } - - }); - }); - /** - * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。 - */ - - define('widgets/validator',[ - 'base', - 'uploader', - 'file', - 'widgets/widget' - ], function( Base, Uploader, WUFile ) { - - var $ = Base.$, - validators = {}, - api; - - /** - * @event error - * @param {String} type 错误类型。 - * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。 - * - * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。 - * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。 - * @for Uploader - */ - - // 暴露给外面的api - api = { - - // 添加验证器 - addValidator: function( type, cb ) { - validators[ type ] = cb; - }, - - // 移除验证器 - removeValidator: function( type ) { - delete validators[ type ]; - } - }; - - // 在Uploader初始化的时候启动Validators的初始化 - Uploader.register({ - init: function() { - var me = this; - $.each( validators, function() { - this.call( me.owner ); - }); - } - }); - - /** - * @property {int} [fileNumLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总数量, 超出则不允许加入队列。 - */ - api.addValidator( 'fileNumLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileNumLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( count >= max && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return count >= max ? false : true; - }); - - uploader.on( 'fileQueued', function() { - count++; - }); - - uploader.on( 'fileDequeued', function() { - count--; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - - /** - * @property {int} [fileSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSizeLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileSizeLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var invalid = count + file.size > max; - - if ( invalid && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return invalid ? false : true; - }); - - uploader.on( 'fileQueued', function( file ) { - count += file.size; - }); - - uploader.on( 'fileDequeued', function( file ) { - count -= file.size; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - /** - * @property {int} [fileSingleSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSingleSizeLimit', function() { - var uploader = this, - opts = uploader.options, - max = opts.fileSingleSizeLimit; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( file.size > max ) { - file.setStatus( WUFile.Status.INVALID, 'exceed_size' ); - this.trigger( 'error', 'F_EXCEED_SIZE', file ); - return false; - } - - }); - - }); - - /** - * @property {int} [duplicate=undefined] - * @namespace options - * @for Uploader - * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key. - */ - api.addValidator( 'duplicate', function() { - var uploader = this, - opts = uploader.options, - mapping = {}; - - if ( opts.duplicate ) { - return; - } - - function hashString( str ) { - var hash = 0, - i = 0, - len = str.length, - _char; - - for ( ; i < len; i++ ) { - _char = str.charCodeAt( i ); - hash = _char + (hash << 6) + (hash << 16) - hash; - } - - return hash; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var hash = file.__hash || (file.__hash = hashString( file.name + - file.size + file.lastModifiedDate )); - - // 已经重复了 - if ( mapping[ hash ] ) { - this.trigger( 'error', 'F_DUPLICATE', file ); - return false; - } - }); - - uploader.on( 'fileQueued', function( file ) { - var hash = file.__hash; - - hash && (mapping[ hash ] = true); - }); - - uploader.on( 'fileDequeued', function( file ) { - var hash = file.__hash; - - hash && (delete mapping[ hash ]); - }); - }); - - return api; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/compbase',[],function() { - - function CompBase( owner, runtime ) { - - this.owner = owner; - this.options = owner.options; - - this.getRuntime = function() { - return runtime; - }; - - this.getRuid = function() { - return runtime.uid; - }; - - this.trigger = function() { - return owner.trigger.apply( owner, arguments ); - }; - } - - return CompBase; - }); - /** - * @fileOverview Html5Runtime - */ - define('runtime/html5/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - - var type = 'html5', - components = {}; - - function Html5Runtime() { - var pool = {}, - me = this, - destory = this.destory; - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - if ( components[ comp ] ) { - instance = pool[ uid ] = pool[ uid ] || - new components[ comp ]( client, me ); - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - }; - - me.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - } - - Base.inherits( Runtime, { - constructor: Html5Runtime, - - // 不需要连接其他程序,直接执行callback - init: function() { - var me = this; - setTimeout(function() { - me.trigger('ready'); - }, 1 ); - } - - }); - - // 注册Components - Html5Runtime.register = function( name, component ) { - var klass = components[ name ] = Base.inherits( CompBase, component ); - return klass; - }; - - // 注册html5运行时。 - // 只有在支持的前提下注册。 - if ( window.Blob && window.FileReader && window.DataView ) { - Runtime.addRuntime( type, Html5Runtime ); - } - - return Html5Runtime; - }); - /** - * @fileOverview Blob Html实现 - */ - define('runtime/html5/blob',[ - 'runtime/html5/runtime', - 'lib/blob' - ], function( Html5Runtime, Blob ) { - - return Html5Runtime.register( 'Blob', { - slice: function( start, end ) { - var blob = this.owner.source, - slice = blob.slice || blob.webkitSlice || blob.mozSlice; - - blob = slice.call( blob, start, end ); - - return new Blob( this.getRuid(), blob ); - } - }); - }); - /** - * @fileOverview FilePaste - */ - define('runtime/html5/dnd',[ - 'base', - 'runtime/html5/runtime', - 'lib/file' - ], function( Base, Html5Runtime, File ) { - - var $ = Base.$, - prefix = 'webuploader-dnd-'; - - return Html5Runtime.register( 'DragAndDrop', { - init: function() { - var elem = this.elem = this.options.container; - - this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this ); - this.dragOverHandler = Base.bindFn( this._dragOverHandler, this ); - this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this ); - this.dropHandler = Base.bindFn( this._dropHandler, this ); - this.dndOver = false; - - elem.on( 'dragenter', this.dragEnterHandler ); - elem.on( 'dragover', this.dragOverHandler ); - elem.on( 'dragleave', this.dragLeaveHandler ); - elem.on( 'drop', this.dropHandler ); - - if ( this.options.disableGlobalDnd ) { - $( document ).on( 'dragover', this.dragOverHandler ); - $( document ).on( 'drop', this.dropHandler ); - } - }, - - _dragEnterHandler: function( e ) { - var me = this, - denied = me._denied || false, - items; - - e = e.originalEvent || e; - - if ( !me.dndOver ) { - me.dndOver = true; - - // 注意只有 chrome 支持。 - items = e.dataTransfer.items; - - if ( items && items.length ) { - me._denied = denied = !me.trigger( 'accept', items ); - } - - me.elem.addClass( prefix + 'over' ); - me.elem[ denied ? 'addClass' : - 'removeClass' ]( prefix + 'denied' ); - } - - - e.dataTransfer.dropEffect = denied ? 'none' : 'copy'; - - return false; - }, - - _dragOverHandler: function( e ) { - // 只处理框内的。 - var parentElem = this.elem.parent().get( 0 ); - if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) { - return false; - } - - clearTimeout( this._leaveTimer ); - this._dragEnterHandler.call( this, e ); - - return false; - }, - - _dragLeaveHandler: function() { - var me = this, - handler; - - handler = function() { - me.dndOver = false; - me.elem.removeClass( prefix + 'over ' + prefix + 'denied' ); - }; - - clearTimeout( me._leaveTimer ); - me._leaveTimer = setTimeout( handler, 100 ); - return false; - }, - - _dropHandler: function( e ) { - var me = this, - ruid = me.getRuid(), - parentElem = me.elem.parent().get( 0 ); - - // 只处理框内的。 - if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) { - return false; - } - - me._getTansferFiles( e, function( results ) { - me.trigger( 'drop', $.map( results, function( file ) { - return new File( ruid, file ); - }) ); - }); - - me.dndOver = false; - me.elem.removeClass( prefix + 'over' ); - return false; - }, - - // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。 - _getTansferFiles: function( e, callback ) { - var results = [], - promises = [], - items, files, dataTransfer, file, item, i, len, canAccessFolder; - - e = e.originalEvent || e; - - dataTransfer = e.dataTransfer; - items = dataTransfer.items; - files = dataTransfer.files; - - canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry); - - for ( i = 0, len = files.length; i < len; i++ ) { - file = files[ i ]; - item = items && items[ i ]; - - if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) { - - promises.push( this._traverseDirectoryTree( - item.webkitGetAsEntry(), results ) ); - } else { - results.push( file ); - } - } - - Base.when.apply( Base, promises ).done(function() { - - if ( !results.length ) { - return; - } - - callback( results ); - }); - }, - - _traverseDirectoryTree: function( entry, results ) { - var deferred = Base.Deferred(), - me = this; - - if ( entry.isFile ) { - entry.file(function( file ) { - results.push( file ); - deferred.resolve(); - }); - } else if ( entry.isDirectory ) { - entry.createReader().readEntries(function( entries ) { - var len = entries.length, - promises = [], - arr = [], // 为了保证顺序。 - i; - - for ( i = 0; i < len; i++ ) { - promises.push( me._traverseDirectoryTree( - entries[ i ], arr ) ); - } - - Base.when.apply( Base, promises ).then(function() { - results.push.apply( results, arr ); - deferred.resolve(); - }, deferred.reject ); - }); - } - - return deferred.promise(); - }, - - destroy: function() { - var elem = this.elem; - - elem.off( 'dragenter', this.dragEnterHandler ); - elem.off( 'dragover', this.dragEnterHandler ); - elem.off( 'dragleave', this.dragLeaveHandler ); - elem.off( 'drop', this.dropHandler ); - - if ( this.options.disableGlobalDnd ) { - $( document ).off( 'dragover', this.dragOverHandler ); - $( document ).off( 'drop', this.dropHandler ); - } - } - }); - }); - - /** - * @fileOverview FilePaste - */ - define('runtime/html5/filepaste',[ - 'base', - 'runtime/html5/runtime', - 'lib/file' - ], function( Base, Html5Runtime, File ) { - - return Html5Runtime.register( 'FilePaste', { - init: function() { - var opts = this.options, - elem = this.elem = opts.container, - accept = '.*', - arr, i, len, item; - - // accetp的mimeTypes中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].mimeTypes; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = arr.join(','); - accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' ); - } - } - this.accept = accept = new RegExp( accept, 'i' ); - this.hander = Base.bindFn( this._pasteHander, this ); - elem.on( 'paste', this.hander ); - }, - - _pasteHander: function( e ) { - var allowed = [], - ruid = this.getRuid(), - items, item, blob, i, len; - - e = e.originalEvent || e; - items = e.clipboardData.items; - - for ( i = 0, len = items.length; i < len; i++ ) { - item = items[ i ]; - - if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) { - continue; - } - - allowed.push( new File( ruid, blob ) ); - } - - if ( allowed.length ) { - // 不阻止非文件粘贴(文字粘贴)的事件冒泡 - e.preventDefault(); - e.stopPropagation(); - this.trigger( 'paste', allowed ); - } - }, - - destroy: function() { - this.elem.off( 'paste', this.hander ); - } - }); - }); - - /** - * @fileOverview FilePicker - */ - define('runtime/html5/filepicker',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var $ = Base.$; - - return Html5Runtime.register( 'FilePicker', { - init: function() { - var container = this.getRuntime().getContainer(), - me = this, - owner = me.owner, - opts = me.options, - lable = $( document.createElement('label') ), - input = $( document.createElement('input') ), - arr, i, len, mouseHandler; - - input.attr( 'type', 'file' ); - input.attr( 'name', opts.name ); - input.addClass('webuploader-element-invisible'); - - lable.on( 'click', function() { - input.trigger('click'); - }); - - lable.css({ - opacity: 0, - width: '100%', - height: '100%', - display: 'block', - cursor: 'pointer', - background: '#ffffff' - }); - - if ( opts.multiple ) { - input.attr( 'multiple', 'multiple' ); - } - - // @todo Firefox不支持单独指定后缀 - if ( opts.accept && opts.accept.length > 0 ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - arr.push( opts.accept[ i ].mimeTypes ); - } - - input.attr( 'accept', arr.join(',') ); - } - - container.append( input ); - container.append( lable ); - - mouseHandler = function( e ) { - owner.trigger( e.type ); - }; - - input.on( 'change', function( e ) { - var fn = arguments.callee, - clone; - - me.files = e.target.files; - - // reset input - clone = this.cloneNode( true ); - this.parentNode.replaceChild( clone, this ); - - input.off(); - input = $( clone ).on( 'change', fn ) - .on( 'mouseenter mouseleave', mouseHandler ); - - owner.trigger('change'); - }); - - lable.on( 'mouseenter mouseleave', mouseHandler ); - - }, - - - getFiles: function() { - return this.files; - }, - - destroy: function() { - // todo - } - }); - }); - /** - * Terms: - * - * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer - * @fileOverview Image控件 - */ - define('runtime/html5/util',[ - 'base' - ], function( Base ) { - - var urlAPI = window.createObjectURL && window || - window.URL && URL.revokeObjectURL && URL || - window.webkitURL, - createObjectURL = Base.noop, - revokeObjectURL = createObjectURL; - - if ( urlAPI ) { - - // 更安全的方式调用,比如android里面就能把context改成其他的对象。 - createObjectURL = function() { - return urlAPI.createObjectURL.apply( urlAPI, arguments ); - }; - - revokeObjectURL = function() { - return urlAPI.revokeObjectURL.apply( urlAPI, arguments ); - }; - } - - return { - createObjectURL: createObjectURL, - revokeObjectURL: revokeObjectURL, - - dataURL2Blob: function( dataURI ) { - var byteStr, intArray, ab, i, mimetype, parts; - - parts = dataURI.split(','); - - if ( ~parts[ 0 ].indexOf('base64') ) { - byteStr = atob( parts[ 1 ] ); - } else { - byteStr = decodeURIComponent( parts[ 1 ] ); - } - - ab = new ArrayBuffer( byteStr.length ); - intArray = new Uint8Array( ab ); - - for ( i = 0; i < byteStr.length; i++ ) { - intArray[ i ] = byteStr.charCodeAt( i ); - } - - mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ]; - - return this.arrayBufferToBlob( ab, mimetype ); - }, - - dataURL2ArrayBuffer: function( dataURI ) { - var byteStr, intArray, i, parts; - - parts = dataURI.split(','); - - if ( ~parts[ 0 ].indexOf('base64') ) { - byteStr = atob( parts[ 1 ] ); - } else { - byteStr = decodeURIComponent( parts[ 1 ] ); - } - - intArray = new Uint8Array( byteStr.length ); - - for ( i = 0; i < byteStr.length; i++ ) { - intArray[ i ] = byteStr.charCodeAt( i ); - } - - return intArray.buffer; - }, - - arrayBufferToBlob: function( buffer, type ) { - var builder = window.BlobBuilder || window.WebKitBlobBuilder, - bb; - - // android不支持直接new Blob, 只能借助blobbuilder. - if ( builder ) { - bb = new builder(); - bb.append( buffer ); - return bb.getBlob( type ); - } - - return new Blob([ buffer ], type ? { type: type } : {} ); - }, - - // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg. - // 你得到的结果是png. - canvasToDataUrl: function( canvas, type, quality ) { - return canvas.toDataURL( type, quality / 100 ); - }, - - // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。 - parseMeta: function( blob, callback ) { - callback( false, {}); - }, - - // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。 - updateImageHead: function( data ) { - return data; - } - }; - }); - /** - * Terms: - * - * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer - * @fileOverview Image控件 - */ - define('runtime/html5/imagemeta',[ - 'runtime/html5/util' - ], function( Util ) { - - var api; - - api = { - parsers: { - 0xffe1: [] - }, - - maxMetaDataSize: 262144, - - parse: function( blob, cb ) { - var me = this, - fr = new FileReader(); - - fr.onload = function() { - cb( false, me._parse( this.result ) ); - fr = fr.onload = fr.onerror = null; - }; - - fr.onerror = function( e ) { - cb( e.message ); - fr = fr.onload = fr.onerror = null; - }; - - blob = blob.slice( 0, me.maxMetaDataSize ); - fr.readAsArrayBuffer( blob.getSource() ); - }, - - _parse: function( buffer, noParse ) { - if ( buffer.byteLength < 6 ) { - return; - } - - var dataview = new DataView( buffer ), - offset = 2, - maxOffset = dataview.byteLength - 4, - headLength = offset, - ret = {}, - markerBytes, markerLength, parsers, i; - - if ( dataview.getUint16( 0 ) === 0xffd8 ) { - - while ( offset < maxOffset ) { - markerBytes = dataview.getUint16( offset ); - - if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef || - markerBytes === 0xfffe ) { - - markerLength = dataview.getUint16( offset + 2 ) + 2; - - if ( offset + markerLength > dataview.byteLength ) { - break; - } - - parsers = api.parsers[ markerBytes ]; - - if ( !noParse && parsers ) { - for ( i = 0; i < parsers.length; i += 1 ) { - parsers[ i ].call( api, dataview, offset, - markerLength, ret ); - } - } - - offset += markerLength; - headLength = offset; - } else { - break; - } - } - - if ( headLength > 6 ) { - if ( buffer.slice ) { - ret.imageHead = buffer.slice( 2, headLength ); - } else { - // Workaround for IE10, which does not yet - // support ArrayBuffer.slice: - ret.imageHead = new Uint8Array( buffer ) - .subarray( 2, headLength ); - } - } - } - - return ret; - }, - - updateImageHead: function( buffer, head ) { - var data = this._parse( buffer, true ), - buf1, buf2, bodyoffset; - - - bodyoffset = 2; - if ( data.imageHead ) { - bodyoffset = 2 + data.imageHead.byteLength; - } - - if ( buffer.slice ) { - buf2 = buffer.slice( bodyoffset ); - } else { - buf2 = new Uint8Array( buffer ).subarray( bodyoffset ); - } - - buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength ); - - buf1[ 0 ] = 0xFF; - buf1[ 1 ] = 0xD8; - buf1.set( new Uint8Array( head ), 2 ); - buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 ); - - return buf1.buffer; - } - }; - - Util.parseMeta = function() { - return api.parse.apply( api, arguments ); - }; - - Util.updateImageHead = function() { - return api.updateImageHead.apply( api, arguments ); - }; - - return api; - }); - /** - * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image - * 暂时项目中只用了orientation. - * - * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail. - * @fileOverview EXIF解析 - */ - - // Sample - // ==================================== - // Make : Apple - // Model : iPhone 4S - // Orientation : 1 - // XResolution : 72 [72/1] - // YResolution : 72 [72/1] - // ResolutionUnit : 2 - // Software : QuickTime 7.7.1 - // DateTime : 2013:09:01 22:53:55 - // ExifIFDPointer : 190 - // ExposureTime : 0.058823529411764705 [1/17] - // FNumber : 2.4 [12/5] - // ExposureProgram : Normal program - // ISOSpeedRatings : 800 - // ExifVersion : 0220 - // DateTimeOriginal : 2013:09:01 22:52:51 - // DateTimeDigitized : 2013:09:01 22:52:51 - // ComponentsConfiguration : YCbCr - // ShutterSpeedValue : 4.058893515764426 - // ApertureValue : 2.5260688216892597 [4845/1918] - // BrightnessValue : -0.3126686601998395 - // MeteringMode : Pattern - // Flash : Flash did not fire, compulsory flash mode - // FocalLength : 4.28 [107/25] - // SubjectArea : [4 values] - // FlashpixVersion : 0100 - // ColorSpace : 1 - // PixelXDimension : 2448 - // PixelYDimension : 3264 - // SensingMethod : One-chip color area sensor - // ExposureMode : 0 - // WhiteBalance : Auto white balance - // FocalLengthIn35mmFilm : 35 - // SceneCaptureType : Standard - define('runtime/html5/imagemeta/exif',[ - 'base', - 'runtime/html5/imagemeta' - ], function( Base, ImageMeta ) { - - var EXIF = {}; - - EXIF.ExifMap = function() { - return this; - }; - - EXIF.ExifMap.prototype.map = { - 'Orientation': 0x0112 - }; - - EXIF.ExifMap.prototype.get = function( id ) { - return this[ id ] || this[ this.map[ id ] ]; - }; - - EXIF.exifTagTypes = { - // byte, 8-bit unsigned int: - 1: { - getValue: function( dataView, dataOffset ) { - return dataView.getUint8( dataOffset ); - }, - size: 1 - }, - - // ascii, 8-bit byte: - 2: { - getValue: function( dataView, dataOffset ) { - return String.fromCharCode( dataView.getUint8( dataOffset ) ); - }, - size: 1, - ascii: true - }, - - // short, 16 bit int: - 3: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint16( dataOffset, littleEndian ); - }, - size: 2 - }, - - // long, 32 bit int: - 4: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint32( dataOffset, littleEndian ); - }, - size: 4 - }, - - // rational = two long values, - // first is numerator, second is denominator: - 5: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getUint32( dataOffset, littleEndian ) / - dataView.getUint32( dataOffset + 4, littleEndian ); - }, - size: 8 - }, - - // slong, 32 bit signed int: - 9: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getInt32( dataOffset, littleEndian ); - }, - size: 4 - }, - - // srational, two slongs, first is numerator, second is denominator: - 10: { - getValue: function( dataView, dataOffset, littleEndian ) { - return dataView.getInt32( dataOffset, littleEndian ) / - dataView.getInt32( dataOffset + 4, littleEndian ); - }, - size: 8 - } - }; - - // undefined, 8-bit byte, value depending on field: - EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ]; - - EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length, - littleEndian ) { - - var tagType = EXIF.exifTagTypes[ type ], - tagSize, dataOffset, values, i, str, c; - - if ( !tagType ) { - Base.log('Invalid Exif data: Invalid tag type.'); - return; - } - - tagSize = tagType.size * length; - - // Determine if the value is contained in the dataOffset bytes, - // or if the value at the dataOffset is a pointer to the actual data: - dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8, - littleEndian ) : (offset + 8); - - if ( dataOffset + tagSize > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid data offset.'); - return; - } - - if ( length === 1 ) { - return tagType.getValue( dataView, dataOffset, littleEndian ); - } - - values = []; - - for ( i = 0; i < length; i += 1 ) { - values[ i ] = tagType.getValue( dataView, - dataOffset + i * tagType.size, littleEndian ); - } - - if ( tagType.ascii ) { - str = ''; - - // Concatenate the chars: - for ( i = 0; i < values.length; i += 1 ) { - c = values[ i ]; - - // Ignore the terminating NULL byte(s): - if ( c === '\u0000' ) { - break; - } - str += c; - } - - return str; - } - return values; - }; - - EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian, - data ) { - - var tag = dataView.getUint16( offset, littleEndian ); - data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset, - dataView.getUint16( offset + 2, littleEndian ), // tag type - dataView.getUint32( offset + 4, littleEndian ), // tag length - littleEndian ); - }; - - EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset, - littleEndian, data ) { - - var tagsNumber, dirEndOffset, i; - - if ( dirOffset + 6 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid directory offset.'); - return; - } - - tagsNumber = dataView.getUint16( dirOffset, littleEndian ); - dirEndOffset = dirOffset + 2 + 12 * tagsNumber; - - if ( dirEndOffset + 4 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid directory size.'); - return; - } - - for ( i = 0; i < tagsNumber; i += 1 ) { - this.parseExifTag( dataView, tiffOffset, - dirOffset + 2 + 12 * i, // tag offset - littleEndian, data ); - } - - // Return the offset to the next directory: - return dataView.getUint32( dirEndOffset, littleEndian ); - }; - - // EXIF.getExifThumbnail = function(dataView, offset, length) { - // var hexData, - // i, - // b; - // if (!length || offset + length > dataView.byteLength) { - // Base.log('Invalid Exif data: Invalid thumbnail data.'); - // return; - // } - // hexData = []; - // for (i = 0; i < length; i += 1) { - // b = dataView.getUint8(offset + i); - // hexData.push((b < 16 ? '0' : '') + b.toString(16)); - // } - // return 'data:image/jpeg,%' + hexData.join('%'); - // }; - - EXIF.parseExifData = function( dataView, offset, length, data ) { - - var tiffOffset = offset + 10, - littleEndian, dirOffset; - - // Check for the ASCII code for "Exif" (0x45786966): - if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) { - // No Exif data, might be XMP data instead - return; - } - if ( tiffOffset + 8 > dataView.byteLength ) { - Base.log('Invalid Exif data: Invalid segment size.'); - return; - } - - // Check for the two null bytes: - if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) { - Base.log('Invalid Exif data: Missing byte alignment offset.'); - return; - } - - // Check the byte alignment: - switch ( dataView.getUint16( tiffOffset ) ) { - case 0x4949: - littleEndian = true; - break; - - case 0x4D4D: - littleEndian = false; - break; - - default: - Base.log('Invalid Exif data: Invalid byte alignment marker.'); - return; - } - - // Check for the TIFF tag marker (0x002A): - if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) { - Base.log('Invalid Exif data: Missing TIFF marker.'); - return; - } - - // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal: - dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian ); - // Create the exif object to store the tags: - data.exif = new EXIF.ExifMap(); - // Parse the tags of the main image directory and retrieve the - // offset to the next directory, usually the thumbnail directory: - dirOffset = EXIF.parseExifTags( dataView, tiffOffset, - tiffOffset + dirOffset, littleEndian, data ); - - // 尝试读取缩略图 - // if ( dirOffset ) { - // thumbnailData = {exif: {}}; - // dirOffset = EXIF.parseExifTags( - // dataView, - // tiffOffset, - // tiffOffset + dirOffset, - // littleEndian, - // thumbnailData - // ); - - // // Check for JPEG Thumbnail offset: - // if (thumbnailData.exif[0x0201]) { - // data.exif.Thumbnail = EXIF.getExifThumbnail( - // dataView, - // tiffOffset + thumbnailData.exif[0x0201], - // thumbnailData.exif[0x0202] // Thumbnail data length - // ); - // } - // } - }; - - ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData ); - return EXIF; - }); - /** - * @fileOverview Image - */ - define('runtime/html5/image',[ - 'base', - 'runtime/html5/runtime', - 'runtime/html5/util' - ], function( Base, Html5Runtime, Util ) { - - var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D'; - - return Html5Runtime.register( 'Image', { - - // flag: 标记是否被修改过。 - modified: false, - - init: function() { - var me = this, - img = new Image(); - - img.onload = function() { - - me._info = { - type: me.type, - width: this.width, - height: this.height - }; - - // 读取meta信息。 - if ( !me._metas && 'image/jpeg' === me.type ) { - Util.parseMeta( me._blob, function( error, ret ) { - me._metas = ret; - me.owner.trigger('load'); - }); - } else { - me.owner.trigger('load'); - } - }; - - img.onerror = function() { - me.owner.trigger('error'); - }; - - me._img = img; - }, - - loadFromBlob: function( blob ) { - var me = this, - img = me._img; - - me._blob = blob; - me.type = blob.type; - img.src = Util.createObjectURL( blob.getSource() ); - me.owner.once( 'load', function() { - Util.revokeObjectURL( img.src ); - }); - }, - - resize: function( width, height ) { - var canvas = this._canvas || - (this._canvas = document.createElement('canvas')); - - this._resize( this._img, canvas, width, height ); - this._blob = null; // 没用了,可以删掉了。 - this.modified = true; - this.owner.trigger('complete'); - }, - - getAsBlob: function( type ) { - var blob = this._blob, - opts = this.options, - canvas; - - type = type || this.type; - - // blob需要重新生成。 - if ( this.modified || this.type !== type ) { - canvas = this._canvas; - - if ( type === 'image/jpeg' ) { - - blob = Util.canvasToDataUrl( canvas, 'image/jpeg', - opts.quality ); - - if ( opts.preserveHeaders && this._metas && - this._metas.imageHead ) { - - blob = Util.dataURL2ArrayBuffer( blob ); - blob = Util.updateImageHead( blob, - this._metas.imageHead ); - blob = Util.arrayBufferToBlob( blob, type ); - return blob; - } - } else { - blob = Util.canvasToDataUrl( canvas, type ); - } - - blob = Util.dataURL2Blob( blob ); - } - - return blob; - }, - - getAsDataUrl: function( type ) { - var opts = this.options; - - type = type || this.type; - - if ( type === 'image/jpeg' ) { - return Util.canvasToDataUrl( this._canvas, type, opts.quality ); - } else { - return this._canvas.toDataURL( type ); - } - }, - - getOrientation: function() { - return this._metas && this._metas.exif && - this._metas.exif.get('Orientation') || 1; - }, - - info: function( val ) { - - // setter - if ( val ) { - this._info = val; - return this; - } - - // getter - return this._info; - }, - - meta: function( val ) { - - // setter - if ( val ) { - this._meta = val; - return this; - } - - // getter - return this._meta; - }, - - destroy: function() { - var canvas = this._canvas; - this._img.onload = null; - - if ( canvas ) { - canvas.getContext('2d') - .clearRect( 0, 0, canvas.width, canvas.height ); - canvas.width = canvas.height = 0; - this._canvas = null; - } - - // 释放内存。非常重要,否则释放不了image的内存。 - this._img.src = BLANK; - this._img = this._blob = null; - }, - - _resize: function( img, cvs, width, height ) { - var opts = this.options, - naturalWidth = img.width, - naturalHeight = img.height, - orientation = this.getOrientation(), - scale, w, h, x, y; - - // values that require 90 degree rotation - if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) { - - // 交换width, height的值。 - width ^= height; - height ^= width; - width ^= height; - } - - scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth, - height / naturalHeight ); - - // 不允许放大。 - opts.allowMagnify || (scale = Math.min( 1, scale )); - - w = naturalWidth * scale; - h = naturalHeight * scale; - - if ( opts.crop ) { - cvs.width = width; - cvs.height = height; - } else { - cvs.width = w; - cvs.height = h; - } - - x = (cvs.width - w) / 2; - y = (cvs.height - h) / 2; - - opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation ); - - this._renderImageToCanvas( cvs, img, x, y, w, h ); - }, - - _rotate2Orientaion: function( canvas, orientation ) { - var width = canvas.width, - height = canvas.height, - ctx = canvas.getContext('2d'); - - switch ( orientation ) { - case 5: - case 6: - case 7: - case 8: - canvas.width = height; - canvas.height = width; - break; - } - - switch ( orientation ) { - case 2: // horizontal flip - ctx.translate( width, 0 ); - ctx.scale( -1, 1 ); - break; - - case 3: // 180 rotate left - ctx.translate( width, height ); - ctx.rotate( Math.PI ); - break; - - case 4: // vertical flip - ctx.translate( 0, height ); - ctx.scale( 1, -1 ); - break; - - case 5: // vertical flip + 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.scale( 1, -1 ); - break; - - case 6: // 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.translate( 0, -height ); - break; - - case 7: // horizontal flip + 90 rotate right - ctx.rotate( 0.5 * Math.PI ); - ctx.translate( width, -height ); - ctx.scale( -1, 1 ); - break; - - case 8: // 90 rotate left - ctx.rotate( -0.5 * Math.PI ); - ctx.translate( -width, 0 ); - break; - } - }, - - // https://github.com/stomita/ios-imagefile-megapixel/ - // blob/master/src/megapix-image.js - _renderImageToCanvas: (function() { - - // 如果不是ios, 不需要这么复杂! - if ( !Base.os.ios ) { - return function( canvas, img, x, y, w, h ) { - canvas.getContext('2d').drawImage( img, x, y, w, h ); - }; - } - - /** - * Detecting vertical squash in loaded image. - * Fixes a bug which squash image vertically while drawing into - * canvas for some images. - */ - function detectVerticalSquash( img, iw, ih ) { - var canvas = document.createElement('canvas'), - ctx = canvas.getContext('2d'), - sy = 0, - ey = ih, - py = ih, - data, alpha, ratio; - - - canvas.width = 1; - canvas.height = ih; - ctx.drawImage( img, 0, 0 ); - data = ctx.getImageData( 0, 0, 1, ih ).data; - - // search image edge pixel position in case - // it is squashed vertically. - while ( py > sy ) { - alpha = data[ (py - 1) * 4 + 3 ]; - - if ( alpha === 0 ) { - ey = py; - } else { - sy = py; - } - - py = (ey + sy) >> 1; - } - - ratio = (py / ih); - return (ratio === 0) ? 1 : ratio; - } - - // fix ie7 bug - // http://stackoverflow.com/questions/11929099/ - // html5-canvas-drawimage-ratio-bug-ios - if ( Base.os.ios >= 7 ) { - return function( canvas, img, x, y, w, h ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - vertSquashRatio = detectVerticalSquash( img, iw, ih ); - - return canvas.getContext('2d').drawImage( img, 0, 0, - iw * vertSquashRatio, ih * vertSquashRatio, - x, y, w, h ); - }; - } - - /** - * Detect subsampling in loaded image. - * In iOS, larger images than 2M pixels may be - * subsampled in rendering. - */ - function detectSubsampling( img ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - canvas, ctx; - - // subsampling may happen overmegapixel image - if ( iw * ih > 1024 * 1024 ) { - canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - ctx = canvas.getContext('2d'); - ctx.drawImage( img, -iw + 1, 0 ); - - // subsampled image becomes half smaller in rendering size. - // check alpha channel value to confirm image is covering - // edge pixel or not. if alpha value is 0 - // image is not covering, hence subsampled. - return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0; - } else { - return false; - } - } - - - return function( canvas, img, x, y, width, height ) { - var iw = img.naturalWidth, - ih = img.naturalHeight, - ctx = canvas.getContext('2d'), - subsampled = detectSubsampling( img ), - doSquash = this.type === 'image/jpeg', - d = 1024, - sy = 0, - dy = 0, - tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx; - - if ( subsampled ) { - iw /= 2; - ih /= 2; - } - - ctx.save(); - tmpCanvas = document.createElement('canvas'); - tmpCanvas.width = tmpCanvas.height = d; - - tmpCtx = tmpCanvas.getContext('2d'); - vertSquashRatio = doSquash ? - detectVerticalSquash( img, iw, ih ) : 1; - - dw = Math.ceil( d * width / iw ); - dh = Math.ceil( d * height / ih / vertSquashRatio ); - - while ( sy < ih ) { - sx = 0; - dx = 0; - while ( sx < iw ) { - tmpCtx.clearRect( 0, 0, d, d ); - tmpCtx.drawImage( img, -sx, -sy ); - ctx.drawImage( tmpCanvas, 0, 0, d, d, - x + dx, y + dy, dw, dh ); - sx += d; - dx += dw; - } - sy += d; - dy += dh; - } - ctx.restore(); - tmpCanvas = tmpCtx = null; - }; - })() - }); - }); - /** - * @fileOverview Transport - * @todo 支持chunked传输,优势: - * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分, - * 而不需要重头再传一次。另外断点续传也需要用chunked方式。 - */ - define('runtime/html5/transport',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var noop = Base.noop, - $ = Base.$; - - return Html5Runtime.register( 'Transport', { - init: function() { - this._status = 0; - this._response = null; - }, - - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - formData, binary, fr; - - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); - - binary = blob.getSource(); - } else { - formData = new FormData(); - $.each( owner._formData, function( k, v ) { - formData.append( k, v ); - }); - - formData.append( opts.fileVal, blob.getSource(), - opts.filename || owner._formData.name || '' ); - } - - if ( opts.withCredentials && 'withCredentials' in xhr ) { - xhr.open( opts.method, server, true ); - xhr.withCredentials = true; - } else { - xhr.open( opts.method, server ); - } - - this._setRequestHeader( xhr, opts.headers ); - - if ( binary ) { - xhr.overrideMimeType('application/octet-stream'); - - // android直接发送blob会导致服务端接收到的是空文件。 - // bug详情。 - // https://code.google.com/p/android/issues/detail?id=39882 - // 所以先用fileReader读取出来再通过arraybuffer的方式发送。 - if ( Base.os.android ) { - fr = new FileReader(); - - fr.onload = function() { - xhr.send( this.result ); - fr = fr.onload = null; - }; - - fr.readAsArrayBuffer( binary ); - } else { - xhr.send( binary ); - } - } else { - xhr.send( formData ); - } - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._parseJson( this._response ); - }, - - getStatus: function() { - return this._status; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - xhr.abort(); - - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new XMLHttpRequest(), - opts = this.options; - - if ( opts.withCredentials && !('withCredentials' in xhr) && - typeof XDomainRequest !== 'undefined' ) { - xhr = new XDomainRequest(); - } - - xhr.upload.onprogress = function( e ) { - var percentage = 0; - - if ( e.lengthComputable ) { - percentage = e.loaded / e.total; - } - - return me.trigger( 'progress', percentage ); - }; - - xhr.onreadystatechange = function() { - - if ( xhr.readyState !== 4 ) { - return; - } - - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - me._xhr = null; - me._status = xhr.status; - - if ( xhr.status >= 200 && xhr.status < 300 ) { - me._response = xhr.responseText; - return me.trigger('load'); - } else if ( xhr.status >= 500 && xhr.status < 600 ) { - me._response = xhr.responseText; - return me.trigger( 'error', 'server' ); - } - - - return me.trigger( 'error', me._status ? 'http' : 'abort' ); - }; - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.setRequestHeader( key, val ); - }); - }, - - _parseJson: function( str ) { - var json; - - try { - json = JSON.parse( str ); - } catch ( ex ) { - json = {}; - } - - return json; - } - }); - }); - /** - * @fileOverview 只有html5实现的文件版本。 - */ - define('preset/html5only',[ - 'base', - - // widgets - 'widgets/filednd', - 'widgets/filepaste', - 'widgets/filepicker', - 'widgets/image', - 'widgets/queue', - 'widgets/runtime', - 'widgets/upload', - 'widgets/validator', - - // runtimes - // html5 - 'runtime/html5/blob', - 'runtime/html5/dnd', - 'runtime/html5/filepaste', - 'runtime/html5/filepicker', - 'runtime/html5/imagemeta/exif', - 'runtime/html5/image', - 'runtime/html5/transport' - ], function( Base ) { - return Base; - }); - define('webuploader',[ - 'preset/html5only' - ], function( preset ) { - return preset; - }); - return require('webuploader'); -}); diff --git a/public/js/ueditor/third-party/webuploader/webuploader.js b/public/js/ueditor/third-party/webuploader/webuploader.js index 39d9351..4d552a3 100644 --- a/public/js/ueditor/third-party/webuploader/webuploader.js +++ b/public/js/ueditor/third-party/webuploader/webuploader.js @@ -1,4 +1,4 @@ -/*! WebUploader 0.1.2 */ +/*! WebUploader 1.0.0 */ /** @@ -92,44 +92,63 @@ host[ last ] = modules[ key ]; } + + return obj; }, - exports = factory( root, _define, _require ), - origin; + makeExport = function( dollar ) { + root.__dollar = dollar; - // exports every module. - exportsTo( exports ); + // exports every module. + return exportsTo( factory( root, _define, _require ) ); + }, + + origin; if ( typeof module === 'object' && typeof module.exports === 'object' ) { // For CommonJS and CommonJS-like environments where a proper window is present, - module.exports = exports; + module.exports = makeExport(); } else if ( typeof define === 'function' && define.amd ) { // Allow using this built library as an AMD module // in another project. That other project will only // see this AMD call, not the internal modules in // the closure below. - define([], exports ); + define([ 'jquery' ], makeExport ); } else { // Browser globals case. Just assign the // result to a property on the global. origin = root.WebUploader; - root.WebUploader = exports; + root.WebUploader = makeExport(); root.WebUploader.noConflict = function() { root.WebUploader = origin; }; } -})( this, function( window, define, require ) { +})( window, function( window, define, require ) { /** * @fileOverview jQuery or Zepto + * @require "jquery" + * @require "zepto" */ define('dollar-third',[],function() { - return window.jQuery || window.Zepto; + var req = window.require; + var $ = window.__dollar || + window.jQuery || + window.Zepto || + req('jquery') || + req('zepto'); + + if ( !$ ) { + throw new Error('jQuery or Zepto not found!'); + } + + return $; }); + /** * @fileOverview Dom 操作相关 */ @@ -169,7 +188,7 @@ * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。 * * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id. - * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: + * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: * * * module `base`:WebUploader.Base * * module `file`: WebUploader.File @@ -177,7 +196,7 @@ * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd * * - * 以下文档将可能省略`WebUploader`前缀。 + * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。 * @module WebUploader * @title WebUploader API文档 */ @@ -225,7 +244,7 @@ /** * @property {String} version 当前版本号。 */ - version: '0.1.2', + version: '1.0.0', /** * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。 @@ -257,7 +276,7 @@ ua.match( /CriOS\/([\d.]+)/ ), ie = ua.match( /MSIE\s([\d\.]+)/ ) || - ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i), + ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ), firefox = ua.match( /Firefox\/([\d.]+)/ ), safari = ua.match( /Safari\/([\d.]+)/ ), opera = ua.match( /OPR\/([\d.]+)/ ); @@ -383,7 +402,7 @@ bindFn: bindFn, /** - * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。 + * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。 * @grammar Base.log( args... ) => undefined * @method log */ @@ -725,7 +744,10 @@ // default Options // widgets中有相应扩展 - Uploader.options = {}; + Uploader.options = { + // 是否开启调试模式 + debug: false, + }; Mediator.installTo( Uploader.prototype ); // 批量添加纯命令式方法。 @@ -738,13 +760,15 @@ addFiles: 'add-file', sort: 'sort-files', removeFile: 'remove-file', + cancelFile: 'cancel-file', skipFile: 'skip-file', retry: 'retry', isInProgress: 'is-in-progress', makeThumb: 'make-thumb', + md5File: 'md5-file', getDimension: 'get-dimension', addButton: 'add-btn', - getRuntimeType: 'get-runtime-type', + predictRuntimeType: 'predict-runtime-type', refresh: 'refresh', disable: 'disable', enable: 'enable', @@ -776,11 +800,11 @@ * * // 初始状态图片上传前不会压缩 * var uploader = new WebUploader.Uploader({ - * resize: null; + * compress: null; * }); * * // 修改后图片上传前,尝试将图片压缩到1600 * 1600 - * uploader.options( 'resize', { + * uploader.option( 'compress', { * width: 1600, * height: 1600 * }); @@ -806,10 +830,12 @@ /** * 获取文件统计信息。返回一个包含一下信息的对象。 * * `successNum` 上传成功的文件数 - * * `uploadFailNum` 上传失败的文件数 + * * `progressNum` 上传中的文件数 * * `cancelNum` 被删除的文件数 * * `invalidNum` 无效的文件数 + * * `uploadFailNum` 上传失败的文件数 * * `queueNum` 还在队列中的文件数 + * * `interruptNum` 被暂停的文件数 * @method getStats * @grammar getStats() => Object */ @@ -817,16 +843,18 @@ // return this._mgr.getStats.apply( this._mgr, arguments ); var stats = this.request('get-stats'); - return { + return stats ? { successNum: stats.numOfSuccess, + progressNum: stats.numOfProgress, // who care? // queueFailNum: 0, cancelNum: stats.numOfCancel, invalidNum: stats.numOfInvalid, uploadFailNum: stats.numOfUploadFailed, - queueNum: stats.numOfQueue - }; + queueNum: stats.numOfQueue, + interruptNum: stats.numOfInterrupt + } : {}; }, // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器 @@ -858,6 +886,16 @@ return true; }, + /** + * 销毁 webuploader 实例 + * @method destroy + * @grammar destroy() => undefined + */ + destroy: function() { + this.request( 'destroy', arguments ); + this.off(); + }, + // widgets/widget.js将补充此方法的详细文档。 request: Base.noop }); @@ -878,6 +916,7 @@ return Uploader; }); + /** * @fileOverview Runtime管理器,负责Runtime的选择, 连接 */ @@ -933,6 +972,7 @@ parent.append( container ); parent.addClass('webuploader-container'); this._container = container; + this._parent = parent; return container; }, @@ -940,10 +980,8 @@ exec: Base.noop, destroy: function() { - if ( this._container ) { - this._container.parentNode.removeChild( this.__container ); - } - + this._container && this._container.remove(); + this._parent && this._parent.removeClass('webuploader-container'); this.off(); } }); @@ -1166,10 +1204,6 @@ me.exec('init'); me.trigger('ready'); }); - }, - - destroy: function() { - this.disconnectRuntime(); } }); @@ -1187,6 +1221,7 @@ var $ = Base.$, _init = Uploader.prototype._init, + _destroy = Uploader.prototype.destroy, IGNORE = {}, widgetClass = []; @@ -1253,13 +1288,22 @@ // 扩展Uploader. $.extend( Uploader.prototype, { + /** + * @property {String | Array} [disableWidgets=undefined] + * @namespace options + * @for Uploader + * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。 + */ + // 覆写_init用来初始化widgets _init: function() { var me = this, - widgets = me._widgets = []; + widgets = me._widgets = [], + deactives = me.options.disableWidgets || ''; $.each( widgetClass, function( _, klass ) { - widgets.push( new klass( me ) ); + (!deactives || !~deactives.indexOf( klass._name )) && + widgets.push( new klass( me ) ); }); return _init.apply( me, arguments ); @@ -1268,7 +1312,7 @@ request: function( apiName, args, callback ) { var i = 0, widgets = this._widgets, - len = widgets.length, + len = widgets && widgets.length, rlts = [], dfds = [], widget, rlt, promise, key; @@ -1296,52 +1340,114 @@ key = promise.pipe ? 'pipe' : 'then'; // 很重要不能删除。删除了会死循环。 - // 保证执行顺序。让callback总是在下一个tick中执行。 + // 保证执行顺序。让callback总是在下一个 tick 中执行。 return promise[ key ](function() { var deferred = Base.Deferred(), args = arguments; + if ( args.length === 1 ) { + args = args[ 0 ]; + } + setTimeout(function() { - deferred.resolve.apply( deferred, args ); + deferred.resolve( args ); }, 1 ); return deferred.promise(); - })[ key ]( callback || Base.noop ); + })[ callback ? key : 'done' ]( callback || Base.noop ); } else { return rlts[ 0 ]; } + }, + + destroy: function() { + _destroy.apply( this, arguments ); + this._widgets = null; } }); /** * 添加组件 - * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义 - * @param {object} responseMap API名称与函数实现的映射 + * @grammar Uploader.register(proto); + * @grammar Uploader.register(map, proto); + * @param {object} responseMap API 名称与函数实现的映射 + * @param {object} proto 组件原型,构造函数通过 constructor 属性定义 + * @method Uploader.register + * @for Uploader * @example - * Uploader.register( { - * init: function( options ) {}, - * makeThumb: function() {} - * }, { - * 'make-thumb': 'makeThumb' - * } ); + * Uploader.register({ + * 'make-thumb': 'makeThumb' + * }, { + * init: function( options ) {}, + * makeThumb: function() {} + * }); + * + * Uploader.register({ + * 'make-thumb': function() { + * + * } + * }); */ Uploader.register = Widget.register = function( responseMap, widgetProto ) { - var map = { init: 'init' }, + var map = { init: 'init', destroy: 'destroy', name: 'anonymous' }, klass; if ( arguments.length === 1 ) { widgetProto = responseMap; - widgetProto.responseMap = map; + + // 自动生成 map 表。 + $.each(widgetProto, function(key) { + if ( key[0] === '_' || key === 'name' ) { + key === 'name' && (map.name = widgetProto.name); + return; + } + + map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key; + }); + } else { - widgetProto.responseMap = $.extend( map, responseMap ); + map = $.extend( map, responseMap ); } + widgetProto.responseMap = map; klass = Base.inherits( Widget, widgetProto ); + klass._name = map.name; widgetClass.push( klass ); return klass; }; + /** + * 删除插件,只有在注册时指定了名字的才能被删除。 + * @grammar Uploader.unRegister(name); + * @param {string} name 组件名字 + * @method Uploader.unRegister + * @for Uploader + * @example + * + * Uploader.register({ + * name: 'custom', + * + * 'make-thumb': function() { + * + * } + * }); + * + * Uploader.unRegister('custom'); + */ + Uploader.unRegister = Widget.unRegister = function( name ) { + if ( !name || name === 'anonymous' ) { + return; + } + + // 删除指定的插件。 + for ( var i = widgetClass.length; i--; ) { + if ( widgetClass[i]._name === name ) { + widgetClass.splice(i, 1) + } + } + }; + return Widget; }); /** @@ -1362,6 +1468,12 @@ * @namespace options * @for Uploader */ + + /** + * @property {Selector} [disableGlobalDnd=false] 是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。 + * @namespace options + * @for Uploader + */ /** * @event dndAccept @@ -1370,6 +1482,8 @@ * @for Uploader */ return Uploader.register({ + name: 'dnd', + init: function( opts ) { if ( !opts.dnd || @@ -1386,7 +1500,7 @@ }), dnd; - dnd = new Dnd( options ); + this.dnd = dnd = new Dnd( options ); dnd.once( 'ready', deferred.resolve ); dnd.on( 'drop', function( files ) { @@ -1401,6 +1515,10 @@ dnd.init(); return deferred.promise(); + }, + + destroy: function() { + this.dnd && this.dnd.destroy(); } }); }); @@ -1432,12 +1550,6 @@ me.exec('init'); me.trigger('ready'); }); - }, - - destroy: function() { - this.exec('destroy'); - this.disconnectRuntime(); - this.off(); } }); @@ -1462,6 +1574,8 @@ * @for Uploader */ return Uploader.register({ + name: 'paste', + init: function( opts ) { if ( !opts.paste || @@ -1477,7 +1591,7 @@ }), paste; - paste = new FilePaste( options ); + this.paste = paste = new FilePaste( options ); paste.once( 'ready', deferred.resolve ); paste.on( 'paste', function( files ) { @@ -1486,6 +1600,10 @@ paste.init(); return deferred.promise(); + }, + + destroy: function() { + this.paste && this.paste.destroy(); } }); }); @@ -1502,12 +1620,18 @@ me.source = source; me.ruid = ruid; + this.size = source.size || 0; + + // 如果没有指定 mimetype, 但是知道文件后缀。 + if ( !source.type && this.ext && + ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) { + this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext); + } else { + this.type = source.type || 'application/octet-stream'; + } RuntimeClient.call( me, 'Blob' ); - this.uid = source.uid || this.uid; - this.type = source.type || ''; - this.size = source.size || 0; if ( ruid ) { me.connectRuntime( ruid ); @@ -1544,27 +1668,23 @@ function File( ruid, file ) { var ext; - Blob.apply( this, arguments ); this.name = file.name || ('untitled' + uid++); ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : ''; // todo 支持其他类型文件的转换。 - - // 如果有mimetype, 但是文件名里面没有找出后缀规律 - if ( !ext && this.type ) { - ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ? + // 如果有 mimetype, 但是文件名里面没有找出后缀规律 + if ( !ext && file.type ) { + ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ? RegExp.$1.toLowerCase() : ''; this.name += '.' + ext; } - // 如果没有指定mimetype, 但是知道文件后缀。 - if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) { - this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext); - } - this.ext = ext; - this.lastModifiedDate = file.lastModifiedDate || + this.lastModifiedDate = file.lastModifiedDate || + file.lastModified && new Date(file.lastModified).toLocaleString() || (new Date()).toLocaleString(); + + Blob.apply( this, arguments ); } return Base.inherits( Blob, File ); @@ -1577,7 +1697,7 @@ 'base', 'runtime/client', 'lib/file' - ], function( Base, RuntimeClent, File ) { + ], function( Base, RuntimeClient, File ) { var $ = Base.$; @@ -1597,7 +1717,7 @@ opts.button.html( opts.innerHTML ); opts.container.html( opts.button ); - RuntimeClent.call( this, 'FilePicker', true ); + RuntimeClient.call( this, 'FilePicker', true ); } FilePicker.options = { @@ -1607,29 +1727,34 @@ innerHTML: null, multiple: true, accept: null, - name: 'file' + name: 'file', + style: 'webuploader-pick' //pick element class attribute, default is "webuploader-pick" }; - Base.inherits( RuntimeClent, { + Base.inherits( RuntimeClient, { constructor: FilePicker, init: function() { var me = this, opts = me.options, - button = opts.button; + button = opts.button, + style = opts.style; - button.addClass('webuploader-pick'); + if (style) + button.addClass('webuploader-pick'); me.on( 'all', function( type ) { var files; switch ( type ) { case 'mouseenter': - button.addClass('webuploader-pick-hover'); + if (style) + button.addClass('webuploader-pick-hover'); break; case 'mouseleave': - button.removeClass('webuploader-pick-hover'); + if (style) + button.removeClass('webuploader-pick-hover'); break; case 'change': @@ -1651,20 +1776,22 @@ me.trigger('ready'); }); - $( window ).on( 'resize', function() { - me.refresh(); - }); + this._resizeHandler = Base.bindFn( this.refresh, this ); + $( window ).on( 'resize', this._resizeHandler ); }, refresh: function() { var shimContainer = this.getRuntime().getContainer(), button = this.options.button, + /* width = button.outerWidth ? button.outerWidth() : button.width(), height = button.outerHeight ? button.outerHeight() : button.height(), - + */ + width = button[0] && button[0].offsetWidth || button.outerWidth() || button.width(), + height = button[0] && button[0].offsetHeight || button.outerHeight() || button.height(), pos = button.offset(); width && height && shimContainer.css({ @@ -1693,10 +1820,10 @@ }, destroy: function() { - if ( this.runtime ) { - this.exec('destroy'); - this.disconnectRuntime(); - } + var btn = this.options.button; + $( window ).off( 'resize', this._resizeHandler ); + btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' + + 'webuploader-pick'); } }); @@ -1722,7 +1849,7 @@ * @for Uploader * @description 指定选择文件的按钮容器,不指定则不创建按钮。 * - * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。 + * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。 * * `label` {String} 请采用 `innerHTML` 代替 * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。 * * `multiple` {Boolean} 是否开起同时选择多个文件能力。 @@ -1730,7 +1857,7 @@ pick: null, /** - * @property {Arroy} [accept=null] + * @property {Array} [accept=null] * @namespace options * @for Uploader * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。 @@ -1757,15 +1884,11 @@ }); return Uploader.register({ - 'add-btn': 'addButton', - refresh: 'refresh', - disable: 'disable', - enable: 'enable' - }, { + name: 'picker', init: function( opts ) { this.pickers = []; - return opts.pick && this.addButton( opts.pick ); + return opts.pick && this.addBtn( opts.pick ); }, refresh: function() { @@ -1786,38 +1909,49 @@ * innerHTML: '选择文件' * }); */ - addButton: function( pick ) { + addBtn: function( pick ) { var me = this, opts = me.options, accept = opts.accept, - options, picker, deferred; + promises = []; if ( !pick ) { return; } - deferred = Base.Deferred(); $.isPlainObject( pick ) || (pick = { id: pick }); - options = $.extend({}, pick, { - accept: $.isPlainObject( accept ) ? [ accept ] : accept, - swf: opts.swf, - runtimeOrder: opts.runtimeOrder + $( pick.id ).each(function() { + var options, picker, deferred; + + deferred = Base.Deferred(); + + options = $.extend({}, pick, { + accept: $.isPlainObject( accept ) ? [ accept ] : accept, + swf: opts.swf, + runtimeOrder: opts.runtimeOrder, + id: this + }); + + picker = new FilePicker( options ); + + picker.once( 'ready', deferred.resolve ); + picker.on( 'select', function( files ) { + me.owner.request( 'add-file', [ files ]); + }); + picker.on('dialogopen', function() { + me.owner.trigger('dialogOpen', picker.button); + }); + picker.init(); + + me.pickers.push( picker ); + + promises.push( deferred.promise() ); }); - picker = new FilePicker( options ); - - picker.once( 'ready', deferred.resolve ); - picker.on( 'select', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - picker.init(); - - this.pickers.push( picker ); - - return deferred.promise(); + return Base.when.apply( Base, promises ); }, disable: function() { @@ -1830,6 +1964,13 @@ $.each( this.pickers, function() { this.enable(); }); + }, + + destroy: function() { + $.each( this.pickers, function() { + this.destroy(); + }); + this.pickers = null; } }); }); @@ -1864,10 +2005,10 @@ crop: false, // 是否保留头部信息 - preserveHeaders: true, + preserveHeaders: false, // 是否允许放大。 - allowMagnify: true + allowMagnify: false }; // 继承RuntimeClient. @@ -1913,6 +2054,11 @@ return this.exec.apply( this, [ 'resize' ].concat( args ) ); }, + crop: function() { + var args = Base.slice( arguments ); + return this.exec.apply( this, [ 'crop' ].concat( args ) ); + }, + getAsDataUrl: function( type ) { return this.exec( 'getAsDataUrl', type ); }, @@ -1926,6 +2072,2343 @@ return Image; }); + /** + * Browser Image Compression + * v2.0.2 + * by Donald + * https://github.com/Donaldcwl/browser-image-compression + */ + define('lib/browser-image-compression',[], function () { + + var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function (t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var _a; + + function _mergeNamespaces(e, t) { + return t.forEach((function (t) { + t && "string" != typeof t && !Array.isArray(t) && Object.keys(t).forEach((function (r) { + if ("default" !== r && !(r in e)) { + var i = Object.getOwnPropertyDescriptor(t, r); + Object.defineProperty(e, r, i.get ? i : { + enumerable: !0, get: function () { + return t[r]; + } + }); + } + })); + })), Object.freeze(e); + } + + function copyExifWithoutOrientation(e, t) { + return new Promise((function (r, i) { + var o; + return getApp1Segment(e).then((function (e) { + try { + return o = e, r(new window.Blob([t.slice(0, 2), o, t.slice(2)], {type: "image/jpeg"})); + } catch (e) { + return i(e); + } + }), i); + })); + } + + var getApp1Segment = function (e) { + return new Promise((function (t, r) { + var i = new FileReader; + i.addEventListener("load", (function (_a) { + var e = _a.target.result; + var i = new DataView(e); + var o = 0; + if (65496 !== i.getUint16(o)) + return r("not a valid JPEG"); + for (o += 2; ;) { + var a_1 = i.getUint16(o); + if (65498 === a_1) + break; + var s_1 = i.getUint16(o + 2); + if (65505 === a_1 && 1165519206 === i.getUint32(o + 4)) { + var a_2 = o + 10; + var f_1 = void 0; + switch (i.getUint16(a_2)) { + case 18761: + f_1 = !0; + break; + case 19789: + f_1 = !1; + break; + default: + return r("TIFF header contains invalid endian"); + } + if (42 !== i.getUint16(a_2 + 2, f_1)) + return r("TIFF header contains invalid version"); + var l_1 = i.getUint32(a_2 + 4, f_1), c = a_2 + l_1 + 2 + 12 * i.getUint16(a_2 + l_1, f_1); + for (var e_1 = a_2 + l_1 + 2; e_1 < c; e_1 += 12) { + if (274 == i.getUint16(e_1, f_1)) { + if (3 !== i.getUint16(e_1 + 2, f_1)) + return r("Orientation data type is invalid"); + if (1 !== i.getUint32(e_1 + 4, f_1)) + return r("Orientation data count is invalid"); + i.setUint16(e_1 + 8, 1, f_1); + break; + } + } + return t(e.slice(o, o + 2 + s_1)); + } + o += 2 + s_1; + } + return t(new window.Blob); + })), i.readAsArrayBuffer(e); + })); + }; + var e = {}; + !function (e) { + var t, r, UZIP = {}; + e.exports = UZIP, UZIP.parse = function (e, t) { + for (var r = UZIP.bin.readUshort, i = UZIP.bin.readUint, o = 0, a = {}, s = new Uint8Array(e), f = s.length - 4; 101010256 != i(s, f);) + f--; + o = f; + o += 4; + var l = r(s, o += 4); + r(s, o += 2); + var c = i(s, o += 2), u = i(s, o += 4); + o += 4, o = u; + for (var h = 0; h < l; h++) { + i(s, o), o += 4, o += 4, o += 4, i(s, o += 4); + c = i(s, o += 4); + var d = i(s, o += 4), A = r(s, o += 4), g = r(s, o + 2), p = r(s, o + 4); + o += 6; + var m = i(s, o += 8); + o += 4, o += A + g + p, UZIP._readLocal(s, m, a, c, d, t); + } + return a; + }, UZIP._readLocal = function (e, t, r, i, o, a) { + var s = UZIP.bin.readUshort, f = UZIP.bin.readUint; + f(e, t), s(e, t += 4), s(e, t += 2); + var l = s(e, t += 2); + f(e, t += 2), f(e, t += 4), t += 4; + var c = s(e, t += 8), u = s(e, t += 2); + t += 2; + var h = UZIP.bin.readUTF8(e, t, c); + if (t += c, t += u, a) + r[h] = {size: o, csize: i}; + else { + var d = new Uint8Array(e.buffer, t); + if (0 == l) + r[h] = new Uint8Array(d.buffer.slice(t, t + i)); + else { + if (8 != l) + throw "unknown compression method: " + l; + var A = new Uint8Array(o); + UZIP.inflateRaw(d, A), r[h] = A; + } + } + }, UZIP.inflateRaw = function (e, t) { + return UZIP.F.inflate(e, t); + }, UZIP.inflate = function (e, t) { + return e[0], e[1], UZIP.inflateRaw(new Uint8Array(e.buffer, e.byteOffset + 2, e.length - 6), t); + }, UZIP.deflate = function (e, t) { + null == t && (t = {level: 6}); + var r = 0, i = new Uint8Array(50 + Math.floor(1.1 * e.length)); + i[r] = 120, i[r + 1] = 156, r += 2, r = UZIP.F.deflateRaw(e, i, r, t.level); + var o = UZIP.adler(e, 0, e.length); + return i[r + 0] = o >>> 24 & 255, i[r + 1] = o >>> 16 & 255, i[r + 2] = o >>> 8 & 255, i[r + 3] = o >>> 0 & 255, new Uint8Array(i.buffer, 0, r + 4); + }, UZIP.deflateRaw = function (e, t) { + null == t && (t = {level: 6}); + var r = new Uint8Array(50 + Math.floor(1.1 * e.length)), i = UZIP.F.deflateRaw(e, r, i, t.level); + return new Uint8Array(r.buffer, 0, i); + }, UZIP.encode = function (e, t) { + null == t && (t = !1); + var r = 0, i = UZIP.bin.writeUint, o = UZIP.bin.writeUshort, a = {}; + for (var s in e) { + var f = !UZIP._noNeed(s) && !t, l = e[s], c = UZIP.crc.crc(l, 0, l.length); + a[s] = {cpr: f, usize: l.length, crc: c, file: f ? UZIP.deflateRaw(l) : l}; + } + for (var s in a) + r += a[s].file.length + 30 + 46 + 2 * UZIP.bin.sizeUTF8(s); + r += 22; + var u = new Uint8Array(r), h = 0, d = []; + for (var s in a) { + var A = a[s]; + d.push(h), h = UZIP._writeHeader(u, h, s, A, 0); + } + var g = 0, p = h; + for (var s in a) { + A = a[s]; + d.push(h), h = UZIP._writeHeader(u, h, s, A, 1, d[g++]); + } + var m = h - p; + return i(u, h, 101010256), h += 4, o(u, h += 4, g), o(u, h += 2, g), i(u, h += 2, m), i(u, h += 4, p), h += 4, h += 2, u.buffer; + }, UZIP._noNeed = function (e) { + var t = e.split(".").pop().toLowerCase(); + return -1 != "png,jpg,jpeg,zip".indexOf(t); + }, UZIP._writeHeader = function (e, t, r, i, o, a) { + var s = UZIP.bin.writeUint, f = UZIP.bin.writeUshort, l = i.file; + return s(e, t, 0 == o ? 67324752 : 33639248), t += 4, 1 == o && (t += 2), f(e, t, 20), f(e, t += 2, 0), f(e, t += 2, i.cpr ? 8 : 0), s(e, t += 2, 0), s(e, t += 4, i.crc), s(e, t += 4, l.length), s(e, t += 4, i.usize), f(e, t += 4, UZIP.bin.sizeUTF8(r)), f(e, t += 2, 0), t += 2, 1 == o && (t += 2, t += 2, s(e, t += 6, a), t += 4), t += UZIP.bin.writeUTF8(e, t, r), 0 == o && (e.set(l, t), t += l.length), t; + }, UZIP.crc = { + table: function () { + for (var e = new Uint32Array(256), t = 0; t < 256; t++) { + for (var r = t, i = 0; i < 8; i++) + 1 & r ? r = 3988292384 ^ r >>> 1 : r >>>= 1; + e[t] = r; + } + return e; + }(), update: function (e, t, r, i) { + for (var o = 0; o < i; o++) + e = UZIP.crc.table[255 & (e ^ t[r + o])] ^ e >>> 8; + return e; + }, crc: function (e, t, r) { + return 4294967295 ^ UZIP.crc.update(4294967295, e, t, r); + } + }, UZIP.adler = function (e, t, r) { + for (var i = 1, o = 0, a = t, s = t + r; a < s;) { + for (var f = Math.min(a + 5552, s); a < f;) + o += i += e[a++]; + i %= 65521, o %= 65521; + } + return o << 16 | i; + }, UZIP.bin = { + readUshort: function (e, t) { + return e[t] | e[t + 1] << 8; + }, writeUshort: function (e, t, r) { + e[t] = 255 & r, e[t + 1] = r >> 8 & 255; + }, readUint: function (e, t) { + return 16777216 * e[t + 3] + (e[t + 2] << 16 | e[t + 1] << 8 | e[t]); + }, writeUint: function (e, t, r) { + e[t] = 255 & r, e[t + 1] = r >> 8 & 255, e[t + 2] = r >> 16 & 255, e[t + 3] = r >> 24 & 255; + }, readASCII: function (e, t, r) { + for (var i = "", o = 0; o < r; o++) + i += String.fromCharCode(e[t + o]); + return i; + }, writeASCII: function (e, t, r) { + for (var i = 0; i < r.length; i++) + e[t + i] = r.charCodeAt(i); + }, pad: function (e) { + return e.length < 2 ? "0" + e : e; + }, readUTF8: function (e, t, r) { + for (var i, o = "", a = 0; a < r; a++) + o += "%" + UZIP.bin.pad(e[t + a].toString(16)); + try { + i = decodeURIComponent(o); + } catch (i) { + return UZIP.bin.readASCII(e, t, r); + } + return i; + }, writeUTF8: function (e, t, r) { + for (var i = r.length, o = 0, a = 0; a < i; a++) { + var s = r.charCodeAt(a); + if (0 == (4294967168 & s)) + e[t + o] = s, o++; + else if (0 == (4294965248 & s)) + e[t + o] = 192 | s >> 6, e[t + o + 1] = 128 | s >> 0 & 63, o += 2; + else if (0 == (4294901760 & s)) + e[t + o] = 224 | s >> 12, e[t + o + 1] = 128 | s >> 6 & 63, e[t + o + 2] = 128 | s >> 0 & 63, o += 3; + else { + if (0 != (4292870144 & s)) + throw "e"; + e[t + o] = 240 | s >> 18, e[t + o + 1] = 128 | s >> 12 & 63, e[t + o + 2] = 128 | s >> 6 & 63, e[t + o + 3] = 128 | s >> 0 & 63, o += 4; + } + } + return o; + }, sizeUTF8: function (e) { + for (var t = e.length, r = 0, i = 0; i < t; i++) { + var o = e.charCodeAt(i); + if (0 == (4294967168 & o)) + r++; + else if (0 == (4294965248 & o)) + r += 2; + else if (0 == (4294901760 & o)) + r += 3; + else { + if (0 != (4292870144 & o)) + throw "e"; + r += 4; + } + } + return r; + } + }, UZIP.F = {}, UZIP.F.deflateRaw = function (e, t, r, i) { + var o = [[0, 0, 0, 0, 0], [4, 4, 8, 4, 0], [4, 5, 16, 8, 0], [4, 6, 16, 16, 0], [4, 10, 16, 32, 0], [8, 16, 32, 32, 0], [8, 16, 128, 128, 0], [8, 32, 128, 256, 0], [32, 128, 258, 1024, 1], [32, 258, 258, 4096, 1]][i], + a = UZIP.F.U, s = UZIP.F._goodIndex; + UZIP.F._hash; + var f = UZIP.F._putsE, l = 0, c = r << 3, u = 0, h = e.length; + if (0 == i) { + for (; l < h;) { + f(t, c, l + (_ = Math.min(65535, h - l)) == h ? 1 : 0), c = UZIP.F._copyExact(e, l, _, t, c + 8), l += _; + } + return c >>> 3; + } + var d = a.lits, A = a.strt, g = a.prev, p = 0, m = 0, w = 0, v = 0, b = 0, y = 0; + for (h > 2 && (A[y = UZIP.F._hash(e, 0)] = 0), l = 0; l < h; l++) { + if (b = y, l + 1 < h - 2) { + y = UZIP.F._hash(e, l + 1); + var E = l + 1 & 32767; + g[E] = A[y], A[y] = E; + } + if (u <= l) { + (p > 14e3 || m > 26697) && h - l > 100 && (u < l && (d[p] = l - u, p += 2, u = l), c = UZIP.F._writeBlock(l == h - 1 || u == h ? 1 : 0, d, p, v, e, w, l - w, t, c), p = m = v = 0, w = l); + var F = 0; + l < h - 2 && (F = UZIP.F._bestMatch(e, l, g, b, Math.min(o[2], h - l), o[3])); + var _ = F >>> 16, B = 65535 & F; + if (0 != F) { + B = 65535 & F; + var U = s(_ = F >>> 16, a.of0); + a.lhst[257 + U]++; + var C = s(B, a.df0); + a.dhst[C]++, v += a.exb[U] + a.dxb[C], d[p] = _ << 23 | l - u, d[p + 1] = B << 16 | U << 8 | C, p += 2, u = l + _; + } else + a.lhst[e[l]]++; + m++; + } + } + for (w == l && 0 != e.length || (u < l && (d[p] = l - u, p += 2, u = l), c = UZIP.F._writeBlock(1, d, p, v, e, w, l - w, t, c), p = 0, m = 0, p = m = v = 0, w = l); 0 != (7 & c);) + c++; + return c >>> 3; + }, UZIP.F._bestMatch = function (e, t, r, i, o, a) { + var s = 32767 & t, f = r[s], l = s - f + 32768 & 32767; + if (f == s || i != UZIP.F._hash(e, t - l)) + return 0; + for (var c = 0, u = 0, h = Math.min(32767, t); l <= h && 0 != --a && f != s;) { + if (0 == c || e[t + c] == e[t + c - l]) { + var d = UZIP.F._howLong(e, t, l); + if (d > c) { + if (u = l, (c = d) >= o) + break; + l + 2 < d && (d = l + 2); + for (var A = 0, g = 0; g < d - 2; g++) { + var p = t - l + g + 32768 & 32767, m = p - r[p] + 32768 & 32767; + m > A && (A = m, f = p); + } + } + } + l += (s = f) - (f = r[s]) + 32768 & 32767; + } + return c << 16 | u; + }, UZIP.F._howLong = function (e, t, r) { + if (e[t] != e[t - r] || e[t + 1] != e[t + 1 - r] || e[t + 2] != e[t + 2 - r]) + return 0; + var i = t, o = Math.min(e.length, t + 258); + for (t += 3; t < o && e[t] == e[t - r];) + t++; + return t - i; + }, UZIP.F._hash = function (e, t) { + return (e[t] << 8 | e[t + 1]) + (e[t + 2] << 4) & 65535; + }, UZIP.saved = 0, UZIP.F._writeBlock = function (e, t, r, i, o, a, s, f, l) { + var c, u, h, d, A, g, p, m, w, v = UZIP.F.U, b = UZIP.F._putsF, y = UZIP.F._putsE; + v.lhst[256]++, u = (c = UZIP.F.getTrees())[0], h = c[1], d = c[2], A = c[3], g = c[4], p = c[5], m = c[6], w = c[7]; + var E = 32 + (0 == (l + 3 & 7) ? 0 : 8 - (l + 3 & 7)) + (s << 3), + F = i + UZIP.F.contSize(v.fltree, v.lhst) + UZIP.F.contSize(v.fdtree, v.dhst), + _ = i + UZIP.F.contSize(v.ltree, v.lhst) + UZIP.F.contSize(v.dtree, v.dhst); + _ += 14 + 3 * p + UZIP.F.contSize(v.itree, v.ihst) + (2 * v.ihst[16] + 3 * v.ihst[17] + 7 * v.ihst[18]); + for (var B = 0; B < 286; B++) + v.lhst[B] = 0; + for (B = 0; B < 30; B++) + v.dhst[B] = 0; + for (B = 0; B < 19; B++) + v.ihst[B] = 0; + var U = E < F && E < _ ? 0 : F < _ ? 1 : 2; + if (b(f, l, e), b(f, l + 1, U), l += 3, 0 == U) { + for (; 0 != (7 & l);) + l++; + l = UZIP.F._copyExact(o, a, s, f, l); + } else { + var C, I; + if (1 == U && (C = v.fltree, I = v.fdtree), 2 == U) { + UZIP.F.makeCodes(v.ltree, u), UZIP.F.revCodes(v.ltree, u), UZIP.F.makeCodes(v.dtree, h), UZIP.F.revCodes(v.dtree, h), UZIP.F.makeCodes(v.itree, d), UZIP.F.revCodes(v.itree, d), C = v.ltree, I = v.dtree, y(f, l, A - 257), y(f, l += 5, g - 1), y(f, l += 5, p - 4), l += 4; + for (var Q = 0; Q < p; Q++) + y(f, l + 3 * Q, v.itree[1 + (v.ordr[Q] << 1)]); + l += 3 * p, l = UZIP.F._codeTiny(m, v.itree, f, l), l = UZIP.F._codeTiny(w, v.itree, f, l); + } + for (var M = a, x = 0; x < r; x += 2) { + for (var T = t[x], S = T >>> 23, R = M + (8388607 & T); M < R;) + l = UZIP.F._writeLit(o[M++], C, f, l); + if (0 != S) { + var O = t[x + 1], P = O >> 16, H = O >> 8 & 255, L = 255 & O; + y(f, l = UZIP.F._writeLit(257 + H, C, f, l), S - v.of0[H]), l += v.exb[H], b(f, l = UZIP.F._writeLit(L, I, f, l), P - v.df0[L]), l += v.dxb[L], M += S; + } + } + l = UZIP.F._writeLit(256, C, f, l); + } + return l; + }, UZIP.F._copyExact = function (e, t, r, i, o) { + var a = o >>> 3; + return i[a] = r, i[a + 1] = r >>> 8, i[a + 2] = 255 - i[a], i[a + 3] = 255 - i[a + 1], a += 4, i.set(new Uint8Array(e.buffer, t, r), a), o + (r + 4 << 3); + }, UZIP.F.getTrees = function () { + for (var e = UZIP.F.U, t = UZIP.F._hufTree(e.lhst, e.ltree, 15), r = UZIP.F._hufTree(e.dhst, e.dtree, 15), i = [], o = UZIP.F._lenCodes(e.ltree, i), a = [], s = UZIP.F._lenCodes(e.dtree, a), f = 0; f < i.length; f += 2) + e.ihst[i[f]]++; + for (f = 0; f < a.length; f += 2) + e.ihst[a[f]]++; + for (var l = UZIP.F._hufTree(e.ihst, e.itree, 7), c = 19; c > 4 && 0 == e.itree[1 + (e.ordr[c - 1] << 1)];) + c--; + return [t, r, l, o, s, c, i, a]; + }, UZIP.F.getSecond = function (e) { + for (var t = [], r = 0; r < e.length; r += 2) + t.push(e[r + 1]); + return t; + }, UZIP.F.nonZero = function (e) { + for (var t = "", r = 0; r < e.length; r += 2) + 0 != e[r + 1] && (t += (r >> 1) + ","); + return t; + }, UZIP.F.contSize = function (e, t) { + for (var r = 0, i = 0; i < t.length; i++) + r += t[i] * e[1 + (i << 1)]; + return r; + }, UZIP.F._codeTiny = function (e, t, r, i) { + for (var o = 0; o < e.length; o += 2) { + var a = e[o], s = e[o + 1]; + i = UZIP.F._writeLit(a, t, r, i); + var f = 16 == a ? 2 : 17 == a ? 3 : 7; + a > 15 && (UZIP.F._putsE(r, i, s, f), i += f); + } + return i; + }, UZIP.F._lenCodes = function (e, t) { + for (var r = e.length; 2 != r && 0 == e[r - 1];) + r -= 2; + for (var i = 0; i < r; i += 2) { + var o = e[i + 1], a = i + 3 < r ? e[i + 3] : -1, s = i + 5 < r ? e[i + 5] : -1, + f = 0 == i ? -1 : e[i - 1]; + if (0 == o && a == o && s == o) { + for (var l = i + 5; l + 2 < r && e[l + 2] == o;) + l += 2; + (c = Math.min(l + 1 - i >>> 1, 138)) < 11 ? t.push(17, c - 3) : t.push(18, c - 11), i += 2 * c - 2; + } else if (o == f && a == o && s == o) { + for (l = i + 5; l + 2 < r && e[l + 2] == o;) + l += 2; + var c = Math.min(l + 1 - i >>> 1, 6); + t.push(16, c - 3), i += 2 * c - 2; + } else + t.push(o, 0); + } + return r >>> 1; + }, UZIP.F._hufTree = function (e, t, r) { + var i = [], o = e.length, a = t.length, s = 0; + for (s = 0; s < a; s += 2) + t[s] = 0, t[s + 1] = 0; + for (s = 0; s < o; s++) + 0 != e[s] && i.push({lit: s, f: e[s]}); + var f = i.length, l = i.slice(0); + if (0 == f) + return 0; + if (1 == f) { + var c = i[0].lit; + l = 0 == c ? 1 : 0; + return t[1 + (c << 1)] = 1, t[1 + (l << 1)] = 1, 1; + } + i.sort((function (e, t) { + return e.f - t.f; + })); + var u = i[0], h = i[1], d = 0, A = 1, g = 2; + for (i[0] = { + lit: -1, + f: u.f + h.f, + l: u, + r: h, + d: 0 + }; A != f - 1;) + u = d != A && (g == f || i[d].f < i[g].f) ? i[d++] : i[g++], h = d != A && (g == f || i[d].f < i[g].f) ? i[d++] : i[g++], i[A++] = { + lit: -1, + f: u.f + h.f, + l: u, + r: h + }; + var p = UZIP.F.setDepth(i[A - 1], 0); + for (p > r && (UZIP.F.restrictDepth(l, r, p), p = r), s = 0; s < f; s++) + t[1 + (l[s].lit << 1)] = l[s].d; + return p; + }, UZIP.F.setDepth = function (e, t) { + return -1 != e.lit ? (e.d = t, t) : Math.max(UZIP.F.setDepth(e.l, t + 1), UZIP.F.setDepth(e.r, t + 1)); + }, UZIP.F.restrictDepth = function (e, t, r) { + var i = 0, o = 1 << r - t, a = 0; + for (e.sort((function (e, t) { + return t.d == e.d ? e.f - t.f : t.d - e.d; + })), i = 0; i < e.length && e[i].d > t; i++) { + var s = e[i].d; + e[i].d = t, a += o - (1 << r - s); + } + for (a >>>= r - t; a > 0;) { + (s = e[i].d) < t ? (e[i].d++, a -= 1 << t - s - 1) : i++; + } + for (; i >= 0; i--) + e[i].d == t && a < 0 && (e[i].d--, a++); + 0 != a && console.log("debt left"); + }, UZIP.F._goodIndex = function (e, t) { + var r = 0; + return t[16 | r] <= e && (r |= 16), t[8 | r] <= e && (r |= 8), t[4 | r] <= e && (r |= 4), t[2 | r] <= e && (r |= 2), t[1 | r] <= e && (r |= 1), r; + }, UZIP.F._writeLit = function (e, t, r, i) { + return UZIP.F._putsF(r, i, t[e << 1]), i + t[1 + (e << 1)]; + }, UZIP.F.inflate = function (e, t) { + var r = Uint8Array; + if (3 == e[0] && 0 == e[1]) + return t || new r(0); + var i = UZIP.F, o = i._bitsF, a = i._bitsE, s = i._decodeTiny, f = i.makeCodes, l = i.codes2map, + c = i._get17, u = i.U, h = null == t; + h && (t = new r(e.length >>> 2 << 3)); + for (var d, A, g = 0, p = 0, m = 0, w = 0, v = 0, b = 0, y = 0, E = 0, F = 0; 0 == g;) + if (g = o(e, F, 1), p = o(e, F + 1, 2), F += 3, 0 != p) { + if (h && (t = UZIP.F._check(t, E + (1 << 17))), 1 == p && (d = u.flmap, A = u.fdmap, b = 511, y = 31), 2 == p) { + m = a(e, F, 5) + 257, w = a(e, F + 5, 5) + 1, v = a(e, F + 10, 4) + 4, F += 14; + for (var _ = 0; _ < 38; _ += 2) + u.itree[_] = 0, u.itree[_ + 1] = 0; + var B = 1; + for (_ = 0; _ < v; _++) { + var U = a(e, F + 3 * _, 3); + u.itree[1 + (u.ordr[_] << 1)] = U, U > B && (B = U); + } + F += 3 * v, f(u.itree, B), l(u.itree, B, u.imap), d = u.lmap, A = u.dmap, F = s(u.imap, (1 << B) - 1, m + w, e, F, u.ttree); + var C = i._copyOut(u.ttree, 0, m, u.ltree); + b = (1 << C) - 1; + var I = i._copyOut(u.ttree, m, w, u.dtree); + y = (1 << I) - 1, f(u.ltree, C), l(u.ltree, C, d), f(u.dtree, I), l(u.dtree, I, A); + } + for (; ;) { + var Q = d[c(e, F) & b]; + F += 15 & Q; + var M = Q >>> 4; + if (M >>> 8 == 0) + t[E++] = M; + else { + if (256 == M) + break; + var x = E + M - 254; + if (M > 264) { + var T = u.ldef[M - 257]; + x = E + (T >>> 3) + a(e, F, 7 & T), F += 7 & T; + } + var S = A[c(e, F) & y]; + F += 15 & S; + var R = S >>> 4, O = u.ddef[R], P = (O >>> 4) + o(e, F, 15 & O); + for (F += 15 & O, h && (t = UZIP.F._check(t, E + (1 << 17))); E < x;) + t[E] = t[E++ - P], t[E] = t[E++ - P], t[E] = t[E++ - P], t[E] = t[E++ - P]; + E = x; + } + } + } else { + 0 != (7 & F) && (F += 8 - (7 & F)); + var H = 4 + (F >>> 3), L = e[H - 4] | e[H - 3] << 8; + h && (t = UZIP.F._check(t, E + L)), t.set(new r(e.buffer, e.byteOffset + H, L), E), F = H + L << 3, E += L; + } + return t.length == E ? t : t.slice(0, E); + }, UZIP.F._check = function (e, t) { + var r = e.length; + if (t <= r) + return e; + var i = new Uint8Array(Math.max(r << 1, t)); + return i.set(e, 0), i; + }, UZIP.F._decodeTiny = function (e, t, r, i, o, a) { + for (var s = UZIP.F._bitsE, f = UZIP.F._get17, l = 0; l < r;) { + var c = e[f(i, o) & t]; + o += 15 & c; + var u = c >>> 4; + if (u <= 15) + a[l] = u, l++; + else { + var h = 0, d = 0; + 16 == u ? (d = 3 + s(i, o, 2), o += 2, h = a[l - 1]) : 17 == u ? (d = 3 + s(i, o, 3), o += 3) : 18 == u && (d = 11 + s(i, o, 7), o += 7); + for (var A = l + d; l < A;) + a[l] = h, l++; + } + } + return o; + }, UZIP.F._copyOut = function (e, t, r, i) { + for (var o = 0, a = 0, s = i.length >>> 1; a < r;) { + var f = e[a + t]; + i[a << 1] = 0, i[1 + (a << 1)] = f, f > o && (o = f), a++; + } + for (; a < s;) + i[a << 1] = 0, i[1 + (a << 1)] = 0, a++; + return o; + }, UZIP.F.makeCodes = function (e, t) { + for (var r, i, o, a, s = UZIP.F.U, f = e.length, l = s.bl_count, c = 0; c <= t; c++) + l[c] = 0; + for (c = 1; c < f; c += 2) + l[e[c]]++; + var u = s.next_code; + for (r = 0, l[0] = 0, i = 1; i <= t; i++) + r = r + l[i - 1] << 1, u[i] = r; + for (o = 0; o < f; o += 2) + 0 != (a = e[o + 1]) && (e[o] = u[a], u[a]++); + }, UZIP.F.codes2map = function (e, t, r) { + for (var i = e.length, o = UZIP.F.U.rev15, a = 0; a < i; a += 2) + if (0 != e[a + 1]) + for (var s = a >> 1, f = e[a + 1], l = s << 4 | f, c = t - f, u = e[a] << c, h = u + (1 << c); u != h;) { + r[o[u] >>> 15 - t] = l, u++; + } + }, UZIP.F.revCodes = function (e, t) { + for (var r = UZIP.F.U.rev15, i = 15 - t, o = 0; o < e.length; o += 2) { + var a = e[o] << t - e[o + 1]; + e[o] = r[a] >>> i; + } + }, UZIP.F._putsE = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8; + }, UZIP.F._putsF = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8, e[i + 2] |= r >>> 16; + }, UZIP.F._bitsE = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8) >>> (7 & t) & (1 << r) - 1; + }, UZIP.F._bitsF = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) & (1 << r) - 1; + }, UZIP.F._get17 = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t); + }, UZIP.F._get25 = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16 | e[3 + (t >>> 3)] << 24) >>> (7 & t); + }, UZIP.F.U = (t = Uint16Array, r = Uint32Array, { + next_code: new t(16), + bl_count: new t(16), + ordr: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + of0: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999], + exb: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0], + ldef: new t(32), + df0: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535], + dxb: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0], + ddef: new r(32), + flmap: new t(512), + fltree: [], + fdmap: new t(32), + fdtree: [], + lmap: new t(32768), + ltree: [], + ttree: [], + dmap: new t(32768), + dtree: [], + imap: new t(512), + itree: [], + rev15: new t(32768), + lhst: new r(286), + dhst: new r(30), + ihst: new r(19), + lits: new r(15e3), + strt: new t(65536), + prev: new t(32768) + }), function () { + for (var e = UZIP.F.U, t = 0; t < 32768; t++) { + var r = t; + r = (4278255360 & (r = (4042322160 & (r = (3435973836 & (r = (2863311530 & r) >>> 1 | (1431655765 & r) << 1)) >>> 2 | (858993459 & r) << 2)) >>> 4 | (252645135 & r) << 4)) >>> 8 | (16711935 & r) << 8, e.rev15[t] = (r >>> 16 | r << 16) >>> 17; + } + + function pushV(e, t, r) { + for (; 0 != t--;) + e.push(0, r); + } + + for (t = 0; t < 32; t++) + e.ldef[t] = e.of0[t] << 3 | e.exb[t], e.ddef[t] = e.df0[t] << 4 | e.dxb[t]; + pushV(e.fltree, 144, 8), pushV(e.fltree, 112, 9), pushV(e.fltree, 24, 7), pushV(e.fltree, 8, 8), UZIP.F.makeCodes(e.fltree, 9), UZIP.F.codes2map(e.fltree, 9, e.flmap), UZIP.F.revCodes(e.fltree, 9), pushV(e.fdtree, 32, 5), UZIP.F.makeCodes(e.fdtree, 5), UZIP.F.codes2map(e.fdtree, 5, e.fdmap), UZIP.F.revCodes(e.fdtree, 5), pushV(e.itree, 19, 0), pushV(e.ltree, 286, 0), pushV(e.dtree, 30, 0), pushV(e.ttree, 320, 0); + }(); + }({ + get exports() { + return e; + }, set exports(t) { + e = t; + } + }); + var UZIP = _mergeNamespaces({__proto__: null, default: e}, [e]); + var UPNG = function () { + var e = { + nextZero: function (e, t) { + for (; 0 != e[t];) + t++; + return t; + }, + readUshort: function (e, t) { + return e[t] << 8 | e[t + 1]; + }, + writeUshort: function (e, t, r) { + e[t] = r >> 8 & 255, e[t + 1] = 255 & r; + }, + readUint: function (e, t) { + return 16777216 * e[t] + (e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3]); + }, + writeUint: function (e, t, r) { + e[t] = r >> 24 & 255, e[t + 1] = r >> 16 & 255, e[t + 2] = r >> 8 & 255, e[t + 3] = 255 & r; + }, + readASCII: function (e, t, r) { + var i = ""; + for (var o_1 = 0; o_1 < r; o_1++) + i += String.fromCharCode(e[t + o_1]); + return i; + }, + writeASCII: function (e, t, r) { + for (var i_1 = 0; i_1 < r.length; i_1++) + e[t + i_1] = r.charCodeAt(i_1); + }, + readBytes: function (e, t, r) { + var i = []; + for (var o_2 = 0; o_2 < r; o_2++) + i.push(e[t + o_2]); + return i; + }, + pad: function (e) { + return e.length < 2 ? "0".concat(e) : e; + }, + readUTF8: function (t, r, i) { + var o, a = ""; + for (var o_3 = 0; o_3 < i; o_3++) + a += "%".concat(e.pad(t[r + o_3].toString(16))); + try { + o = decodeURIComponent(a); + } catch (o) { + return e.readASCII(t, r, i); + } + return o; + } + }; + + function decodeImage(t, r, i, o) { + var a = r * i, s = _getBPP(o), f = Math.ceil(r * s / 8), l = new Uint8Array(4 * a), + c = new Uint32Array(l.buffer), u = o.ctype, h = o.depth, d = e.readUshort; + if (6 == u) { + var e_2 = a << 2; + if (8 == h) + for (var A = 0; A < e_2; A += 4) + l[A] = t[A], l[A + 1] = t[A + 1], l[A + 2] = t[A + 2], l[A + 3] = t[A + 3]; + if (16 == h) + for (A = 0; A < e_2; A++) + l[A] = t[A << 1]; + } else if (2 == u) { + var e_3 = o.tabs.tRNS; + if (null == e_3) { + if (8 == h) + for (A = 0; A < a; A++) { + var g = 3 * A; + c[A] = 255 << 24 | t[g + 2] << 16 | t[g + 1] << 8 | t[g]; + } + if (16 == h) + for (A = 0; A < a; A++) { + g = 6 * A; + c[A] = 255 << 24 | t[g + 4] << 16 | t[g + 2] << 8 | t[g]; + } + } else { + var p = e_3[0]; + var r_1 = e_3[1], i_2 = e_3[2]; + if (8 == h) + for (A = 0; A < a; A++) { + var m = A << 2; + g = 3 * A; + c[A] = 255 << 24 | t[g + 2] << 16 | t[g + 1] << 8 | t[g], t[g] == p && t[g + 1] == r_1 && t[g + 2] == i_2 && (l[m + 3] = 0); + } + if (16 == h) + for (A = 0; A < a; A++) { + m = A << 2, g = 6 * A; + c[A] = 255 << 24 | t[g + 4] << 16 | t[g + 2] << 8 | t[g], d(t, g) == p && d(t, g + 2) == r_1 && d(t, g + 4) == i_2 && (l[m + 3] = 0); + } + } + } else if (3 == u) { + var e_4 = o.tabs.PLTE, s_2 = o.tabs.tRNS, c_1 = s_2 ? s_2.length : 0; + if (1 == h) + for (var w = 0; w < i; w++) { + var v = w * f, b = w * r; + for (A = 0; A < r; A++) { + m = b + A << 2; + var y = 3 * (E = t[v + (A >> 3)] >> 7 - ((7 & A) << 0) & 1); + l[m] = e_4[y], l[m + 1] = e_4[y + 1], l[m + 2] = e_4[y + 2], l[m + 3] = E < c_1 ? s_2[E] : 255; + } + } + if (2 == h) + for (w = 0; w < i; w++) + for (v = w * f, b = w * r, A = 0; A < r; A++) { + m = b + A << 2, y = 3 * (E = t[v + (A >> 2)] >> 6 - ((3 & A) << 1) & 3); + l[m] = e_4[y], l[m + 1] = e_4[y + 1], l[m + 2] = e_4[y + 2], l[m + 3] = E < c_1 ? s_2[E] : 255; + } + if (4 == h) + for (w = 0; w < i; w++) + for (v = w * f, b = w * r, A = 0; A < r; A++) { + m = b + A << 2, y = 3 * (E = t[v + (A >> 1)] >> 4 - ((1 & A) << 2) & 15); + l[m] = e_4[y], l[m + 1] = e_4[y + 1], l[m + 2] = e_4[y + 2], l[m + 3] = E < c_1 ? s_2[E] : 255; + } + if (8 == h) + for (A = 0; A < a; A++) { + var E; + m = A << 2, y = 3 * (E = t[A]); + l[m] = e_4[y], l[m + 1] = e_4[y + 1], l[m + 2] = e_4[y + 2], l[m + 3] = E < c_1 ? s_2[E] : 255; + } + } else if (4 == u) { + if (8 == h) + for (A = 0; A < a; A++) { + m = A << 2; + var F = t[_ = A << 1]; + l[m] = F, l[m + 1] = F, l[m + 2] = F, l[m + 3] = t[_ + 1]; + } + if (16 == h) + for (A = 0; A < a; A++) { + var _; + m = A << 2, F = t[_ = A << 2]; + l[m] = F, l[m + 1] = F, l[m + 2] = F, l[m + 3] = t[_ + 2]; + } + } else if (0 == u) + for (p = o.tabs.tRNS ? o.tabs.tRNS : -1, w = 0; w < i; w++) { + var e_5 = w * f, i_3 = w * r; + if (1 == h) + for (var B = 0; B < r; B++) { + var U = (F = 255 * (t[e_5 + (B >>> 3)] >>> 7 - (7 & B) & 1)) == 255 * p ? 0 : 255; + c[i_3 + B] = U << 24 | F << 16 | F << 8 | F; + } + else if (2 == h) + for (B = 0; B < r; B++) { + U = (F = 85 * (t[e_5 + (B >>> 2)] >>> 6 - ((3 & B) << 1) & 3)) == 85 * p ? 0 : 255; + c[i_3 + B] = U << 24 | F << 16 | F << 8 | F; + } + else if (4 == h) + for (B = 0; B < r; B++) { + U = (F = 17 * (t[e_5 + (B >>> 1)] >>> 4 - ((1 & B) << 2) & 15)) == 17 * p ? 0 : 255; + c[i_3 + B] = U << 24 | F << 16 | F << 8 | F; + } + else if (8 == h) + for (B = 0; B < r; B++) { + U = (F = t[e_5 + B]) == p ? 0 : 255; + c[i_3 + B] = U << 24 | F << 16 | F << 8 | F; + } + else if (16 == h) + for (B = 0; B < r; B++) { + F = t[e_5 + (B << 1)], U = d(t, e_5 + (B << 1)) == p ? 0 : 255; + c[i_3 + B] = U << 24 | F << 16 | F << 8 | F; + } + } + return l; + } + + function _decompress(e, r, i, o) { + var a = _getBPP(e), s = Math.ceil(i * a / 8), f = new Uint8Array((s + 1 + e.interlace) * o); + return r = e.tabs.CgBI ? t(r, f) : _inflate(r, f), 0 == e.interlace ? r = _filterZero(r, e, 0, i, o) : 1 == e.interlace && (r = function _readInterlace(e, t) { + var r = t.width, i = t.height, o = _getBPP(t), a = o >> 3, s = Math.ceil(r * o / 8), + f = new Uint8Array(i * s); + var l = 0; + var c = [0, 0, 4, 0, 2, 0, 1], u = [0, 4, 0, 2, 0, 1, 0], h = [8, 8, 8, 4, 4, 2, 2], + d = [8, 8, 4, 4, 2, 2, 1]; + var A = 0; + for (; A < 7;) { + var p = h[A], m = d[A]; + var w = 0, v = 0, b = c[A]; + for (; b < i;) + b += p, v++; + var y = u[A]; + for (; y < r;) + y += m, w++; + var E = Math.ceil(w * o / 8); + _filterZero(e, t, l, w, v); + var F = 0, _ = c[A]; + for (; _ < i;) { + var t_1 = u[A], i_4 = l + F * E << 3; + for (; t_1 < r;) { + var g; + if (1 == o) + g = (g = e[i_4 >> 3]) >> 7 - (7 & i_4) & 1, f[_ * s + (t_1 >> 3)] |= g << 7 - ((7 & t_1) << 0); + if (2 == o) + g = (g = e[i_4 >> 3]) >> 6 - (7 & i_4) & 3, f[_ * s + (t_1 >> 2)] |= g << 6 - ((3 & t_1) << 1); + if (4 == o) + g = (g = e[i_4 >> 3]) >> 4 - (7 & i_4) & 15, f[_ * s + (t_1 >> 1)] |= g << 4 - ((1 & t_1) << 2); + if (o >= 8) { + var r_2 = _ * s + t_1 * a; + for (var t_2 = 0; t_2 < a; t_2++) + f[r_2 + t_2] = e[(i_4 >> 3) + t_2]; + } + i_4 += o, t_1 += m; + } + F++, _ += p; + } + w * v != 0 && (l += v * (1 + E)), A += 1; + } + return f; + }(r, e)), r; + } + + function _inflate(e, r) { + return t(new Uint8Array(e.buffer, 2, e.length - 6), r); + } + + var t = function () { + var e = {H: {}}; + return e.H.N = function (t, r) { + var i = Uint8Array; + var o, a, s = 0, f = 0, l = 0, c = 0, u = 0, h = 0, d = 0, A = 0, g = 0; + if (3 == t[0] && 0 == t[1]) + return r || new i(0); + var p = e.H, m = p.b, w = p.e, v = p.R, b = p.n, y = p.A, E = p.Z, F = p.m, _ = null == r; + for (_ && (r = new i(t.length >>> 2 << 5)); 0 == s;) + if (s = m(t, g, 1), f = m(t, g + 1, 2), g += 3, 0 != f) { + if (_ && (r = e.H.W(r, A + (1 << 17))), 1 == f && (o = F.J, a = F.h, h = 511, d = 31), 2 == f) { + l = w(t, g, 5) + 257, c = w(t, g + 5, 5) + 1, u = w(t, g + 10, 4) + 4, g += 14; + var e_6 = 1; + for (var B = 0; B < 38; B += 2) + F.Q[B] = 0, F.Q[B + 1] = 0; + for (B = 0; B < u; B++) { + var r_3 = w(t, g + 3 * B, 3); + F.Q[1 + (F.X[B] << 1)] = r_3, r_3 > e_6 && (e_6 = r_3); + } + g += 3 * u, b(F.Q, e_6), y(F.Q, e_6, F.u), o = F.w, a = F.d, g = v(F.u, (1 << e_6) - 1, l + c, t, g, F.v); + var r_4 = p.V(F.v, 0, l, F.C); + h = (1 << r_4) - 1; + var i_5 = p.V(F.v, l, c, F.D); + d = (1 << i_5) - 1, b(F.C, r_4), y(F.C, r_4, o), b(F.D, i_5), y(F.D, i_5, a); + } + for (; ;) { + var e_7 = o[E(t, g) & h]; + g += 15 & e_7; + var i_6 = e_7 >>> 4; + if (i_6 >>> 8 == 0) + r[A++] = i_6; + else { + if (256 == i_6) + break; + { + var e_8 = A + i_6 - 254; + if (i_6 > 264) { + var r_5 = F.q[i_6 - 257]; + e_8 = A + (r_5 >>> 3) + w(t, g, 7 & r_5), g += 7 & r_5; + } + var o_4 = a[E(t, g) & d]; + g += 15 & o_4; + var s_3 = o_4 >>> 4, f_2 = F.c[s_3], l_2 = (f_2 >>> 4) + m(t, g, 15 & f_2); + for (g += 15 & f_2; A < e_8;) + r[A] = r[A++ - l_2], r[A] = r[A++ - l_2], r[A] = r[A++ - l_2], r[A] = r[A++ - l_2]; + A = e_8; + } + } + } + } else { + 0 != (7 & g) && (g += 8 - (7 & g)); + var o_5 = 4 + (g >>> 3), a_3 = t[o_5 - 4] | t[o_5 - 3] << 8; + _ && (r = e.H.W(r, A + a_3)), r.set(new i(t.buffer, t.byteOffset + o_5, a_3), A), g = o_5 + a_3 << 3, A += a_3; + } + return r.length == A ? r : r.slice(0, A); + }, e.H.W = function (e, t) { + var r = e.length; + if (t <= r) + return e; + var i = new Uint8Array(r << 1); + return i.set(e, 0), i; + }, e.H.R = function (t, r, i, o, a, s) { + var f = e.H.e, l = e.H.Z; + var c = 0; + for (; c < i;) { + var e_9 = t[l(o, a) & r]; + a += 15 & e_9; + var i_7 = e_9 >>> 4; + if (i_7 <= 15) + s[c] = i_7, c++; + else { + var e_10 = 0, t_3 = 0; + 16 == i_7 ? (t_3 = 3 + f(o, a, 2), a += 2, e_10 = s[c - 1]) : 17 == i_7 ? (t_3 = 3 + f(o, a, 3), a += 3) : 18 == i_7 && (t_3 = 11 + f(o, a, 7), a += 7); + var r_6 = c + t_3; + for (; c < r_6;) + s[c] = e_10, c++; + } + } + return a; + }, e.H.V = function (e, t, r, i) { + var o = 0, a = 0; + var s = i.length >>> 1; + for (; a < r;) { + var r_7 = e[a + t]; + i[a << 1] = 0, i[1 + (a << 1)] = r_7, r_7 > o && (o = r_7), a++; + } + for (; a < s;) + i[a << 1] = 0, i[1 + (a << 1)] = 0, a++; + return o; + }, e.H.n = function (t, r) { + var i = e.H.m, o = t.length; + var a, s, f; + var l; + var c = i.j; + for (var u = 0; u <= r; u++) + c[u] = 0; + for (u = 1; u < o; u += 2) + c[t[u]]++; + var h = i.K; + for (a = 0, c[0] = 0, s = 1; s <= r; s++) + a = a + c[s - 1] << 1, h[s] = a; + for (f = 0; f < o; f += 2) + l = t[f + 1], 0 != l && (t[f] = h[l], h[l]++); + }, e.H.A = function (t, r, i) { + var o = t.length, a = e.H.m.r; + for (var e_11 = 0; e_11 < o; e_11 += 2) + if (0 != t[e_11 + 1]) { + var o_6 = e_11 >> 1, s_4 = t[e_11 + 1], f_3 = o_6 << 4 | s_4, l_3 = r - s_4; + var c = t[e_11] << l_3; + var u = c + (1 << l_3); + for (; c != u;) { + i[a[c] >>> 15 - r] = f_3, c++; + } + } + }, e.H.l = function (t, r) { + var i = e.H.m.r, o = 15 - r; + for (var e_12 = 0; e_12 < t.length; e_12 += 2) { + var a_4 = t[e_12] << r - t[e_12 + 1]; + t[e_12] = i[a_4] >>> o; + } + }, e.H.M = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8; + }, e.H.I = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8, e[i + 2] |= r >>> 16; + }, e.H.e = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8) >>> (7 & t) & (1 << r) - 1; + }, e.H.b = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) & (1 << r) - 1; + }, e.H.Z = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t); + }, e.H.i = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16 | e[3 + (t >>> 3)] << 24) >>> (7 & t); + }, e.H.m = function () { + var e = Uint16Array, t = Uint32Array; + return { + K: new e(16), + j: new e(16), + X: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + S: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999], + T: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0], + q: new e(32), + p: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535], + z: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0], + c: new t(32), + J: new e(512), + _: [], + h: new e(32), + $: [], + w: new e(32768), + C: [], + v: [], + d: new e(32768), + D: [], + u: new e(512), + Q: [], + r: new e(32768), + s: new t(286), + Y: new t(30), + a: new t(19), + t: new t(15e3), + k: new e(65536), + g: new e(32768) + }; + }(), function () { + var t = e.H.m; + for (var r = 0; r < 32768; r++) { + var e_13 = r; + e_13 = (2863311530 & e_13) >>> 1 | (1431655765 & e_13) << 1, e_13 = (3435973836 & e_13) >>> 2 | (858993459 & e_13) << 2, e_13 = (4042322160 & e_13) >>> 4 | (252645135 & e_13) << 4, e_13 = (4278255360 & e_13) >>> 8 | (16711935 & e_13) << 8, t.r[r] = (e_13 >>> 16 | e_13 << 16) >>> 17; + } + + function n(e, t, r) { + for (; 0 != t--;) + e.push(0, r); + } + + for (r = 0; r < 32; r++) + t.q[r] = t.S[r] << 3 | t.T[r], t.c[r] = t.p[r] << 4 | t.z[r]; + n(t._, 144, 8), n(t._, 112, 9), n(t._, 24, 7), n(t._, 8, 8), e.H.n(t._, 9), e.H.A(t._, 9, t.J), e.H.l(t._, 9), n(t.$, 32, 5), e.H.n(t.$, 5), e.H.A(t.$, 5, t.h), e.H.l(t.$, 5), n(t.Q, 19, 0), n(t.C, 286, 0), n(t.D, 30, 0), n(t.v, 320, 0); + }(), e.H.N; + }(); + + function _getBPP(e) { + return [1, null, 3, 1, 2, null, 4][e.ctype] * e.depth; + } + + function _filterZero(e, t, r, i, o) { + var a = _getBPP(t); + var s = Math.ceil(i * a / 8); + var f, l; + a = Math.ceil(a / 8); + var c = e[r], u = 0; + if (c > 1 && (e[r] = [0, 0, 1][c - 2]), 3 == c) + for (u = a; u < s; u++) + e[u + 1] = e[u + 1] + (e[u + 1 - a] >>> 1) & 255; + for (var t_4 = 0; t_4 < o; t_4++) + if (f = r + t_4 * s, l = f + t_4 + 1, c = e[l - 1], u = 0, 0 == c) + for (; u < s; u++) + e[f + u] = e[l + u]; + else if (1 == c) { + for (; u < a; u++) + e[f + u] = e[l + u]; + for (; u < s; u++) + e[f + u] = e[l + u] + e[f + u - a]; + } else if (2 == c) + for (; u < s; u++) + e[f + u] = e[l + u] + e[f + u - s]; + else if (3 == c) { + for (; u < a; u++) + e[f + u] = e[l + u] + (e[f + u - s] >>> 1); + for (; u < s; u++) + e[f + u] = e[l + u] + (e[f + u - s] + e[f + u - a] >>> 1); + } else { + for (; u < a; u++) + e[f + u] = e[l + u] + _paeth(0, e[f + u - s], 0); + for (; u < s; u++) + e[f + u] = e[l + u] + _paeth(e[f + u - a], e[f + u - s], e[f + u - a - s]); + } + return e; + } + + function _paeth(e, t, r) { + var i = e + t - r, o = i - e, a = i - t, s = i - r; + return o * o <= a * a && o * o <= s * s ? e : a * a <= s * s ? t : r; + } + + function _IHDR(t, r, i) { + i.width = e.readUint(t, r), r += 4, i.height = e.readUint(t, r), r += 4, i.depth = t[r], r++, i.ctype = t[r], r++, i.compress = t[r], r++, i.filter = t[r], r++, i.interlace = t[r], r++; + } + + function _copyTile(e, t, r, i, o, a, s, f, l) { + var c = Math.min(t, o), u = Math.min(r, a); + var h = 0, d = 0; + for (var r_8 = 0; r_8 < u; r_8++) + for (var a_5 = 0; a_5 < c; a_5++) + if (s >= 0 && f >= 0 ? (h = r_8 * t + a_5 << 2, d = (f + r_8) * o + s + a_5 << 2) : (h = (-f + r_8) * t - s + a_5 << 2, d = r_8 * o + a_5 << 2), 0 == l) + i[d] = e[h], i[d + 1] = e[h + 1], i[d + 2] = e[h + 2], i[d + 3] = e[h + 3]; + else if (1 == l) { + var A = e[h + 3] * (1 / 255), g = e[h] * A, p = e[h + 1] * A, m = e[h + 2] * A, + w = i[d + 3] * (1 / 255), v = i[d] * w, b = i[d + 1] * w, y = i[d + 2] * w; + var t_5 = 1 - A, r_9 = A + w * t_5, o_7 = 0 == r_9 ? 0 : 1 / r_9; + i[d + 3] = 255 * r_9, i[d + 0] = (g + v * t_5) * o_7, i[d + 1] = (p + b * t_5) * o_7, i[d + 2] = (m + y * t_5) * o_7; + } else if (2 == l) { + A = e[h + 3], g = e[h], p = e[h + 1], m = e[h + 2], w = i[d + 3], v = i[d], b = i[d + 1], y = i[d + 2]; + A == w && g == v && p == b && m == y ? (i[d] = 0, i[d + 1] = 0, i[d + 2] = 0, i[d + 3] = 0) : (i[d] = g, i[d + 1] = p, i[d + 2] = m, i[d + 3] = A); + } else if (3 == l) { + A = e[h + 3], g = e[h], p = e[h + 1], m = e[h + 2], w = i[d + 3], v = i[d], b = i[d + 1], y = i[d + 2]; + if (A == w && g == v && p == b && m == y) + continue; + if (A < 220 && w > 20) + return !1; + } + return !0; + } + + return { + decode: function decode(r) { + var i = new Uint8Array(r); + var o = 8; + var a = e, s = a.readUshort, f = a.readUint, l = {tabs: {}, frames: []}, c = new Uint8Array(i.length); + var u, h = 0, d = 0; + var A = [137, 80, 78, 71, 13, 10, 26, 10]; + for (var g = 0; g < 8; g++) + if (i[g] != A[g]) + throw "The input is not a PNG file!"; + for (; o < i.length;) { + var e_14 = a.readUint(i, o); + o += 4; + var r_10 = a.readASCII(i, o, 4); + if (o += 4, "IHDR" == r_10) + _IHDR(i, o, l); + else if ("iCCP" == r_10) { + for (var p = o; 0 != i[p];) + p++; + a.readASCII(i, o, p - o), i[p + 1]; + var s_5 = i.slice(p + 2, o + e_14); + var f_4 = null; + try { + f_4 = _inflate(s_5); + } catch (e) { + f_4 = t(s_5); + } + l.tabs[r_10] = f_4; + } else if ("CgBI" == r_10) + l.tabs[r_10] = i.slice(o, o + 4); + else if ("IDAT" == r_10) { + for (g = 0; g < e_14; g++) + c[h + g] = i[o + g]; + h += e_14; + } else if ("acTL" == r_10) + l.tabs[r_10] = { + num_frames: f(i, o), + num_plays: f(i, o + 4) + }, u = new Uint8Array(i.length); + else if ("fcTL" == r_10) { + if (0 != d) + (E = l.frames[l.frames.length - 1]).data = _decompress(l, u.slice(0, d), E.rect.width, E.rect.height), d = 0; + var e_15 = {x: f(i, o + 12), y: f(i, o + 16), width: f(i, o + 4), height: f(i, o + 8)}; + var t_6 = s(i, o + 22); + t_6 = s(i, o + 20) / (0 == t_6 ? 100 : t_6); + var r_11 = {rect: e_15, delay: Math.round(1e3 * t_6), dispose: i[o + 24], blend: i[o + 25]}; + l.frames.push(r_11); + } else if ("fdAT" == r_10) { + for (g = 0; g < e_14 - 4; g++) + u[d + g] = i[o + g + 4]; + d += e_14 - 4; + } else if ("pHYs" == r_10) + l.tabs[r_10] = [a.readUint(i, o), a.readUint(i, o + 4), i[o + 8]]; + else if ("cHRM" == r_10) { + l.tabs[r_10] = []; + for (g = 0; g < 8; g++) + l.tabs[r_10].push(a.readUint(i, o + 4 * g)); + } else if ("tEXt" == r_10 || "zTXt" == r_10) { + null == l.tabs[r_10] && (l.tabs[r_10] = {}); + var m = a.nextZero(i, o), w = a.readASCII(i, o, m - o), v = o + e_14 - m - 1; + if ("tEXt" == r_10) + y = a.readASCII(i, m + 1, v); + else { + var b = _inflate(i.slice(m + 2, m + 2 + v)); + y = a.readUTF8(b, 0, b.length); + } + l.tabs[r_10][w] = y; + } else if ("iTXt" == r_10) { + null == l.tabs[r_10] && (l.tabs[r_10] = {}); + m = 0, p = o; + m = a.nextZero(i, p); + w = a.readASCII(i, p, m - p); + var t_7 = i[p = m + 1]; + var y; + i[p + 1], p += 2, m = a.nextZero(i, p), a.readASCII(i, p, m - p), p = m + 1, m = a.nextZero(i, p), a.readUTF8(i, p, m - p); + v = e_14 - ((p = m + 1) - o); + if (0 == t_7) + y = a.readUTF8(i, p, v); + else { + b = _inflate(i.slice(p, p + v)); + y = a.readUTF8(b, 0, b.length); + } + l.tabs[r_10][w] = y; + } else if ("PLTE" == r_10) + l.tabs[r_10] = a.readBytes(i, o, e_14); + else if ("hIST" == r_10) { + var e_16 = l.tabs.PLTE.length / 3; + l.tabs[r_10] = []; + for (g = 0; g < e_16; g++) + l.tabs[r_10].push(s(i, o + 2 * g)); + } else if ("tRNS" == r_10) + 3 == l.ctype ? l.tabs[r_10] = a.readBytes(i, o, e_14) : 0 == l.ctype ? l.tabs[r_10] = s(i, o) : 2 == l.ctype && (l.tabs[r_10] = [s(i, o), s(i, o + 2), s(i, o + 4)]); + else if ("gAMA" == r_10) + l.tabs[r_10] = a.readUint(i, o) / 1e5; + else if ("sRGB" == r_10) + l.tabs[r_10] = i[o]; + else if ("bKGD" == r_10) + 0 == l.ctype || 4 == l.ctype ? l.tabs[r_10] = [s(i, o)] : 2 == l.ctype || 6 == l.ctype ? l.tabs[r_10] = [s(i, o), s(i, o + 2), s(i, o + 4)] : 3 == l.ctype && (l.tabs[r_10] = i[o]); + else if ("IEND" == r_10) + break; + o += e_14, a.readUint(i, o), o += 4; + } + var E; + return 0 != d && ((E = l.frames[l.frames.length - 1]).data = _decompress(l, u.slice(0, d), E.rect.width, E.rect.height)), l.data = _decompress(l, c, l.width, l.height), delete l.compress, delete l.interlace, delete l.filter, l; + }, toRGBA8: function toRGBA8(e) { + var t = e.width, r = e.height; + if (null == e.tabs.acTL) + return [decodeImage(e.data, t, r, e).buffer]; + var i = []; + null == e.frames[0].data && (e.frames[0].data = e.data); + var o = t * r * 4, a = new Uint8Array(o), s = new Uint8Array(o), f = new Uint8Array(o); + for (var c = 0; c < e.frames.length; c++) { + var u = e.frames[c], h = u.rect.x, d = u.rect.y, A = u.rect.width, g = u.rect.height, + p = decodeImage(u.data, A, g, e); + if (0 != c) + for (var l = 0; l < o; l++) + f[l] = a[l]; + if (0 == u.blend ? _copyTile(p, A, g, a, t, r, h, d, 0) : 1 == u.blend && _copyTile(p, A, g, a, t, r, h, d, 1), i.push(a.buffer.slice(0)), 0 == u.dispose) + ; + else if (1 == u.dispose) + _copyTile(s, A, g, a, t, r, h, d, 0); + else if (2 == u.dispose) + for (l = 0; l < o; l++) + a[l] = f[l]; + } + return i; + }, _paeth: _paeth, _copyTile: _copyTile, _bin: e + }; + }(); + !function () { + var e = UPNG._copyTile, t = UPNG._bin, r = UPNG._paeth; + var i = { + table: function () { + var e = new Uint32Array(256); + for (var t_8 = 0; t_8 < 256; t_8++) { + var r_12 = t_8; + for (var e_17 = 0; e_17 < 8; e_17++) + 1 & r_12 ? r_12 = 3988292384 ^ r_12 >>> 1 : r_12 >>>= 1; + e[t_8] = r_12; + } + return e; + }(), + update: function (e, t, r, o) { + for (var a_6 = 0; a_6 < o; a_6++) + e = i.table[255 & (e ^ t[r + a_6])] ^ e >>> 8; + return e; + }, + crc: function (e, t, r) { + return 4294967295 ^ i.update(4294967295, e, t, r); + } + }; + + function addErr(e, t, r, i) { + t[r] += e[0] * i >> 4, t[r + 1] += e[1] * i >> 4, t[r + 2] += e[2] * i >> 4, t[r + 3] += e[3] * i >> 4; + } + + function N(e) { + return Math.max(0, Math.min(255, e)); + } + + function D(e, t) { + var r = e[0] - t[0], i = e[1] - t[1], o = e[2] - t[2], a = e[3] - t[3]; + return r * r + i * i + o * o + a * a; + } + + function dither(e, t, r, i, o, a, s) { + null == s && (s = 1); + var f = i.length, l = []; + for (var c = 0; c < f; c++) { + var e_18 = i[c]; + l.push([e_18 >>> 0 & 255, e_18 >>> 8 & 255, e_18 >>> 16 & 255, e_18 >>> 24 & 255]); + } + for (c = 0; c < f; c++) { + var e_19 = 4294967295; + for (var u = 0, h = 0; h < f; h++) { + var d = D(l[c], l[h]); + h != c && d < e_19 && (e_19 = d, u = h); + } + } + var A = new Uint32Array(o.buffer), g = new Int16Array(t * r * 4), + p = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5]; + for (c = 0; c < p.length; c++) + p[c] = 255 * ((p[c] + .5) / 16 - .5); + for (var o_8 = 0; o_8 < r; o_8++) + for (var w = 0; w < t; w++) { + var m; + c = 4 * (o_8 * t + w); + if (2 != s) + m = [N(e[c] + g[c]), N(e[c + 1] + g[c + 1]), N(e[c + 2] + g[c + 2]), N(e[c + 3] + g[c + 3])]; + else { + d = p[4 * (3 & o_8) + (3 & w)]; + m = [N(e[c] + d), N(e[c + 1] + d), N(e[c + 2] + d), N(e[c + 3] + d)]; + } + u = 0; + var v = 16777215; + for (h = 0; h < f; h++) { + var e_20 = D(m, l[h]); + e_20 < v && (v = e_20, u = h); + } + var b = l[u], y = [m[0] - b[0], m[1] - b[1], m[2] - b[2], m[3] - b[3]]; + 1 == s && (w != t - 1 && addErr(y, g, c + 4, 7), o_8 != r - 1 && (0 != w && addErr(y, g, c + 4 * t - 4, 3), addErr(y, g, c + 4 * t, 5), w != t - 1 && addErr(y, g, c + 4 * t + 4, 1))), a[c >> 2] = u, A[c >> 2] = i[u]; + } + } + + function _main(e, r, o, a, s) { + null == s && (s = {}); + var f = i.crc, l = t.writeUint, c = t.writeUshort, u = t.writeASCII; + var h = 8; + var d = e.frames.length > 1; + var A, g = !1, p = 33 + (d ? 20 : 0); + if (null != s.sRGB && (p += 13), null != s.pHYs && (p += 21), null != s.iCCP && (A = pako.deflate(s.iCCP), p += 21 + A.length + 4), 3 == e.ctype) { + for (var m = e.plte.length, w = 0; w < m; w++) + e.plte[w] >>> 24 != 255 && (g = !0); + p += 8 + 3 * m + 4 + (g ? 8 + 1 * m + 4 : 0); + } + for (var v = 0; v < e.frames.length; v++) { + d && (p += 38), p += (F = e.frames[v]).cimg.length + 12, 0 != v && (p += 4); + } + p += 12; + var b = new Uint8Array(p), y = [137, 80, 78, 71, 13, 10, 26, 10]; + for (w = 0; w < 8; w++) + b[w] = y[w]; + if (l(b, h, 13), h += 4, u(b, h, "IHDR"), h += 4, l(b, h, r), h += 4, l(b, h, o), h += 4, b[h] = e.depth, h++, b[h] = e.ctype, h++, b[h] = 0, h++, b[h] = 0, h++, b[h] = 0, h++, l(b, h, f(b, h - 17, 17)), h += 4, null != s.sRGB && (l(b, h, 1), h += 4, u(b, h, "sRGB"), h += 4, b[h] = s.sRGB, h++, l(b, h, f(b, h - 5, 5)), h += 4), null != s.iCCP) { + var e_21 = 13 + A.length; + l(b, h, e_21), h += 4, u(b, h, "iCCP"), h += 4, u(b, h, "ICC profile"), h += 11, h += 2, b.set(A, h), h += A.length, l(b, h, f(b, h - (e_21 + 4), e_21 + 4)), h += 4; + } + if (null != s.pHYs && (l(b, h, 9), h += 4, u(b, h, "pHYs"), h += 4, l(b, h, s.pHYs[0]), h += 4, l(b, h, s.pHYs[1]), h += 4, b[h] = s.pHYs[2], h++, l(b, h, f(b, h - 13, 13)), h += 4), d && (l(b, h, 8), h += 4, u(b, h, "acTL"), h += 4, l(b, h, e.frames.length), h += 4, l(b, h, null != s.loop ? s.loop : 0), h += 4, l(b, h, f(b, h - 12, 12)), h += 4), 3 == e.ctype) { + l(b, h, 3 * (m = e.plte.length)), h += 4, u(b, h, "PLTE"), h += 4; + for (w = 0; w < m; w++) { + var t_9 = 3 * w, r_13 = e.plte[w], i_8 = 255 & r_13, o_9 = r_13 >>> 8 & 255, + a_7 = r_13 >>> 16 & 255; + b[h + t_9 + 0] = i_8, b[h + t_9 + 1] = o_9, b[h + t_9 + 2] = a_7; + } + if (h += 3 * m, l(b, h, f(b, h - 3 * m - 4, 3 * m + 4)), h += 4, g) { + l(b, h, m), h += 4, u(b, h, "tRNS"), h += 4; + for (w = 0; w < m; w++) + b[h + w] = e.plte[w] >>> 24 & 255; + h += m, l(b, h, f(b, h - m - 4, m + 4)), h += 4; + } + } + var E = 0; + for (v = 0; v < e.frames.length; v++) { + var F = e.frames[v]; + d && (l(b, h, 26), h += 4, u(b, h, "fcTL"), h += 4, l(b, h, E++), h += 4, l(b, h, F.rect.width), h += 4, l(b, h, F.rect.height), h += 4, l(b, h, F.rect.x), h += 4, l(b, h, F.rect.y), h += 4, c(b, h, a[v]), h += 2, c(b, h, 1e3), h += 2, b[h] = F.dispose, h++, b[h] = F.blend, h++, l(b, h, f(b, h - 30, 30)), h += 4); + var t_10 = F.cimg; + l(b, h, (m = t_10.length) + (0 == v ? 0 : 4)), h += 4; + var r_14 = h; + u(b, h, 0 == v ? "IDAT" : "fdAT"), h += 4, 0 != v && (l(b, h, E++), h += 4), b.set(t_10, h), h += m, l(b, h, f(b, r_14, h - r_14)), h += 4; + } + return l(b, h, 0), h += 4, u(b, h, "IEND"), h += 4, l(b, h, f(b, h - 4, 4)), h += 4, b.buffer; + } + + function compressPNG(e, t, r) { + for (var i_9 = 0; i_9 < e.frames.length; i_9++) { + var o_10 = e.frames[i_9]; + o_10.rect.width; + var a_8 = o_10.rect.height, s_6 = new Uint8Array(a_8 * o_10.bpl + a_8); + o_10.cimg = _filterZero(o_10.img, a_8, o_10.bpp, o_10.bpl, s_6, t, r); + } + } + + function compress(t, r, i, o, a) { + var s = a[0], f = a[1], l = a[2], c = a[3], u = a[4], h = a[5]; + var d = 6, A = 8, g = 255; + for (var p = 0; p < t.length; p++) { + var e_22 = new Uint8Array(t[p]); + for (var m = e_22.length, w = 0; w < m; w += 4) + g &= e_22[w + 3]; + } + var v = 255 != g, b = function framize(t, r, i, o, a, s) { + var f = []; + for (var l = 0; l < t.length; l++) { + var h_1 = new Uint8Array(t[l]), A_1 = new Uint32Array(h_1.buffer); + var c; + var g_1 = 0, p_1 = 0, m_1 = r, w_1 = i, v_1 = o ? 1 : 0; + if (0 != l) { + var b_1 = s || o || 1 == l || 0 != f[l - 2].dispose ? 1 : 2; + var y_1 = 0, E_1 = 1e9; + for (var e_23 = 0; e_23 < b_1; e_23++) { + var u = new Uint8Array(t[l - 1 - e_23]); + var o_11 = new Uint32Array(t[l - 1 - e_23]); + var s_7 = r, f_5 = i, c_2 = -1, h_2 = -1; + for (var e_24 = 0; e_24 < i; e_24++) + for (var t_11 = 0; t_11 < r; t_11++) { + A_1[d = e_24 * r + t_11] != o_11[d] && (t_11 < s_7 && (s_7 = t_11), t_11 > c_2 && (c_2 = t_11), e_24 < f_5 && (f_5 = e_24), e_24 > h_2 && (h_2 = e_24)); + } + -1 == c_2 && (s_7 = f_5 = c_2 = h_2 = 0), a && (1 == (1 & s_7) && s_7--, 1 == (1 & f_5) && f_5--); + var v_2 = (c_2 - s_7 + 1) * (h_2 - f_5 + 1); + v_2 < E_1 && (E_1 = v_2, y_1 = e_23, g_1 = s_7, p_1 = f_5, m_1 = c_2 - s_7 + 1, w_1 = h_2 - f_5 + 1); + } + u = new Uint8Array(t[l - 1 - y_1]); + 1 == y_1 && (f[l - 1].dispose = 2), c = new Uint8Array(m_1 * w_1 * 4), e(u, r, i, c, m_1, w_1, -g_1, -p_1, 0), v_1 = e(h_1, r, i, c, m_1, w_1, -g_1, -p_1, 3) ? 1 : 0, 1 == v_1 ? _prepareDiff(h_1, r, i, c, { + x: g_1, + y: p_1, + width: m_1, + height: w_1 + }) : e(h_1, r, i, c, m_1, w_1, -g_1, -p_1, 0); + } else + c = h_1.slice(0); + f.push({rect: {x: g_1, y: p_1, width: m_1, height: w_1}, img: c, blend: v_1, dispose: 0}); + } + if (o) + for (l = 0; l < f.length; l++) { + if (1 == (A = f[l]).blend) + continue; + var e_25 = A.rect, o_12 = f[l - 1].rect, s_8 = Math.min(e_25.x, o_12.x), + c_3 = Math.min(e_25.y, o_12.y), u_1 = { + x: s_8, + y: c_3, + width: Math.max(e_25.x + e_25.width, o_12.x + o_12.width) - s_8, + height: Math.max(e_25.y + e_25.height, o_12.y + o_12.height) - c_3 + }; + f[l - 1].dispose = 1, l - 1 != 0 && _updateFrame(t, r, i, f, l - 1, u_1, a), _updateFrame(t, r, i, f, l, u_1, a); + } + var h = 0; + if (1 != t.length) + for (var d = 0; d < f.length; d++) { + var A; + h += (A = f[d]).rect.width * A.rect.height; + } + return f; + }(t, r, i, s, f, l), y = {}, E = [], F = []; + if (0 != o) { + var e_26 = []; + for (w = 0; w < b.length; w++) + e_26.push(b[w].img.buffer); + var t_12 = function concatRGBA(e) { + var t = 0; + for (var r = 0; r < e.length; r++) + t += e[r].byteLength; + var i = new Uint8Array(t); + var o = 0; + for (r = 0; r < e.length; r++) { + var t_13 = new Uint8Array(e[r]), a_9 = t_13.length; + for (var e_27 = 0; e_27 < a_9; e_27 += 4) { + var r_15 = t_13[e_27], a_10 = t_13[e_27 + 1], s_9 = t_13[e_27 + 2]; + var f_6 = t_13[e_27 + 3]; + 0 == f_6 && (r_15 = a_10 = s_9 = 0), i[o + e_27] = r_15, i[o + e_27 + 1] = a_10, i[o + e_27 + 2] = s_9, i[o + e_27 + 3] = f_6; + } + o += a_9; + } + return i.buffer; + }(e_26), r_16 = quantize(t_12, o); + for (w = 0; w < r_16.plte.length; w++) + E.push(r_16.plte[w].est.rgba); + var i_10 = 0; + for (w = 0; w < b.length; w++) { + var e_28 = (B = b[w]).img.length; + var _ = new Uint8Array(r_16.inds.buffer, i_10 >> 2, e_28 >> 2); + F.push(_); + var t_14 = new Uint8Array(r_16.abuf, i_10, e_28); + h && dither(B.img, B.rect.width, B.rect.height, E, t_14, _), B.img.set(t_14), i_10 += e_28; + } + } else + for (p = 0; p < b.length; p++) { + var B = b[p]; + var e_29 = new Uint32Array(B.img.buffer); + var U = B.rect.width; + m = e_29.length, _ = new Uint8Array(m); + F.push(_); + for (w = 0; w < m; w++) { + var t_15 = e_29[w]; + if (0 != w && t_15 == e_29[w - 1]) + _[w] = _[w - 1]; + else if (w > U && t_15 == e_29[w - U]) + _[w] = _[w - U]; + else { + var e_30 = y[t_15]; + if (null == e_30 && (y[t_15] = e_30 = E.length, E.push(t_15), E.length >= 300)) + break; + _[w] = e_30; + } + } + } + var C = E.length; + C <= 256 && 0 == u && (A = C <= 2 ? 1 : C <= 4 ? 2 : C <= 16 ? 4 : 8, A = Math.max(A, c)); + for (p = 0; p < b.length; p++) { + (B = b[p]).rect.x, B.rect.y; + U = B.rect.width; + var e_31 = B.rect.height; + var t_16 = B.img; + new Uint32Array(t_16.buffer); + var r_17 = 4 * U, i_11 = 4; + if (C <= 256 && 0 == u) { + r_17 = Math.ceil(A * U / 8); + var I = new Uint8Array(r_17 * e_31); + var o_13 = F[p]; + for (var t_17 = 0; t_17 < e_31; t_17++) { + w = t_17 * r_17; + var e_32 = t_17 * U; + if (8 == A) + for (var Q = 0; Q < U; Q++) + I[w + Q] = o_13[e_32 + Q]; + else if (4 == A) + for (Q = 0; Q < U; Q++) + I[w + (Q >> 1)] |= o_13[e_32 + Q] << 4 - 4 * (1 & Q); + else if (2 == A) + for (Q = 0; Q < U; Q++) + I[w + (Q >> 2)] |= o_13[e_32 + Q] << 6 - 2 * (3 & Q); + else if (1 == A) + for (Q = 0; Q < U; Q++) + I[w + (Q >> 3)] |= o_13[e_32 + Q] << 7 - 1 * (7 & Q); + } + t_16 = I, d = 3, i_11 = 1; + } else if (0 == v && 1 == b.length) { + I = new Uint8Array(U * e_31 * 3); + var o_14 = U * e_31; + for (w = 0; w < o_14; w++) { + var e_33 = 3 * w, r_18 = 4 * w; + I[e_33] = t_16[r_18], I[e_33 + 1] = t_16[r_18 + 1], I[e_33 + 2] = t_16[r_18 + 2]; + } + t_16 = I, d = 2, i_11 = 3, r_17 = 3 * U; + } + B.img = t_16, B.bpl = r_17, B.bpp = i_11; + } + return {ctype: d, depth: A, plte: E, frames: b}; + } + + function _updateFrame(t, r, i, o, a, s, f) { + var l = Uint8Array, c = Uint32Array, u = new l(t[a - 1]), h = new c(t[a - 1]), + d = a + 1 < t.length ? new l(t[a + 1]) : null, A = new l(t[a]), g = new c(A.buffer); + var p = r, m = i, w = -1, v = -1; + for (var e_34 = 0; e_34 < s.height; e_34++) + for (var t_18 = 0; t_18 < s.width; t_18++) { + var i_12 = s.x + t_18, f_7 = s.y + e_34, l_4 = f_7 * r + i_12, c_4 = g[l_4]; + 0 == c_4 || 0 == o[a - 1].dispose && h[l_4] == c_4 && (null == d || 0 != d[4 * l_4 + 3]) || (i_12 < p && (p = i_12), i_12 > w && (w = i_12), f_7 < m && (m = f_7), f_7 > v && (v = f_7)); + } + -1 == w && (p = m = w = v = 0), f && (1 == (1 & p) && p--, 1 == (1 & m) && m--), s = { + x: p, + y: m, + width: w - p + 1, + height: v - m + 1 + }; + var b = o[a]; + b.rect = s, b.blend = 1, b.img = new Uint8Array(s.width * s.height * 4), 0 == o[a - 1].dispose ? (e(u, r, i, b.img, s.width, s.height, -s.x, -s.y, 0), _prepareDiff(A, r, i, b.img, s)) : e(A, r, i, b.img, s.width, s.height, -s.x, -s.y, 0); + } + + function _prepareDiff(t, r, i, o, a) { + e(t, r, i, o, a.width, a.height, -a.x, -a.y, 2); + } + + function _filterZero(e, t, r, i, o, a, s) { + var f = []; + var l, c = [0, 1, 2, 3, 4]; + -1 != a ? c = [a] : (t * i > 5e5 || 1 == r) && (c = [0]), s && (l = {level: 0}); + var u = UZIP; + for (var h = 0; h < c.length; h++) { + for (var a_11 = 0; a_11 < t; a_11++) + _filterLine(o, e, a_11, i, r, c[h]); + f.push(u.deflate(o, l)); + } + var d, A = 1e9; + for (h = 0; h < f.length; h++) + f[h].length < A && (d = h, A = f[h].length); + return f[d]; + } + + function _filterLine(e, t, i, o, a, s) { + var f = i * o; + var l = f + i; + if (e[l] = s, l++, 0 == s) + if (o < 500) + for (var c = 0; c < o; c++) + e[l + c] = t[f + c]; + else + e.set(new Uint8Array(t.buffer, f, o), l); + else if (1 == s) { + for (c = 0; c < a; c++) + e[l + c] = t[f + c]; + for (c = a; c < o; c++) + e[l + c] = t[f + c] - t[f + c - a] + 256 & 255; + } else if (0 == i) { + for (c = 0; c < a; c++) + e[l + c] = t[f + c]; + if (2 == s) + for (c = a; c < o; c++) + e[l + c] = t[f + c]; + if (3 == s) + for (c = a; c < o; c++) + e[l + c] = t[f + c] - (t[f + c - a] >> 1) + 256 & 255; + if (4 == s) + for (c = a; c < o; c++) + e[l + c] = t[f + c] - r(t[f + c - a], 0, 0) + 256 & 255; + } else { + if (2 == s) + for (c = 0; c < o; c++) + e[l + c] = t[f + c] + 256 - t[f + c - o] & 255; + if (3 == s) { + for (c = 0; c < a; c++) + e[l + c] = t[f + c] + 256 - (t[f + c - o] >> 1) & 255; + for (c = a; c < o; c++) + e[l + c] = t[f + c] + 256 - (t[f + c - o] + t[f + c - a] >> 1) & 255; + } + if (4 == s) { + for (c = 0; c < a; c++) + e[l + c] = t[f + c] + 256 - r(0, t[f + c - o], 0) & 255; + for (c = a; c < o; c++) + e[l + c] = t[f + c] + 256 - r(t[f + c - a], t[f + c - o], t[f + c - a - o]) & 255; + } + } + } + + function quantize(e, t) { + var r = new Uint8Array(e), i = r.slice(0), o = new Uint32Array(i.buffer), a = getKDtree(i, t), s = a[0], + f = a[1], l = r.length, c = new Uint8Array(l >> 2); + var u; + if (r.length < 2e7) + for (var h = 0; h < l; h += 4) { + u = getNearest(s, d = r[h] * (1 / 255), A = r[h + 1] * (1 / 255), g = r[h + 2] * (1 / 255), p = r[h + 3] * (1 / 255)), c[h >> 2] = u.ind, o[h >> 2] = u.est.rgba; + } + else + for (h = 0; h < l; h += 4) { + var d = r[h] * (1 / 255), A = r[h + 1] * (1 / 255), g = r[h + 2] * (1 / 255), + p = r[h + 3] * (1 / 255); + for (u = s; u.left;) + u = planeDst(u.est, d, A, g, p) <= 0 ? u.left : u.right; + c[h >> 2] = u.ind, o[h >> 2] = u.est.rgba; + } + return {abuf: i.buffer, inds: c, plte: f}; + } + + function getKDtree(e, t, r) { + null == r && (r = 1e-4); + var i = new Uint32Array(e.buffer), + o = {i0: 0, i1: e.length, bst: null, est: null, tdst: 0, left: null, right: null}; + o.bst = stats(e, o.i0, o.i1), o.est = estats(o.bst); + var a = [o]; + for (; a.length < t;) { + var t_19 = 0, o_15 = 0; + for (var s = 0; s < a.length; s++) + a[s].est.L > t_19 && (t_19 = a[s].est.L, o_15 = s); + if (t_19 < r) + break; + var f_8 = a[o_15], l_5 = splitPixels(e, i, f_8.i0, f_8.i1, f_8.est.e, f_8.est.eMq255); + if (f_8.i0 >= l_5 || f_8.i1 <= l_5) { + f_8.est.L = 0; + continue; + } + var c = {i0: f_8.i0, i1: l_5, bst: null, est: null, tdst: 0, left: null, right: null}; + c.bst = stats(e, c.i0, c.i1), c.est = estats(c.bst); + var u = {i0: l_5, i1: f_8.i1, bst: null, est: null, tdst: 0, left: null, right: null}; + u.bst = {R: [], m: [], N: f_8.bst.N - c.bst.N}; + for (s = 0; s < 16; s++) + u.bst.R[s] = f_8.bst.R[s] - c.bst.R[s]; + for (s = 0; s < 4; s++) + u.bst.m[s] = f_8.bst.m[s] - c.bst.m[s]; + u.est = estats(u.bst), f_8.left = c, f_8.right = u, a[o_15] = c, a.push(u); + } + a.sort((function (e, t) { + return t.bst.N - e.bst.N; + })); + for (s = 0; s < a.length; s++) + a[s].ind = s; + return [o, a]; + } + + function getNearest(e, t, r, i, o) { + if (null == e.left) + return e.tdst = function dist(e, t, r, i, o) { + var a = t - e[0], s = r - e[1], f = i - e[2], l = o - e[3]; + return a * a + s * s + f * f + l * l; + }(e.est.q, t, r, i, o), e; + var a = planeDst(e.est, t, r, i, o); + var s = e.left, f = e.right; + a > 0 && (s = e.right, f = e.left); + var l = getNearest(s, t, r, i, o); + if (l.tdst <= a * a) + return l; + var c = getNearest(f, t, r, i, o); + return c.tdst < l.tdst ? c : l; + } + + function planeDst(e, t, r, i, o) { + var a = e.e; + return a[0] * t + a[1] * r + a[2] * i + a[3] * o - e.eMq; + } + + function splitPixels(e, t, r, i, o, a) { + for (i -= 4; r < i;) { + for (; vecDot(e, r, o) <= a;) + r += 4; + for (; vecDot(e, i, o) > a;) + i -= 4; + if (r >= i) + break; + var s_10 = t[r >> 2]; + t[r >> 2] = t[i >> 2], t[i >> 2] = s_10, r += 4, i -= 4; + } + for (; vecDot(e, r, o) > a;) + r -= 4; + return r + 4; + } + + function vecDot(e, t, r) { + return e[t] * r[0] + e[t + 1] * r[1] + e[t + 2] * r[2] + e[t + 3] * r[3]; + } + + function stats(e, t, r) { + var i = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], o = [0, 0, 0, 0], a = r - t >> 2; + for (var a_12 = t; a_12 < r; a_12 += 4) { + var t_20 = e[a_12] * (1 / 255), r_19 = e[a_12 + 1] * (1 / 255), s_11 = e[a_12 + 2] * (1 / 255), + f_9 = e[a_12 + 3] * (1 / 255); + o[0] += t_20, o[1] += r_19, o[2] += s_11, o[3] += f_9, i[0] += t_20 * t_20, i[1] += t_20 * r_19, i[2] += t_20 * s_11, i[3] += t_20 * f_9, i[5] += r_19 * r_19, i[6] += r_19 * s_11, i[7] += r_19 * f_9, i[10] += s_11 * s_11, i[11] += s_11 * f_9, i[15] += f_9 * f_9; + } + return i[4] = i[1], i[8] = i[2], i[9] = i[6], i[12] = i[3], i[13] = i[7], i[14] = i[11], { + R: i, + m: o, + N: a + }; + } + + function estats(e) { + var t = e.R, r = e.m, i = e.N, a = r[0], s = r[1], f = r[2], l = r[3], c = 0 == i ? 0 : 1 / i, + u = [t[0] - a * a * c, t[1] - a * s * c, t[2] - a * f * c, t[3] - a * l * c, t[4] - s * a * c, t[5] - s * s * c, t[6] - s * f * c, t[7] - s * l * c, t[8] - f * a * c, t[9] - f * s * c, t[10] - f * f * c, t[11] - f * l * c, t[12] - l * a * c, t[13] - l * s * c, t[14] - l * f * c, t[15] - l * l * c], + h = u, d = o; + var A = [Math.random(), Math.random(), Math.random(), Math.random()], g = 0, p = 0; + if (0 != i) + for (var e_35 = 0; e_35 < 16 && (A = d.multVec(h, A), p = Math.sqrt(d.dot(A, A)), A = d.sml(1 / p, A), !(0 != e_35 && Math.abs(p - g) < 1e-9)); e_35++) + g = p; + var m = [a * c, s * c, f * c, l * c]; + return { + Cov: u, + q: m, + e: A, + L: g, + eMq255: d.dot(d.sml(255, m), A), + eMq: d.dot(A, m), + rgba: (Math.round(255 * m[3]) << 24 | Math.round(255 * m[2]) << 16 | Math.round(255 * m[1]) << 8 | Math.round(255 * m[0]) << 0) >>> 0 + }; + } + + var o = { + multVec: function (e, t) { + return [e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3], e[4] * t[0] + e[5] * t[1] + e[6] * t[2] + e[7] * t[3], e[8] * t[0] + e[9] * t[1] + e[10] * t[2] + e[11] * t[3], e[12] * t[0] + e[13] * t[1] + e[14] * t[2] + e[15] * t[3]]; + }, + dot: function (e, t) { + return e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3]; + }, + sml: function (e, t) { + return [e * t[0], e * t[1], e * t[2], e * t[3]]; + } + }; + UPNG.encode = function encode(e, t, r, i, o, a, s) { + null == i && (i = 0), null == s && (s = !1); + var f = compress(e, t, r, i, [!1, !1, !1, 0, s, !1]); + return compressPNG(f, -1), _main(f, t, r, o, a); + }, UPNG.encodeLL = function encodeLL(e, t, r, i, o, a, s, f) { + var l = {ctype: 0 + (1 == i ? 0 : 2) + (0 == o ? 0 : 4), depth: a, frames: []}, c = (i + o) * a, u = c * t; + for (var i_13 = 0; i_13 < e.length; i_13++) + l.frames.push({ + rect: {x: 0, y: 0, width: t, height: r}, + img: new Uint8Array(e[i_13]), + blend: 0, + dispose: 1, + bpp: Math.ceil(c / 8), + bpl: Math.ceil(u / 8) + }); + return compressPNG(l, 0, !0), _main(l, t, r, s, f); + }, UPNG.encode.compress = compress, UPNG.encode.dither = dither, UPNG.quantize = quantize, UPNG.quantize.getKDtree = getKDtree, UPNG.quantize.getNearest = getNearest; + }(); + var t = { + toArrayBuffer: function (e, r) { + var i = e.width, o = e.height, a = i << 2, s = e.getContext("2d").getImageData(0, 0, i, o), + f = new Uint32Array(s.data.buffer), l = (32 * i + 31) / 32 << 2, c = l * o, u = 122 + c, + h = new ArrayBuffer(u), d = new DataView(h), A = 1 << 20; + var g, p, m, w, v = A, b = 0, y = 0, E = 0; + + function set16(e) { + d.setUint16(y, e, !0), y += 2; + } + + function set32(e) { + d.setUint32(y, e, !0), y += 4; + } + + function seek(e) { + y += e; + } + + set16(19778), set32(u), seek(4), set32(122), set32(108), set32(i), set32(-o >>> 0), set16(1), set16(32), set32(3), set32(c), set32(2835), set32(2835), seek(8), set32(16711680), set32(65280), set32(255), set32(4278190080), set32(1466527264), function convert() { + for (; b < o && v > 0;) { + for (w = 122 + b * l, g = 0; g < a;) + v--, p = f[E++], m = p >>> 24, d.setUint32(w + g, p << 8 | m), g += 4; + b++; + } + E < f.length ? (v = A, setTimeout(convert, t._dly)) : r(h); + }(); + }, + toBlob: function (e, t) { + this.toArrayBuffer(e, (function (e) { + t(new window.Blob([e], {type: "image/bmp"})); + })); + }, + _dly: 9 + }; + var r = { + CHROME: "CHROME", + FIREFOX: "FIREFOX", + DESKTOP_SAFARI: "DESKTOP_SAFARI", + IE: "IE", + IOS: "IOS", + ETC: "ETC" + }, i = (_a = {}, + _a[r.CHROME] = 16384, + _a[r.FIREFOX] = 11180, + _a[r.DESKTOP_SAFARI] = 16384, + _a[r.IE] = 8192, + _a[r.IOS] = 4096, + _a[r.ETC] = 8192, + _a); + var o = "undefined" != typeof window, + a = "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope, + s = o && window.cordova && window.cordova.require && window.cordova.require("cordova/modulemapper"), + CustomFile = (o || a) && (s && s.getOriginalSymbol(window, "File") || "undefined" != typeof File && File), + CustomFileReader = (o || a) && (s && s.getOriginalSymbol(window, "FileReader") || "undefined" != typeof FileReader && FileReader); + + function getFilefromDataUrl(e, t, r) { + if (r === void 0) { + r = Date.now(); + } + return new Promise((function (i) { + var o = e.split(","), a = o[0].match(/:(.*?);/)[1], s = globalThis.atob(o[1]); + var f = s.length; + var l = new Uint8Array(f); + for (; f--;) + l[f] = s.charCodeAt(f); + var c = new window.Blob([l], {type: a}); + c.name = t, c.lastModified = r, i(c); + })); + } + + function getDataUrlFromFile(e) { + return new Promise((function (t, r) { + var i = new CustomFileReader; + i.onload = function () { + return t(i.result); + }, i.onerror = function (e) { + return r(e); + }, i.readAsDataURL(e); + })); + } + + function loadImage(e) { + return new Promise((function (t, r) { + var i = new Image; + i.onload = function () { + return t(i); + }, i.onerror = function (e) { + return r(e); + }, i.src = e; + })); + } + + function getBrowserName() { + if (void 0 !== getBrowserName.cachedResult) + return getBrowserName.cachedResult; + var e = r.ETC; + var t = navigator.userAgent; + return /Chrom(e|ium)/i.test(t) ? e = r.CHROME : /iP(ad|od|hone)/i.test(t) && /WebKit/i.test(t) ? e = r.IOS : /Safari/i.test(t) ? e = r.DESKTOP_SAFARI : /Firefox/i.test(t) ? e = r.FIREFOX : (/MSIE/i.test(t) || !0 == !!document.documentMode) && (e = r.IE), getBrowserName.cachedResult = e, getBrowserName.cachedResult; + } + + function approximateBelowMaximumCanvasSizeOfBrowser(e, t) { + var r = getBrowserName(), o = i[r]; + var a = e, s = t, f = a * s; + var l = a > s ? s / a : a / s; + for (; f > o * o;) { + var e_36 = (o + a) / 2, t_21 = (o + s) / 2; + e_36 < t_21 ? (s = t_21, a = t_21 * l) : (s = e_36 * l, a = e_36), f = a * s; + } + return {width: a, height: s}; + } + + function getNewCanvasAndCtx(e, t) { + var r, i; + try { + if (r = new OffscreenCanvas(e, t), i = r.getContext("2d"), null === i) + throw new Error("getContext of OffscreenCanvas returns null"); + } catch (e) { + r = document.createElement("canvas"), i = r.getContext("2d"); + } + return r.width = e, r.height = t, [r, i]; + } + + function drawImageInCanvas(e, t) { + var _a = approximateBelowMaximumCanvasSizeOfBrowser(e.width, e.height), r = _a.width, i = _a.height, + _b = getNewCanvasAndCtx(r, i), o = _b[0], a = _b[1]; + return t && /jpe?g/.test(t) && (a.fillStyle = "white", a.fillRect(0, 0, o.width, o.height)), a.drawImage(e, 0, 0, o.width, o.height), o; + } + + function isIOS() { + return void 0 !== isIOS.cachedResult || (isIOS.cachedResult = ["iPad Simulator", "iPhone Simulator", "iPod Simulator", "iPad", "iPhone", "iPod"].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "undefined" != typeof document && "ontouchend" in document), isIOS.cachedResult; + } + + function drawFileInCanvas(e, t) { + if (t === void 0) { + t = {}; + } + return new Promise((function (i, o) { + var a, s; + var $Try_2_Post = function () { + try { + return s = drawImageInCanvas(a, t.fileType || e.type), i([a, s]); + } catch (e) { + return o(e); + } + }, $Try_2_Catch = function (t) { + try { + 0; + var $Try_3_Catch = function (e) { + try { + throw e; + } catch (e) { + return o(e); + } + }; + try { + var t_22; + return getDataUrlFromFile(e).then((function (e) { + try { + return t_22 = e, loadImage(t_22).then((function (e) { + try { + return a = e, function () { + try { + return $Try_2_Post(); + } catch (e) { + return o(e); + } + }(); + } catch (e) { + return $Try_3_Catch(e); + } + }), $Try_3_Catch); + } catch (e) { + return $Try_3_Catch(e); + } + }), $Try_3_Catch); + } catch (e) { + $Try_3_Catch(e); + } + } catch (e) { + return o(e); + } + }; + try { + if (isIOS() || [r.DESKTOP_SAFARI, r.MOBILE_SAFARI].includes(getBrowserName())) + throw new Error("Skip createImageBitmap on IOS and Safari"); + return createImageBitmap(e).then((function (e) { + try { + return a = e, $Try_2_Post(); + } catch (e) { + return $Try_2_Catch(); + } + }), $Try_2_Catch); + } catch (e) { + $Try_2_Catch(); + } + })); + } + + function canvasToFile(e, r, i, o, a) { + if (a === void 0) { + a = 1; + } + return new Promise((function (s, f) { + var l; + if ("image/png" === r) { + var c = void 0, u = void 0, h = void 0; + return c = e.getContext("2d"), (u = c.getImageData(0, 0, e.width, e.height).data), h = UPNG.encode([u.buffer], e.width, e.height, 4096 * a), l = new window.Blob([h], {type: r}), l.name = i, l.lastModified = o, $If_4.call(this); + } + { + if ("image/bmp" === r) + return new Promise((function (r) { + return t.toBlob(e, r); + })).then(function (e) { + try { + return l = e, l.name = i, l.lastModified = o, $If_5.call(this); + } catch (e) { + return f(e); + } + }.bind(this), f); + { + if ("function" == typeof OffscreenCanvas && e instanceof OffscreenCanvas) + return e.convertToBlob({ + type: r, + quality: a + }).then(function (e) { + try { + return l = e, l.name = i, l.lastModified = o, $If_6.call(this); + } catch (e) { + return f(e); + } + }.bind(this), f); + { + var d = void 0; + return d = e.toDataURL(r, a), getFilefromDataUrl(d, i, o).then(function (e) { + try { + return l = e, $If_6.call(this); + } catch (e) { + return f(e); + } + }.bind(this), f); + } + + function $If_6() { + return $If_5.call(this); + } + } + + function $If_5() { + return $If_4.call(this); + } + } + + function $If_4() { + return s(l); + } + })); + } + + function cleanupCanvasMemory(e) { + e.width = 0, e.height = 0; + } + + function isAutoOrientationInBrowser() { + return new Promise((function (e, t) { + var r, i, o, a, s; + return void 0 !== isAutoOrientationInBrowser.cachedResult ? e(isAutoOrientationInBrowser.cachedResult) : (r = "data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==", getFilefromDataUrl("data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==", "test.jpg", Date.now()).then((function (r) { + try { + return i = r, drawFileInCanvas(i).then((function (r) { + try { + return o = r[1], canvasToFile(o, i.type, i.name, i.lastModified).then((function (r) { + try { + return a = r, cleanupCanvasMemory(o), drawFileInCanvas(a).then((function (r) { + try { + return s = r[0], isAutoOrientationInBrowser.cachedResult = 1 === s.width && 2 === s.height, e(isAutoOrientationInBrowser.cachedResult); + } catch (e) { + return t(e); + } + }), t); + } catch (e) { + return t(e); + } + }), t); + } catch (e) { + return t(e); + } + }), t); + } catch (e) { + return t(e); + } + }), t)); + })); + } + + function getExifOrientation(e) { + return new Promise((function (t, r) { + var i = new CustomFileReader; + i.onload = function (e) { + var r = new DataView(e.target.result); + if (65496 != r.getUint16(0, !1)) + return t(-2); + var i = r.byteLength; + var o = 2; + for (; o < i;) { + if (r.getUint16(o + 2, !1) <= 8) + return t(-1); + var e_37 = r.getUint16(o, !1); + if (o += 2, 65505 == e_37) { + if (1165519206 != r.getUint32(o += 2, !1)) + return t(-1); + var e_38 = 18761 == r.getUint16(o += 6, !1); + o += r.getUint32(o + 4, e_38); + var i_14 = r.getUint16(o, e_38); + o += 2; + for (var a_13 = 0; a_13 < i_14; a_13++) + if (274 == r.getUint16(o + 12 * a_13, e_38)) + return t(r.getUint16(o + 12 * a_13 + 8, e_38)); + } else { + if (65280 != (65280 & e_37)) + break; + o += r.getUint16(o, !1); + } + } + return t(-1); + }, i.onerror = function (e) { + return r(e); + }, i.readAsArrayBuffer(e); + })); + } + + function handleMaxWidthOrHeight(e, t) { + var _a; + var r = e.width, i = e.height, o = t.maxWidthOrHeight; + var a, s = e; + return isFinite(o) && (r > o || i > o) && (_a = getNewCanvasAndCtx(r, i), s = _a[0], a = _a[1], r > i ? (s.width = o, s.height = i / r * o) : (s.width = r / i * o, s.height = o), a.drawImage(e, 0, 0, s.width, s.height), cleanupCanvasMemory(e)), s; + } + + function followExifOrientation(e, t) { + var r = e.width, i = e.height, _a = getNewCanvasAndCtx(r, i), o = _a[0], a = _a[1]; + switch (t > 4 && t < 9 ? (o.width = i, o.height = r) : (o.width = r, o.height = i), t) { + case 2: + a.transform(-1, 0, 0, 1, r, 0); + break; + case 3: + a.transform(-1, 0, 0, -1, r, i); + break; + case 4: + a.transform(1, 0, 0, -1, 0, i); + break; + case 5: + a.transform(0, 1, 1, 0, 0, 0); + break; + case 6: + a.transform(0, 1, -1, 0, i, 0); + break; + case 7: + a.transform(0, -1, -1, 0, i, r); + break; + case 8: + a.transform(0, -1, 1, 0, 0, r); + } + return a.drawImage(e, 0, 0, r, i), cleanupCanvasMemory(e), o; + } + + function compress(e, t, r) { + if (r === void 0) { + r = 0; + } + return new Promise((function (i, o) { + var a, s, f, l, c, u, h, d, A, g, p, m, w, v, b, y, E, F, _, B; + + function incProgress(e) { + if (e === void 0) { + e = 5; + } + if (t.signal && t.signal.aborted) + throw t.signal.reason; + a += e, t.onProgress(Math.min(a, 100)); + } + + function setProgress(e) { + if (t.signal && t.signal.aborted) + throw t.signal.reason; + a = Math.min(Math.max(e, a), 100), t.onProgress(a); + } + + return a = r, s = t.maxIteration || 10, f = 1024 * t.maxSizeMB * 1024, incProgress(), drawFileInCanvas(e, t).then(function (r) { + try { + return l = r[1], incProgress(), c = handleMaxWidthOrHeight(l, t), incProgress(), new Promise((function (r, i) { + var o; + if (!(o = t.exifOrientation)) + return getExifOrientation(e).then(function (e) { + try { + return o = e, $If_2.call(this); + } catch (e) { + return i(e); + } + }.bind(this), i); + + function $If_2() { + return r(o); + } + + return $If_2.call(this); + })).then(function (r) { + try { + return u = r, incProgress(), isAutoOrientationInBrowser().then(function (r) { + try { + return h = r ? c : followExifOrientation(c, u), incProgress(), d = t.initialQuality || 1, A = t.fileType || e.type, canvasToFile(h, A, e.name, e.lastModified, d).then(function (r) { + try { + { + if (g = r, incProgress(), p = g.size > f, m = g.size > e.size, !p && !m) + return setProgress(100), i(g); + var a; + + function $Loop_3() { + var _a; + if (s-- && (b > f || b > w)) { + var t_23, r_20; + return t_23 = B ? .95 * _.width : _.width, r_20 = B ? .95 * _.height : _.height, _a = getNewCanvasAndCtx(t_23, r_20), E = _a[0], F = _a[1], F.drawImage(_, 0, 0, t_23, r_20), d *= "image/png" === A ? .85 : .95, canvasToFile(E, A, e.name, e.lastModified, d).then((function (e) { + try { + return y = e, cleanupCanvasMemory(_), _ = E, b = y.size, setProgress(Math.min(99, Math.floor((v - b) / (v - f) * 100))), $Loop_3; + } catch (e) { + return o(e); + } + }), o); + } + return [1]; + } + + return w = e.size, v = g.size, b = v, _ = h, B = !t.alwaysKeepResolution && p, (a = function (e) { + for (; e;) { + if (e.then) + return void e.then(a, o); + try { + if (e.pop) { + if (e.length) + return e.pop() ? $Loop_3_exit.call(this) : e; + e = $Loop_3; + } else + e = e.call(this); + } catch (e) { + return o(e); + } + } + }.bind(this))($Loop_3); + + function $Loop_3_exit() { + return cleanupCanvasMemory(_), cleanupCanvasMemory(E), cleanupCanvasMemory(c), cleanupCanvasMemory(h), cleanupCanvasMemory(l), setProgress(100), i(y); + } + } + } catch (u) { + return o(u); + } + }.bind(this), o); + } catch (e) { + return o(e); + } + }.bind(this), o); + } catch (e) { + return o(e); + } + }.bind(this), o); + } catch (e) { + return o(e); + } + }.bind(this), o); + })); + } + + var f = "\nlet scriptImported = false\nself.addEventListener('message', async (e) => {\n const { file, id, imageCompressionLibUrl, options } = e.data\n options.onProgress = (progress) => self.postMessage({ progress, id })\n try {\n if (!scriptImported) {\n // console.log('[worker] importScripts', imageCompressionLibUrl)\n self.importScripts(imageCompressionLibUrl)\n scriptImported = true\n }\n // console.log('[worker] self', self)\n const compressedFile = await imageCompression(file, options)\n self.postMessage({ file: compressedFile, id })\n } catch (e) {\n // console.error('[worker] error', e)\n self.postMessage({ error: e.message + '\\n' + e.stack, id })\n }\n})\n"; + var l; + + function compressOnWebWorker(e, t) { + return new Promise((function (r, i) { + l || (l = function createWorkerScriptURL(e) { + var t = []; + return "function" == typeof e ? t.push("(".concat(e, ")()")) : t.push(e), URL.createObjectURL(new window.Blob(t)); + }(f)); + var o = new Worker(l); + o.addEventListener("message", (function handler(e) { + if (t.signal && t.signal.aborted) + o.terminate(); + else if (void 0 === e.data.progress) { + if (e.data.error) + return i(new Error(e.data.error)), void o.terminate(); + r(e.data.file), o.terminate(); + } else + t.onProgress(e.data.progress); + })), o.addEventListener("error", i), t.signal && t.signal.addEventListener("abort", (function () { + i(t.signal.reason), o.terminate(); + })), o.postMessage({ + file: e, + imageCompressionLibUrl: t.libURL, + options: __assign(__assign({}, t), {onProgress: void 0, signal: void 0}) + }); + })); + } + + function imageCompression(e, t) { + return new Promise((function (r, i) { + var o, a, s, f, l, c; + if (o = __assign({}, t), s = 0, (f = o.onProgress), o.maxSizeMB = o.maxSizeMB || Number.POSITIVE_INFINITY, l = "boolean" != typeof o.useWebWorker || o.useWebWorker, delete o.useWebWorker, o.onProgress = function (e) { + s = e, "function" == typeof f && f(s); + }, !(e instanceof window.Blob || e instanceof CustomFile)) + return i(new Error("The file given is not an instance of Blob or File")); + if (!/^image/.test(e.type)) + return i(new Error("The file given is not an image")); + if (c = "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope, !l || "function" != typeof Worker || c) + return compress(e, o).then(function (e) { + try { + return a = e, $If_4.call(this); + } catch (e) { + return i(e); + } + }.bind(this), i); + var u = function () { + try { + return $If_4.call(this); + } catch (e) { + return i(e); + } + }.bind(this), $Try_1_Catch = function (t) { + try { + return compress(e, o).then((function (e) { + try { + return a = e, u(); + } catch (e) { + return i(e); + } + }), i); + } catch (e) { + return i(e); + } + }; + try { + return o.libURL = o.libURL || "https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js", compressOnWebWorker(e, o).then((function (e) { + try { + return a = e, u(); + } catch (e) { + return $Try_1_Catch(); + } + }), $Try_1_Catch); + } catch (e) { + $Try_1_Catch(); + } + + function $If_4() { + try { + a.name = e.name, a.lastModified = e.lastModified; + } catch (e) { + } + try { + o.preserveExif && "image/jpeg" === e.type && (!o.fileType || o.fileType && o.fileType === e.type) && (a = copyExifWithoutOrientation(e, a)); + } catch (e) { + } + return r(a); + } + })); + } + + return imageCompression.getDataUrlFromFile = getDataUrlFromFile, imageCompression.getFilefromDataUrl = getFilefromDataUrl, imageCompression.loadImage = loadImage, imageCompression.drawImageInCanvas = drawImageInCanvas, imageCompression.drawFileInCanvas = drawFileInCanvas, imageCompression.canvasToFile = canvasToFile, imageCompression.getExifOrientation = getExifOrientation, imageCompression.handleMaxWidthOrHeight = handleMaxWidthOrHeight, imageCompression.followExifOrientation = followExifOrientation, imageCompression.cleanupCanvasMemory = cleanupCanvasMemory, imageCompression.isAutoOrientationInBrowser = isAutoOrientationInBrowser, imageCompression.approximateBelowMaximumCanvasSizeOfBrowser = approximateBelowMaximumCanvasSizeOfBrowser, imageCompression.copyExifWithoutOrientation = copyExifWithoutOrientation, imageCompression.getBrowserName = getBrowserName, imageCompression.version = "2.0.2", imageCompression; + }); + /** * @fileOverview 图片操作, 负责预览图片和上传前压缩图片 */ @@ -1933,8 +4416,9 @@ 'base', 'uploader', 'lib/image', + 'lib/browser-image-compression', 'widgets/widget' - ], function( Base, Uploader, Image ) { + ], function( Base, Uploader, Image, imageCompression ) { var $ = Base.$, throttle; @@ -1987,9 +4471,6 @@ * // 是否允许裁剪。 * crop: true, * - * // 是否保留头部meta信息。 - * preserveHeaders: false, - * * // 为空的话则保留原有图片格式。 * // 否则强制转换成指定的类型。 * type: 'image/jpeg' @@ -2010,61 +4491,34 @@ // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg type: 'image/jpeg' }, - - /** - * @property {Object} [compress] - * @namespace options - * @for Uploader - * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。 - * - * 默认为: - * - * ```javascript - * { - * width: 1600, - * height: 1600, - * - * // 图片质量,只有type为`image/jpeg`的时候才有效。 - * quality: 90, - * - * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. - * allowMagnify: false, - * - * // 是否允许裁剪。 - * crop: false, - * - * // 是否保留头部meta信息。 - * preserveHeaders: true - * } - * ``` - */ compress: { - width: 1600, - height: 1600, - quality: 90, - allowMagnify: false, - crop: false, - preserveHeaders: true + // 是否开启 + enable: false, + // 压缩最大宽度或高度 + maxWidthOrHeight: 4000, + // 压缩的最大大小 + maxSize: 10*1024*1024, } }); return Uploader.register({ - 'make-thumb': 'makeThumb', - 'before-send-file': 'compressImage' - }, { + + name: 'image', /** * 生成缩略图,此过程为异步,所以需要传入`callback`。 * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。 * + * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。 + * * `callback`中可以接收到两个参数。 * * 第一个为error,如果生成缩略图有错误,此error将为真。 * * 第二个为ret, 缩略图的Data URL值。 * * **注意** * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。 - * + * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。 * * @method makeThumb * @grammar makeThumb( file, callback ) => undefined @@ -2112,16 +4566,29 @@ image.once( 'load', function() { file._info = file._info || image.info(); file._meta = file._meta || image.meta(); + + // 如果 width 的值介于 0 - 1 + // 说明设置的是百分比。 + if ( width <= 1 && width > 0 ) { + width = file._info.width * width; + } + + // 同样的规则应用于 height + if ( height <= 1 && height > 0 ) { + height = file._info.height * height; + } + image.resize( width, height ); }); + // 当 resize 完后 image.once( 'complete', function() { cb( false, image.getAsDataUrl( opts.type ) ); image.destroy(); }); - image.once( 'error', function() { - cb( true ); + image.once( 'error', function( reason ) { + cb( reason || true ); image.destroy(); }); @@ -2132,73 +4599,124 @@ }); }, - compressImage: function( file ) { - var opts = this.options.compress || this.options.resize, - compressSize = opts && opts.compressSize || 300 * 1024, - image, deferred; + beforeSendFile: function( file ) { + var opts = this.options.compress, image, me=this, deferred; + + // console.log('image.beforeSendFile',opts, file) file = this.request( 'get-file', file ); - // 只预览图片格式。 - if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) || - file.size < compressSize || - file._compressed ) { + if(file._widgetImageData){ + return; + } + + var data = { + processed: false, + success: false, + originalSize: file.size, + }; + + if ( !opts || !opts.enable || !~'image/jpeg,image/jpg,image/png'.indexOf( file.type ) ) { + file._widgetImageData = data; return; } opts = $.extend({}, opts ); deferred = Base.Deferred(); - image = new Image( opts ); + me.owner.trigger( 'fileProcessStart', 'imageCompress', file); - deferred.always(function() { - image.destroy(); - image = null; - }); - image.once( 'error', deferred.reject ); - image.once( 'load', function() { - file._info = file._info || image.info(); - file._meta = file._meta || image.meta(); - image.resize( opts.width, opts.height ); - }); - - image.once( 'complete', function() { - var blob, size; - - // 移动端 UC / qq 浏览器的无图模式下 - // ctx.getImageData 处理大图的时候会报 Exception - // INDEX_SIZE_ERR: DOM Exception 1 - try { - blob = image.getAsBlob( opts.type ); - - size = file.size; - - // 如果压缩后,比原来还大则不用压缩后的。 - if ( blob.size < size ) { - // file.source.destroy && file.source.destroy(); - file.source = blob; - file.size = blob.size; - - file.trigger( 'resize', blob.size, size ); - } - - // 标记,避免重复压缩。 - file._compressed = true; - deferred.resolve(); - } catch ( e ) { - // 出错了直接继续,让其上传原始图片 - deferred.resolve(); + imageCompression(file.source.source,{ + maxSizeMB: opts.maxSize/1024/1024, + maxWidthOrHeight: opts.maxWidthOrHeight, + }).then(function (compressedBlob) { + me.owner.trigger( 'fileProcessEnd', 'imageCompress', file); + if(opts.debug){ + console.log('webuploader.compress.output', (compressedBlob.size / file.size * 100).toFixed(2) + '%'); } + var oldSize = file.size; + file.source.source = compressedBlob; + file.source.size = compressedBlob.size; + file.size = compressedBlob.size; + file.trigger( 'resize', compressedBlob.size, oldSize ); + data.processed = true; + data.success = true; + file._widgetImageData = data; + deferred.resolve(); + }).catch(function (error) { + console.warn('webuploader.compress.error',error); + me.owner.trigger( 'fileProcessEnd', 'imageCompress', file); + data.processed = true; + file._widgetImageData = data; + deferred.resolve(); }); - file._info && image.info( file._info ); - file._meta && image.meta( file._meta ); - - image.loadFromBlob( file.source ); + // image = new Image( opts ); + // + // deferred.always(function() { + // image.destroy(); + // image = null; + // }); + // image.once( 'error', deferred.reject ); + // image.once( 'load', function() { + // var width = opts.width, + // height = opts.height; + // + // file._info = file._info || image.info(); + // file._meta = file._meta || image.meta(); + // + // // 如果 width 的值介于 0 - 1 + // // 说明设置的是百分比。 + // if ( width <= 1 && width > 0 ) { + // width = file._info.width * width; + // } + // + // // 同样的规则应用于 height + // if ( height <= 1 && height > 0 ) { + // height = file._info.height * height; + // } + // + // image.resize( width, height ); + // }); + // + // image.once( 'complete', function() { + // var blob, size; + // + // // 移动端 UC / qq 浏览器的无图模式下 + // // ctx.getImageData 处理大图的时候会报 Exception + // // INDEX_SIZE_ERR: DOM Exception 1 + // try { + // blob = image.getAsBlob( opts.type ); + // + // size = file.size; + // + // // 如果压缩后,比原来还大则不用压缩后的。 + // if ( !noCompressIfLarger || blob.size < size ) { + // // file.source.destroy && file.source.destroy(); + // file.source = blob; + // file.size = blob.size; + // + // file.trigger( 'resize', blob.size, size ); + // } + // + // // 标记,避免重复压缩。 + // file._compressed = true; + // deferred.resolve(); + // } catch ( e ) { + // // 出错了直接继续,让其上传原始图片 + // deferred.resolve(); + // } + // }); + // + // file._info && image.info( file._info ); + // file._meta && image.meta( file._meta ); + // + // image.loadFromBlob( file.source ); return deferred.promise(); } }); }); + /** * @fileOverview 文件属性封装 */ @@ -2245,9 +4763,9 @@ * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny) * @property type * @type {string} - * @default 'application' + * @default 'application/octet-stream' */ - this.type = source.type || 'application'; + this.type = source.type || 'application/octet-stream'; /** * 文件最后修改日期 @@ -2348,7 +4866,8 @@ return this.source; }, - destory: function() { + destroy: function() { + this.off(); delete statusMap[ this.id ]; } }); @@ -2407,10 +4926,12 @@ * 统计文件数。 * * `numOfQueue` 队列中的文件数。 * * `numOfSuccess` 上传成功的文件数 - * * `numOfCancel` 被移除的文件数 + * * `numOfCancel` 被取消的文件数 * * `numOfProgress` 正在上传中的文件数 * * `numOfUploadFailed` 上传错误的文件数。 * * `numOfInvalid` 无效的文件数。 + * * `numOfDeleted` 被移除的文件数。 + * * `numOfInterrupt` 被中断的文件数。 * @property {Object} stats */ this.stats = { @@ -2419,7 +4940,9 @@ numOfCancel: 0, numOfProgress: 0, numOfUploadFailed: 0, - numOfInvalid: 0 + numOfInvalid: 0, + numOfDeleted: 0, + numOfInterrupt: 0 }; // 上传队列,仅包括等待上传的文件 @@ -2531,6 +5054,25 @@ return ret; }, + /** + * 在队列中删除文件。 + * @grammar removeFile( file ) => Array + * @method removeFile + * @param {File} 文件对象。 + */ + removeFile: function( file ) { + var me = this, + existing = this._map[ file.id ]; + + if ( existing ) { + delete this._map[ file.id ]; + this._delFile(file); + file.destroy(); + this.stats.numOfDeleted++; + + } + }, + _fileAdded: function( file ) { var me = this, existing = this._map[ file.id ]; @@ -2546,6 +5088,15 @@ file.setStatus( STATUS.QUEUED ); }, + _delFile : function(file){ + for(var i = this._queue.length - 1 ; i >= 0 ; i-- ){ + if(this._queue[i] == file){ + this._queue.splice(i,1); + break; + } + } + }, + _onFileStatusChange: function( curStatus, preStatus ) { var stats = this.stats; @@ -2565,6 +5116,10 @@ case STATUS.INVALID: stats.numOfInvalid--; break; + + case STATUS.INTERRUPT: + stats.numOfInterrupt--; + break; } switch ( curStatus ) { @@ -2588,9 +5143,14 @@ stats.numOfCancel++; break; + case STATUS.INVALID: stats.numOfInvalid++; break; + + case STATUS.INTERRUPT: + stats.numOfInterrupt++; + break; } } @@ -2600,6 +5160,7 @@ return Queue; }); + /** * @fileOverview 队列 */ @@ -2618,17 +5179,7 @@ Status = WUFile.Status; return Uploader.register({ - 'sort-files': 'sortFiles', - 'add-file': 'addFiles', - 'get-file': 'getFile', - 'fetch-file': 'fetchFile', - 'get-stats': 'getStats', - 'get-files': 'getFiles', - 'remove-file': 'removeFile', - 'retry': 'retry', - 'reset': 'reset', - 'accept-file': 'acceptFile' - }, { + name: 'queue', init: function( opts ) { var me = this, @@ -2668,7 +5219,7 @@ // 创建一个 html5 运行时的 placeholder // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。 deferred = Base.Deferred(); - runtime = new RuntimeClient('Placeholder'); + this.placeholder = runtime = new RuntimeClient('Placeholder'); runtime.connectRuntime({ runtimeOrder: 'html5' }, function() { @@ -2698,7 +5249,7 @@ // 判断文件是否可以被加入队列 acceptFile: function( file ) { - var invalid = !file || file.size < 6 || this.accept && + var invalid = !file || !file.size || this.accept && // 如果名字中有后缀,才做后缀白名单处理。 rExt.exec( file.name ) && !this.accept.test( file.name ); @@ -2710,7 +5261,7 @@ /** * @event beforeFileQueued * @param {File} file File对象 - * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。 + * @description 当文件被加入队列之前触发。如果此事件handler的返回值为`false`,则此文件不会被添加进入队列。 * @for Uploader */ @@ -2752,6 +5303,14 @@ * @description 当一批文件添加进队列以后触发。 * @for Uploader */ + + /** + * @property {Boolean} [auto=false] + * @namespace options + * @for Uploader + * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。 + * + */ /** * @method addFiles @@ -2761,7 +5320,7 @@ * @description 添加文件到队列 * @for Uploader */ - addFiles: function( files ) { + addFile: function( files ) { var me = this; if ( !files.length ) { @@ -2771,11 +5330,16 @@ files = $.map( files, function( file ) { return me._addFile( file ); }); + + if ( files.length ) { - me.owner.trigger( 'filesQueued', files ); + me.owner.trigger( 'filesQueued', files ); - if ( me.options.auto ) { - me.request('start-upload'); + if ( me.options.auto ) { + setTimeout(function() { + me.request('start-upload'); + }, 20 ); + } } }, @@ -2790,12 +5354,14 @@ * @for Uploader */ - /** + /** * @method removeFile * @grammar removeFile( file ) => undefined * @grammar removeFile( id ) => undefined + * @grammar removeFile( file, true ) => undefined + * @grammar removeFile( id, true ) => undefined * @param {File|id} file File对象或这File对象的id - * @description 移除某一文件。 + * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。 * @for Uploader * @example * @@ -2803,13 +5369,16 @@ * uploader.removeFile( file ); * }) */ - removeFile: function( file ) { + removeFile: function( file, remove ) { var me = this; file = file.id ? file : me.queue.getFile( file ); - file.setStatus( Status.CANCELLED ); - me.owner.trigger( 'fileDequeued', file ); + this.request( 'cancel-file', file ); + + if ( remove ) { + this.queue.removeFile( file ); + } }, /** @@ -2874,6 +5443,12 @@ return this.queue.sort.apply( this.queue, arguments ); }, + /** + * @event reset + * @description 当 uploader 被重置的时候触发。 + * @for Uploader + */ + /** * @method reset * @grammar reset() => undefined @@ -2883,8 +5458,14 @@ * uploader.reset(); */ reset: function() { + this.owner.trigger('reset'); this.queue = new Queue(); this.stats = this.queue.stats; + }, + + destroy: function() { + this.reset(); + this.placeholder && this.placeholder.destroy(); } }); @@ -2902,23 +5483,31 @@ return Runtime.hasRuntime.apply( Runtime, arguments ); }; + /** + * @property {Object} [runtimeOrder=html5,flash] + * @namespace options + * @for Uploader + * @description 指定运行时启动顺序。默认会先尝试 html5 是否支持,如果支持则使用 html5, 否则使用 flash. + * + * 可以将此值设置成 `flash`,来强制使用 flash 运行时。 + */ + return Uploader.register({ - 'predict-runtime-type': 'predictRuntmeType' - }, { + name: 'runtime', init: function() { - if ( !this.predictRuntmeType() ) { + if ( !this.predictRuntimeType() ) { throw Error('Runtime Error'); } }, /** * 预测Uploader将采用哪个`Runtime` - * @grammar predictRuntmeType() => String - * @method predictRuntmeType + * @grammar predictRuntimeType() => String + * @method predictRuntimeType * @for Uploader */ - predictRuntmeType: function() { + predictRuntimeType: function() { var orders = this.options.runtimeOrder || Runtime.orders, type = this.type, i, len; @@ -2955,6 +5544,7 @@ opts = me.options = $.extend( true, {}, Transport.options, opts || {} ); RuntimeClient.call( this, 'Transport' ); + this._block = null; this._blob = null; this._formData = opts.formData || {}; this._headers = opts.headers || {}; @@ -2976,13 +5566,15 @@ timeout: 2 * 60 * 1000, // 2分钟 formData: {}, headers: {}, - sendAsBinary: false + sendAsBinary: false, + + customUploadResponse: null, }; $.extend( Transport.prototype, { // 添加Blob, 只能添加一次,最后一次有效。 - appendBlob: function( key, blob, filename ) { + appendBlob: function( key, blob, filename, block) { var me = this, opts = me.options; @@ -2995,6 +5587,7 @@ me.exec('init'); }); + me._block = block; me._blob = blob; opts.fileVal = key || opts.fileVal; opts.filename = filename || opts.filename; @@ -3018,8 +5611,25 @@ }, send: function( method ) { - this.exec( 'send', method ); - this._timeout(); + var me = this, + opts = me.options; + if( opts.customUpload ){ + opts.customUpload(me._block, { + onProgress: function (file, percentage) { + me.trigger('progress', percentage); + }, + onSuccess: function (file, res) { + me.customUploadResponse = res; + me.trigger('load'); + }, + onError: function (file, error) { + me.trigger('error', error, true); + } + }); + }else{ + this.exec( 'send', method ); + this._timeout(); + } }, abort: function() { @@ -3034,6 +5644,10 @@ this.disconnectRuntime(); }, + getResponseHeaders: function() { + return this.exec('getResponseHeaders'); + }, + getResponse: function() { return this.exec('getResponse'); }, @@ -3068,6 +5682,7 @@ return Transport; }); + /** * @fileOverview 负责文件上传相关。 */ @@ -3092,7 +5707,7 @@ * @namespace options * @for Uploader * @description 是否允许在文件传输时提前把下一个文件准备好。 - * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 + * 某些文件的准备工作比较耗时,比如图片压缩,md5序列化。 * 如果能提前在当前文件传输期处理,可以节省总体耗时。 */ prepareNextFile: false, @@ -3121,22 +5736,30 @@ */ chunkRetry: 2, + /** + * @property {Number} [chunkRetryDelay=1000] + * @namespace options + * @for Uploader + * @description 开启重试后,设置重试延时时间, 单位毫秒。默认1000毫秒,即1秒. + */ + chunkRetryDelay: 1000, + /** * @property {Boolean} [threads=3] * @namespace options * @for Uploader * @description 上传并发数。允许同时最大上传进程数。 */ - threads: 3, + threads: 1, /** - * @property {Object} [formData] + * @property {Object} [formData={}] * @namespace options * @for Uploader * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。 */ - formData: null + formData: {} /** * @property {Object} [fileVal='file'] @@ -3145,11 +5768,11 @@ * @description 设置文件上传域的name。 */ - /** - * @property {Object} [method='POST'] + /** + * @property {Object} [method=POST] * @namespace options * @for Uploader - * @description 文件上传方式,`POST`或者`GET`。 + * @description 文件上传方式,`POST` 或者 `GET`。 */ /** @@ -3169,7 +5792,23 @@ chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1, start = 0, index = 0, - len; + len, api; + + api = { + file: file, + + has: function() { + return !!pending.length; + }, + + shift: function() { + return pending.shift(); + }, + + unshift: function( block ) { + pending.unshift( block ); + } + }; while ( index < chunks ) { len = Math.min( chunkSize, total - start ); @@ -3180,7 +5819,8 @@ end: chunkSize ? (start + len) : total, total: total, chunks: chunks, - chunk: index++ + chunk: index++, + cuted: api }); start += len; } @@ -3188,42 +5828,43 @@ file.blocks = pending.concat(); file.remaning = pending.length; - return { - file: file, - - has: function() { - return !!pending.length; - }, - - fetch: function() { - return pending.shift(); - } - }; + return api; } Uploader.register({ - 'start-upload': 'start', - 'stop-upload': 'stop', - 'skip-file': 'skipFile', - 'is-in-progress': 'isInProgress' - }, { + name: 'upload', init: function() { - var owner = this.owner; + var owner = this.owner, + me = this; this.runing = false; + this.progress = false; + + owner + .on( 'startUpload', function() { + me.progress = true; + }) + .on( 'uploadFinished', function() { + me.progress = false; + }); // 记录当前正在传的数据,跟threads相关 this.pool = []; + // 缓存分好片的文件。 + this.stack = []; + // 缓存即将上传的文件。 this.pending = []; - // 跟踪还有多少分片没有完成上传。 + // 跟踪还有多少分片在上传中但是没有完成上传。 this.remaning = 0; this.__tick = Base.bindFn( this._tick, this ); + // 销毁上传相关的属性。 owner.on( 'uploadComplete', function( file ) { + // 把其他块取消了。 file.blocks && $.each( file.blocks, function( _, v ) { v.transport && (v.transport.abort(), v.transport.destroy()); @@ -3235,6 +5876,17 @@ }); }, + reset: function() { + this.request( 'stop-upload', true ); + this.runing = false; + this.pool = []; + this.stack = []; + this.pending = []; + this.remaning = 0; + this._trigged = false; + this._promise = null; + }, + /** * @event startUpload * @description 当开始上传流程时触发。 @@ -3243,11 +5895,14 @@ /** * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。 + * + * 可以指定开始某一个文件。 * @grammar upload() => undefined + * @grammar upload( file | fileId) => undefined * @method upload * @for Uploader */ - start: function() { + startUpload: function(file) { var me = this; // 移出invalid的文件 @@ -3255,26 +5910,71 @@ me.request( 'remove-file', this ); }); + // 如果指定了开始某个文件,则只开始指定的文件。 + if ( file ) { + file = file.id ? file : me.request( 'get-file', file ); + + if (file.getStatus() === Status.INTERRUPT) { + file.setStatus( Status.QUEUED ); + + $.each( me.pool, function( _, v ) { + + // 之前暂停过。 + if (v.file !== file) { + return; + } + + v.transport && v.transport.send(); + file.setStatus( Status.PROGRESS ); + }); + + + } else if (file.getStatus() !== Status.PROGRESS) { + file.setStatus( Status.QUEUED ); + } + } else { + $.each( me.request( 'get-files', [ Status.INITED ] ), function() { + this.setStatus( Status.QUEUED ); + }); + } + if ( me.runing ) { - return; + me.owner.trigger('startUpload', file);// 开始上传或暂停恢复的,trigger event + return Base.nextTick( me.__tick ); } me.runing = true; + var files = []; // 如果有暂停的,则续传 - $.each( me.pool, function( _, v ) { + file || $.each( me.pool, function( _, v ) { var file = v.file; if ( file.getStatus() === Status.INTERRUPT ) { - file.setStatus( Status.PROGRESS ); me._trigged = false; - v.transport && v.transport.send(); + files.push(file); + + if (v.waiting) { + return; + } + + // 文件 prepare 完后,如果暂停了,这个时候只会把文件插入 pool, 而不会创建 tranport, + v.transport ? v.transport.send() : me._doSend(v); } }); + $.each(files, function() { + this.setStatus( Status.PROGRESS ); + }); + + file || $.each( me.request( 'get-files', + Status.INTERRUPT ), function() { + this.setStatus( Status.PROGRESS ); + }); + me._trigged = false; - me.owner.trigger('startUpload'); Base.nextTick( me.__tick ); + me.owner.trigger('startUpload'); }, /** @@ -3285,20 +5985,63 @@ /** * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。 + * + * 如果第一个参数是文件,则只暂停指定文件。 * @grammar stop() => undefined * @grammar stop( true ) => undefined + * @grammar stop( file ) => undefined * @method stop * @for Uploader */ - stop: function( interrupt ) { + stopUpload: function( file, interrupt ) { var me = this; + if (file === true) { + interrupt = file; + file = null; + } + if ( me.runing === false ) { return; } + // 如果只是暂停某个文件。 + if ( file ) { + file = file.id ? file : me.request( 'get-file', file ); + + if ( file.getStatus() !== Status.PROGRESS && + file.getStatus() !== Status.QUEUED ) { + return; + } + + file.setStatus( Status.INTERRUPT ); + + + $.each( me.pool, function( _, v ) { + + // 只 abort 指定的文件,每一个分片。 + if (v.file === file) { + v.transport && v.transport.abort(); + + if (interrupt) { + me._putback(v); + me._popBlock(v); + } + } + }); + + me.owner.trigger('stopUpload', file);// 暂停,trigger event + + return Base.nextTick( me.__tick ); + } + me.runing = false; + // 正在准备中的文件。 + if (this._promise && this._promise.file) { + this._promise.file.setStatus( Status.INTERRUPT ); + } + interrupt && $.each( me.pool, function( _, v ) { v.transport && v.transport.abort(); v.file.setStatus( Status.INTERRUPT ); @@ -3308,27 +6051,58 @@ }, /** - * 判断`Uplaode`r是否正在上传中。 + * @method cancelFile + * @grammar cancelFile( file ) => undefined + * @grammar cancelFile( id ) => undefined + * @param {File|id} file File对象或这File对象的id + * @description 标记文件状态为已取消, 同时将中断文件传输。 + * @for Uploader + * @example + * + * $li.on('click', '.remove-this', function() { + * uploader.cancelFile( file ); + * }) + */ + cancelFile: function( file ) { + file = file.id ? file : this.request( 'get-file', file ); + + // 如果正在上传。 + file.blocks && $.each( file.blocks, function( _, v ) { + var _tr = v.transport; + + if ( _tr ) { + _tr.abort(); + _tr.destroy(); + delete v.transport; + } + }); + + file.setStatus( Status.CANCELLED ); + this.owner.trigger( 'fileDequeued', file ); + }, + + /** + * 判断`Uploader`是否正在上传中。 * @grammar isInProgress() => Boolean * @method isInProgress * @for Uploader */ isInProgress: function() { - return !!this.runing; + return !!this.progress; }, - getStats: function() { + _getStats: function() { return this.request('get-stats'); }, /** - * 掉过一个文件上传,直接标记指定文件为已上传状态。 + * 跳过一个文件上传,直接标记指定文件为已上传状态。 * @grammar skipFile( file ) => undefined * @method skipFile * @for Uploader */ skipFile: function( file, status ) { - file = this.request( 'get-file', file ); + file = file.id ? file : this.request( 'get-file', file ); file.setStatus( status || Status.COMPLETE ); file.skipped = true; @@ -3377,7 +6151,8 @@ me._promise = isPromise( val ) ? val.always( fn ) : fn( val ); // 没有要上传的了,且没有正在传输的了。 - } else if ( !me.remaning && !me.getStats().numOfQueue ) { + } else if ( !me.remaning && !me._getStats().numOfQueue && + !me._getStats().numOfInterrupt ) { me.runing = false; me._trigged || Base.nextTick(function() { @@ -3387,28 +6162,60 @@ } }, + _putback: function(block) { + var idx; + + block.cuted.unshift(block); + idx = this.stack.indexOf(block.cuted); + + if (!~idx) { + // 如果不在里面,说明移除过,需要把计数还原回去。 + this.remaning++; + block.file.remaning++; + this.stack.unshift(block.cuted); + } + }, + + _getStack: function() { + var i = 0, + act; + + while ( (act = this.stack[ i++ ]) ) { + if ( act.has() && act.file.getStatus() === Status.PROGRESS ) { + return act; + } else if (!act.has() || + act.file.getStatus() !== Status.PROGRESS && + act.file.getStatus() !== Status.INTERRUPT ) { + + // 把已经处理完了的,或者,状态为非 progress(上传中)、 + // interupt(暂停中) 的移除。 + this.stack.splice( --i, 1 ); + } + } + + return null; + }, + _nextBlock: function() { var me = this, - act = me._act, opts = me.options, - next, done; + act, next, done, preparing; // 如果当前文件还有没有需要传输的,则直接返回剩下的。 - if ( act && act.has() && - act.file.getStatus() === Status.PROGRESS ) { + if ( (act = this._getStack()) ) { // 是否提前准备下一个文件 if ( opts.prepareNextFile && !me.pending.length ) { me._prepareNextFile(); } - return act.fetch(); + return act.shift(); // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。 } else if ( me.runing ) { // 如果缓存中有,则直接在缓存中取,没有则去queue中取。 - if ( !me.pending.length && me.getStats().numOfQueue ) { + if ( !me.pending.length && me._getStats().numOfQueue ) { me._prepareNextFile(); } @@ -3418,15 +6225,24 @@ return null; } - act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 ); - me._act = act; - return act.fetch(); + if (opts.customUpload) { + act = CuteFile(file, 0); + } else { + act = CuteFile(file, opts.chunked ? opts.chunkSize : 0); + } + me.stack.push(act); + return act.shift(); }; // 文件可能还在prepare中,也有可能已经完全准备好了。 - return isPromise( next ) ? - next[ next.pipe ? 'pipe' : 'then']( done ) : - done( next ); + if ( isPromise( next) ) { + preparing = next.file; + next = next[ next.pipe ? 'pipe' : 'then' ]( done ); + next.file = preparing; + return next; + } + + return done( next ); } }, @@ -3447,15 +6263,19 @@ promise = me.request( 'before-send-file', file, function() { // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued. - if ( file.getStatus() === Status.QUEUED ) { - me.owner.trigger( 'uploadStart', file ); - file.setStatus( Status.PROGRESS ); + if ( file.getStatus() === Status.PROGRESS || + file.getStatus() === Status.INTERRUPT ) { return file; } return me._finishFile( file ); }); + me.owner.trigger( 'uploadStart', file ); + file.setStatus( Status.PROGRESS ); + + promise.file = file; + // 如果还在pending中,则替换成文件本身。 promise.done(function() { var idx = $.inArray( promise, pending ); @@ -3489,6 +6309,19 @@ file = block.file, promise; + // 有可能在 before-send-file 的 promise 期间改变了文件状态。 + // 如:暂停,取消 + // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。 + if ( file.getStatus() !== Status.PROGRESS ) { + + // 如果是中断,则还需要放回去。 + if (file.getStatus() === Status.INTERRUPT) { + me._putback(block); + } + + return; + } + me.pool.push( block ); me.remaning++; @@ -3498,19 +6331,23 @@ file.source.slice( block.start, block.end ); // hook, 每个分片发送之前可能要做些异步的事情。 - promise = me.request( 'before-send', block, function() { + block.waiting = promise = me.request( 'before-send', block, function() { + delete block.waiting; // 有可能文件已经上传出错了,所以不需要再传输了。 if ( file.getStatus() === Status.PROGRESS ) { me._doSend( block ); - } else { - me._popBlock( block ); - Base.nextTick( me.__tick ); + } else if (block.file.getStatus() !== Status.INTERRUPT) { + me._popBlock(block); } + + Base.nextTick(me.__tick); }); // 如果为fail了,则跳过此分片。 promise.fail(function() { + delete block.waiting; + if ( file.remaning === 1 ) { me._finishFile( file ).always(function() { block.percentage = 1; @@ -3520,6 +6357,7 @@ }); } else { block.percentage = 1; + me.updateFileProgress( file ); me._popBlock( block ); Base.nextTick( me.__tick ); } @@ -3531,6 +6369,7 @@ * @event uploadBeforeSend * @param {Object} object * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。 + * @param {Object} headers 可以扩展此对象来控制上传头部。 * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 * @for Uploader */ @@ -3579,7 +6418,7 @@ _doSend: function( block ) { var me = this, owner = me.owner, - opts = me.options, + opts = $.extend({}, me.options, block.options), file = block.file, tr = new Transport( opts ), data = $.extend({}, opts.formData ), @@ -3596,33 +6435,22 @@ // 广播上传进度。以文件为单位。 tr.on( 'progress', function( percentage ) { - var totalPercent = 0, - uploaded = 0; - - // 可能没有abort掉,progress还是执行进来了。 - // if ( !file.blocks ) { - // return; - // } - - totalPercent = block.percentage = percentage; - - if ( block.chunks > 1 ) { // 计算文件的整体速度。 - $.each( file.blocks, function( _, v ) { - uploaded += (v.percentage || 0) * (v.end - v.start); - }); - - totalPercent = uploaded / file.size; - } - - owner.trigger( 'uploadProgress', file, totalPercent || 0 ); + block.percentage = percentage; + me.updateFileProgress( file ); }); // 用来询问,是否返回的结果是有错误的。 requestAccept = function( reject ) { var fn; - ret = tr.getResponseAsJson() || {}; - ret._raw = tr.getResponse(); + if( opts.customUpload ){ + ret = tr.customUploadResponse; + }else{ + ret = tr.getResponseAsJson() || {}; + ret._raw = tr.getResponse(); + ret._headers = tr.getResponseHeaders(); + } + block.response = ret; fn = function( value ) { reject = value; }; @@ -3637,14 +6465,24 @@ // 尝试重试,然后广播文件上传出错。 tr.on( 'error', function( type, flag ) { + // 在 runtime/html5/transport.js 上为 type 加上了状态码,形式:type|status|text(如:http|403|Forbidden) + // 这里把状态码解释出来,并还原后面代码所依赖的 type 变量 + var typeArr = type.split( '|' ), status, statusText; + type = typeArr[0]; + status = parseFloat( typeArr[1] ), + statusText = typeArr[2]; + block.retried = block.retried || 0; // 自动重试 - if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) && + if ( block.chunks > 1 && ~'http,abort,server'.indexOf( type.replace( /-.*/, '' ) ) && block.retried < opts.chunkRetry ) { block.retried++; - tr.send(); + + me.retryTimer = setTimeout(function() { + tr.send(); + }, opts.chunkRetryDelay || 1000); } else { @@ -3654,7 +6492,7 @@ } file.setStatus( Status.ERROR, type ); - owner.trigger( 'uploadError', file, type ); + owner.trigger( 'uploadError', file, type, status, statusText ); owner.trigger( 'uploadComplete', file ); } }); @@ -3696,7 +6534,7 @@ owner.trigger( 'uploadBeforeSend', block, data, headers ); // 开始发送。 - tr.appendBlob( opts.fileVal, block.blob, file.name ); + tr.appendBlob( opts.fileVal, block.blob, file.name, block); tr.append( data ); tr.setRequestHeader( headers ); tr.send(); @@ -3723,10 +6561,31 @@ .always(function() { owner.trigger( 'uploadComplete', file ); }); + }, + + updateFileProgress: function(file) { + var totalPercent = 0, + uploaded = 0; + + if (!file.blocks) { + return; + } + + $.each( file.blocks, function( _, v ) { + uploaded += (v.percentage || 0) * (v.end - v.start); + }); + + totalPercent = uploaded / file.size; + this.owner.trigger( 'uploadProgress', file, totalPercent || 0 ); + }, + + destroy: function() { + clearTimeout(this.retryTimer); } }); }); + /** * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。 */ @@ -3749,6 +6608,7 @@ * * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。 * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。 + * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。 * @for Uploader */ @@ -3768,10 +6628,14 @@ // 在Uploader初始化的时候启动Validators的初始化 Uploader.register({ + name: 'validator', + init: function() { var me = this; - $.each( validators, function() { - this.call( me.owner ); + Base.nextTick(function() { + $.each( validators, function() { + this.call( me.owner ); + }); }); } }); @@ -3786,7 +6650,7 @@ var uploader = this, opts = uploader.options, count = 0, - max = opts.fileNumLimit >> 0, + max = parseInt( opts.fileNumLimit, 10 ), flag = true; if ( !max ) { @@ -3794,7 +6658,10 @@ } uploader.on( 'beforeFileQueued', function( file ) { - + // 增加beforeFileQueuedCheckfileNumLimit验证,主要为了再次加载时(已存在历史文件)验证数量是否超过设置项 + if (!this.trigger('beforeFileQueuedCheckfileNumLimit', file,count)) { + return false; + } if ( count >= max && flag ) { flag = false; this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file ); @@ -3814,7 +6681,7 @@ count--; }); - uploader.on( 'uploadFinished', function() { + uploader.on( 'reset', function() { count = 0; }); }); @@ -3830,7 +6697,7 @@ var uploader = this, opts = uploader.options, count = 0, - max = opts.fileSizeLimit >> 0, + max = parseInt( opts.fileSizeLimit, 10 ), flag = true; if ( !max ) { @@ -3859,7 +6726,7 @@ count -= file.size; }); - uploader.on( 'uploadFinished', function() { + uploader.on( 'reset', function() { count = 0; }); }); @@ -3883,7 +6750,7 @@ if ( file.size > max ) { file.setStatus( WUFile.Status.INVALID, 'exceed_size' ); - this.trigger( 'error', 'F_EXCEED_SIZE', file ); + this.trigger( 'error', 'F_EXCEED_SIZE', max, file ); return false; } @@ -3892,7 +6759,7 @@ }); /** - * @property {int} [duplicate=undefined] + * @property {Boolean} [duplicate=undefined] * @namespace options * @for Uploader * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key. @@ -3942,11 +6809,125 @@ hash && (delete mapping[ hash ]); }); + + uploader.on( 'reset', function() { + mapping = {}; + }); }); return api; }); + /** + * @fileOverview Md5 + */ + define('lib/md5',[ + 'runtime/client', + 'mediator' + ], function( RuntimeClient, Mediator ) { + + function Md5() { + RuntimeClient.call( this, 'Md5' ); + } + + // 让 Md5 具备事件功能。 + Mediator.installTo( Md5.prototype ); + + Md5.prototype.loadFromBlob = function( blob ) { + var me = this; + + if ( me.getRuid() ) { + me.disconnectRuntime(); + } + + // 连接到blob归属的同一个runtime. + me.connectRuntime( blob.ruid, function() { + me.exec('init'); + me.exec( 'loadFromBlob', blob ); + }); + }; + + Md5.prototype.getResult = function() { + return this.exec('getResult'); + }; + + return Md5; + }); + /** + * @fileOverview 图片操作, 负责预览图片和上传前压缩图片 + */ + define('widgets/md5',[ + 'base', + 'uploader', + 'lib/md5', + 'lib/blob', + 'widgets/widget' + ], function( Base, Uploader, Md5, Blob ) { + + return Uploader.register({ + name: 'md5', + + + /** + * 计算文件 md5 值,返回一个 promise 对象,可以监听 progress 进度。 + * + * + * @method md5File + * @grammar md5File( file[, start[, end]] ) => promise + * @for Uploader + * @example + * + * uploader.on( 'fileQueued', function( file ) { + * var $li = ...; + * + * uploader.md5File( file ) + * + * // 及时显示进度 + * .progress(function(percentage) { + * console.log('Percentage:', percentage); + * }) + * + * // 完成 + * .then(function(val) { + * console.log('md5 result:', val); + * }); + * + * }); + */ + md5File: function( file, start, end ) { + var md5 = new Md5(), + deferred = Base.Deferred(), + blob = (file instanceof Blob) ? file : + this.request( 'get-file', file ).source; + + md5.on( 'progress load', function( e ) { + e = e || {}; + deferred.notify( e.total ? e.loaded / e.total : 1 ); + }); + + md5.on( 'complete', function() { + deferred.resolve( md5.getResult() ); + }); + + md5.on( 'error', function( reason ) { + deferred.reject( reason ); + }); + + if ( arguments.length > 1 ) { + start = start || 0; + end = end || 0; + start < 0 && (start = blob.size + start); + end < 0 && (end = blob.size + end); + end = Math.min( end, blob.size ); + blob = blob.slice( start, end ); + } + + md5.loadFromBlob( blob ); + + return deferred.promise(); + } + }); + }); /** * @fileOverview Runtime管理器,负责Runtime的选择, 连接 */ @@ -3987,7 +6968,7 @@ function Html5Runtime() { var pool = {}, me = this, - destory = this.destory; + destroy = this.destroy; Runtime.apply( me, arguments ); me.type = type; @@ -4010,9 +6991,9 @@ } }; - me.destory = function() { + me.destroy = function() { // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); + return destroy && destroy.apply( this, arguments ); }; } @@ -4117,7 +7098,6 @@ 'removeClass' ]( prefix + 'denied' ); } - e.dataTransfer.dropEffect = denied ? 'none' : 'copy'; return false; @@ -4153,33 +7133,46 @@ _dropHandler: function( e ) { var me = this, ruid = me.getRuid(), - parentElem = me.elem.parent().get( 0 ); + parentElem = me.elem.parent().get( 0 ), + dataTransfer, data; // 只处理框内的。 if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) { return false; } - me._getTansferFiles( e, function( results ) { + e = e.originalEvent || e; + dataTransfer = e.dataTransfer; + + // 如果是页面内拖拽,还不能处理,不阻止事件。 + // 此处 ie11 下会报参数错误, + try { + data = dataTransfer.getData('text/html'); + } catch( err ) { + } + + me.dndOver = false; + me.elem.removeClass( prefix + 'over' ); + + if ( !dataTransfer || data ) { + return; + } + + me._getTansferFiles( dataTransfer, function( results ) { me.trigger( 'drop', $.map( results, function( file ) { return new File( ruid, file ); }) ); }); - me.dndOver = false; - me.elem.removeClass( prefix + 'over' ); return false; }, // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。 - _getTansferFiles: function( e, callback ) { + _getTansferFiles: function( dataTransfer, callback ) { var results = [], promises = [], - items, files, dataTransfer, file, item, i, len, canAccessFolder; + items, files, file, item, i, len, canAccessFolder; - e = e.originalEvent || e; - - dataTransfer = e.dataTransfer; items = dataTransfer.items; files = dataTransfer.files; @@ -4242,8 +7235,13 @@ destroy: function() { var elem = this.elem; + // 还没 init 就调用 destroy + if (!elem) { + return; + } + elem.off( 'dragenter', this.dragEnterHandler ); - elem.off( 'dragover', this.dragEnterHandler ); + elem.off( 'dragover', this.dragOverHandler ); elem.off( 'dragleave', this.dragLeaveHandler ); elem.off( 'drop', this.dropHandler ); @@ -4338,19 +7336,22 @@ me = this, owner = me.owner, opts = me.options, - lable = $( document.createElement('label') ), - input = $( document.createElement('input') ), - arr, i, len, mouseHandler; + label = this.label = $( document.createElement('label') ), + input = this.input = $( document.createElement('input') ), + arr, i, len, mouseHandler, changeHandler; input.attr( 'type', 'file' ); + // input.attr( 'capture', 'camera'); input.attr( 'name', opts.name ); input.addClass('webuploader-element-invisible'); - lable.on( 'click', function() { + label.on( 'click', function(e) { input.trigger('click'); + e.stopPropagation(); + owner.trigger('dialogopen'); }); - lable.css({ + label.css({ opacity: 0, width: '100%', height: '100%', @@ -4375,30 +7376,37 @@ } container.append( input ); - container.append( lable ); + container.append( label ); mouseHandler = function( e ) { owner.trigger( e.type ); }; - input.on( 'change', function( e ) { - var fn = arguments.callee, - clone; + changeHandler = function( e ) { + var clone; + // 解决chrome 56 第二次打开文件选择器,然后点击取消,依然会触发change事件的问题 + if (e.target.files.length === 0){ + return false; + } + + // 第一次上传图片后,第二次再点击弹出文件选择器窗,等待 me.files = e.target.files; + // reset input clone = this.cloneNode( true ); + clone.value = null; this.parentNode.replaceChild( clone, this ); input.off(); - input = $( clone ).on( 'change', fn ) + input = $( clone ).on( 'change', changeHandler ) .on( 'mouseenter mouseleave', mouseHandler ); owner.trigger('change'); - }); - - lable.on( 'mouseenter mouseleave', mouseHandler ); + } + input.on( 'change', changeHandler); + label.on( 'mouseenter mouseleave', mouseHandler ); }, @@ -4408,10 +7416,12 @@ }, destroy: function() { - // todo + this.input.off(); + this.label.off(); } }); }); + /** * Terms: * @@ -5789,6 +8799,8 @@ height: this.height }; + //debugger; + // 读取meta信息。 if ( !me._metas && 'image/jpeg' === me.type ) { Util.parseMeta( me._blob, function( error, ret ) { @@ -5826,7 +8838,45 @@ this._resize( this._img, canvas, width, height ); this._blob = null; // 没用了,可以删掉了。 this.modified = true; - this.owner.trigger('complete'); + this.owner.trigger( 'complete', 'resize' ); + }, + + crop: function( x, y, w, h, s ) { + var cvs = this._canvas || + (this._canvas = document.createElement('canvas')), + opts = this.options, + img = this._img, + iw = img.naturalWidth, + ih = img.naturalHeight, + orientation = this.getOrientation(); + + s = s || 1; + + // todo 解决 orientation 的问题。 + // values that require 90 degree rotation + // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) { + + // switch ( orientation ) { + // case 6: + // tmp = x; + // x = y; + // y = iw * s - tmp - w; + // console.log(ih * s, tmp, w) + // break; + // } + + // (w ^= h, h ^= w, w ^= h); + // } + + cvs.width = w; + cvs.height = h; + + opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation ); + this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s ); + + this._blob = null; // 没用了,可以删掉了。 + this.modified = true; + this.owner.trigger( 'complete', 'crop' ); }, getAsBlob: function( type ) { @@ -5842,8 +8892,7 @@ if ( type === 'image/jpeg' ) { - blob = Util.canvasToDataUrl( canvas, 'image/jpeg', - opts.quality ); + blob = Util.canvasToDataUrl( canvas, type, opts.quality ); if ( opts.preserveHeaders && this._metas && this._metas.imageHead ) { @@ -5897,12 +8946,12 @@ // setter if ( val ) { - this._meta = val; + this._metas = val; return this; } // getter - return this._meta; + return this._metas; }, destroy: function() { @@ -6022,8 +9071,11 @@ // 如果不是ios, 不需要这么复杂! if ( !Base.os.ios ) { - return function( canvas, img, x, y, w, h ) { - canvas.getContext('2d').drawImage( img, x, y, w, h ); + return function( canvas ) { + var args = Base.slice( arguments, 1 ), + ctx = canvas.getContext('2d'); + + ctx.drawImage.apply( ctx, args ); }; } @@ -6074,8 +9126,8 @@ vertSquashRatio = detectVerticalSquash( img, iw, ih ); return canvas.getContext('2d').drawImage( img, 0, 0, - iw * vertSquashRatio, ih * vertSquashRatio, - x, y, w, h ); + iw * vertSquashRatio, ih * vertSquashRatio, + x, y, w, h ); }; } @@ -6154,6 +9206,7 @@ })() }); }); + /** * @fileOverview Transport * @todo 支持chunked传输,优势: @@ -6183,8 +9236,8 @@ formData, binary, fr; if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); + server += opts.attachInfoToQuery !== false ? ((/\?/.test( server ) ? '&' : '?') + + $.param( owner._formData )) : ''; binary = blob.getSource(); } else { @@ -6207,7 +9260,9 @@ this._setRequestHeader( xhr, opts.headers ); if ( binary ) { - xhr.overrideMimeType('application/octet-stream'); + // 强制设置成 content-type 为文件流。 + xhr.overrideMimeType && + xhr.overrideMimeType('application/octet-stream'); // android直接发送blob会导致服务端接收到的是空文件。 // bug详情。 @@ -6238,6 +9293,10 @@ return this._parseJson( this._response ); }, + getResponseHeaders: function() { + return this._headers; + }, + getStatus: function() { return this._status; }, @@ -6258,6 +9317,16 @@ this.abort(); }, + _parseHeader: function(raw) { + var ret = {}; + + raw && raw.replace(/^([^\:]+):(.*)$/mg, function(_, key, value) { + ret[key.trim()] = value.trim(); + }); + + return ret; + }, + _initAjax: function() { var me = this, xhr = new XMLHttpRequest(), @@ -6289,16 +9358,23 @@ me._xhr = null; me._status = xhr.status; + var separator = '|', // 分隔符 + // 拼接的状态,在 widgets/upload.js 会有代码用到这个分隔符 + status = separator + xhr.status + + separator + xhr.statusText; + if ( xhr.status >= 200 && xhr.status < 300 ) { me._response = xhr.responseText; + me._headers = me._parseHeader(xhr.getAllResponseHeaders()); return me.trigger('load'); } else if ( xhr.status >= 500 && xhr.status < 600 ) { me._response = xhr.responseText; - return me.trigger( 'error', 'server' ); + me._headers = me._parseHeader(xhr.getAllResponseHeaders()); + return me.trigger( 'error', 'server' + status ); } - return me.trigger( 'error', me._status ? 'http' : 'abort' ); + return me.trigger( 'error', me._status ? 'http' + status : 'abort' ); }; me._xhr = xhr; @@ -6324,369 +9400,639 @@ } }); }); - /** - * @fileOverview FlashRuntime - */ - define('runtime/flash/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - var $ = Base.$, - type = 'flash', - components = {}; - - - function getFlashVersion() { - var version; - - try { - version = navigator.plugins[ 'Shockwave Flash' ]; - version = version.description; - } catch ( ex ) { - try { - version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash') - .GetVariable('$version'); - } catch ( ex2 ) { - version = '0.0'; - } - } - version = version.match( /\d+/g ); - return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 ); - } - - function FlashRuntime() { - var pool = {}, - clients = {}, - destory = this.destory, - me = this, - jsreciver = Base.guid('webuploader_'); - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/ ) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - clients[ uid ] = client; - - if ( components[ comp ] ) { - if ( !pool[ uid ] ) { - pool[ uid ] = new components[ comp ]( client, me ); - } - - instance = pool[ uid ]; - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - - return me.flashExec.apply( client, arguments ); - }; - - function handler( evt, obj ) { - var type = evt.type || evt, - parts, uid; - - parts = type.split('::'); - uid = parts[ 0 ]; - type = parts[ 1 ]; - - // console.log.apply( console, arguments ); - - if ( type === 'Ready' && uid === me.uid ) { - me.trigger('ready'); - } else if ( clients[ uid ] ) { - clients[ uid ].trigger( type.toLowerCase(), evt, obj ); - } - - // Base.log( evt, obj ); - } - - // flash的接受器。 - window[ jsreciver ] = function() { - var args = arguments; - - // 为了能捕获得到。 - setTimeout(function() { - handler.apply( null, args ); - }, 1 ); - }; - - this.jsreciver = jsreciver; - - this.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - - this.flashExec = function( comp, fn ) { - var flash = me.getFlash(), - args = Base.slice( arguments, 2 ); - - return flash.exec( this.uid, comp, fn, args ); - }; - - // @todo - } - - Base.inherits( Runtime, { - constructor: FlashRuntime, - - init: function() { - var container = this.getContainer(), - opts = this.options, - html; - - // if not the minimal height, shims are not initialized - // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc) - container.css({ - position: 'absolute', - top: '-8px', - left: '-8px', - width: '9px', - height: '9px', - overflow: 'hidden' - }); - - // insert flash object - html = '' + - '' + - '' + - '' + - ''; - - container.html( html ); - }, - - getFlash: function() { - if ( this._flash ) { - return this._flash; - } - - this._flash = $( '#' + this.uid ).get( 0 ); - return this._flash; - } - - }); - - FlashRuntime.register = function( name, component ) { - component = components[ name ] = Base.inherits( CompBase, $.extend({ - - // @todo fix this later - flashExec: function() { - var owner = this.owner, - runtime = this.getRuntime(); - - return runtime.flashExec.apply( owner, arguments ); - } - }, component ) ); - - return component; - }; - - if ( getFlashVersion() >= 11.4 ) { - Runtime.addRuntime( type, FlashRuntime ); - } - - return FlashRuntime; - }); - /** - * @fileOverview FilePicker - */ - define('runtime/flash/filepicker',[ - 'base', - 'runtime/flash/runtime' - ], function( Base, FlashRuntime ) { - var $ = Base.$; - - return FlashRuntime.register( 'FilePicker', { - init: function( opts ) { - var copy = $.extend({}, opts ), - len, i; - - // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug. - len = copy.accept && copy.accept.length; - for ( i = 0; i < len; i++ ) { - if ( !copy.accept[ i ].title ) { - copy.accept[ i ].title = 'Files'; - } - } - - delete copy.button; - delete copy.container; - - this.flashExec( 'FilePicker', 'init', copy ); - }, - - destroy: function() { - // todo - } - }); - }); - /** - * @fileOverview 图片压缩 - */ - define('runtime/flash/image',[ - 'runtime/flash/runtime' - ], function( FlashRuntime ) { - - return FlashRuntime.register( 'Image', { - // init: function( options ) { - // var owner = this.owner; - - // this.flashExec( 'Image', 'init', options ); - // owner.on( 'load', function() { - // debugger; - // }); - // }, - - loadFromBlob: function( blob ) { - var owner = this.owner; - - owner.info() && this.flashExec( 'Image', 'info', owner.info() ); - owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() ); - - this.flashExec( 'Image', 'loadFromBlob', blob.uid ); - } - }); - }); /** * @fileOverview Transport flash实现 */ - define('runtime/flash/transport',[ - 'base', - 'runtime/flash/runtime', - 'runtime/client' - ], function( Base, FlashRuntime, RuntimeClient ) { - var $ = Base.$; + define('runtime/html5/md5',[ + 'runtime/html5/runtime' + ], function( FlashRuntime ) { - return FlashRuntime.register( 'Transport', { + /* + * Fastest md5 implementation around (JKM md5) + * Credits: Joseph Myers + * + * @see http://www.myersdaily.org/joseph/javascript/md5-text.html + * @see http://jsperf.com/md5-shootout/7 + */ + + /* this function is much faster, + so if possible we use it. Some IEs + are the only ones I know of that + need the idiotic second function, + generated by an if clause. */ + var add32 = function (a, b) { + return (a + b) & 0xFFFFFFFF; + }, + + cmn = function (q, a, b, x, s, t) { + a = add32(add32(a, q), add32(x, t)); + return add32((a << s) | (a >>> (32 - s)), b); + }, + + ff = function (a, b, c, d, x, s, t) { + return cmn((b & c) | ((~b) & d), a, b, x, s, t); + }, + + gg = function (a, b, c, d, x, s, t) { + return cmn((b & d) | (c & (~d)), a, b, x, s, t); + }, + + hh = function (a, b, c, d, x, s, t) { + return cmn(b ^ c ^ d, a, b, x, s, t); + }, + + ii = function (a, b, c, d, x, s, t) { + return cmn(c ^ (b | (~d)), a, b, x, s, t); + }, + + md5cycle = function (x, k) { + var a = x[0], + b = x[1], + c = x[2], + d = x[3]; + + a = ff(a, b, c, d, k[0], 7, -680876936); + d = ff(d, a, b, c, k[1], 12, -389564586); + c = ff(c, d, a, b, k[2], 17, 606105819); + b = ff(b, c, d, a, k[3], 22, -1044525330); + a = ff(a, b, c, d, k[4], 7, -176418897); + d = ff(d, a, b, c, k[5], 12, 1200080426); + c = ff(c, d, a, b, k[6], 17, -1473231341); + b = ff(b, c, d, a, k[7], 22, -45705983); + a = ff(a, b, c, d, k[8], 7, 1770035416); + d = ff(d, a, b, c, k[9], 12, -1958414417); + c = ff(c, d, a, b, k[10], 17, -42063); + b = ff(b, c, d, a, k[11], 22, -1990404162); + a = ff(a, b, c, d, k[12], 7, 1804603682); + d = ff(d, a, b, c, k[13], 12, -40341101); + c = ff(c, d, a, b, k[14], 17, -1502002290); + b = ff(b, c, d, a, k[15], 22, 1236535329); + + a = gg(a, b, c, d, k[1], 5, -165796510); + d = gg(d, a, b, c, k[6], 9, -1069501632); + c = gg(c, d, a, b, k[11], 14, 643717713); + b = gg(b, c, d, a, k[0], 20, -373897302); + a = gg(a, b, c, d, k[5], 5, -701558691); + d = gg(d, a, b, c, k[10], 9, 38016083); + c = gg(c, d, a, b, k[15], 14, -660478335); + b = gg(b, c, d, a, k[4], 20, -405537848); + a = gg(a, b, c, d, k[9], 5, 568446438); + d = gg(d, a, b, c, k[14], 9, -1019803690); + c = gg(c, d, a, b, k[3], 14, -187363961); + b = gg(b, c, d, a, k[8], 20, 1163531501); + a = gg(a, b, c, d, k[13], 5, -1444681467); + d = gg(d, a, b, c, k[2], 9, -51403784); + c = gg(c, d, a, b, k[7], 14, 1735328473); + b = gg(b, c, d, a, k[12], 20, -1926607734); + + a = hh(a, b, c, d, k[5], 4, -378558); + d = hh(d, a, b, c, k[8], 11, -2022574463); + c = hh(c, d, a, b, k[11], 16, 1839030562); + b = hh(b, c, d, a, k[14], 23, -35309556); + a = hh(a, b, c, d, k[1], 4, -1530992060); + d = hh(d, a, b, c, k[4], 11, 1272893353); + c = hh(c, d, a, b, k[7], 16, -155497632); + b = hh(b, c, d, a, k[10], 23, -1094730640); + a = hh(a, b, c, d, k[13], 4, 681279174); + d = hh(d, a, b, c, k[0], 11, -358537222); + c = hh(c, d, a, b, k[3], 16, -722521979); + b = hh(b, c, d, a, k[6], 23, 76029189); + a = hh(a, b, c, d, k[9], 4, -640364487); + d = hh(d, a, b, c, k[12], 11, -421815835); + c = hh(c, d, a, b, k[15], 16, 530742520); + b = hh(b, c, d, a, k[2], 23, -995338651); + + a = ii(a, b, c, d, k[0], 6, -198630844); + d = ii(d, a, b, c, k[7], 10, 1126891415); + c = ii(c, d, a, b, k[14], 15, -1416354905); + b = ii(b, c, d, a, k[5], 21, -57434055); + a = ii(a, b, c, d, k[12], 6, 1700485571); + d = ii(d, a, b, c, k[3], 10, -1894986606); + c = ii(c, d, a, b, k[10], 15, -1051523); + b = ii(b, c, d, a, k[1], 21, -2054922799); + a = ii(a, b, c, d, k[8], 6, 1873313359); + d = ii(d, a, b, c, k[15], 10, -30611744); + c = ii(c, d, a, b, k[6], 15, -1560198380); + b = ii(b, c, d, a, k[13], 21, 1309151649); + a = ii(a, b, c, d, k[4], 6, -145523070); + d = ii(d, a, b, c, k[11], 10, -1120210379); + c = ii(c, d, a, b, k[2], 15, 718787259); + b = ii(b, c, d, a, k[9], 21, -343485551); + + x[0] = add32(a, x[0]); + x[1] = add32(b, x[1]); + x[2] = add32(c, x[2]); + x[3] = add32(d, x[3]); + }, + + /* there needs to be support for Unicode here, + * unless we pretend that we can redefine the MD-5 + * algorithm for multi-byte characters (perhaps + * by adding every four 16-bit characters and + * shortening the sum to 32 bits). Otherwise + * I suggest performing MD-5 as if every character + * was two bytes--e.g., 0040 0025 = @%--but then + * how will an ordinary MD-5 sum be matched? + * There is no way to standardize text to something + * like UTF-8 before transformation; speed cost is + * utterly prohibitive. The JavaScript standard + * itself needs to look at this: it should start + * providing access to strings as preformed UTF-8 + * 8-bit unsigned value arrays. + */ + md5blk = function (s) { + var md5blks = [], + i; /* Andy King said do it this way. */ + + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); + } + return md5blks; + }, + + md5blk_array = function (a) { + var md5blks = [], + i; /* Andy King said do it this way. */ + + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24); + } + return md5blks; + }, + + md51 = function (s) { + var n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i, + length, + tail, + tmp, + lo, + hi; + + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk(s.substring(i - 64, i))); + } + s = s.substring(i - 64); + length = s.length; + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3); + } + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Beware that the final length might not fit in 32 bits so we take care of that + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + + md5cycle(state, tail); + return state; + }, + + md51_array = function (a) { + var n = a.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i, + length, + tail, + tmp, + lo, + hi; + + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk_array(a.subarray(i - 64, i))); + } + + // Not sure if it is a bug, however IE10 will always produce a sub array of length 1 + // containing the last element of the parent array if the sub array specified starts + // beyond the length of the parent array - weird. + // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue + a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0); + + length = a.length; + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= a[i] << ((i % 4) << 3); + } + + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Beware that the final length might not fit in 32 bits so we take care of that + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + + md5cycle(state, tail); + + return state; + }, + + hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'], + + rhex = function (n) { + var s = '', + j; + for (j = 0; j < 4; j += 1) { + s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F]; + } + return s; + }, + + hex = function (x) { + var i; + for (i = 0; i < x.length; i += 1) { + x[i] = rhex(x[i]); + } + return x.join(''); + }, + + md5 = function (s) { + return hex(md51(s)); + }, + + + + //////////////////////////////////////////////////////////////////////////// + + /** + * SparkMD5 OOP implementation. + * + * Use this class to perform an incremental md5, otherwise use the + * static methods instead. + */ + SparkMD5 = function () { + // call reset to init the instance + this.reset(); + }; + + + // In some cases the fast add32 function cannot be used.. + if (md5('hello') !== '5d41402abc4b2a76b9719d911017c592') { + add32 = function (x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF), + msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + }; + } + + + /** + * Appends a string. + * A conversion will be applied if an utf8 string is detected. + * + * @param {String} str The string to be appended + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.append = function (str) { + // converts the string to utf8 bytes if necessary + if (/[\u0080-\uFFFF]/.test(str)) { + str = unescape(encodeURIComponent(str)); + } + + // then append as binary + this.appendBinary(str); + + return this; + }; + + /** + * Appends a binary string. + * + * @param {String} contents The binary string to be appended + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.appendBinary = function (contents) { + this._buff += contents; + this._length += contents.length; + + var length = this._buff.length, + i; + + for (i = 64; i <= length; i += 64) { + md5cycle(this._state, md5blk(this._buff.substring(i - 64, i))); + } + + this._buff = this._buff.substr(i - 64); + + return this; + }; + + /** + * Finishes the incremental computation, reseting the internal state and + * returning the result. + * Use the raw parameter to obtain the raw result instead of the hex one. + * + * @param {Boolean} raw True to get the raw result, false to get the hex result + * + * @return {String|Array} The result + */ + SparkMD5.prototype.end = function (raw) { + var buff = this._buff, + length = buff.length, + i, + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ret; + + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3); + } + + this._finish(tail, length); + ret = !!raw ? this._state : hex(this._state); + + this.reset(); + + return ret; + }; + + /** + * Finish the final calculation based on the tail. + * + * @param {Array} tail The tail (will be modified) + * @param {Number} length The length of the remaining buffer + */ + SparkMD5.prototype._finish = function (tail, length) { + var i = length, + tmp, + lo, + hi; + + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(this._state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Do the final computation based on the tail and length + // Beware that the final length may not fit in 32 bits so we take care of that + tmp = this._length * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + md5cycle(this._state, tail); + }; + + /** + * Resets the internal state of the computation. + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.reset = function () { + this._buff = ""; + this._length = 0; + this._state = [1732584193, -271733879, -1732584194, 271733878]; + + return this; + }; + + /** + * Releases memory used by the incremental buffer and other aditional + * resources. If you plan to use the instance again, use reset instead. + */ + SparkMD5.prototype.destroy = function () { + delete this._state; + delete this._buff; + delete this._length; + }; + + + /** + * Performs the md5 hash on a string. + * A conversion will be applied if utf8 string is detected. + * + * @param {String} str The string + * @param {Boolean} raw True to get the raw result, false to get the hex result + * + * @return {String|Array} The result + */ + SparkMD5.hash = function (str, raw) { + // converts the string to utf8 bytes if necessary + if (/[\u0080-\uFFFF]/.test(str)) { + str = unescape(encodeURIComponent(str)); + } + + var hash = md51(str); + + return !!raw ? hash : hex(hash); + }; + + /** + * Performs the md5 hash on a binary string. + * + * @param {String} content The binary string + * @param {Boolean} raw True to get the raw result, false to get the hex result + * + * @return {String|Array} The result + */ + SparkMD5.hashBinary = function (content, raw) { + var hash = md51(content); + + return !!raw ? hash : hex(hash); + }; + + /** + * SparkMD5 OOP implementation for array buffers. + * + * Use this class to perform an incremental md5 ONLY for array buffers. + */ + SparkMD5.ArrayBuffer = function () { + // call reset to init the instance + this.reset(); + }; + + //////////////////////////////////////////////////////////////////////////// + + /** + * Appends an array buffer. + * + * @param {ArrayBuffer} arr The array to be appended + * + * @return {SparkMD5.ArrayBuffer} The instance itself + */ + SparkMD5.ArrayBuffer.prototype.append = function (arr) { + // TODO: we could avoid the concatenation here but the algorithm would be more complex + // if you find yourself needing extra performance, please make a PR. + var buff = this._concatArrayBuffer(this._buff, arr), + length = buff.length, + i; + + this._length += arr.byteLength; + + for (i = 64; i <= length; i += 64) { + md5cycle(this._state, md5blk_array(buff.subarray(i - 64, i))); + } + + // Avoids IE10 weirdness (documented above) + this._buff = (i - 64) < length ? buff.subarray(i - 64) : new Uint8Array(0); + + return this; + }; + + /** + * Finishes the incremental computation, reseting the internal state and + * returning the result. + * Use the raw parameter to obtain the raw result instead of the hex one. + * + * @param {Boolean} raw True to get the raw result, false to get the hex result + * + * @return {String|Array} The result + */ + SparkMD5.ArrayBuffer.prototype.end = function (raw) { + var buff = this._buff, + length = buff.length, + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + i, + ret; + + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff[i] << ((i % 4) << 3); + } + + this._finish(tail, length); + ret = !!raw ? this._state : hex(this._state); + + this.reset(); + + return ret; + }; + + SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish; + + /** + * Resets the internal state of the computation. + * + * @return {SparkMD5.ArrayBuffer} The instance itself + */ + SparkMD5.ArrayBuffer.prototype.reset = function () { + this._buff = new Uint8Array(0); + this._length = 0; + this._state = [1732584193, -271733879, -1732584194, 271733878]; + + return this; + }; + + /** + * Releases memory used by the incremental buffer and other aditional + * resources. If you plan to use the instance again, use reset instead. + */ + SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy; + + /** + * Concats two array buffers, returning a new one. + * + * @param {ArrayBuffer} first The first array buffer + * @param {ArrayBuffer} second The second array buffer + * + * @return {ArrayBuffer} The new array buffer + */ + SparkMD5.ArrayBuffer.prototype._concatArrayBuffer = function (first, second) { + var firstLength = first.length, + result = new Uint8Array(firstLength + second.byteLength); + + result.set(first); + result.set(new Uint8Array(second), firstLength); + + return result; + }; + + /** + * Performs the md5 hash on an array buffer. + * + * @param {ArrayBuffer} arr The array buffer + * @param {Boolean} raw True to get the raw result, false to get the hex result + * + * @return {String|Array} The result + */ + SparkMD5.ArrayBuffer.hash = function (arr, raw) { + var hash = md51_array(new Uint8Array(arr)); + + return !!raw ? hash : hex(hash); + }; + + return FlashRuntime.register( 'Md5', { init: function() { - this._status = 0; - this._response = null; - this._responseJson = null; + // do nothing. }, - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - binary; + loadFromBlob: function( file ) { + var blob = file.getSource(), + chunkSize = 2 * 1024 * 1024, + chunks = Math.ceil( blob.size / chunkSize ), + chunk = 0, + owner = this.owner, + spark = new SparkMD5.ArrayBuffer(), + me = this, + blobSlice = blob.mozSlice || blob.webkitSlice || blob.slice, + loadNext, fr; - xhr.connectRuntime( blob.ruid ); + fr = new FileReader(); - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); + loadNext = function() { + var start, end; - binary = blob.uid; - } else { - $.each( owner._formData, function( k, v ) { - xhr.exec( 'append', k, v ); - }); + start = chunk * chunkSize; + end = Math.min( start + chunkSize, blob.size ); - xhr.exec( 'appendBlob', opts.fileVal, blob.uid, - opts.filename || owner._formData.name || '' ); - } + fr.onload = function( e ) { + spark.append( e.target.result ); + owner.trigger( 'progress', { + total: file.size, + loaded: end + }); + }; - this._setRequestHeader( xhr, opts.headers ); - xhr.exec( 'send', { - method: opts.method, - url: server - }, binary ); + fr.onloadend = function() { + fr.onloadend = fr.onload = null; + + if ( ++chunk < chunks ) { + setTimeout( loadNext, 1 ); + } else { + setTimeout(function(){ + owner.trigger('load'); + me.result = spark.end(); + loadNext = file = blob = spark = null; + owner.trigger('complete'); + }, 50 ); + } + }; + + fr.readAsArrayBuffer( blobSlice.call( blob, start, end ) ); + }; + + loadNext(); }, - getStatus: function() { - return this._status; - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._responseJson; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.exec('abort'); - xhr.destroy(); - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new RuntimeClient('XMLHttpRequest'); - - xhr.on( 'uploadprogress progress', function( e ) { - return me.trigger( 'progress', e.loaded / e.total ); - }); - - xhr.on( 'load', function() { - var status = xhr.exec('getStatus'), - err = ''; - - xhr.off(); - me._xhr = null; - - if ( status >= 200 && status < 300 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - } else if ( status >= 500 && status < 600 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - err = 'server'; - } else { - err = 'http'; - } - - xhr.destroy(); - xhr = null; - - return err ? me.trigger( 'error', err ) : me.trigger('load'); - }); - - xhr.on( 'error', function() { - xhr.off(); - me._xhr = null; - me.trigger( 'error', 'http' ); - }); - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.exec( 'setRequestHeader', key, val ); - }); + getResult: function() { + return this.result; } }); }); @@ -6705,6 +10051,7 @@ 'widgets/runtime', 'widgets/upload', 'widgets/validator', + 'widgets/md5', // runtimes // html5 @@ -6716,16 +10063,114 @@ 'runtime/html5/androidpatch', 'runtime/html5/image', 'runtime/html5/transport', + 'runtime/html5/md5', // flash - 'runtime/flash/filepicker', - 'runtime/flash/image', - 'runtime/flash/transport' + // 'runtime/flash/filepicker', + // 'runtime/flash/image', + // 'runtime/flash/transport', + // 'runtime/flash/blob', + // 'runtime/flash/md5' ], function( Base ) { return Base; }); + + /** + * @fileOverview 日志组件,主要用来收集错误信息,可以帮助 webuploader 更好的定位问题和发展。 + * + * 如果您不想要启用此功能,请在打包的时候去掉 log 模块。 + * + * 或者可以在初始化的时候通过 options.disableWidgets 属性禁用。 + * + * 如: + * WebUploader.create({ + * ... + * + * disableWidgets: 'log', + * + * ... + * }) + */ + define('widgets/log',[ + 'base', + 'uploader', + 'widgets/widget' + ], function( Base, Uploader ) { + var $ = Base.$, + logUrl = ' http://static.tieba.baidu.com/tb/pms/img/st.gif??', + product = (location.hostname || location.host || 'protected').toLowerCase(), + + // 只针对 baidu 内部产品用户做统计功能。 + enable = product && /baidu/i.exec(product), + base; + + if (!enable) { + return; + } + + base = { + dv: 3, + master: 'webuploader', + online: /test/.exec(product) ? 0 : 1, + module: '', + product: product, + type: 0 + }; + + function send(data) { + var obj = $.extend({}, base, data), + url = logUrl.replace(/^(.*)\?/, '$1' + $.param( obj )), + image = new Image(); + + image.src = url; + } + + return Uploader.register({ + name: 'log', + + init: function() { + var owner = this.owner, + count = 0, + size = 0; + + owner + .on('error', function(code) { + send({ + type: 2, + c_error_code: code + }); + }) + .on('uploadError', function(file, reason) { + send({ + type: 2, + c_error_code: 'UPLOAD_ERROR', + c_reason: '' + reason + }); + }) + .on('uploadComplete', function(file) { + count++; + size += file.size; + }). + on('uploadFinished', function() { + send({ + c_count: count, + c_size: size + }); + count = size = 0; + }); + + send({ + c_usage: 1 + }); + } + }); + }); + /** + * @fileOverview Uploader上传类 + */ define('webuploader',[ - 'preset/all' + 'preset/all', + 'widgets/log' ], function( preset ) { return preset; }); diff --git a/public/js/ueditor/third-party/webuploader/webuploader.withoutimage.js b/public/js/ueditor/third-party/webuploader/webuploader.withoutimage.js deleted file mode 100644 index 1b921c3..0000000 --- a/public/js/ueditor/third-party/webuploader/webuploader.withoutimage.js +++ /dev/null @@ -1,4593 +0,0 @@ -/*! WebUploader 0.1.2 */ - - -/** - * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。 - * - * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。 - */ -(function( root, factory ) { - var modules = {}, - - // 内部require, 简单不完全实现。 - // https://github.com/amdjs/amdjs-api/wiki/require - _require = function( deps, callback ) { - var args, len, i; - - // 如果deps不是数组,则直接返回指定module - if ( typeof deps === 'string' ) { - return getModule( deps ); - } else { - args = []; - for( len = deps.length, i = 0; i < len; i++ ) { - args.push( getModule( deps[ i ] ) ); - } - - return callback.apply( null, args ); - } - }, - - // 内部define,暂时不支持不指定id. - _define = function( id, deps, factory ) { - if ( arguments.length === 2 ) { - factory = deps; - deps = null; - } - - _require( deps || [], function() { - setModule( id, factory, arguments ); - }); - }, - - // 设置module, 兼容CommonJs写法。 - setModule = function( id, factory, args ) { - var module = { - exports: factory - }, - returned; - - if ( typeof factory === 'function' ) { - args.length || (args = [ _require, module.exports, module ]); - returned = factory.apply( null, args ); - returned !== undefined && (module.exports = returned); - } - - modules[ id ] = module.exports; - }, - - // 根据id获取module - getModule = function( id ) { - var module = modules[ id ] || root[ id ]; - - if ( !module ) { - throw new Error( '`' + id + '` is undefined' ); - } - - return module; - }, - - // 将所有modules,将路径ids装换成对象。 - exportsTo = function( obj ) { - var key, host, parts, part, last, ucFirst; - - // make the first character upper case. - ucFirst = function( str ) { - return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 )); - }; - - for ( key in modules ) { - host = obj; - - if ( !modules.hasOwnProperty( key ) ) { - continue; - } - - parts = key.split('/'); - last = ucFirst( parts.pop() ); - - while( (part = ucFirst( parts.shift() )) ) { - host[ part ] = host[ part ] || {}; - host = host[ part ]; - } - - host[ last ] = modules[ key ]; - } - }, - - exports = factory( root, _define, _require ), - origin; - - // exports every module. - exportsTo( exports ); - - if ( typeof module === 'object' && typeof module.exports === 'object' ) { - - // For CommonJS and CommonJS-like environments where a proper window is present, - module.exports = exports; - } else if ( typeof define === 'function' && define.amd ) { - - // Allow using this built library as an AMD module - // in another project. That other project will only - // see this AMD call, not the internal modules in - // the closure below. - define([], exports ); - } else { - - // Browser globals case. Just assign the - // result to a property on the global. - origin = root.WebUploader; - root.WebUploader = exports; - root.WebUploader.noConflict = function() { - root.WebUploader = origin; - }; - } -})( this, function( window, define, require ) { - - - /** - * @fileOverview jQuery or Zepto - */ - define('dollar-third',[],function() { - return window.jQuery || window.Zepto; - }); - /** - * @fileOverview Dom 操作相关 - */ - define('dollar',[ - 'dollar-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 使用jQuery的Promise - */ - define('promise-third',[ - 'dollar' - ], function( $ ) { - return { - Deferred: $.Deferred, - when: $.when, - - isPromise: function( anything ) { - return anything && typeof anything.then === 'function'; - } - }; - }); - /** - * @fileOverview Promise/A+ - */ - define('promise',[ - 'promise-third' - ], function( _ ) { - return _; - }); - /** - * @fileOverview 基础类方法。 - */ - - /** - * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。 - * - * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id. - * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如: - * - * * module `base`:WebUploader.Base - * * module `file`: WebUploader.File - * * module `lib/dnd`: WebUploader.Lib.Dnd - * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd - * - * - * 以下文档将可能省略`WebUploader`前缀。 - * @module WebUploader - * @title WebUploader API文档 - */ - define('base',[ - 'dollar', - 'promise' - ], function( $, promise ) { - - var noop = function() {}, - call = Function.call; - - // http://jsperf.com/uncurrythis - // 反科里化 - function uncurryThis( fn ) { - return function() { - return call.apply( fn, arguments ); - }; - } - - function bindFn( fn, context ) { - return function() { - return fn.apply( context, arguments ); - }; - } - - function createObject( proto ) { - var f; - - if ( Object.create ) { - return Object.create( proto ); - } else { - f = function() {}; - f.prototype = proto; - return new f(); - } - } - - - /** - * 基础类,提供一些简单常用的方法。 - * @class Base - */ - return { - - /** - * @property {String} version 当前版本号。 - */ - version: '0.1.2', - - /** - * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。 - */ - $: $, - - Deferred: promise.Deferred, - - isPromise: promise.isPromise, - - when: promise.when, - - /** - * @description 简单的浏览器检查结果。 - * - * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。 - * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。 - * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+** - * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。 - * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。 - * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。 - * - * @property {Object} [browser] - */ - browser: (function( ua ) { - var ret = {}, - webkit = ua.match( /WebKit\/([\d.]+)/ ), - chrome = ua.match( /Chrome\/([\d.]+)/ ) || - ua.match( /CriOS\/([\d.]+)/ ), - - ie = ua.match( /MSIE\s([\d\.]+)/ ) || - ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i), - firefox = ua.match( /Firefox\/([\d.]+)/ ), - safari = ua.match( /Safari\/([\d.]+)/ ), - opera = ua.match( /OPR\/([\d.]+)/ ); - - webkit && (ret.webkit = parseFloat( webkit[ 1 ] )); - chrome && (ret.chrome = parseFloat( chrome[ 1 ] )); - ie && (ret.ie = parseFloat( ie[ 1 ] )); - firefox && (ret.firefox = parseFloat( firefox[ 1 ] )); - safari && (ret.safari = parseFloat( safari[ 1 ] )); - opera && (ret.opera = parseFloat( opera[ 1 ] )); - - return ret; - })( navigator.userAgent ), - - /** - * @description 操作系统检查结果。 - * - * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。 - * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。 - * @property {Object} [os] - */ - os: (function( ua ) { - var ret = {}, - - // osx = !!ua.match( /\(Macintosh\; Intel / ), - android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ), - ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ ); - - // osx && (ret.osx = true); - android && (ret.android = parseFloat( android[ 1 ] )); - ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) )); - - return ret; - })( navigator.userAgent ), - - /** - * 实现类与类之间的继承。 - * @method inherits - * @grammar Base.inherits( super ) => child - * @grammar Base.inherits( super, protos ) => child - * @grammar Base.inherits( super, protos, statics ) => child - * @param {Class} super 父类 - * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。 - * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。 - * @param {Object} [statics] 静态属性或方法。 - * @return {Class} 返回子类。 - * @example - * function Person() { - * console.log( 'Super' ); - * } - * Person.prototype.hello = function() { - * console.log( 'hello' ); - * }; - * - * var Manager = Base.inherits( Person, { - * world: function() { - * console.log( 'World' ); - * } - * }); - * - * // 因为没有指定构造器,父类的构造器将会执行。 - * var instance = new Manager(); // => Super - * - * // 继承子父类的方法 - * instance.hello(); // => hello - * instance.world(); // => World - * - * // 子类的__super__属性指向父类 - * console.log( Manager.__super__ === Person ); // => true - */ - inherits: function( Super, protos, staticProtos ) { - var child; - - if ( typeof protos === 'function' ) { - child = protos; - protos = null; - } else if ( protos && protos.hasOwnProperty('constructor') ) { - child = protos.constructor; - } else { - child = function() { - return Super.apply( this, arguments ); - }; - } - - // 复制静态方法 - $.extend( true, child, Super, staticProtos || {} ); - - /* jshint camelcase: false */ - - // 让子类的__super__属性指向父类。 - child.__super__ = Super.prototype; - - // 构建原型,添加原型方法或属性。 - // 暂时用Object.create实现。 - child.prototype = createObject( Super.prototype ); - protos && $.extend( true, child.prototype, protos ); - - return child; - }, - - /** - * 一个不做任何事情的方法。可以用来赋值给默认的callback. - * @method noop - */ - noop: noop, - - /** - * 返回一个新的方法,此方法将已指定的`context`来执行。 - * @grammar Base.bindFn( fn, context ) => Function - * @method bindFn - * @example - * var doSomething = function() { - * console.log( this.name ); - * }, - * obj = { - * name: 'Object Name' - * }, - * aliasFn = Base.bind( doSomething, obj ); - * - * aliasFn(); // => Object Name - * - */ - bindFn: bindFn, - - /** - * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。 - * @grammar Base.log( args... ) => undefined - * @method log - */ - log: (function() { - if ( window.console ) { - return bindFn( console.log, console ); - } - return noop; - })(), - - nextTick: (function() { - - return function( cb ) { - setTimeout( cb, 1 ); - }; - - // @bug 当浏览器不在当前窗口时就停了。 - // var next = window.requestAnimationFrame || - // window.webkitRequestAnimationFrame || - // window.mozRequestAnimationFrame || - // function( cb ) { - // window.setTimeout( cb, 1000 / 60 ); - // }; - - // // fix: Uncaught TypeError: Illegal invocation - // return bindFn( next, window ); - })(), - - /** - * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。 - * 将用来将非数组对象转化成数组对象。 - * @grammar Base.slice( target, start[, end] ) => Array - * @method slice - * @example - * function doSomthing() { - * var args = Base.slice( arguments, 1 ); - * console.log( args ); - * } - * - * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"] - */ - slice: uncurryThis( [].slice ), - - /** - * 生成唯一的ID - * @method guid - * @grammar Base.guid() => String - * @grammar Base.guid( prefx ) => String - */ - guid: (function() { - var counter = 0; - - return function( prefix ) { - var guid = (+new Date()).toString( 32 ), - i = 0; - - for ( ; i < 5; i++ ) { - guid += Math.floor( Math.random() * 65535 ).toString( 32 ); - } - - return (prefix || 'wu_') + guid + (counter++).toString( 32 ); - }; - })(), - - /** - * 格式化文件大小, 输出成带单位的字符串 - * @method formatSize - * @grammar Base.formatSize( size ) => String - * @grammar Base.formatSize( size, pointLength ) => String - * @grammar Base.formatSize( size, pointLength, units ) => String - * @param {Number} size 文件大小 - * @param {Number} [pointLength=2] 精确到的小数点数。 - * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. - * @example - * console.log( Base.formatSize( 100 ) ); // => 100B - * console.log( Base.formatSize( 1024 ) ); // => 1.00K - * console.log( Base.formatSize( 1024, 0 ) ); // => 1K - * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M - * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G - * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB - */ - formatSize: function( size, pointLength, units ) { - var unit; - - units = units || [ 'B', 'K', 'M', 'G', 'TB' ]; - - while ( (unit = units.shift()) && size > 1024 ) { - size = size / 1024; - } - - return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) + - unit; - } - }; - }); - /** - * 事件处理类,可以独立使用,也可以扩展给对象使用。 - * @fileOverview Mediator - */ - define('mediator',[ - 'base' - ], function( Base ) { - var $ = Base.$, - slice = [].slice, - separator = /\s+/, - protos; - - // 根据条件过滤出事件handlers. - function findHandlers( arr, name, callback, context ) { - return $.grep( arr, function( handler ) { - return handler && - (!name || handler.e === name) && - (!callback || handler.cb === callback || - handler.cb._cb === callback) && - (!context || handler.ctx === context); - }); - } - - function eachEvent( events, callback, iterator ) { - // 不支持对象,只支持多个event用空格隔开 - $.each( (events || '').split( separator ), function( _, key ) { - iterator( key, callback ); - }); - } - - function triggerHanders( events, args ) { - var stoped = false, - i = -1, - len = events.length, - handler; - - while ( ++i < len ) { - handler = events[ i ]; - - if ( handler.cb.apply( handler.ctx2, args ) === false ) { - stoped = true; - break; - } - } - - return !stoped; - } - - protos = { - - /** - * 绑定事件。 - * - * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如 - * ```javascript - * var obj = {}; - * - * // 使得obj有事件行为 - * Mediator.installTo( obj ); - * - * obj.on( 'testa', function( arg1, arg2 ) { - * console.log( arg1, arg2 ); // => 'arg1', 'arg2' - * }); - * - * obj.trigger( 'testa', 'arg1', 'arg2' ); - * ``` - * - * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。 - * 切会影响到`trigger`方法的返回值,为`false`。 - * - * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处, - * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。 - * ```javascript - * obj.on( 'all', function( type, arg1, arg2 ) { - * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2' - * }); - * ``` - * - * @method on - * @grammar on( name, callback[, context] ) => self - * @param {String} name 事件名,支持多个事件用空格隔开 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - * @class Mediator - */ - on: function( name, callback, context ) { - var me = this, - set; - - if ( !callback ) { - return this; - } - - set = this._events || (this._events = []); - - eachEvent( name, callback, function( name, callback ) { - var handler = { e: name }; - - handler.cb = callback; - handler.ctx = context; - handler.ctx2 = context || me; - handler.id = set.length; - - set.push( handler ); - }); - - return this; - }, - - /** - * 绑定事件,且当handler执行完后,自动解除绑定。 - * @method once - * @grammar once( name, callback[, context] ) => self - * @param {String} name 事件名 - * @param {Function} callback 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - once: function( name, callback, context ) { - var me = this; - - if ( !callback ) { - return me; - } - - eachEvent( name, callback, function( name, callback ) { - var once = function() { - me.off( name, once ); - return callback.apply( context || me, arguments ); - }; - - once._cb = callback; - me.on( name, once, context ); - }); - - return me; - }, - - /** - * 解除事件绑定 - * @method off - * @grammar off( [name[, callback[, context] ] ] ) => self - * @param {String} [name] 事件名 - * @param {Function} [callback] 事件处理器 - * @param {Object} [context] 事件处理器的上下文。 - * @return {self} 返回自身,方便链式 - * @chainable - */ - off: function( name, cb, ctx ) { - var events = this._events; - - if ( !events ) { - return this; - } - - if ( !name && !cb && !ctx ) { - this._events = []; - return this; - } - - eachEvent( name, cb, function( name, cb ) { - $.each( findHandlers( events, name, cb, ctx ), function() { - delete events[ this.id ]; - }); - }); - - return this; - }, - - /** - * 触发事件 - * @method trigger - * @grammar trigger( name[, args...] ) => self - * @param {String} type 事件名 - * @param {*} [...] 任意参数 - * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true - */ - trigger: function( type ) { - var args, events, allEvents; - - if ( !this._events || !type ) { - return this; - } - - args = slice.call( arguments, 1 ); - events = findHandlers( this._events, type ); - allEvents = findHandlers( this._events, 'all' ); - - return triggerHanders( events, args ) && - triggerHanders( allEvents, arguments ); - } - }; - - /** - * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。 - * 主要目的是负责模块与模块之间的合作,降低耦合度。 - * - * @class Mediator - */ - return $.extend({ - - /** - * 可以通过这个接口,使任何对象具备事件功能。 - * @method installTo - * @param {Object} obj 需要具备事件行为的对象。 - * @return {Object} 返回obj. - */ - installTo: function( obj ) { - return $.extend( obj, protos ); - } - - }, protos ); - }); - /** - * @fileOverview Uploader上传类 - */ - define('uploader',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$; - - /** - * 上传入口类。 - * @class Uploader - * @constructor - * @grammar new Uploader( opts ) => Uploader - * @example - * var uploader = WebUploader.Uploader({ - * swf: 'path_of_swf/Uploader.swf', - * - * // 开起分片上传。 - * chunked: true - * }); - */ - function Uploader( opts ) { - this.options = $.extend( true, {}, Uploader.options, opts ); - this._init( this.options ); - } - - // default Options - // widgets中有相应扩展 - Uploader.options = {}; - Mediator.installTo( Uploader.prototype ); - - // 批量添加纯命令式方法。 - $.each({ - upload: 'start-upload', - stop: 'stop-upload', - getFile: 'get-file', - getFiles: 'get-files', - addFile: 'add-file', - addFiles: 'add-file', - sort: 'sort-files', - removeFile: 'remove-file', - skipFile: 'skip-file', - retry: 'retry', - isInProgress: 'is-in-progress', - makeThumb: 'make-thumb', - getDimension: 'get-dimension', - addButton: 'add-btn', - getRuntimeType: 'get-runtime-type', - refresh: 'refresh', - disable: 'disable', - enable: 'enable', - reset: 'reset' - }, function( fn, command ) { - Uploader.prototype[ fn ] = function() { - return this.request( command, arguments ); - }; - }); - - $.extend( Uploader.prototype, { - state: 'pending', - - _init: function( opts ) { - var me = this; - - me.request( 'init', opts, function() { - me.state = 'ready'; - me.trigger('ready'); - }); - }, - - /** - * 获取或者设置Uploader配置项。 - * @method option - * @grammar option( key ) => * - * @grammar option( key, val ) => self - * @example - * - * // 初始状态图片上传前不会压缩 - * var uploader = new WebUploader.Uploader({ - * resize: null; - * }); - * - * // 修改后图片上传前,尝试将图片压缩到1600 * 1600 - * uploader.options( 'resize', { - * width: 1600, - * height: 1600 - * }); - */ - option: function( key, val ) { - var opts = this.options; - - // setter - if ( arguments.length > 1 ) { - - if ( $.isPlainObject( val ) && - $.isPlainObject( opts[ key ] ) ) { - $.extend( opts[ key ], val ); - } else { - opts[ key ] = val; - } - - } else { // getter - return key ? opts[ key ] : opts; - } - }, - - /** - * 获取文件统计信息。返回一个包含一下信息的对象。 - * * `successNum` 上传成功的文件数 - * * `uploadFailNum` 上传失败的文件数 - * * `cancelNum` 被删除的文件数 - * * `invalidNum` 无效的文件数 - * * `queueNum` 还在队列中的文件数 - * @method getStats - * @grammar getStats() => Object - */ - getStats: function() { - // return this._mgr.getStats.apply( this._mgr, arguments ); - var stats = this.request('get-stats'); - - return { - successNum: stats.numOfSuccess, - - // who care? - // queueFailNum: 0, - cancelNum: stats.numOfCancel, - invalidNum: stats.numOfInvalid, - uploadFailNum: stats.numOfUploadFailed, - queueNum: stats.numOfQueue - }; - }, - - // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器 - trigger: function( type/*, args...*/ ) { - var args = [].slice.call( arguments, 1 ), - opts = this.options, - name = 'on' + type.substring( 0, 1 ).toUpperCase() + - type.substring( 1 ); - - if ( - // 调用通过on方法注册的handler. - Mediator.trigger.apply( this, arguments ) === false || - - // 调用opts.onEvent - $.isFunction( opts[ name ] ) && - opts[ name ].apply( this, args ) === false || - - // 调用this.onEvent - $.isFunction( this[ name ] ) && - this[ name ].apply( this, args ) === false || - - // 广播所有uploader的事件。 - Mediator.trigger.apply( Mediator, - [ this, type ].concat( args ) ) === false ) { - - return false; - } - - return true; - }, - - // widgets/widget.js将补充此方法的详细文档。 - request: Base.noop - }); - - /** - * 创建Uploader实例,等同于new Uploader( opts ); - * @method create - * @class Base - * @static - * @grammar Base.create( opts ) => Uploader - */ - Base.create = Uploader.create = function( opts ) { - return new Uploader( opts ); - }; - - // 暴露Uploader,可以通过它来扩展业务逻辑。 - Base.Uploader = Uploader; - - return Uploader; - }); - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/runtime',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - factories = {}, - - // 获取对象的第一个key - getFirstKey = function( obj ) { - for ( var key in obj ) { - if ( obj.hasOwnProperty( key ) ) { - return key; - } - } - return null; - }; - - // 接口类。 - function Runtime( options ) { - this.options = $.extend({ - container: document.body - }, options ); - this.uid = Base.guid('rt_'); - } - - $.extend( Runtime.prototype, { - - getContainer: function() { - var opts = this.options, - parent, container; - - if ( this._container ) { - return this._container; - } - - parent = $( opts.container || document.body ); - container = $( document.createElement('div') ); - - container.attr( 'id', 'rt_' + this.uid ); - container.css({ - position: 'absolute', - top: '0px', - left: '0px', - width: '1px', - height: '1px', - overflow: 'hidden' - }); - - parent.append( container ); - parent.addClass('webuploader-container'); - this._container = container; - return container; - }, - - init: Base.noop, - exec: Base.noop, - - destroy: function() { - if ( this._container ) { - this._container.parentNode.removeChild( this.__container ); - } - - this.off(); - } - }); - - Runtime.orders = 'html5,flash'; - - - /** - * 添加Runtime实现。 - * @param {String} type 类型 - * @param {Runtime} factory 具体Runtime实现。 - */ - Runtime.addRuntime = function( type, factory ) { - factories[ type ] = factory; - }; - - Runtime.hasRuntime = function( type ) { - return !!(type ? factories[ type ] : getFirstKey( factories )); - }; - - Runtime.create = function( opts, orders ) { - var type, runtime; - - orders = orders || Runtime.orders; - $.each( orders.split( /\s*,\s*/g ), function() { - if ( factories[ this ] ) { - type = this; - return false; - } - }); - - type = type || getFirstKey( factories ); - - if ( !type ) { - throw new Error('Runtime Error'); - } - - runtime = new factories[ type ]( opts ); - return runtime; - }; - - Mediator.installTo( Runtime.prototype ); - return Runtime; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/client',[ - 'base', - 'mediator', - 'runtime/runtime' - ], function( Base, Mediator, Runtime ) { - - var cache; - - cache = (function() { - var obj = {}; - - return { - add: function( runtime ) { - obj[ runtime.uid ] = runtime; - }, - - get: function( ruid, standalone ) { - var i; - - if ( ruid ) { - return obj[ ruid ]; - } - - for ( i in obj ) { - // 有些类型不能重用,比如filepicker. - if ( standalone && obj[ i ].__standalone ) { - continue; - } - - return obj[ i ]; - } - - return null; - }, - - remove: function( runtime ) { - delete obj[ runtime.uid ]; - } - }; - })(); - - function RuntimeClient( component, standalone ) { - var deferred = Base.Deferred(), - runtime; - - this.uid = Base.guid('client_'); - - // 允许runtime没有初始化之前,注册一些方法在初始化后执行。 - this.runtimeReady = function( cb ) { - return deferred.done( cb ); - }; - - this.connectRuntime = function( opts, cb ) { - - // already connected. - if ( runtime ) { - throw new Error('already connected!'); - } - - deferred.done( cb ); - - if ( typeof opts === 'string' && cache.get( opts ) ) { - runtime = cache.get( opts ); - } - - // 像filePicker只能独立存在,不能公用。 - runtime = runtime || cache.get( null, standalone ); - - // 需要创建 - if ( !runtime ) { - runtime = Runtime.create( opts, opts.runtimeOrder ); - runtime.__promise = deferred.promise(); - runtime.once( 'ready', deferred.resolve ); - runtime.init(); - cache.add( runtime ); - runtime.__client = 1; - } else { - // 来自cache - Base.$.extend( runtime.options, opts ); - runtime.__promise.then( deferred.resolve ); - runtime.__client++; - } - - standalone && (runtime.__standalone = standalone); - return runtime; - }; - - this.getRuntime = function() { - return runtime; - }; - - this.disconnectRuntime = function() { - if ( !runtime ) { - return; - } - - runtime.__client--; - - if ( runtime.__client <= 0 ) { - cache.remove( runtime ); - delete runtime.__promise; - runtime.destroy(); - } - - runtime = null; - }; - - this.exec = function() { - if ( !runtime ) { - return; - } - - var args = Base.slice( arguments ); - component && args.unshift( component ); - - return runtime.exec.apply( this, args ); - }; - - this.getRuid = function() { - return runtime && runtime.uid; - }; - - this.destroy = (function( destroy ) { - return function() { - destroy && destroy.apply( this, arguments ); - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }; - })( this.destroy ); - } - - Mediator.installTo( RuntimeClient.prototype ); - return RuntimeClient; - }); - /** - * @fileOverview 错误信息 - */ - define('lib/dnd',[ - 'base', - 'mediator', - 'runtime/client' - ], function( Base, Mediator, RuntimeClent ) { - - var $ = Base.$; - - function DragAndDrop( opts ) { - opts = this.options = $.extend({}, DragAndDrop.options, opts ); - - opts.container = $( opts.container ); - - if ( !opts.container.length ) { - return; - } - - RuntimeClent.call( this, 'DragAndDrop' ); - } - - DragAndDrop.options = { - accept: null, - disableGlobalDnd: false - }; - - Base.inherits( RuntimeClent, { - constructor: DragAndDrop, - - init: function() { - var me = this; - - me.connectRuntime( me.options, function() { - me.exec('init'); - me.trigger('ready'); - }); - }, - - destroy: function() { - this.disconnectRuntime(); - } - }); - - Mediator.installTo( DragAndDrop.prototype ); - - return DragAndDrop; - }); - /** - * @fileOverview 组件基类。 - */ - define('widgets/widget',[ - 'base', - 'uploader' - ], function( Base, Uploader ) { - - var $ = Base.$, - _init = Uploader.prototype._init, - IGNORE = {}, - widgetClass = []; - - function isArrayLike( obj ) { - if ( !obj ) { - return false; - } - - var length = obj.length, - type = $.type( obj ); - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === 'array' || type !== 'function' && type !== 'string' && - (length === 0 || typeof length === 'number' && length > 0 && - (length - 1) in obj); - } - - function Widget( uploader ) { - this.owner = uploader; - this.options = uploader.options; - } - - $.extend( Widget.prototype, { - - init: Base.noop, - - // 类Backbone的事件监听声明,监听uploader实例上的事件 - // widget直接无法监听事件,事件只能通过uploader来传递 - invoke: function( apiName, args ) { - - /* - { - 'make-thumb': 'makeThumb' - } - */ - var map = this.responseMap; - - // 如果无API响应声明则忽略 - if ( !map || !(apiName in map) || !(map[ apiName ] in this) || - !$.isFunction( this[ map[ apiName ] ] ) ) { - - return IGNORE; - } - - return this[ map[ apiName ] ].apply( this, args ); - - }, - - /** - * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。 - * @method request - * @grammar request( command, args ) => * | Promise - * @grammar request( command, args, callback ) => Promise - * @for Uploader - */ - request: function() { - return this.owner.request.apply( this.owner, arguments ); - } - }); - - // 扩展Uploader. - $.extend( Uploader.prototype, { - - // 覆写_init用来初始化widgets - _init: function() { - var me = this, - widgets = me._widgets = []; - - $.each( widgetClass, function( _, klass ) { - widgets.push( new klass( me ) ); - }); - - return _init.apply( me, arguments ); - }, - - request: function( apiName, args, callback ) { - var i = 0, - widgets = this._widgets, - len = widgets.length, - rlts = [], - dfds = [], - widget, rlt, promise, key; - - args = isArrayLike( args ) ? args : [ args ]; - - for ( ; i < len; i++ ) { - widget = widgets[ i ]; - rlt = widget.invoke( apiName, args ); - - if ( rlt !== IGNORE ) { - - // Deferred对象 - if ( Base.isPromise( rlt ) ) { - dfds.push( rlt ); - } else { - rlts.push( rlt ); - } - } - } - - // 如果有callback,则用异步方式。 - if ( callback || dfds.length ) { - promise = Base.when.apply( Base, dfds ); - key = promise.pipe ? 'pipe' : 'then'; - - // 很重要不能删除。删除了会死循环。 - // 保证执行顺序。让callback总是在下一个tick中执行。 - return promise[ key ](function() { - var deferred = Base.Deferred(), - args = arguments; - - setTimeout(function() { - deferred.resolve.apply( deferred, args ); - }, 1 ); - - return deferred.promise(); - })[ key ]( callback || Base.noop ); - } else { - return rlts[ 0 ]; - } - } - }); - - /** - * 添加组件 - * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义 - * @param {object} responseMap API名称与函数实现的映射 - * @example - * Uploader.register( { - * init: function( options ) {}, - * makeThumb: function() {} - * }, { - * 'make-thumb': 'makeThumb' - * } ); - */ - Uploader.register = Widget.register = function( responseMap, widgetProto ) { - var map = { init: 'init' }, - klass; - - if ( arguments.length === 1 ) { - widgetProto = responseMap; - widgetProto.responseMap = map; - } else { - widgetProto.responseMap = $.extend( map, responseMap ); - } - - klass = Base.inherits( Widget, widgetProto ); - widgetClass.push( klass ); - - return klass; - }; - - return Widget; - }); - /** - * @fileOverview DragAndDrop Widget。 - */ - define('widgets/filednd',[ - 'base', - 'uploader', - 'lib/dnd', - 'widgets/widget' - ], function( Base, Uploader, Dnd ) { - var $ = Base.$; - - Uploader.options.dnd = ''; - - /** - * @property {Selector} [dnd=undefined] 指定Drag And Drop拖拽的容器,如果不指定,则不启动。 - * @namespace options - * @for Uploader - */ - - /** - * @event dndAccept - * @param {DataTransferItemList} items DataTransferItem - * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。 - * @for Uploader - */ - return Uploader.register({ - init: function( opts ) { - - if ( !opts.dnd || - this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - var me = this, - deferred = Base.Deferred(), - options = $.extend({}, { - disableGlobalDnd: opts.disableGlobalDnd, - container: opts.dnd, - accept: opts.accept - }), - dnd; - - dnd = new Dnd( options ); - - dnd.once( 'ready', deferred.resolve ); - dnd.on( 'drop', function( files ) { - me.request( 'add-file', [ files ]); - }); - - // 检测文件是否全部允许添加。 - dnd.on( 'accept', function( items ) { - return me.owner.trigger( 'dndAccept', items ); - }); - - dnd.init(); - - return deferred.promise(); - } - }); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepaste',[ - 'base', - 'mediator', - 'runtime/client' - ], function( Base, Mediator, RuntimeClent ) { - - var $ = Base.$; - - function FilePaste( opts ) { - opts = this.options = $.extend({}, opts ); - opts.container = $( opts.container || document.body ); - RuntimeClent.call( this, 'FilePaste' ); - } - - Base.inherits( RuntimeClent, { - constructor: FilePaste, - - init: function() { - var me = this; - - me.connectRuntime( me.options, function() { - me.exec('init'); - me.trigger('ready'); - }); - }, - - destroy: function() { - this.exec('destroy'); - this.disconnectRuntime(); - this.off(); - } - }); - - Mediator.installTo( FilePaste.prototype ); - - return FilePaste; - }); - /** - * @fileOverview 组件基类。 - */ - define('widgets/filepaste',[ - 'base', - 'uploader', - 'lib/filepaste', - 'widgets/widget' - ], function( Base, Uploader, FilePaste ) { - var $ = Base.$; - - /** - * @property {Selector} [paste=undefined] 指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`. - * @namespace options - * @for Uploader - */ - return Uploader.register({ - init: function( opts ) { - - if ( !opts.paste || - this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - var me = this, - deferred = Base.Deferred(), - options = $.extend({}, { - container: opts.paste, - accept: opts.accept - }), - paste; - - paste = new FilePaste( options ); - - paste.once( 'ready', deferred.resolve ); - paste.on( 'paste', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - paste.init(); - - return deferred.promise(); - } - }); - }); - /** - * @fileOverview Blob - */ - define('lib/blob',[ - 'base', - 'runtime/client' - ], function( Base, RuntimeClient ) { - - function Blob( ruid, source ) { - var me = this; - - me.source = source; - me.ruid = ruid; - - RuntimeClient.call( me, 'Blob' ); - - this.uid = source.uid || this.uid; - this.type = source.type || ''; - this.size = source.size || 0; - - if ( ruid ) { - me.connectRuntime( ruid ); - } - } - - Base.inherits( RuntimeClient, { - constructor: Blob, - - slice: function( start, end ) { - return this.exec( 'slice', start, end ); - }, - - getSource: function() { - return this.source; - } - }); - - return Blob; - }); - /** - * 为了统一化Flash的File和HTML5的File而存在。 - * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。 - * @fileOverview File - */ - define('lib/file',[ - 'base', - 'lib/blob' - ], function( Base, Blob ) { - - var uid = 1, - rExt = /\.([^.]+)$/; - - function File( ruid, file ) { - var ext; - - Blob.apply( this, arguments ); - this.name = file.name || ('untitled' + uid++); - ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : ''; - - // todo 支持其他类型文件的转换。 - - // 如果有mimetype, 但是文件名里面没有找出后缀规律 - if ( !ext && this.type ) { - ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ? - RegExp.$1.toLowerCase() : ''; - this.name += '.' + ext; - } - - // 如果没有指定mimetype, 但是知道文件后缀。 - if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) { - this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext); - } - - this.ext = ext; - this.lastModifiedDate = file.lastModifiedDate || - (new Date()).toLocaleString(); - } - - return Base.inherits( Blob, File ); - }); - - /** - * @fileOverview 错误信息 - */ - define('lib/filepicker',[ - 'base', - 'runtime/client', - 'lib/file' - ], function( Base, RuntimeClent, File ) { - - var $ = Base.$; - - function FilePicker( opts ) { - opts = this.options = $.extend({}, FilePicker.options, opts ); - - opts.container = $( opts.id ); - - if ( !opts.container.length ) { - throw new Error('按钮指定错误'); - } - - opts.innerHTML = opts.innerHTML || opts.label || - opts.container.html() || ''; - - opts.button = $( opts.button || document.createElement('div') ); - opts.button.html( opts.innerHTML ); - opts.container.html( opts.button ); - - RuntimeClent.call( this, 'FilePicker', true ); - } - - FilePicker.options = { - button: null, - container: null, - label: null, - innerHTML: null, - multiple: true, - accept: null, - name: 'file' - }; - - Base.inherits( RuntimeClent, { - constructor: FilePicker, - - init: function() { - var me = this, - opts = me.options, - button = opts.button; - - button.addClass('webuploader-pick'); - - me.on( 'all', function( type ) { - var files; - - switch ( type ) { - case 'mouseenter': - button.addClass('webuploader-pick-hover'); - break; - - case 'mouseleave': - button.removeClass('webuploader-pick-hover'); - break; - - case 'change': - files = me.exec('getFiles'); - me.trigger( 'select', $.map( files, function( file ) { - file = new File( me.getRuid(), file ); - - // 记录来源。 - file._refer = opts.container; - return file; - }), opts.container ); - break; - } - }); - - me.connectRuntime( opts, function() { - me.refresh(); - me.exec( 'init', opts ); - me.trigger('ready'); - }); - - $( window ).on( 'resize', function() { - me.refresh(); - }); - }, - - refresh: function() { - var shimContainer = this.getRuntime().getContainer(), - button = this.options.button, - width = button.outerWidth ? - button.outerWidth() : button.width(), - - height = button.outerHeight ? - button.outerHeight() : button.height(), - - pos = button.offset(); - - width && height && shimContainer.css({ - bottom: 'auto', - right: 'auto', - width: width + 'px', - height: height + 'px' - }).offset( pos ); - }, - - enable: function() { - var btn = this.options.button; - - btn.removeClass('webuploader-pick-disable'); - this.refresh(); - }, - - disable: function() { - var btn = this.options.button; - - this.getRuntime().getContainer().css({ - top: '-99999px' - }); - - btn.addClass('webuploader-pick-disable'); - }, - - destroy: function() { - if ( this.runtime ) { - this.exec('destroy'); - this.disconnectRuntime(); - } - } - }); - - return FilePicker; - }); - - /** - * @fileOverview 文件选择相关 - */ - define('widgets/filepicker',[ - 'base', - 'uploader', - 'lib/filepicker', - 'widgets/widget' - ], function( Base, Uploader, FilePicker ) { - var $ = Base.$; - - $.extend( Uploader.options, { - - /** - * @property {Selector | Object} [pick=undefined] - * @namespace options - * @for Uploader - * @description 指定选择文件的按钮容器,不指定则不创建按钮。 - * - * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。 - * * `label` {String} 请采用 `innerHTML` 代替 - * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。 - * * `multiple` {Boolean} 是否开起同时选择多个文件能力。 - */ - pick: null, - - /** - * @property {Arroy} [accept=null] - * @namespace options - * @for Uploader - * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。 - * - * * `title` {String} 文字描述 - * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。 - * * `mimeTypes` {String} 多个用逗号分割。 - * - * 如: - * - * ``` - * { - * title: 'Images', - * extensions: 'gif,jpg,jpeg,bmp,png', - * mimeTypes: 'image/*' - * } - * ``` - */ - accept: null/*{ - title: 'Images', - extensions: 'gif,jpg,jpeg,bmp,png', - mimeTypes: 'image/*' - }*/ - }); - - return Uploader.register({ - 'add-btn': 'addButton', - refresh: 'refresh', - disable: 'disable', - enable: 'enable' - }, { - - init: function( opts ) { - this.pickers = []; - return opts.pick && this.addButton( opts.pick ); - }, - - refresh: function() { - $.each( this.pickers, function() { - this.refresh(); - }); - }, - - /** - * @method addButton - * @for Uploader - * @grammar addButton( pick ) => Promise - * @description - * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。 - * @example - * uploader.addButton({ - * id: '#btnContainer', - * innerHTML: '选择文件' - * }); - */ - addButton: function( pick ) { - var me = this, - opts = me.options, - accept = opts.accept, - options, picker, deferred; - - if ( !pick ) { - return; - } - - deferred = Base.Deferred(); - $.isPlainObject( pick ) || (pick = { - id: pick - }); - - options = $.extend({}, pick, { - accept: $.isPlainObject( accept ) ? [ accept ] : accept, - swf: opts.swf, - runtimeOrder: opts.runtimeOrder - }); - - picker = new FilePicker( options ); - - picker.once( 'ready', deferred.resolve ); - picker.on( 'select', function( files ) { - me.owner.request( 'add-file', [ files ]); - }); - picker.init(); - - this.pickers.push( picker ); - - return deferred.promise(); - }, - - disable: function() { - $.each( this.pickers, function() { - this.disable(); - }); - }, - - enable: function() { - $.each( this.pickers, function() { - this.enable(); - }); - } - }); - }); - /** - * @fileOverview 文件属性封装 - */ - define('file',[ - 'base', - 'mediator' - ], function( Base, Mediator ) { - - var $ = Base.$, - idPrefix = 'WU_FILE_', - idSuffix = 0, - rExt = /\.([^.]+)$/, - statusMap = {}; - - function gid() { - return idPrefix + idSuffix++; - } - - /** - * 文件类 - * @class File - * @constructor 构造函数 - * @grammar new File( source ) => File - * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。 - */ - function WUFile( source ) { - - /** - * 文件名,包括扩展名(后缀) - * @property name - * @type {string} - */ - this.name = source.name || 'Untitled'; - - /** - * 文件体积(字节) - * @property size - * @type {uint} - * @default 0 - */ - this.size = source.size || 0; - - /** - * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny) - * @property type - * @type {string} - * @default 'application' - */ - this.type = source.type || 'application'; - - /** - * 文件最后修改日期 - * @property lastModifiedDate - * @type {int} - * @default 当前时间戳 - */ - this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1); - - /** - * 文件ID,每个对象具有唯一ID,与文件名无关 - * @property id - * @type {string} - */ - this.id = gid(); - - /** - * 文件扩展名,通过文件名获取,例如test.png的扩展名为png - * @property ext - * @type {string} - */ - this.ext = rExt.exec( this.name ) ? RegExp.$1 : ''; - - - /** - * 状态文字说明。在不同的status语境下有不同的用途。 - * @property statusText - * @type {string} - */ - this.statusText = ''; - - // 存储文件状态,防止通过属性直接修改 - statusMap[ this.id ] = WUFile.Status.INITED; - - this.source = source; - this.loaded = 0; - - this.on( 'error', function( msg ) { - this.setStatus( WUFile.Status.ERROR, msg ); - }); - } - - $.extend( WUFile.prototype, { - - /** - * 设置状态,状态变化时会触发`change`事件。 - * @method setStatus - * @grammar setStatus( status[, statusText] ); - * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status) - * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。 - */ - setStatus: function( status, text ) { - - var prevStatus = statusMap[ this.id ]; - - typeof text !== 'undefined' && (this.statusText = text); - - if ( status !== prevStatus ) { - statusMap[ this.id ] = status; - /** - * 文件状态变化 - * @event statuschange - */ - this.trigger( 'statuschange', status, prevStatus ); - } - - }, - - /** - * 获取文件状态 - * @return {File.Status} - * @example - 文件状态具体包括以下几种类型: - { - // 初始化 - INITED: 0, - // 已入队列 - QUEUED: 1, - // 正在上传 - PROGRESS: 2, - // 上传出错 - ERROR: 3, - // 上传成功 - COMPLETE: 4, - // 上传取消 - CANCELLED: 5 - } - */ - getStatus: function() { - return statusMap[ this.id ]; - }, - - /** - * 获取文件原始信息。 - * @return {*} - */ - getSource: function() { - return this.source; - }, - - destory: function() { - delete statusMap[ this.id ]; - } - }); - - Mediator.installTo( WUFile.prototype ); - - /** - * 文件状态值,具体包括以下几种类型: - * * `inited` 初始状态 - * * `queued` 已经进入队列, 等待上传 - * * `progress` 上传中 - * * `complete` 上传完成。 - * * `error` 上传出错,可重试 - * * `interrupt` 上传中断,可续传。 - * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。 - * * `cancelled` 文件被移除。 - * @property {Object} Status - * @namespace File - * @class File - * @static - */ - WUFile.Status = { - INITED: 'inited', // 初始状态 - QUEUED: 'queued', // 已经进入队列, 等待上传 - PROGRESS: 'progress', // 上传中 - ERROR: 'error', // 上传出错,可重试 - COMPLETE: 'complete', // 上传完成。 - CANCELLED: 'cancelled', // 上传取消。 - INTERRUPT: 'interrupt', // 上传中断,可续传。 - INVALID: 'invalid' // 文件不合格,不能重试上传。 - }; - - return WUFile; - }); - - /** - * @fileOverview 文件队列 - */ - define('queue',[ - 'base', - 'mediator', - 'file' - ], function( Base, Mediator, WUFile ) { - - var $ = Base.$, - STATUS = WUFile.Status; - - /** - * 文件队列, 用来存储各个状态中的文件。 - * @class Queue - * @extends Mediator - */ - function Queue() { - - /** - * 统计文件数。 - * * `numOfQueue` 队列中的文件数。 - * * `numOfSuccess` 上传成功的文件数 - * * `numOfCancel` 被移除的文件数 - * * `numOfProgress` 正在上传中的文件数 - * * `numOfUploadFailed` 上传错误的文件数。 - * * `numOfInvalid` 无效的文件数。 - * @property {Object} stats - */ - this.stats = { - numOfQueue: 0, - numOfSuccess: 0, - numOfCancel: 0, - numOfProgress: 0, - numOfUploadFailed: 0, - numOfInvalid: 0 - }; - - // 上传队列,仅包括等待上传的文件 - this._queue = []; - - // 存储所有文件 - this._map = {}; - } - - $.extend( Queue.prototype, { - - /** - * 将新文件加入对队列尾部 - * - * @method append - * @param {File} file 文件对象 - */ - append: function( file ) { - this._queue.push( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 将新文件加入对队列头部 - * - * @method prepend - * @param {File} file 文件对象 - */ - prepend: function( file ) { - this._queue.unshift( file ); - this._fileAdded( file ); - return this; - }, - - /** - * 获取文件对象 - * - * @method getFile - * @param {String} fileId 文件ID - * @return {File} - */ - getFile: function( fileId ) { - if ( typeof fileId !== 'string' ) { - return fileId; - } - return this._map[ fileId ]; - }, - - /** - * 从队列中取出一个指定状态的文件。 - * @grammar fetch( status ) => File - * @method fetch - * @param {String} status [文件状态值](#WebUploader:File:File.Status) - * @return {File} [File](#WebUploader:File) - */ - fetch: function( status ) { - var len = this._queue.length, - i, file; - - status = status || STATUS.QUEUED; - - for ( i = 0; i < len; i++ ) { - file = this._queue[ i ]; - - if ( status === file.getStatus() ) { - return file; - } - } - - return null; - }, - - /** - * 对队列进行排序,能够控制文件上传顺序。 - * @grammar sort( fn ) => undefined - * @method sort - * @param {Function} fn 排序方法 - */ - sort: function( fn ) { - if ( typeof fn === 'function' ) { - this._queue.sort( fn ); - } - }, - - /** - * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。 - * @grammar getFiles( [status1[, status2 ...]] ) => Array - * @method getFiles - * @param {String} [status] [文件状态值](#WebUploader:File:File.Status) - */ - getFiles: function() { - var sts = [].slice.call( arguments, 0 ), - ret = [], - i = 0, - len = this._queue.length, - file; - - for ( ; i < len; i++ ) { - file = this._queue[ i ]; - - if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) { - continue; - } - - ret.push( file ); - } - - return ret; - }, - - _fileAdded: function( file ) { - var me = this, - existing = this._map[ file.id ]; - - if ( !existing ) { - this._map[ file.id ] = file; - - file.on( 'statuschange', function( cur, pre ) { - me._onFileStatusChange( cur, pre ); - }); - } - - file.setStatus( STATUS.QUEUED ); - }, - - _onFileStatusChange: function( curStatus, preStatus ) { - var stats = this.stats; - - switch ( preStatus ) { - case STATUS.PROGRESS: - stats.numOfProgress--; - break; - - case STATUS.QUEUED: - stats.numOfQueue --; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed--; - break; - - case STATUS.INVALID: - stats.numOfInvalid--; - break; - } - - switch ( curStatus ) { - case STATUS.QUEUED: - stats.numOfQueue++; - break; - - case STATUS.PROGRESS: - stats.numOfProgress++; - break; - - case STATUS.ERROR: - stats.numOfUploadFailed++; - break; - - case STATUS.COMPLETE: - stats.numOfSuccess++; - break; - - case STATUS.CANCELLED: - stats.numOfCancel++; - break; - - case STATUS.INVALID: - stats.numOfInvalid++; - break; - } - } - - }); - - Mediator.installTo( Queue.prototype ); - - return Queue; - }); - /** - * @fileOverview 队列 - */ - define('widgets/queue',[ - 'base', - 'uploader', - 'queue', - 'file', - 'lib/file', - 'runtime/client', - 'widgets/widget' - ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) { - - var $ = Base.$, - rExt = /\.\w+$/, - Status = WUFile.Status; - - return Uploader.register({ - 'sort-files': 'sortFiles', - 'add-file': 'addFiles', - 'get-file': 'getFile', - 'fetch-file': 'fetchFile', - 'get-stats': 'getStats', - 'get-files': 'getFiles', - 'remove-file': 'removeFile', - 'retry': 'retry', - 'reset': 'reset', - 'accept-file': 'acceptFile' - }, { - - init: function( opts ) { - var me = this, - deferred, len, i, item, arr, accept, runtime; - - if ( $.isPlainObject( opts.accept ) ) { - opts.accept = [ opts.accept ]; - } - - // accept中的中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].extensions; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = '\\.' + arr.join(',') - .replace( /,/g, '$|\\.' ) - .replace( /\*/g, '.*' ) + '$'; - } - - me.accept = new RegExp( accept, 'i' ); - } - - me.queue = new Queue(); - me.stats = me.queue.stats; - - // 如果当前不是html5运行时,那就算了。 - // 不执行后续操作 - if ( this.request('predict-runtime-type') !== 'html5' ) { - return; - } - - // 创建一个 html5 运行时的 placeholder - // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。 - deferred = Base.Deferred(); - runtime = new RuntimeClient('Placeholder'); - runtime.connectRuntime({ - runtimeOrder: 'html5' - }, function() { - me._ruid = runtime.getRuid(); - deferred.resolve(); - }); - return deferred.promise(); - }, - - - // 为了支持外部直接添加一个原生File对象。 - _wrapFile: function( file ) { - if ( !(file instanceof WUFile) ) { - - if ( !(file instanceof File) ) { - if ( !this._ruid ) { - throw new Error('Can\'t add external files.'); - } - file = new File( this._ruid, file ); - } - - file = new WUFile( file ); - } - - return file; - }, - - // 判断文件是否可以被加入队列 - acceptFile: function( file ) { - var invalid = !file || file.size < 6 || this.accept && - - // 如果名字中有后缀,才做后缀白名单处理。 - rExt.exec( file.name ) && !this.accept.test( file.name ); - - return !invalid; - }, - - - /** - * @event beforeFileQueued - * @param {File} file File对象 - * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。 - * @for Uploader - */ - - /** - * @event fileQueued - * @param {File} file File对象 - * @description 当文件被加入队列以后触发。 - * @for Uploader - */ - - _addFile: function( file ) { - var me = this; - - file = me._wrapFile( file ); - - // 不过类型判断允许不允许,先派送 `beforeFileQueued` - if ( !me.owner.trigger( 'beforeFileQueued', file ) ) { - return; - } - - // 类型不匹配,则派送错误事件,并返回。 - if ( !me.acceptFile( file ) ) { - me.owner.trigger( 'error', 'Q_TYPE_DENIED', file ); - return; - } - - me.queue.append( file ); - me.owner.trigger( 'fileQueued', file ); - return file; - }, - - getFile: function( fileId ) { - return this.queue.getFile( fileId ); - }, - - /** - * @event filesQueued - * @param {File} files 数组,内容为原始File(lib/File)对象。 - * @description 当一批文件添加进队列以后触发。 - * @for Uploader - */ - - /** - * @method addFiles - * @grammar addFiles( file ) => undefined - * @grammar addFiles( [file1, file2 ...] ) => undefined - * @param {Array of File or File} [files] Files 对象 数组 - * @description 添加文件到队列 - * @for Uploader - */ - addFiles: function( files ) { - var me = this; - - if ( !files.length ) { - files = [ files ]; - } - - files = $.map( files, function( file ) { - return me._addFile( file ); - }); - - me.owner.trigger( 'filesQueued', files ); - - if ( me.options.auto ) { - me.request('start-upload'); - } - }, - - getStats: function() { - return this.stats; - }, - - /** - * @event fileDequeued - * @param {File} file File对象 - * @description 当文件被移除队列后触发。 - * @for Uploader - */ - - /** - * @method removeFile - * @grammar removeFile( file ) => undefined - * @grammar removeFile( id ) => undefined - * @param {File|id} file File对象或这File对象的id - * @description 移除某一文件。 - * @for Uploader - * @example - * - * $li.on('click', '.remove-this', function() { - * uploader.removeFile( file ); - * }) - */ - removeFile: function( file ) { - var me = this; - - file = file.id ? file : me.queue.getFile( file ); - - file.setStatus( Status.CANCELLED ); - me.owner.trigger( 'fileDequeued', file ); - }, - - /** - * @method getFiles - * @grammar getFiles() => Array - * @grammar getFiles( status1, status2, status... ) => Array - * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。 - * @for Uploader - * @example - * console.log( uploader.getFiles() ); // => all files - * console.log( uploader.getFiles('error') ) // => all error files. - */ - getFiles: function() { - return this.queue.getFiles.apply( this.queue, arguments ); - }, - - fetchFile: function() { - return this.queue.fetch.apply( this.queue, arguments ); - }, - - /** - * @method retry - * @grammar retry() => undefined - * @grammar retry( file ) => undefined - * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。 - * @for Uploader - * @example - * function retry() { - * uploader.retry(); - * } - */ - retry: function( file, noForceStart ) { - var me = this, - files, i, len; - - if ( file ) { - file = file.id ? file : me.queue.getFile( file ); - file.setStatus( Status.QUEUED ); - noForceStart || me.request('start-upload'); - return; - } - - files = me.queue.getFiles( Status.ERROR ); - i = 0; - len = files.length; - - for ( ; i < len; i++ ) { - file = files[ i ]; - file.setStatus( Status.QUEUED ); - } - - me.request('start-upload'); - }, - - /** - * @method sort - * @grammar sort( fn ) => undefined - * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。 - * @for Uploader - */ - sortFiles: function() { - return this.queue.sort.apply( this.queue, arguments ); - }, - - /** - * @method reset - * @grammar reset() => undefined - * @description 重置uploader。目前只重置了队列。 - * @for Uploader - * @example - * uploader.reset(); - */ - reset: function() { - this.queue = new Queue(); - this.stats = this.queue.stats; - } - }); - - }); - /** - * @fileOverview 添加获取Runtime相关信息的方法。 - */ - define('widgets/runtime',[ - 'uploader', - 'runtime/runtime', - 'widgets/widget' - ], function( Uploader, Runtime ) { - - Uploader.support = function() { - return Runtime.hasRuntime.apply( Runtime, arguments ); - }; - - return Uploader.register({ - 'predict-runtime-type': 'predictRuntmeType' - }, { - - init: function() { - if ( !this.predictRuntmeType() ) { - throw Error('Runtime Error'); - } - }, - - /** - * 预测Uploader将采用哪个`Runtime` - * @grammar predictRuntmeType() => String - * @method predictRuntmeType - * @for Uploader - */ - predictRuntmeType: function() { - var orders = this.options.runtimeOrder || Runtime.orders, - type = this.type, - i, len; - - if ( !type ) { - orders = orders.split( /\s*,\s*/g ); - - for ( i = 0, len = orders.length; i < len; i++ ) { - if ( Runtime.hasRuntime( orders[ i ] ) ) { - this.type = type = orders[ i ]; - break; - } - } - } - - return type; - } - }); - }); - /** - * @fileOverview Transport - */ - define('lib/transport',[ - 'base', - 'runtime/client', - 'mediator' - ], function( Base, RuntimeClient, Mediator ) { - - var $ = Base.$; - - function Transport( opts ) { - var me = this; - - opts = me.options = $.extend( true, {}, Transport.options, opts || {} ); - RuntimeClient.call( this, 'Transport' ); - - this._blob = null; - this._formData = opts.formData || {}; - this._headers = opts.headers || {}; - - this.on( 'progress', this._timeout ); - this.on( 'load error', function() { - me.trigger( 'progress', 1 ); - clearTimeout( me._timer ); - }); - } - - Transport.options = { - server: '', - method: 'POST', - - // 跨域时,是否允许携带cookie, 只有html5 runtime才有效 - withCredentials: false, - fileVal: 'file', - timeout: 2 * 60 * 1000, // 2分钟 - formData: {}, - headers: {}, - sendAsBinary: false - }; - - $.extend( Transport.prototype, { - - // 添加Blob, 只能添加一次,最后一次有效。 - appendBlob: function( key, blob, filename ) { - var me = this, - opts = me.options; - - if ( me.getRuid() ) { - me.disconnectRuntime(); - } - - // 连接到blob归属的同一个runtime. - me.connectRuntime( blob.ruid, function() { - me.exec('init'); - }); - - me._blob = blob; - opts.fileVal = key || opts.fileVal; - opts.filename = filename || opts.filename; - }, - - // 添加其他字段 - append: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._formData, key ); - } else { - this._formData[ key ] = value; - } - }, - - setRequestHeader: function( key, value ) { - if ( typeof key === 'object' ) { - $.extend( this._headers, key ); - } else { - this._headers[ key ] = value; - } - }, - - send: function( method ) { - this.exec( 'send', method ); - this._timeout(); - }, - - abort: function() { - clearTimeout( this._timer ); - return this.exec('abort'); - }, - - destroy: function() { - this.trigger('destroy'); - this.off(); - this.exec('destroy'); - this.disconnectRuntime(); - }, - - getResponse: function() { - return this.exec('getResponse'); - }, - - getResponseAsJson: function() { - return this.exec('getResponseAsJson'); - }, - - getStatus: function() { - return this.exec('getStatus'); - }, - - _timeout: function() { - var me = this, - duration = me.options.timeout; - - if ( !duration ) { - return; - } - - clearTimeout( me._timer ); - me._timer = setTimeout(function() { - me.abort(); - me.trigger( 'error', 'timeout' ); - }, duration ); - } - - }); - - // 让Transport具备事件功能。 - Mediator.installTo( Transport.prototype ); - - return Transport; - }); - /** - * @fileOverview 负责文件上传相关。 - */ - define('widgets/upload',[ - 'base', - 'uploader', - 'file', - 'lib/transport', - 'widgets/widget' - ], function( Base, Uploader, WUFile, Transport ) { - - var $ = Base.$, - isPromise = Base.isPromise, - Status = WUFile.Status; - - // 添加默认配置项 - $.extend( Uploader.options, { - - - /** - * @property {Boolean} [prepareNextFile=false] - * @namespace options - * @for Uploader - * @description 是否允许在文件传输时提前把下一个文件准备好。 - * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 - * 如果能提前在当前文件传输期处理,可以节省总体耗时。 - */ - prepareNextFile: false, - - /** - * @property {Boolean} [chunked=false] - * @namespace options - * @for Uploader - * @description 是否要分片处理大文件上传。 - */ - chunked: false, - - /** - * @property {Boolean} [chunkSize=5242880] - * @namespace options - * @for Uploader - * @description 如果要分片,分多大一片? 默认大小为5M. - */ - chunkSize: 5 * 1024 * 1024, - - /** - * @property {Boolean} [chunkRetry=2] - * @namespace options - * @for Uploader - * @description 如果某个分片由于网络问题出错,允许自动重传多少次? - */ - chunkRetry: 2, - - /** - * @property {Boolean} [threads=3] - * @namespace options - * @for Uploader - * @description 上传并发数。允许同时最大上传进程数。 - */ - threads: 3, - - - /** - * @property {Object} [formData] - * @namespace options - * @for Uploader - * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。 - */ - formData: null - - /** - * @property {Object} [fileVal='file'] - * @namespace options - * @for Uploader - * @description 设置文件上传域的name。 - */ - - /** - * @property {Object} [method='POST'] - * @namespace options - * @for Uploader - * @description 文件上传方式,`POST`或者`GET`。 - */ - - /** - * @property {Object} [sendAsBinary=false] - * @namespace options - * @for Uploader - * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容, - * 其他参数在$_GET数组中。 - */ - }); - - // 负责将文件切片。 - function CuteFile( file, chunkSize ) { - var pending = [], - blob = file.source, - total = blob.size, - chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1, - start = 0, - index = 0, - len; - - while ( index < chunks ) { - len = Math.min( chunkSize, total - start ); - - pending.push({ - file: file, - start: start, - end: chunkSize ? (start + len) : total, - total: total, - chunks: chunks, - chunk: index++ - }); - start += len; - } - - file.blocks = pending.concat(); - file.remaning = pending.length; - - return { - file: file, - - has: function() { - return !!pending.length; - }, - - fetch: function() { - return pending.shift(); - } - }; - } - - Uploader.register({ - 'start-upload': 'start', - 'stop-upload': 'stop', - 'skip-file': 'skipFile', - 'is-in-progress': 'isInProgress' - }, { - - init: function() { - var owner = this.owner; - - this.runing = false; - - // 记录当前正在传的数据,跟threads相关 - this.pool = []; - - // 缓存即将上传的文件。 - this.pending = []; - - // 跟踪还有多少分片没有完成上传。 - this.remaning = 0; - this.__tick = Base.bindFn( this._tick, this ); - - owner.on( 'uploadComplete', function( file ) { - // 把其他块取消了。 - file.blocks && $.each( file.blocks, function( _, v ) { - v.transport && (v.transport.abort(), v.transport.destroy()); - delete v.transport; - }); - - delete file.blocks; - delete file.remaning; - }); - }, - - /** - * @event startUpload - * @description 当开始上传流程时触发。 - * @for Uploader - */ - - /** - * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。 - * @grammar upload() => undefined - * @method upload - * @for Uploader - */ - start: function() { - var me = this; - - // 移出invalid的文件 - $.each( me.request( 'get-files', Status.INVALID ), function() { - me.request( 'remove-file', this ); - }); - - if ( me.runing ) { - return; - } - - me.runing = true; - - // 如果有暂停的,则续传 - $.each( me.pool, function( _, v ) { - var file = v.file; - - if ( file.getStatus() === Status.INTERRUPT ) { - file.setStatus( Status.PROGRESS ); - me._trigged = false; - v.transport && v.transport.send(); - } - }); - - me._trigged = false; - me.owner.trigger('startUpload'); - Base.nextTick( me.__tick ); - }, - - /** - * @event stopUpload - * @description 当开始上传流程暂停时触发。 - * @for Uploader - */ - - /** - * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。 - * @grammar stop() => undefined - * @grammar stop( true ) => undefined - * @method stop - * @for Uploader - */ - stop: function( interrupt ) { - var me = this; - - if ( me.runing === false ) { - return; - } - - me.runing = false; - - interrupt && $.each( me.pool, function( _, v ) { - v.transport && v.transport.abort(); - v.file.setStatus( Status.INTERRUPT ); - }); - - me.owner.trigger('stopUpload'); - }, - - /** - * 判断`Uplaode`r是否正在上传中。 - * @grammar isInProgress() => Boolean - * @method isInProgress - * @for Uploader - */ - isInProgress: function() { - return !!this.runing; - }, - - getStats: function() { - return this.request('get-stats'); - }, - - /** - * 掉过一个文件上传,直接标记指定文件为已上传状态。 - * @grammar skipFile( file ) => undefined - * @method skipFile - * @for Uploader - */ - skipFile: function( file, status ) { - file = this.request( 'get-file', file ); - - file.setStatus( status || Status.COMPLETE ); - file.skipped = true; - - // 如果正在上传。 - file.blocks && $.each( file.blocks, function( _, v ) { - var _tr = v.transport; - - if ( _tr ) { - _tr.abort(); - _tr.destroy(); - delete v.transport; - } - }); - - this.owner.trigger( 'uploadSkip', file ); - }, - - /** - * @event uploadFinished - * @description 当所有文件上传结束时触发。 - * @for Uploader - */ - _tick: function() { - var me = this, - opts = me.options, - fn, val; - - // 上一个promise还没有结束,则等待完成后再执行。 - if ( me._promise ) { - return me._promise.always( me.__tick ); - } - - // 还有位置,且还有文件要处理的话。 - if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) { - me._trigged = false; - - fn = function( val ) { - me._promise = null; - - // 有可能是reject过来的,所以要检测val的类型。 - val && val.file && me._startSend( val ); - Base.nextTick( me.__tick ); - }; - - me._promise = isPromise( val ) ? val.always( fn ) : fn( val ); - - // 没有要上传的了,且没有正在传输的了。 - } else if ( !me.remaning && !me.getStats().numOfQueue ) { - me.runing = false; - - me._trigged || Base.nextTick(function() { - me.owner.trigger('uploadFinished'); - }); - me._trigged = true; - } - }, - - _nextBlock: function() { - var me = this, - act = me._act, - opts = me.options, - next, done; - - // 如果当前文件还有没有需要传输的,则直接返回剩下的。 - if ( act && act.has() && - act.file.getStatus() === Status.PROGRESS ) { - - // 是否提前准备下一个文件 - if ( opts.prepareNextFile && !me.pending.length ) { - me._prepareNextFile(); - } - - return act.fetch(); - - // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。 - } else if ( me.runing ) { - - // 如果缓存中有,则直接在缓存中取,没有则去queue中取。 - if ( !me.pending.length && me.getStats().numOfQueue ) { - me._prepareNextFile(); - } - - next = me.pending.shift(); - done = function( file ) { - if ( !file ) { - return null; - } - - act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 ); - me._act = act; - return act.fetch(); - }; - - // 文件可能还在prepare中,也有可能已经完全准备好了。 - return isPromise( next ) ? - next[ next.pipe ? 'pipe' : 'then']( done ) : - done( next ); - } - }, - - - /** - * @event uploadStart - * @param {File} file File对象 - * @description 某个文件开始上传前触发,一个文件只会触发一次。 - * @for Uploader - */ - _prepareNextFile: function() { - var me = this, - file = me.request('fetch-file'), - pending = me.pending, - promise; - - if ( file ) { - promise = me.request( 'before-send-file', file, function() { - - // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued. - if ( file.getStatus() === Status.QUEUED ) { - me.owner.trigger( 'uploadStart', file ); - file.setStatus( Status.PROGRESS ); - return file; - } - - return me._finishFile( file ); - }); - - // 如果还在pending中,则替换成文件本身。 - promise.done(function() { - var idx = $.inArray( promise, pending ); - - ~idx && pending.splice( idx, 1, file ); - }); - - // befeore-send-file的钩子就有错误发生。 - promise.fail(function( reason ) { - file.setStatus( Status.ERROR, reason ); - me.owner.trigger( 'uploadError', file, reason ); - me.owner.trigger( 'uploadComplete', file ); - }); - - pending.push( promise ); - } - }, - - // 让出位置了,可以让其他分片开始上传 - _popBlock: function( block ) { - var idx = $.inArray( block, this.pool ); - - this.pool.splice( idx, 1 ); - block.file.remaning--; - this.remaning--; - }, - - // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。 - _startSend: function( block ) { - var me = this, - file = block.file, - promise; - - me.pool.push( block ); - me.remaning++; - - // 如果没有分片,则直接使用原始的。 - // 不会丢失content-type信息。 - block.blob = block.chunks === 1 ? file.source : - file.source.slice( block.start, block.end ); - - // hook, 每个分片发送之前可能要做些异步的事情。 - promise = me.request( 'before-send', block, function() { - - // 有可能文件已经上传出错了,所以不需要再传输了。 - if ( file.getStatus() === Status.PROGRESS ) { - me._doSend( block ); - } else { - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - - // 如果为fail了,则跳过此分片。 - promise.fail(function() { - if ( file.remaning === 1 ) { - me._finishFile( file ).always(function() { - block.percentage = 1; - me._popBlock( block ); - me.owner.trigger( 'uploadComplete', file ); - Base.nextTick( me.__tick ); - }); - } else { - block.percentage = 1; - me._popBlock( block ); - Base.nextTick( me.__tick ); - } - }); - }, - - - /** - * @event uploadBeforeSend - * @param {Object} object - * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。 - * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。 - * @for Uploader - */ - - /** - * @event uploadAccept - * @param {Object} object - * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。 - * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。 - * @for Uploader - */ - - /** - * @event uploadProgress - * @param {File} file File对象 - * @param {Number} percentage 上传进度 - * @description 上传过程中触发,携带上传进度。 - * @for Uploader - */ - - - /** - * @event uploadError - * @param {File} file File对象 - * @param {String} reason 出错的code - * @description 当文件上传出错时触发。 - * @for Uploader - */ - - /** - * @event uploadSuccess - * @param {File} file File对象 - * @param {Object} response 服务端返回的数据 - * @description 当文件上传成功时触发。 - * @for Uploader - */ - - /** - * @event uploadComplete - * @param {File} [file] File对象 - * @description 不管成功或者失败,文件上传完成时触发。 - * @for Uploader - */ - - // 做上传操作。 - _doSend: function( block ) { - var me = this, - owner = me.owner, - opts = me.options, - file = block.file, - tr = new Transport( opts ), - data = $.extend({}, opts.formData ), - headers = $.extend({}, opts.headers ), - requestAccept, ret; - - block.transport = tr; - - tr.on( 'destroy', function() { - delete block.transport; - me._popBlock( block ); - Base.nextTick( me.__tick ); - }); - - // 广播上传进度。以文件为单位。 - tr.on( 'progress', function( percentage ) { - var totalPercent = 0, - uploaded = 0; - - // 可能没有abort掉,progress还是执行进来了。 - // if ( !file.blocks ) { - // return; - // } - - totalPercent = block.percentage = percentage; - - if ( block.chunks > 1 ) { // 计算文件的整体速度。 - $.each( file.blocks, function( _, v ) { - uploaded += (v.percentage || 0) * (v.end - v.start); - }); - - totalPercent = uploaded / file.size; - } - - owner.trigger( 'uploadProgress', file, totalPercent || 0 ); - }); - - // 用来询问,是否返回的结果是有错误的。 - requestAccept = function( reject ) { - var fn; - - ret = tr.getResponseAsJson() || {}; - ret._raw = tr.getResponse(); - fn = function( value ) { - reject = value; - }; - - // 服务端响应了,不代表成功了,询问是否响应正确。 - if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) { - reject = reject || 'server'; - } - - return reject; - }; - - // 尝试重试,然后广播文件上传出错。 - tr.on( 'error', function( type, flag ) { - block.retried = block.retried || 0; - - // 自动重试 - if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) && - block.retried < opts.chunkRetry ) { - - block.retried++; - tr.send(); - - } else { - - // http status 500 ~ 600 - if ( !flag && type === 'server' ) { - type = requestAccept( type ); - } - - file.setStatus( Status.ERROR, type ); - owner.trigger( 'uploadError', file, type ); - owner.trigger( 'uploadComplete', file ); - } - }); - - // 上传成功 - tr.on( 'load', function() { - var reason; - - // 如果非预期,转向上传出错。 - if ( (reason = requestAccept()) ) { - tr.trigger( 'error', reason, true ); - return; - } - - // 全部上传完成。 - if ( file.remaning === 1 ) { - me._finishFile( file, ret ); - } else { - tr.destroy(); - } - }); - - // 配置默认的上传字段。 - data = $.extend( data, { - id: file.id, - name: file.name, - type: file.type, - lastModifiedDate: file.lastModifiedDate, - size: file.size - }); - - block.chunks > 1 && $.extend( data, { - chunks: block.chunks, - chunk: block.chunk - }); - - // 在发送之间可以添加字段什么的。。。 - // 如果默认的字段不够使用,可以通过监听此事件来扩展 - owner.trigger( 'uploadBeforeSend', block, data, headers ); - - // 开始发送。 - tr.appendBlob( opts.fileVal, block.blob, file.name ); - tr.append( data ); - tr.setRequestHeader( headers ); - tr.send(); - }, - - // 完成上传。 - _finishFile: function( file, ret, hds ) { - var owner = this.owner; - - return owner - .request( 'after-send-file', arguments, function() { - file.setStatus( Status.COMPLETE ); - owner.trigger( 'uploadSuccess', file, ret, hds ); - }) - .fail(function( reason ) { - - // 如果外部已经标记为invalid什么的,不再改状态。 - if ( file.getStatus() === Status.PROGRESS ) { - file.setStatus( Status.ERROR, reason ); - } - - owner.trigger( 'uploadError', file, reason ); - }) - .always(function() { - owner.trigger( 'uploadComplete', file ); - }); - } - - }); - }); - /** - * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。 - */ - - define('widgets/validator',[ - 'base', - 'uploader', - 'file', - 'widgets/widget' - ], function( Base, Uploader, WUFile ) { - - var $ = Base.$, - validators = {}, - api; - - /** - * @event error - * @param {String} type 错误类型。 - * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。 - * - * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。 - * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。 - * @for Uploader - */ - - // 暴露给外面的api - api = { - - // 添加验证器 - addValidator: function( type, cb ) { - validators[ type ] = cb; - }, - - // 移除验证器 - removeValidator: function( type ) { - delete validators[ type ]; - } - }; - - // 在Uploader初始化的时候启动Validators的初始化 - Uploader.register({ - init: function() { - var me = this; - $.each( validators, function() { - this.call( me.owner ); - }); - } - }); - - /** - * @property {int} [fileNumLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总数量, 超出则不允许加入队列。 - */ - api.addValidator( 'fileNumLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileNumLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( count >= max && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return count >= max ? false : true; - }); - - uploader.on( 'fileQueued', function() { - count++; - }); - - uploader.on( 'fileDequeued', function() { - count--; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - - /** - * @property {int} [fileSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSizeLimit', function() { - var uploader = this, - opts = uploader.options, - count = 0, - max = opts.fileSizeLimit >> 0, - flag = true; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var invalid = count + file.size > max; - - if ( invalid && flag ) { - flag = false; - this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file ); - setTimeout(function() { - flag = true; - }, 1 ); - } - - return invalid ? false : true; - }); - - uploader.on( 'fileQueued', function( file ) { - count += file.size; - }); - - uploader.on( 'fileDequeued', function( file ) { - count -= file.size; - }); - - uploader.on( 'uploadFinished', function() { - count = 0; - }); - }); - - /** - * @property {int} [fileSingleSizeLimit=undefined] - * @namespace options - * @for Uploader - * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。 - */ - api.addValidator( 'fileSingleSizeLimit', function() { - var uploader = this, - opts = uploader.options, - max = opts.fileSingleSizeLimit; - - if ( !max ) { - return; - } - - uploader.on( 'beforeFileQueued', function( file ) { - - if ( file.size > max ) { - file.setStatus( WUFile.Status.INVALID, 'exceed_size' ); - this.trigger( 'error', 'F_EXCEED_SIZE', file ); - return false; - } - - }); - - }); - - /** - * @property {int} [duplicate=undefined] - * @namespace options - * @for Uploader - * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key. - */ - api.addValidator( 'duplicate', function() { - var uploader = this, - opts = uploader.options, - mapping = {}; - - if ( opts.duplicate ) { - return; - } - - function hashString( str ) { - var hash = 0, - i = 0, - len = str.length, - _char; - - for ( ; i < len; i++ ) { - _char = str.charCodeAt( i ); - hash = _char + (hash << 6) + (hash << 16) - hash; - } - - return hash; - } - - uploader.on( 'beforeFileQueued', function( file ) { - var hash = file.__hash || (file.__hash = hashString( file.name + - file.size + file.lastModifiedDate )); - - // 已经重复了 - if ( mapping[ hash ] ) { - this.trigger( 'error', 'F_DUPLICATE', file ); - return false; - } - }); - - uploader.on( 'fileQueued', function( file ) { - var hash = file.__hash; - - hash && (mapping[ hash ] = true); - }); - - uploader.on( 'fileDequeued', function( file ) { - var hash = file.__hash; - - hash && (delete mapping[ hash ]); - }); - }); - - return api; - }); - - /** - * @fileOverview Runtime管理器,负责Runtime的选择, 连接 - */ - define('runtime/compbase',[],function() { - - function CompBase( owner, runtime ) { - - this.owner = owner; - this.options = owner.options; - - this.getRuntime = function() { - return runtime; - }; - - this.getRuid = function() { - return runtime.uid; - }; - - this.trigger = function() { - return owner.trigger.apply( owner, arguments ); - }; - } - - return CompBase; - }); - /** - * @fileOverview Html5Runtime - */ - define('runtime/html5/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - - var type = 'html5', - components = {}; - - function Html5Runtime() { - var pool = {}, - me = this, - destory = this.destory; - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - if ( components[ comp ] ) { - instance = pool[ uid ] = pool[ uid ] || - new components[ comp ]( client, me ); - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - }; - - me.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - } - - Base.inherits( Runtime, { - constructor: Html5Runtime, - - // 不需要连接其他程序,直接执行callback - init: function() { - var me = this; - setTimeout(function() { - me.trigger('ready'); - }, 1 ); - } - - }); - - // 注册Components - Html5Runtime.register = function( name, component ) { - var klass = components[ name ] = Base.inherits( CompBase, component ); - return klass; - }; - - // 注册html5运行时。 - // 只有在支持的前提下注册。 - if ( window.Blob && window.FileReader && window.DataView ) { - Runtime.addRuntime( type, Html5Runtime ); - } - - return Html5Runtime; - }); - /** - * @fileOverview Blob Html实现 - */ - define('runtime/html5/blob',[ - 'runtime/html5/runtime', - 'lib/blob' - ], function( Html5Runtime, Blob ) { - - return Html5Runtime.register( 'Blob', { - slice: function( start, end ) { - var blob = this.owner.source, - slice = blob.slice || blob.webkitSlice || blob.mozSlice; - - blob = slice.call( blob, start, end ); - - return new Blob( this.getRuid(), blob ); - } - }); - }); - /** - * @fileOverview FilePaste - */ - define('runtime/html5/dnd',[ - 'base', - 'runtime/html5/runtime', - 'lib/file' - ], function( Base, Html5Runtime, File ) { - - var $ = Base.$, - prefix = 'webuploader-dnd-'; - - return Html5Runtime.register( 'DragAndDrop', { - init: function() { - var elem = this.elem = this.options.container; - - this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this ); - this.dragOverHandler = Base.bindFn( this._dragOverHandler, this ); - this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this ); - this.dropHandler = Base.bindFn( this._dropHandler, this ); - this.dndOver = false; - - elem.on( 'dragenter', this.dragEnterHandler ); - elem.on( 'dragover', this.dragOverHandler ); - elem.on( 'dragleave', this.dragLeaveHandler ); - elem.on( 'drop', this.dropHandler ); - - if ( this.options.disableGlobalDnd ) { - $( document ).on( 'dragover', this.dragOverHandler ); - $( document ).on( 'drop', this.dropHandler ); - } - }, - - _dragEnterHandler: function( e ) { - var me = this, - denied = me._denied || false, - items; - - e = e.originalEvent || e; - - if ( !me.dndOver ) { - me.dndOver = true; - - // 注意只有 chrome 支持。 - items = e.dataTransfer.items; - - if ( items && items.length ) { - me._denied = denied = !me.trigger( 'accept', items ); - } - - me.elem.addClass( prefix + 'over' ); - me.elem[ denied ? 'addClass' : - 'removeClass' ]( prefix + 'denied' ); - } - - - e.dataTransfer.dropEffect = denied ? 'none' : 'copy'; - - return false; - }, - - _dragOverHandler: function( e ) { - // 只处理框内的。 - var parentElem = this.elem.parent().get( 0 ); - if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) { - return false; - } - - clearTimeout( this._leaveTimer ); - this._dragEnterHandler.call( this, e ); - - return false; - }, - - _dragLeaveHandler: function() { - var me = this, - handler; - - handler = function() { - me.dndOver = false; - me.elem.removeClass( prefix + 'over ' + prefix + 'denied' ); - }; - - clearTimeout( me._leaveTimer ); - me._leaveTimer = setTimeout( handler, 100 ); - return false; - }, - - _dropHandler: function( e ) { - var me = this, - ruid = me.getRuid(), - parentElem = me.elem.parent().get( 0 ); - - // 只处理框内的。 - if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) { - return false; - } - - me._getTansferFiles( e, function( results ) { - me.trigger( 'drop', $.map( results, function( file ) { - return new File( ruid, file ); - }) ); - }); - - me.dndOver = false; - me.elem.removeClass( prefix + 'over' ); - return false; - }, - - // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。 - _getTansferFiles: function( e, callback ) { - var results = [], - promises = [], - items, files, dataTransfer, file, item, i, len, canAccessFolder; - - e = e.originalEvent || e; - - dataTransfer = e.dataTransfer; - items = dataTransfer.items; - files = dataTransfer.files; - - canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry); - - for ( i = 0, len = files.length; i < len; i++ ) { - file = files[ i ]; - item = items && items[ i ]; - - if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) { - - promises.push( this._traverseDirectoryTree( - item.webkitGetAsEntry(), results ) ); - } else { - results.push( file ); - } - } - - Base.when.apply( Base, promises ).done(function() { - - if ( !results.length ) { - return; - } - - callback( results ); - }); - }, - - _traverseDirectoryTree: function( entry, results ) { - var deferred = Base.Deferred(), - me = this; - - if ( entry.isFile ) { - entry.file(function( file ) { - results.push( file ); - deferred.resolve(); - }); - } else if ( entry.isDirectory ) { - entry.createReader().readEntries(function( entries ) { - var len = entries.length, - promises = [], - arr = [], // 为了保证顺序。 - i; - - for ( i = 0; i < len; i++ ) { - promises.push( me._traverseDirectoryTree( - entries[ i ], arr ) ); - } - - Base.when.apply( Base, promises ).then(function() { - results.push.apply( results, arr ); - deferred.resolve(); - }, deferred.reject ); - }); - } - - return deferred.promise(); - }, - - destroy: function() { - var elem = this.elem; - - elem.off( 'dragenter', this.dragEnterHandler ); - elem.off( 'dragover', this.dragEnterHandler ); - elem.off( 'dragleave', this.dragLeaveHandler ); - elem.off( 'drop', this.dropHandler ); - - if ( this.options.disableGlobalDnd ) { - $( document ).off( 'dragover', this.dragOverHandler ); - $( document ).off( 'drop', this.dropHandler ); - } - } - }); - }); - - /** - * @fileOverview FilePaste - */ - define('runtime/html5/filepaste',[ - 'base', - 'runtime/html5/runtime', - 'lib/file' - ], function( Base, Html5Runtime, File ) { - - return Html5Runtime.register( 'FilePaste', { - init: function() { - var opts = this.options, - elem = this.elem = opts.container, - accept = '.*', - arr, i, len, item; - - // accetp的mimeTypes中生成匹配正则。 - if ( opts.accept ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - item = opts.accept[ i ].mimeTypes; - item && arr.push( item ); - } - - if ( arr.length ) { - accept = arr.join(','); - accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' ); - } - } - this.accept = accept = new RegExp( accept, 'i' ); - this.hander = Base.bindFn( this._pasteHander, this ); - elem.on( 'paste', this.hander ); - }, - - _pasteHander: function( e ) { - var allowed = [], - ruid = this.getRuid(), - items, item, blob, i, len; - - e = e.originalEvent || e; - items = e.clipboardData.items; - - for ( i = 0, len = items.length; i < len; i++ ) { - item = items[ i ]; - - if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) { - continue; - } - - allowed.push( new File( ruid, blob ) ); - } - - if ( allowed.length ) { - // 不阻止非文件粘贴(文字粘贴)的事件冒泡 - e.preventDefault(); - e.stopPropagation(); - this.trigger( 'paste', allowed ); - } - }, - - destroy: function() { - this.elem.off( 'paste', this.hander ); - } - }); - }); - - /** - * @fileOverview FilePicker - */ - define('runtime/html5/filepicker',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var $ = Base.$; - - return Html5Runtime.register( 'FilePicker', { - init: function() { - var container = this.getRuntime().getContainer(), - me = this, - owner = me.owner, - opts = me.options, - lable = $( document.createElement('label') ), - input = $( document.createElement('input') ), - arr, i, len, mouseHandler; - - input.attr( 'type', 'file' ); - input.attr( 'name', opts.name ); - input.addClass('webuploader-element-invisible'); - - lable.on( 'click', function() { - input.trigger('click'); - }); - - lable.css({ - opacity: 0, - width: '100%', - height: '100%', - display: 'block', - cursor: 'pointer', - background: '#ffffff' - }); - - if ( opts.multiple ) { - input.attr( 'multiple', 'multiple' ); - } - - // @todo Firefox不支持单独指定后缀 - if ( opts.accept && opts.accept.length > 0 ) { - arr = []; - - for ( i = 0, len = opts.accept.length; i < len; i++ ) { - arr.push( opts.accept[ i ].mimeTypes ); - } - - input.attr( 'accept', arr.join(',') ); - } - - container.append( input ); - container.append( lable ); - - mouseHandler = function( e ) { - owner.trigger( e.type ); - }; - - input.on( 'change', function( e ) { - var fn = arguments.callee, - clone; - - me.files = e.target.files; - - // reset input - clone = this.cloneNode( true ); - this.parentNode.replaceChild( clone, this ); - - input.off(); - input = $( clone ).on( 'change', fn ) - .on( 'mouseenter mouseleave', mouseHandler ); - - owner.trigger('change'); - }); - - lable.on( 'mouseenter mouseleave', mouseHandler ); - - }, - - - getFiles: function() { - return this.files; - }, - - destroy: function() { - // todo - } - }); - }); - /** - * @fileOverview Transport - * @todo 支持chunked传输,优势: - * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分, - * 而不需要重头再传一次。另外断点续传也需要用chunked方式。 - */ - define('runtime/html5/transport',[ - 'base', - 'runtime/html5/runtime' - ], function( Base, Html5Runtime ) { - - var noop = Base.noop, - $ = Base.$; - - return Html5Runtime.register( 'Transport', { - init: function() { - this._status = 0; - this._response = null; - }, - - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - formData, binary, fr; - - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); - - binary = blob.getSource(); - } else { - formData = new FormData(); - $.each( owner._formData, function( k, v ) { - formData.append( k, v ); - }); - - formData.append( opts.fileVal, blob.getSource(), - opts.filename || owner._formData.name || '' ); - } - - if ( opts.withCredentials && 'withCredentials' in xhr ) { - xhr.open( opts.method, server, true ); - xhr.withCredentials = true; - } else { - xhr.open( opts.method, server ); - } - - this._setRequestHeader( xhr, opts.headers ); - - if ( binary ) { - xhr.overrideMimeType('application/octet-stream'); - - // android直接发送blob会导致服务端接收到的是空文件。 - // bug详情。 - // https://code.google.com/p/android/issues/detail?id=39882 - // 所以先用fileReader读取出来再通过arraybuffer的方式发送。 - if ( Base.os.android ) { - fr = new FileReader(); - - fr.onload = function() { - xhr.send( this.result ); - fr = fr.onload = null; - }; - - fr.readAsArrayBuffer( binary ); - } else { - xhr.send( binary ); - } - } else { - xhr.send( formData ); - } - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._parseJson( this._response ); - }, - - getStatus: function() { - return this._status; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - xhr.abort(); - - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new XMLHttpRequest(), - opts = this.options; - - if ( opts.withCredentials && !('withCredentials' in xhr) && - typeof XDomainRequest !== 'undefined' ) { - xhr = new XDomainRequest(); - } - - xhr.upload.onprogress = function( e ) { - var percentage = 0; - - if ( e.lengthComputable ) { - percentage = e.loaded / e.total; - } - - return me.trigger( 'progress', percentage ); - }; - - xhr.onreadystatechange = function() { - - if ( xhr.readyState !== 4 ) { - return; - } - - xhr.upload.onprogress = noop; - xhr.onreadystatechange = noop; - me._xhr = null; - me._status = xhr.status; - - if ( xhr.status >= 200 && xhr.status < 300 ) { - me._response = xhr.responseText; - return me.trigger('load'); - } else if ( xhr.status >= 500 && xhr.status < 600 ) { - me._response = xhr.responseText; - return me.trigger( 'error', 'server' ); - } - - - return me.trigger( 'error', me._status ? 'http' : 'abort' ); - }; - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.setRequestHeader( key, val ); - }); - }, - - _parseJson: function( str ) { - var json; - - try { - json = JSON.parse( str ); - } catch ( ex ) { - json = {}; - } - - return json; - } - }); - }); - /** - * @fileOverview FlashRuntime - */ - define('runtime/flash/runtime',[ - 'base', - 'runtime/runtime', - 'runtime/compbase' - ], function( Base, Runtime, CompBase ) { - - var $ = Base.$, - type = 'flash', - components = {}; - - - function getFlashVersion() { - var version; - - try { - version = navigator.plugins[ 'Shockwave Flash' ]; - version = version.description; - } catch ( ex ) { - try { - version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash') - .GetVariable('$version'); - } catch ( ex2 ) { - version = '0.0'; - } - } - version = version.match( /\d+/g ); - return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 ); - } - - function FlashRuntime() { - var pool = {}, - clients = {}, - destory = this.destory, - me = this, - jsreciver = Base.guid('webuploader_'); - - Runtime.apply( me, arguments ); - me.type = type; - - - // 这个方法的调用者,实际上是RuntimeClient - me.exec = function( comp, fn/*, args...*/ ) { - var client = this, - uid = client.uid, - args = Base.slice( arguments, 2 ), - instance; - - clients[ uid ] = client; - - if ( components[ comp ] ) { - if ( !pool[ uid ] ) { - pool[ uid ] = new components[ comp ]( client, me ); - } - - instance = pool[ uid ]; - - if ( instance[ fn ] ) { - return instance[ fn ].apply( instance, args ); - } - } - - return me.flashExec.apply( client, arguments ); - }; - - function handler( evt, obj ) { - var type = evt.type || evt, - parts, uid; - - parts = type.split('::'); - uid = parts[ 0 ]; - type = parts[ 1 ]; - - // console.log.apply( console, arguments ); - - if ( type === 'Ready' && uid === me.uid ) { - me.trigger('ready'); - } else if ( clients[ uid ] ) { - clients[ uid ].trigger( type.toLowerCase(), evt, obj ); - } - - // Base.log( evt, obj ); - } - - // flash的接受器。 - window[ jsreciver ] = function() { - var args = arguments; - - // 为了能捕获得到。 - setTimeout(function() { - handler.apply( null, args ); - }, 1 ); - }; - - this.jsreciver = jsreciver; - - this.destory = function() { - // @todo 删除池子中的所有实例 - return destory && destory.apply( this, arguments ); - }; - - this.flashExec = function( comp, fn ) { - var flash = me.getFlash(), - args = Base.slice( arguments, 2 ); - - return flash.exec( this.uid, comp, fn, args ); - }; - - // @todo - } - - Base.inherits( Runtime, { - constructor: FlashRuntime, - - init: function() { - var container = this.getContainer(), - opts = this.options, - html; - - // if not the minimal height, shims are not initialized - // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc) - container.css({ - position: 'absolute', - top: '-8px', - left: '-8px', - width: '9px', - height: '9px', - overflow: 'hidden' - }); - - // insert flash object - html = '' + - '' + - '' + - '' + - ''; - - container.html( html ); - }, - - getFlash: function() { - if ( this._flash ) { - return this._flash; - } - - this._flash = $( '#' + this.uid ).get( 0 ); - return this._flash; - } - - }); - - FlashRuntime.register = function( name, component ) { - component = components[ name ] = Base.inherits( CompBase, $.extend({ - - // @todo fix this later - flashExec: function() { - var owner = this.owner, - runtime = this.getRuntime(); - - return runtime.flashExec.apply( owner, arguments ); - } - }, component ) ); - - return component; - }; - - if ( getFlashVersion() >= 11.4 ) { - Runtime.addRuntime( type, FlashRuntime ); - } - - return FlashRuntime; - }); - /** - * @fileOverview FilePicker - */ - define('runtime/flash/filepicker',[ - 'base', - 'runtime/flash/runtime' - ], function( Base, FlashRuntime ) { - var $ = Base.$; - - return FlashRuntime.register( 'FilePicker', { - init: function( opts ) { - var copy = $.extend({}, opts ), - len, i; - - // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug. - len = copy.accept && copy.accept.length; - for ( i = 0; i < len; i++ ) { - if ( !copy.accept[ i ].title ) { - copy.accept[ i ].title = 'Files'; - } - } - - delete copy.button; - delete copy.container; - - this.flashExec( 'FilePicker', 'init', copy ); - }, - - destroy: function() { - // todo - } - }); - }); - /** - * @fileOverview Transport flash实现 - */ - define('runtime/flash/transport',[ - 'base', - 'runtime/flash/runtime', - 'runtime/client' - ], function( Base, FlashRuntime, RuntimeClient ) { - var $ = Base.$; - - return FlashRuntime.register( 'Transport', { - init: function() { - this._status = 0; - this._response = null; - this._responseJson = null; - }, - - send: function() { - var owner = this.owner, - opts = this.options, - xhr = this._initAjax(), - blob = owner._blob, - server = opts.server, - binary; - - xhr.connectRuntime( blob.ruid ); - - if ( opts.sendAsBinary ) { - server += (/\?/.test( server ) ? '&' : '?') + - $.param( owner._formData ); - - binary = blob.uid; - } else { - $.each( owner._formData, function( k, v ) { - xhr.exec( 'append', k, v ); - }); - - xhr.exec( 'appendBlob', opts.fileVal, blob.uid, - opts.filename || owner._formData.name || '' ); - } - - this._setRequestHeader( xhr, opts.headers ); - xhr.exec( 'send', { - method: opts.method, - url: server - }, binary ); - }, - - getStatus: function() { - return this._status; - }, - - getResponse: function() { - return this._response; - }, - - getResponseAsJson: function() { - return this._responseJson; - }, - - abort: function() { - var xhr = this._xhr; - - if ( xhr ) { - xhr.exec('abort'); - xhr.destroy(); - this._xhr = xhr = null; - } - }, - - destroy: function() { - this.abort(); - }, - - _initAjax: function() { - var me = this, - xhr = new RuntimeClient('XMLHttpRequest'); - - xhr.on( 'uploadprogress progress', function( e ) { - return me.trigger( 'progress', e.loaded / e.total ); - }); - - xhr.on( 'load', function() { - var status = xhr.exec('getStatus'), - err = ''; - - xhr.off(); - me._xhr = null; - - if ( status >= 200 && status < 300 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - } else if ( status >= 500 && status < 600 ) { - me._response = xhr.exec('getResponse'); - me._responseJson = xhr.exec('getResponseAsJson'); - err = 'server'; - } else { - err = 'http'; - } - - xhr.destroy(); - xhr = null; - - return err ? me.trigger( 'error', err ) : me.trigger('load'); - }); - - xhr.on( 'error', function() { - xhr.off(); - me._xhr = null; - me.trigger( 'error', 'http' ); - }); - - me._xhr = xhr; - return xhr; - }, - - _setRequestHeader: function( xhr, headers ) { - $.each( headers, function( key, val ) { - xhr.exec( 'setRequestHeader', key, val ); - }); - } - }); - }); - /** - * @fileOverview 没有图像处理的版本。 - */ - define('preset/withoutimage',[ - 'base', - - // widgets - 'widgets/filednd', - 'widgets/filepaste', - 'widgets/filepicker', - 'widgets/queue', - 'widgets/runtime', - 'widgets/upload', - 'widgets/validator', - - // runtimes - // html5 - 'runtime/html5/blob', - 'runtime/html5/dnd', - 'runtime/html5/filepaste', - 'runtime/html5/filepicker', - 'runtime/html5/transport', - - // flash - 'runtime/flash/filepicker', - 'runtime/flash/transport' - ], function( Base ) { - return Base; - }); - define('webuploader',[ - 'preset/withoutimage' - ], function( preset ) { - return preset; - }); - return require('webuploader'); -}); diff --git a/public/js/ueditor/ueditor.all.js b/public/js/ueditor/ueditor.all.js index b703f6d..6728cb5 100644 --- a/public/js/ueditor/ueditor.all.js +++ b/public/js/ueditor/ueditor.all.js @@ -12,12 +12,19 @@ var baidu = window.baidu || {}; window.baidu = baidu; window.UE = baidu.editor = { - plugins: {}, - commands: {}, - instants: {}, - I18N: {}, - _customizeUI: {}, - version: "2.6.0" + plugins: {}, + commands: {}, + instants: {}, + I18N: {}, + _customizeUI: {}, + version: "4.1.0", + constants: { + STATEFUL: { + DISABLED: -1, + OFF: 0, + ON: 1, + }, + } }; var dom = (UE.dom = {}); @@ -35,99 +42,99 @@ var dom = (UE.dom = {}); * @unfile * @module UE.browser */ -var browser = (UE.browser = (function() { - var agent = navigator.userAgent.toLowerCase(), - opera = window.opera, - browser = { - /** - * @property {boolean} ie 检测当前浏览器是否为IE - * @example - * ```javascript - * if ( UE.browser.ie ) { - * console.log( '当前浏览器是IE' ); - * } - * ``` - */ - ie: /(msie\s|trident.*rv:)([\w.]+)/i.test(agent), +var browser = (UE.browser = (function () { + var agent = navigator.userAgent.toLowerCase(), + opera = window.opera, + browser = { + /** + * @property {boolean} ie 检测当前浏览器是否为IE + * @example + * ```javascript + * if ( UE.browser.ie ) { + * console.log( '当前浏览器是IE' ); + * } + * ``` + */ + ie: /(msie\s|trident.*rv:)([\w.]+)/i.test(agent), - /** - * @property {boolean} opera 检测当前浏览器是否为Opera - * @example - * ```javascript - * if ( UE.browser.opera ) { - * console.log( '当前浏览器是Opera' ); - * } - * ``` - */ - opera: !!opera && opera.version, + /** + * @property {boolean} opera 检测当前浏览器是否为Opera + * @example + * ```javascript + * if ( UE.browser.opera ) { + * console.log( '当前浏览器是Opera' ); + * } + * ``` + */ + opera: !!opera && opera.version, - /** - * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器 - * @example - * ```javascript - * if ( UE.browser.webkit ) { - * console.log( '当前浏览器是webkit内核浏览器' ); - * } - * ``` - */ - webkit: agent.indexOf(" applewebkit/") > -1, + /** + * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器 + * @example + * ```javascript + * if ( UE.browser.webkit ) { + * console.log( '当前浏览器是webkit内核浏览器' ); + * } + * ``` + */ + webkit: agent.indexOf(" applewebkit/") > -1, - /** - * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下 - * @example - * ```javascript - * if ( UE.browser.mac ) { - * console.log( '当前浏览器运行在mac平台下' ); - * } - * ``` - */ - mac: agent.indexOf("macintosh") > -1, + /** + * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下 + * @example + * ```javascript + * if ( UE.browser.mac ) { + * console.log( '当前浏览器运行在mac平台下' ); + * } + * ``` + */ + mac: agent.indexOf("macintosh") > -1, - /** - * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下 - * @example - * ```javascript - * if ( UE.browser.quirks ) { - * console.log( '当前浏览器运行处于“怪异模式”' ); - * } - * ``` - */ - quirks: document.compatMode == "BackCompat" - }; + /** + * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下 + * @example + * ```javascript + * if ( UE.browser.quirks ) { + * console.log( '当前浏览器运行处于“怪异模式”' ); + * } + * ``` + */ + quirks: document.compatMode == "BackCompat" + }; - /** - * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核 - * @example - * ```javascript - * if ( UE.browser.gecko ) { - * console.log( '当前浏览器内核是gecko内核' ); - * } - * ``` - */ - browser.gecko = - navigator.product == "Gecko" && - !browser.webkit && - !browser.opera && - !browser.ie; - - var version = 0; - - // Internet Explorer 6.0+ - if (browser.ie) { - var v1 = agent.match(/(?:msie\s([\w.]+))/); - var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); - if (v1 && v2 && v1[1] && v2[1]) { - version = Math.max(v1[1] * 1, v2[1] * 1); - } else if (v1 && v1[1]) { - version = v1[1] * 1; - } else if (v2 && v2[1]) { - version = v2[1] * 1; - } else { - version = 0; - } - - browser.ie11Compat = document.documentMode == 11; /** + * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核 + * @example + * ```javascript + * if ( UE.browser.gecko ) { + * console.log( '当前浏览器内核是gecko内核' ); + * } + * ``` + */ + browser.gecko = + navigator.product == "Gecko" && + !browser.webkit && + !browser.opera && + !browser.ie; + + var version = 0; + + // Internet Explorer 6.0+ + if (browser.ie) { + var v1 = agent.match(/(?:msie\s([\w.]+))/); + var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); + if (v1 && v2 && v1[1] && v2[1]) { + version = Math.max(v1[1] * 1, v2[1] * 1); + } else if (v1 && v1[1]) { + version = v1[1] * 1; + } else if (v2 && v2[1]) { + version = v2[1] * 1; + } else { + version = 0; + } + + browser.ie11Compat = document.documentMode == 11; + /** * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式 * @warning 如果浏览器不是IE, 则该值为undefined * @example @@ -137,9 +144,9 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.ie9Compat = document.documentMode == 9; + browser.ie9Compat = document.documentMode == 9; - /** + /** * @property { boolean } ie8 检测浏览器是否是IE8浏览器 * @warning 如果浏览器不是IE, 则该值为undefined * @example @@ -149,9 +156,9 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.ie8 = !!document.documentMode; + browser.ie8 = !!document.documentMode; - /** + /** * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式 * @warning 如果浏览器不是IE, 则该值为undefined * @example @@ -161,9 +168,9 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.ie8Compat = document.documentMode == 8; + browser.ie8Compat = document.documentMode == 8; - /** + /** * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式 * @warning 如果浏览器不是IE, 则该值为undefined * @example @@ -173,10 +180,10 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.ie7Compat = - (version == 7 && !document.documentMode) || document.documentMode == 7; + browser.ie7Compat = + (version == 7 && !document.documentMode) || document.documentMode == 7; - /** + /** * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式 * @warning 如果浏览器不是IE, 则该值为undefined * @example @@ -186,30 +193,30 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.ie6Compat = version < 7 || browser.quirks; + browser.ie6Compat = version < 7 || browser.quirks; - browser.ie9above = version > 8; + browser.ie9above = version > 8; - browser.ie9below = version < 9; + browser.ie9below = version < 9; - browser.ie11above = version > 10; + browser.ie11above = version > 10; - browser.ie11below = version < 11; - } - - // Gecko. - if (browser.gecko) { - var geckoRelease = agent.match(/rv:([\d\.]+)/); - if (geckoRelease) { - geckoRelease = geckoRelease[1].split("."); - version = - geckoRelease[0] * 10000 + - (geckoRelease[1] || 0) * 100 + - (geckoRelease[2] || 0) * 1; + browser.ie11below = version < 11; } - } - /** + // Gecko. + if (browser.gecko) { + var geckoRelease = agent.match(/rv:([\d\.]+)/); + if (geckoRelease) { + geckoRelease = geckoRelease[1].split("."); + version = + geckoRelease[0] * 10000 + + (geckoRelease[1] || 0) * 100 + + (geckoRelease[2] || 0) * 1; + } + } + + /** * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号 * @warning 如果浏览器不是chrome, 则该值为undefined * @example @@ -219,11 +226,11 @@ var browser = (UE.browser = (function() { * } * ``` */ - if (/chrome\/(\d+\.\d)/i.test(agent)) { - browser.chrome = +RegExp["\x241"]; - } + if (/chrome\/(\d+\.\d)/i.test(agent)) { + browser.chrome = +RegExp["\x241"]; + } - /** + /** * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号 * @warning 如果浏览器不是safari, 则该值为undefined * @example @@ -233,21 +240,21 @@ var browser = (UE.browser = (function() { * } * ``` */ - if ( - /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && - !/chrome/i.test(agent) - ) { - browser.safari = +(RegExp["\x241"] || RegExp["\x242"]); - } + if ( + /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && + !/chrome/i.test(agent) + ) { + browser.safari = +(RegExp["\x241"] || RegExp["\x242"]); + } - // Opera 9.50+ - if (browser.opera) version = parseFloat(opera.version()); + // Opera 9.50+ + if (browser.opera) version = parseFloat(opera.version()); - // WebKit 522+ (Safari 3+) - if (browser.webkit) - version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); + // WebKit 522+ (Safari 3+) + if (browser.webkit) + version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); - /** + /** * @property { Number } version 检测当前浏览器版本号 * @remind *
      @@ -260,9 +267,9 @@ var browser = (UE.browser = (function() { * console.log( '当前浏览器版本号是: ' + UE.browser.version ); * ``` */ - browser.version = version; + browser.version = version; - /** + /** * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容 * @example * ```javascript @@ -271,21 +278,21 @@ var browser = (UE.browser = (function() { * } * ``` */ - browser.isCompatible = - !browser.mobile && - ((browser.ie && version >= 6) || - (browser.gecko && version >= 10801) || - (browser.opera && version >= 9.5) || - (browser.air && version >= 1) || - (browser.webkit && version >= 522) || - false); - return browser; + browser.isCompatible = + !browser.mobile && + ((browser.ie && version >= 6) || + (browser.gecko && version >= 10801) || + (browser.opera && version >= 9.5) || + (browser.air && version >= 1) || + (browser.webkit && version >= 522) || + false); + return browser; })()); //快捷方式 var ie = browser.ie, - webkit = browser.webkit, - gecko = browser.gecko, - opera = browser.opera; + webkit = browser.webkit, + gecko = browser.gecko, + opera = browser.opera; // core/utils.js @@ -303,7 +310,7 @@ var ie = browser.ie, */ var utils = (UE.utils = { - /** + /** * 用给定的迭代器遍历对象 * @method each * @param { Object } obj 需要遍历的对象 @@ -324,7 +331,7 @@ var utils = (UE.utils = { * ``` */ - /** + /** * 用给定的迭代器遍历数组或类数组对象 * @method each * @param { Array } array 需要遍历的数组或者类数组 @@ -341,23 +348,23 @@ var utils = (UE.utils = { * } ); * ``` */ - each: function(obj, iterator, context) { - if (obj == null) return; - if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (iterator.call(context, obj[i], i, obj) === false) return false; - } - } else { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - if (iterator.call(context, obj[key], key, obj) === false) - return false; + each: function (obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if (iterator.call(context, obj[i], i, obj) === false) return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if (iterator.call(context, obj[key], key, obj) === false) + return false; + } + } } - } - } - }, + }, - /** + /** * 以给定对象作为原型创建一个新对象 * @method makeInstance * @param { Object } protoObject 该对象将作为新创建对象的原型 @@ -372,37 +379,37 @@ var utils = (UE.utils = { * newObject.sayHello(); * ``` */ - makeInstance: function(obj) { - var noop = new Function(); - noop.prototype = obj; - obj = new noop(); - noop.prototype = null; - return obj; - }, + makeInstance: function (obj) { + var noop = new Function(); + noop.prototype = obj; + obj = new noop(); + noop.prototype = null; + return obj; + }, - /** - * 将source对象中的属性扩展到target对象上 - * @method extend - * @remind 该方法将强制把source对象上的属性复制到target对象上 - * @see UE.utils.extend(Object,Object,Boolean) - * @param { Object } target 目标对象, 新的属性将附加到该对象上 - * @param { Object } source 源对象, 该对象的属性会被附加到target对象上 - * @return { Object } 返回target对象 - * @example - * ```javascript - * - * var target = { name: 'target', sex: 1 }, - * source = { name: 'source', age: 17 }; - * - * UE.utils.extend( target, source ); - * - * //output: { name: 'source', sex: 1, age: 17 } - * console.log( target ); - * - * ``` - */ + isObject: function (item) { + return (item && typeof item === 'object' && !Array.isArray(item)); + }, - /** + merge: function (target, source) { + var output = Object.assign({}, target); + if (this.isObject(target) && this.isObject(source)) { + Object.keys(source).forEach(key => { + if (this.isObject(source[key])) { + if (!(key in target)) { + Object.assign(output, {[key]: source[key]}); + } else { + output[key] = this.merge(target[key], source[key]); + } + } else { + Object.assign(output, {[key]: source[key]}); + } + }); + } + return output; + }, + + /** * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与 * 源对象属性名相同的属性值。 * @method extend @@ -423,18 +430,18 @@ var utils = (UE.utils = { * * ``` */ - extend: function(t, s, b) { - if (s) { - for (var k in s) { - if (!b || !t.hasOwnProperty(k)) { - t[k] = s[k]; + extend: function (t, s, b) { + if (s) { + for (var k in s) { + if (!b || !t.hasOwnProperty(k)) { + t[k] = s[k]; + } + } } - } - } - return t; - }, + return t; + }, - /** + /** * 将给定的多个对象的属性复制到目标对象target上 * @method extend2 * @remind 该方法将强制把源对象上的属性复制到target对象上 @@ -457,20 +464,20 @@ var utils = (UE.utils = { * * ``` */ - extend2: function(t) { - var a = arguments; - for (var i = 1; i < a.length; i++) { - var x = a[i]; - for (var k in x) { - if (!t.hasOwnProperty(k)) { - t[k] = x[k]; + extend2: function (t) { + var a = arguments; + for (var i = 1; i < a.length; i++) { + var x = a[i]; + for (var k in x) { + if (!t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } } - } - } - return t; - }, + return t; + }, - /** + /** * 模拟继承机制, 使得subClass继承自superClass * @method inherits * @param { Object } subClass 子类对象 @@ -500,15 +507,15 @@ var utils = (UE.utils = { * sub.hello("早上好!"); * ``` */ - inherits: function(subClass, superClass) { - var oldP = subClass.prototype, - newP = utils.makeInstance(superClass.prototype); - utils.extend(newP, oldP, true); - subClass.prototype = newP; - return (newP.constructor = subClass); - }, + inherits: function (subClass, superClass) { + var oldP = subClass.prototype, + newP = utils.makeInstance(superClass.prototype); + utils.extend(newP, oldP, true); + subClass.prototype = newP; + return (newP.constructor = subClass); + }, - /** + /** * 用指定的context对象作为函数fn的上下文 * @method bind * @param { Function } fn 需要绑定上下文的函数对象 @@ -534,13 +541,13 @@ var utils = (UE.utils = { * * ``` */ - bind: function(fn, context) { - return function() { - return fn.apply(context, arguments); - }; - }, + bind: function (fn, context) { + return function () { + return fn.apply(context, arguments); + }; + }, - /** + /** * 创建延迟指定时间后执行的函数fn * @method defer * @param { Function } fn 需要延迟执行的函数对象 @@ -564,7 +571,7 @@ var utils = (UE.utils = { * ``` */ - /** + /** * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值, * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。 * @method defer @@ -589,17 +596,17 @@ var utils = (UE.utils = { * testDefer(); * ``` */ - defer: function(fn, delay, exclusion) { - var timerID; - return function() { - if (exclusion) { - clearTimeout(timerID); - } - timerID = setTimeout(fn, delay); - }; - }, + defer: function (fn, delay, exclusion) { + var timerID; + return function () { + if (exclusion) { + clearTimeout(timerID); + } + timerID = setTimeout(fn, delay); + }; + }, - /** + /** * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1 * @method indexOf * @remind 该方法的匹配过程使用的是恒等“===” @@ -616,7 +623,7 @@ var utils = (UE.utils = { * ``` */ - /** + /** * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。 * @method indexOf * @remind 该方法的匹配过程使用的是恒等“===” @@ -633,19 +640,19 @@ var utils = (UE.utils = { * console.log( UE.utils.indexOf( arr, item, 5 ) ); * ``` */ - indexOf: function(array, item, start) { - var index = -1; - start = this.isNumber(start) ? start : 0; - this.each(array, function(v, i) { - if (i >= start && v === item) { - index = i; - return false; - } - }); - return index; - }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, - /** + /** * 移除数组array中所有的元素item * @method removeItem * @param { Array } array 要移除元素的目标数组 @@ -661,16 +668,16 @@ var utils = (UE.utils = { * * ``` */ - removeItem: function(array, item) { - for (var i = 0, l = array.length; i < l; i++) { - if (array[i] === item) { - array.splice(i, 1); - i--; - } - } - }, + removeItem: function (array, item) { + for (var i = 0, l = array.length; i < l; i++) { + if (array[i] === item) { + array.splice(i, 1); + i--; + } + } + }, - /** + /** * 删除字符串str的首尾空格 * @method trim * @param { String } str 需要删除首尾空格的字符串 @@ -691,11 +698,11 @@ var utils = (UE.utils = { * * ``` */ - trim: function(str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); - }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); + }, - /** + /** * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 * @method listToMap * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 @@ -710,7 +717,7 @@ var utils = (UE.utils = { * ``` */ - /** + /** * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 * @method listToMap * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 @@ -724,16 +731,16 @@ var utils = (UE.utils = { * * ``` */ - listToMap: function(list) { - if (!list) return {}; - list = utils.isArray(list) ? list : list.split(","); - for (var i = 0, ci, obj = {}; (ci = list[i++]); ) { - obj[ci.toUpperCase()] = obj[ci] = 1; - } - return obj; - }, + listToMap: function (list) { + if (!list) return {}; + list = utils.isArray(list) ? list : list.split(","); + for (var i = 0, ci, obj = {}; (ci = list[i++]);) { + obj[ci.toUpperCase()] = obj[ci] = 1; + } + return obj; + }, - /** + /** * 将str中的html符号转义,将转义“',&,<,",>,”,“”七个字符 * @method unhtml * @param { String } str 需要转义的字符串 @@ -747,30 +754,30 @@ var utils = (UE.utils = { * * ``` */ - unhtml: function(str, reg) { - return str - ? str.replace( - reg || /[&<">'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g, - function(a, b) { - if (b) { - return a; - } else { - return { - "<": "<", - "&": "&", - '"': """, - "“": "“", - "”": "”", - ">": ">", - "'": "'" - }[a]; - } - } - ) - : ""; - }, + unhtml: function (str, reg) { + return str + ? str.replace( + reg || /[&<">'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g, + function (a, b) { + if (b) { + return a; + } else { + return { + "<": "<", + "&": "&", + '"': """, + "“": "“", + "”": "”", + ">": ">", + "'": "'" + }[a]; + } + } + ) + : ""; + }, - /** + /** * 将str中的转义字符还原成html字符 * @see UE.utils.unhtml(String); * @method html @@ -786,24 +793,24 @@ var utils = (UE.utils = { * * ``` */ - html: function(str) { - return str - ? str.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g, function(m) { - return { - "<": "<", - "&": "&", - """: '"', - "“": "“", - "”": "”", - ">": ">", - "'": "'", - " ": " " - }[m]; - }) - : ""; - }, + html: function (str) { + return str + ? str.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g, function (m) { + return { + "<": "<", + "&": "&", + """: '"', + "“": "“", + "”": "”", + ">": ">", + "'": "'", + " ": " " + }[m]; + }) + : ""; + }, - /** + /** * 将css样式转换为驼峰的形式 * @method cssStyleToDomStyle * @param { String } cssName 需要转换的css样式名 @@ -818,25 +825,25 @@ var utils = (UE.utils = { * * ``` */ - cssStyleToDomStyle: (function() { - var test = document.createElement("div").style, - cache = { - float: test.cssFloat != undefined - ? "cssFloat" - : test.styleFloat != undefined ? "styleFloat" : "float" - }; + cssStyleToDomStyle: (function () { + var test = document.createElement("div").style, + cache = { + float: test.cssFloat !== undefined + ? "cssFloat" + : test.styleFloat !== undefined ? "styleFloat" : "float" + }; - return function(cssName) { - return ( - cache[cssName] || - (cache[cssName] = cssName.toLowerCase().replace(/-./g, function(match) { - return match.charAt(1).toUpperCase(); - })) - ); - }; - })(), + return function (cssName) { + return ( + cache[cssName] || + (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) { + return match.charAt(1).toUpperCase(); + })) + ); + }; + })(), - /** + /** * 动态加载文件到doc中 * @method loadFile * @param { DomDocument } document 需要加载资源文件的文档对象 @@ -854,7 +861,7 @@ var utils = (UE.utils = { * ``` */ - /** + /** * 动态加载文件到doc中,加载成功后执行的回调函数fn * @method loadFile * @param { DomDocument } document 需要加载资源文件的文档对象 @@ -876,79 +883,79 @@ var utils = (UE.utils = { * * ``` */ - loadFile: (function() { - var tmpList = []; + loadFile: (function () { + var tmpList = []; - function getItem(doc, obj) { - try { - for (var i = 0, ci; (ci = tmpList[i++]); ) { - if (ci.doc === doc && ci.url == (obj.src || obj.href)) { - return ci; - } - } - } catch (e) { - return null; - } - } - - return function(doc, obj, fn) { - var item = getItem(doc, obj); - if (item) { - if (item.ready) { - fn && fn(); - } else { - item.funs.push(fn); - } - return; - } - tmpList.push({ - doc: doc, - url: obj.src || obj.href, - funs: [fn] - }); - if (!doc.body) { - var html = []; - for (var p in obj) { - if (p == "tag") continue; - html.push(p + '="' + obj[p] + '"'); - } - doc.write( - "<" + obj.tag + " " + html.join(" ") + " >" - ); - return; - } - if (obj.id && doc.getElementById(obj.id)) { - return; - } - var element = doc.createElement(obj.tag); - delete obj.tag; - for (var p in obj) { - element.setAttribute(p, obj[p]); - } - element.onload = element.onreadystatechange = function() { - if (!this.readyState || /loaded|complete/.test(this.readyState)) { - item = getItem(doc, obj); - if (item.funs.length > 0) { - item.ready = 1; - for (var fi; (fi = item.funs.pop()); ) { - fi(); + function getItem(doc, obj) { + try { + for (var i = 0, ci; (ci = tmpList[i++]);) { + if (ci.doc === doc && ci.url == (obj.src || obj.href)) { + return ci; + } + } + } catch (e) { + return null; } - } - element.onload = element.onreadystatechange = null; } - }; - element.onerror = function() { - throw Error( - "The load " + - (obj.href || obj.src) + - " fails,check the url settings of file ueditor.config.js " - ); - }; - doc.getElementsByTagName("head")[0].appendChild(element); - }; - })(), - /** + return function (doc, obj, fn) { + var item = getItem(doc, obj); + if (item) { + if (item.ready) { + fn && fn(); + } else { + item.funs.push(fn); + } + return; + } + tmpList.push({ + doc: doc, + url: obj.src || obj.href, + funs: [fn] + }); + if (!doc.body) { + var html = []; + for (var p in obj) { + if (p == "tag") continue; + html.push(p + '="' + obj[p] + '"'); + } + doc.write( + "<" + obj.tag + " " + html.join(" ") + " >" + ); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc, obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; (fi = item.funs.pop());) { + fi(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function () { + throw Error( + "The load " + + (obj.href || obj.src) + + " fails,check the url settings of file ueditor.config.js " + ); + }; + doc.getElementsByTagName("head")[0].appendChild(element); + }; + })(), + + /** * 判断obj对象是否为空 * @method isEmptyObject * @param { * } obj 需要判断的对象 @@ -978,14 +985,14 @@ var utils = (UE.utils = { * * ``` */ - isEmptyObject: function(obj) { - if (obj == null) return true; - if (this.isArray(obj) || this.isString(obj)) return obj.length === 0; - for (var key in obj) if (obj.hasOwnProperty(key)) return false; - return true; - }, + isEmptyObject: function (obj) { + if (obj == null) return true; + if (this.isArray(obj) || this.isString(obj)) return obj.length === 0; + for (var key in obj) if (obj.hasOwnProperty(key)) return false; + return true; + }, - /** + /** * 把rgb格式的颜色值转换成16进制格式 * @method fixColor * @param { String } rgb格式的颜色值 @@ -993,121 +1000,121 @@ var utils = (UE.utils = { * @example * rgb(255,255,255) => "#ffffff" */ - fixColor: function(name, value) { - if (/color/i.test(name) && /rgba?/.test(value)) { - var array = value.split(","); - if (array.length > 3) return ""; - value = "#"; - for (var i = 0, color; (color = array[i++]); ) { - color = parseInt(color.replace(/[^\d]/gi, ""), 10).toString(16); - value += color.length == 1 ? "0" + color : color; - } - value = value.toUpperCase(); - } - return value; - }, - /** + fixColor: function (name, value) { + if (/color/i.test(name) && /rgba?/.test(value)) { + var array = value.split(","); + if (array.length > 3) return ""; + value = "#"; + for (var i = 0, color; (color = array[i++]);) { + color = parseInt(color.replace(/[^\d]/gi, ""), 10).toString(16); + value += color.length == 1 ? "0" + color : color; + } + value = value.toUpperCase(); + } + return value; + }, + /** * 只针对border,padding,margin做了处理,因为性能问题 * @public * @function * @param {String} val style字符串 */ - optCss: function(val) { - var padding, margin, border; - val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function( - str, - key, - name, - val - ) { - if (val.split(" ").length == 1) { - switch (key) { - case "padding": - !padding && (padding = {}); - padding[name] = val; - return ""; - case "margin": - !margin && (margin = {}); - margin[name] = val; - return ""; - case "border": - return val == "initial" ? "" : str; + optCss: function (val) { + var padding, margin, border; + val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function ( + str, + key, + name, + val + ) { + if (val.split(" ").length == 1) { + switch (key) { + case "padding": + !padding && (padding = {}); + padding[name] = val; + return ""; + case "margin": + !margin && (margin = {}); + margin[name] = val; + return ""; + case "border": + return val == "initial" ? "" : str; + } + } + return str; + }); + + function opt(obj, name) { + if (!obj) { + return ""; + } + var t = obj.top, + b = obj.bottom, + l = obj.left, + r = obj.right, + val = ""; + if (!t || !l || !b || !r) { + for (var p in obj) { + val += ";" + name + "-" + p + ":" + obj[p] + ";"; + } + } else { + val += + ";" + + name + + ":" + + (t == b && b == l && l == r + ? t + : t == b && l == r + ? t + " " + l + : l == r + ? t + " " + l + " " + b + : t + " " + r + " " + b + " " + l) + + ";"; + } + return val; } - } - return str; - }); - function opt(obj, name) { - if (!obj) { - return ""; - } - var t = obj.top, - b = obj.bottom, - l = obj.left, - r = obj.right, - val = ""; - if (!t || !l || !b || !r) { - for (var p in obj) { - val += ";" + name + "-" + p + ":" + obj[p] + ";"; - } - } else { - val += - ";" + - name + - ":" + - (t == b && b == l && l == r - ? t - : t == b && l == r - ? t + " " + l - : l == r - ? t + " " + l + " " + b - : t + " " + r + " " + b + " " + l) + - ";"; - } - return val; - } + val += opt(padding, "padding") + opt(margin, "margin"); + return val + .replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, "") + .replace(/;([ \n\r\t]+)|\1;/g, ";") + .replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (a, b) { + return b ? b + ";;" : ";"; + }); + }, - val += opt(padding, "padding") + opt(margin, "margin"); - return val - .replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, "") - .replace(/;([ \n\r\t]+)|\1;/g, ";") - .replace(/(&((l|g)t|quot|#39))?;{2,}/g, function(a, b) { - return b ? b + ";;" : ";"; - }); - }, - - /** + /** * 克隆对象 * @method clone * @param { Object } source 源对象 * @return { Object } source的一个副本 */ - /** + /** * 深度克隆对象,将source的属性克隆到target对象, 会覆盖target重名的属性。 * @method clone * @param { Object } source 源对象 * @param { Object } target 目标对象 * @return { Object } 附加了source对象所有属性的target对象 */ - clone: function(source, target) { - var tmp; - target = target || {}; - for (var i in source) { - if (source.hasOwnProperty(i)) { - tmp = source[i]; - if (typeof tmp == "object") { - target[i] = utils.isArray(tmp) ? [] : {}; - utils.clone(source[i], target[i]); - } else { - target[i] = tmp; + clone: function (source, target) { + var tmp; + target = target || {}; + for (var i in source) { + if (source.hasOwnProperty(i)) { + tmp = source[i]; + if (typeof tmp == "object") { + target[i] = utils.isArray(tmp) ? [] : {}; + utils.clone(source[i], target[i]); + } else { + target[i] = tmp; + } + } } - } - } - return target; - }, + return target; + }, - /** + /** * 把cm/pt为单位的值转换为px为单位的值 * @method transUnitToPx * @param { String } 待转换的带单位的字符串 @@ -1123,26 +1130,26 @@ var utils = (UE.utils = { * * ``` */ - transUnitToPx: function(val) { - if (!/(pt|cm)/.test(val)) { - return val; - } - var unit; - val.replace(/([\d.]+)(\w+)/, function(str, v, u) { - val = v; - unit = u; - }); - switch (unit) { - case "cm": - val = parseFloat(val) * 25; - break; - case "pt": - val = Math.round(parseFloat(val) * 96 / 72); - } - return val + (val ? "px" : ""); - }, + transUnitToPx: function (val) { + if (!/(pt|cm)/.test(val)) { + return val; + } + var unit; + val.replace(/([\d.]+)(\w+)/, function (str, v, u) { + val = v; + unit = u; + }); + switch (unit) { + case "cm": + val = parseFloat(val) * 25; + break; + case "pt": + val = Math.round(parseFloat(val) * 96 / 72); + } + return val + (val ? "px" : ""); + }, - /** + /** * 在dom树ready之后执行给定的回调函数 * @method domReady * @remind 如果在执行该方法的时候, dom树已经ready, 那么回调函数将立刻执行 @@ -1158,63 +1165,64 @@ var utils = (UE.utils = { * * ``` */ - domReady: (function() { - var fnArr = []; + domReady: (function () { + var fnArr = []; - function doReady(doc) { - //确保onready只执行一次 - doc.isReady = true; - for (var ci; (ci = fnArr.pop()); ci()) {} - } - - return function(onready, win) { - win = win || window; - var doc = win.document; - onready && fnArr.push(onready); - if (doc.readyState === "complete") { - doReady(doc); - } else { - doc.isReady && doReady(doc); - if (browser.ie && browser.version != 11) { - (function() { - if (doc.isReady) return; - try { - doc.documentElement.doScroll("left"); - } catch (error) { - setTimeout(arguments.callee, 0); - return; + function doReady(doc) { + //确保onready只执行一次 + doc.isReady = true; + for (var ci; (ci = fnArr.pop()); ci()) { } - doReady(doc); - })(); - win.attachEvent("onload", function() { - doReady(doc); - }); - } else { - doc.addEventListener( - "DOMContentLoaded", - function() { - doc.removeEventListener( - "DOMContentLoaded", - arguments.callee, - false - ); - doReady(doc); - }, - false - ); - win.addEventListener( - "load", - function() { - doReady(doc); - }, - false - ); } - } - }; - })(), - /** + return function (onready, win) { + win = win || window; + var doc = win.document; + onready && fnArr.push(onready); + if (doc.readyState === "complete") { + doReady(doc); + } else { + doc.isReady && doReady(doc); + if (browser.ie && browser.version != 11) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + doReady(doc); + })(); + win.attachEvent("onload", function () { + doReady(doc); + }); + } else { + doc.addEventListener( + "DOMContentLoaded", + function () { + doc.removeEventListener( + "DOMContentLoaded", + arguments.callee, + false + ); + doReady(doc); + }, + false + ); + win.addEventListener( + "load", + function () { + doReady(doc); + }, + false + ); + } + } + }; + })(), + + /** * 动态添加css样式 * @method cssRule * @param { String } 节点名称 @@ -1224,298 +1232,316 @@ var utils = (UE.utils = { * @grammar UE.utils.cssRule('body',document) => 返回指定key的样式,并且指定是哪个document * @grammar UE.utils.cssRule('body','') =>null //清空给定的key值的背景颜色 */ - cssRule: browser.ie && browser.version != 11 - ? function(key, style, doc) { - var indexList, index; - if ( - style === undefined || - (style && style.nodeType && style.nodeType == 9) - ) { - //获取样式 - doc = style && style.nodeType && style.nodeType == 9 - ? style - : doc || document; - indexList = doc.indexList || (doc.indexList = {}); - index = indexList[key]; - if (index !== undefined) { - return doc.styleSheets[index].cssText; - } - return undefined; - } - doc = doc || document; - indexList = doc.indexList || (doc.indexList = {}); - index = indexList[key]; - //清除样式 - if (style === "") { - if (index !== undefined) { - doc.styleSheets[index].cssText = ""; - delete indexList[key]; - return true; - } - return false; - } - - //添加样式 - if (index !== undefined) { - sheetStyle = doc.styleSheets[index]; - } else { - sheetStyle = doc.createStyleSheet( - "", - (index = doc.styleSheets.length) - ); - indexList[key] = index; - } - sheetStyle.cssText = style; - } - : function(key, style, doc) { - var head, node; - if ( - style === undefined || - (style && style.nodeType && style.nodeType == 9) - ) { - //获取样式 - doc = style && style.nodeType && style.nodeType == 9 - ? style - : doc || document; - node = doc.getElementById(key); - return node ? node.innerHTML : undefined; - } - doc = doc || document; - node = doc.getElementById(key); - - //清除样式 - if (style === "") { - if (node) { - node.parentNode.removeChild(node); - return true; - } - return false; - } - - //添加样式 - if (node) { - node.innerHTML = style; - } else { - node = doc.createElement("style"); - node.id = key; - node.innerHTML = style; - doc.getElementsByTagName("head")[0].appendChild(node); - } - }, - sort: function(array, compareFn) { - compareFn = - compareFn || - function(item1, item2) { - return item1.localeCompare(item2); - }; - for (var i = 0, len = array.length; i < len; i++) { - for (var j = i, length = array.length; j < length; j++) { - if (compareFn(array[i], array[j]) > 0) { - var t = array[i]; - array[i] = array[j]; - array[j] = t; - } - } - } - return array; - }, - serializeParam: function(json) { - var strArr = []; - for (var i in json) { - //忽略默认的几个参数 - if (i == "method" || i == "timeout" || i == "async") continue; - //传递过来的对象和函数不在提交之列 - if ( - !( - (typeof json[i]).toLowerCase() == "function" || - (typeof json[i]).toLowerCase() == "object" - ) - ) { - strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])); - } else if (utils.isArray(json[i])) { - //支持传数组内容 - for (var j = 0; j < json[i].length; j++) { - strArr.push( - encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j]) - ); - } - } - } - return strArr.join("&"); - }, - formatUrl: function(url) { - var u = url.replace(/&&/g, "&"); - u = u.replace(/\?&/g, "?"); - u = u.replace(/&$/g, ""); - u = u.replace(/&#/g, "#"); - u = u.replace(/&+/g, "&"); - return u; - }, - addStyleContent: function(cssContent){ - var style = document.createElement("style"); - style.innerHTML = cssContent; - document.head.appendChild(style); - }, - isCrossDomainUrl: function(url) { - var a = document.createElement("a"); - a.href = url; - if (browser.ie) { - a.href = a.href; - } - return !( - a.protocol == location.protocol && - a.hostname == location.hostname && - (a.port == location.port || - (a.port == "80" && location.port == "") || - (a.port == "" && location.port == "80")) - ); - }, - clearEmptyAttrs: function(obj) { - for (var p in obj) { - if (obj[p] === "") { - delete obj[p]; - } - } - return obj; - }, - str2json: function(s) { - if (!utils.isString(s)) return null; - if (window.JSON) { - return JSON.parse(s); - } else { - return new Function("return " + utils.trim(s || ""))(); - } - }, - json2str: (function() { - if (window.JSON) { - return JSON.stringify; - } else { - var escapeMap = { - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - '"': '\\"', - "\\": "\\\\" - }; - - function encodeString(source) { - if (/["\\\x00-\x1f]/.test(source)) { - source = source.replace(/["\\\x00-\x1f]/g, function(match) { - var c = escapeMap[match]; - if (c) { - return c; - } - c = match.charCodeAt(); - return ( - "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16) - ); - }); - } - return '"' + source + '"'; - } - - function encodeArray(source) { - var result = ["["], - l = source.length, - preComma, - i, - item; - - for (i = 0; i < l; i++) { - item = source[i]; - - switch (typeof item) { - case "undefined": - case "function": - case "unknown": - break; - default: - if (preComma) { - result.push(","); - } - result.push(utils.json2str(item)); - preComma = 1; - } - } - result.push("]"); - return result.join(""); - } - - function pad(source) { - return source < 10 ? "0" + source : source; - } - - function encodeDate(source) { - return ( - '"' + - source.getFullYear() + - "-" + - pad(source.getMonth() + 1) + - "-" + - pad(source.getDate()) + - "T" + - pad(source.getHours()) + - ":" + - pad(source.getMinutes()) + - ":" + - pad(source.getSeconds()) + - '"' - ); - } - - return function(value) { - switch (typeof value) { - case "undefined": - return "undefined"; - - case "number": - return isFinite(value) ? String(value) : "null"; - - case "string": - return encodeString(value); - - case "boolean": - return String(value); - - default: - if (value === null) { - return "null"; - } else if (utils.isArray(value)) { - return encodeArray(value); - } else if (utils.isDate(value)) { - return encodeDate(value); - } else { - var result = ["{"], - encode = utils.json2str, - preComma, - item; - - for (var key in value) { - if (Object.prototype.hasOwnProperty.call(value, key)) { - item = value[key]; - switch (typeof item) { - case "undefined": - case "unknown": - case "function": - break; - default: - if (preComma) { - result.push(","); - } - preComma = 1; - result.push(encode(key) + ":" + encode(item)); - } + cssRule: browser.ie && browser.version != 11 + ? function (key, style, doc) { + var indexList, index; + if ( + style === undefined || + (style && style.nodeType && style.nodeType == 9) + ) { + //获取样式 + doc = style && style.nodeType && style.nodeType == 9 + ? style + : doc || document; + indexList = doc.indexList || (doc.indexList = {}); + index = indexList[key]; + if (index !== undefined) { + return doc.styleSheets[index].cssText; + } + return undefined; + } + doc = doc || document; + indexList = doc.indexList || (doc.indexList = {}); + index = indexList[key]; + //清除样式 + if (style === "") { + if (index !== undefined) { + doc.styleSheets[index].cssText = ""; + delete indexList[key]; + return true; + } + return false; + } + + //添加样式 + if (index !== undefined) { + sheetStyle = doc.styleSheets[index]; + } else { + sheetStyle = doc.createStyleSheet( + "", + (index = doc.styleSheets.length) + ); + indexList[key] = index; + } + sheetStyle.cssText = style; + } + : function (key, style, doc) { + var head, node; + if ( + style === undefined || + (style && style.nodeType && style.nodeType == 9) + ) { + //获取样式 + doc = style && style.nodeType && style.nodeType == 9 + ? style + : doc || document; + node = doc.getElementById(key); + return node ? node.innerHTML : undefined; + } + doc = doc || document; + node = doc.getElementById(key); + + //清除样式 + if (style === "") { + if (node) { + node.parentNode.removeChild(node); + return true; + } + return false; + } + + //添加样式 + if (node) { + node.innerHTML = style; + } else { + node = doc.createElement("style"); + node.id = key; + node.innerHTML = style; + doc.getElementsByTagName("head")[0].appendChild(node); + } + }, + sort: function (array, compareFn) { + compareFn = + compareFn || + function (item1, item2) { + return item1.localeCompare(item2); + }; + for (var i = 0, len = array.length; i < len; i++) { + for (var j = i, length = array.length; j < length; j++) { + if (compareFn(array[i], array[j]) > 0) { + var t = array[i]; + array[i] = array[j]; + array[j] = t; } - } - result.push("}"); - return result.join(""); } } - }; - } - })() + return array; + }, + serializeParam: function (json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if (i == "method" || i == "timeout" || i == "async") continue; + //传递过来的对象和函数不在提交之列 + if ( + !( + (typeof json[i]).toLowerCase() == "function" || + (typeof json[i]).toLowerCase() == "object" + ) + ) { + strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for (var j = 0; j < json[i].length; j++) { + strArr.push( + encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j]) + ); + } + } + } + return strArr.join("&"); + }, + formatUrl: function (url) { + var u = url.replace(/&&/g, "&"); + u = u.replace(/\?&/g, "?"); + u = u.replace(/&$/g, ""); + u = u.replace(/&#/g, "#"); + u = u.replace(/&+/g, "&"); + return u; + }, + addStyleContent: function (cssContent) { + var style = document.createElement("style"); + style.innerHTML = cssContent; + document.head.appendChild(style); + }, + isCrossDomainUrl: function (url) { + var a = document.createElement("a"); + a.href = url; + if (browser.ie) { + a.href = a.href; + } + return !( + a.protocol == location.protocol && + a.hostname == location.hostname && + (a.port == location.port || + (a.port == "80" && location.port == "") || + (a.port == "" && location.port == "80")) + ); + }, + clearEmptyAttrs: function (obj) { + for (var p in obj) { + if (obj[p] === "") { + delete obj[p]; + } + } + return obj; + }, + str2json: function (s) { + if (!utils.isString(s)) return null; + if (window.JSON) { + return JSON.parse(s); + } else { + return new Function("return " + utils.trim(s || ""))(); + } + }, + base64toBlob: function (base64Data, contentType) { + contentType = contentType || ""; + var sliceSize = 1024; + var byteCharacters = atob(base64Data); + var bytesLength = byteCharacters.length; + var slicesCount = Math.ceil(bytesLength / sliceSize); + var byteArrays = new Array(slicesCount); + for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { + var begin = sliceIndex * sliceSize; + var end = Math.min(begin + sliceSize, bytesLength); + var bytes = new Array(end - begin); + for (var offset = begin, i = 0; offset < end; ++i, ++offset) { + bytes[i] = byteCharacters[offset].charCodeAt(0); + } + byteArrays[sliceIndex] = new Uint8Array(bytes); + } + return new Blob(byteArrays, { type: contentType }); + }, + json2str: (function () { + if (window.JSON) { + return JSON.stringify; + } else { + var escapeMap = { + "\b": "\\b", + "\t": "\\t", + "\n": "\\n", + "\f": "\\f", + "\r": "\\r", + '"': '\\"', + "\\": "\\\\" + }; + + function encodeString(source) { + if (/["\\\x00-\x1f]/.test(source)) { + source = source.replace(/["\\\x00-\x1f]/g, function (match) { + var c = escapeMap[match]; + if (c) { + return c; + } + c = match.charCodeAt(); + return ( + "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16) + ); + }); + } + return '"' + source + '"'; + } + + function encodeArray(source) { + var result = ["["], + l = source.length, + preComma, + i, + item; + + for (i = 0; i < l; i++) { + item = source[i]; + + switch (typeof item) { + case "undefined": + case "function": + case "unknown": + break; + default: + if (preComma) { + result.push(","); + } + result.push(utils.json2str(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + function pad(source) { + return source < 10 ? "0" + source : source; + } + + function encodeDate(source) { + return ( + '"' + + source.getFullYear() + + "-" + + pad(source.getMonth() + 1) + + "-" + + pad(source.getDate()) + + "T" + + pad(source.getHours()) + + ":" + + pad(source.getMinutes()) + + ":" + + pad(source.getSeconds()) + + '"' + ); + } + + return function (value) { + switch (typeof value) { + case "undefined": + return "undefined"; + + case "number": + return isFinite(value) ? String(value) : "null"; + + case "string": + return encodeString(value); + + case "boolean": + return String(value); + + default: + if (value === null) { + return "null"; + } else if (utils.isArray(value)) { + return encodeArray(value); + } else if (utils.isDate(value)) { + return encodeDate(value); + } else { + var result = ["{"], + encode = utils.json2str, + preComma, + item; + + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + item = value[key]; + switch (typeof item) { + case "undefined": + case "unknown": + case "function": + break; + default: + if (preComma) { + result.push(","); + } + preComma = 1; + result.push(encode(key) + ":" + encode(item)); + } + } + } + result.push("}"); + return result.join(""); + } + } + }; + } + })() }); /** * 判断给定的对象是否是字符串 @@ -1559,12 +1585,12 @@ var utils = (UE.utils = { * @return { Boolean } 给定的对象是否是普通对象 */ utils.each( - ["String", "Function", "Array", "Number", "RegExp", "Object", "Date"], - function(v) { - UE.utils["is" + v] = function(obj) { - return Object.prototype.toString.apply(obj) == "[object " + v + "]"; - }; - } + ["String", "Function", "Array", "Number", "RegExp", "Object", "Date"], + function (v) { + UE.utils["is" + v] = function (obj) { + return Object.prototype.toString.apply(obj) == "[object " + v + "]"; + }; + } ); @@ -1599,10 +1625,11 @@ utils.each( * UE.EventBase.call(editor); * ``` */ -var EventBase = (UE.EventBase = function() {}); +var EventBase = (UE.EventBase = function () { +}); EventBase.prototype = { - /** + /** * 注册事件监听器 * @method addListener * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔 @@ -1624,23 +1651,23 @@ EventBase.prototype = { * ``` * @see UE.EventBase:fireEvent(String) */ - addListener: function(types, listener) { - types = utils.trim(types).split(/\s+/); - for (var i = 0, ti; (ti = types[i++]); ) { - getListener(this, ti, true).push(listener); - } - }, + addListener: function (types, listener) { + types = utils.trim(types).split(/\s+/); + for (var i = 0, ti; (ti = types[i++]);) { + getListener(this, ti, true).push(listener); + } + }, - on: function(types, listener) { - return this.addListener(types, listener); - }, - off: function(types, listener) { - return this.removeListener(types, listener); - }, - trigger: function() { - return this.fireEvent.apply(this, arguments); - }, - /** + on: function (types, listener) { + return this.addListener(types, listener); + }, + off: function (types, listener) { + return this.removeListener(types, listener); + }, + trigger: function () { + return this.fireEvent.apply(this, arguments); + }, + /** * 移除事件监听器 * @method removeListener * @param { String } types 移除的事件名称,同时移除多个事件使用空格分隔 @@ -1651,14 +1678,14 @@ EventBase.prototype = { * editor.removeListener("selectionchange",changeCallback); * ``` */ - removeListener: function(types, listener) { - types = utils.trim(types).split(/\s+/); - for (var i = 0, ti; (ti = types[i++]); ) { - utils.removeItem(getListener(this, ti) || [], listener); - } - }, + removeListener: function (types, listener) { + types = utils.trim(types).split(/\s+/); + for (var i = 0, ti; (ti = types[i++]);) { + utils.removeItem(getListener(this, ti) || [], listener); + } + }, - /** + /** * 触发事件 * @method fireEvent * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 @@ -1670,7 +1697,7 @@ EventBase.prototype = { * ``` */ - /** + /** * 触发事件 * @method fireEvent * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 @@ -1690,34 +1717,35 @@ EventBase.prototype = { * editor.fireEvent("selectionchange", "Hello", "World"); * ``` */ - fireEvent: function() { - var types = arguments[0]; - types = utils.trim(types).split(" "); - for (var i = 0, ti; (ti = types[i++]); ) { - var listeners = getListener(this, ti), - r, - t, - k; - if (listeners) { - k = listeners.length; - while (k--) { - if (!listeners[k]) continue; - t = listeners[k].apply(this, arguments); - if (t === true) { - return t; - } - if (t !== undefined) { - r = t; - } + fireEvent: function () { + var types = arguments[0]; + types = utils.trim(types).split(" "); + for (var i = 0, ti; (ti = types[i++]);) { + var listeners = getListener(this, ti), + r, + t, + k; + if (listeners) { + k = listeners.length; + while (k--) { + if (!listeners[k]) continue; + t = listeners[k].apply(this, arguments); + if (t === true) { + return t; + } + if (t !== undefined) { + r = t; + } + } + } + if ((t = this["on" + ti.toLowerCase()])) { + r = t.apply(this, arguments); + } } - } - if ((t = this["on" + ti.toLowerCase()])) { - r = t.apply(this, arguments); - } + return r; } - return r; - } }; + /** * 获得对象所拥有监听类型的所有监听器 * @unfile @@ -1731,13 +1759,13 @@ EventBase.prototype = { * @return { Array } 监听器数组 */ function getListener(obj, type, force) { - var allListeners; - type = type.toLowerCase(); - return ( - (allListeners = - obj.__allListeners || (force && (obj.__allListeners = {}))) && - (allListeners[type] || (force && (allListeners[type] = []))) - ); + var allListeners; + type = type.toLowerCase(); + return ( + (allListeners = + obj.__allListeners || (force && (obj.__allListeners = {}))) && + (allListeners[type] || (force && (allListeners[type] = []))) + ); } @@ -1750,431 +1778,432 @@ function getListener(obj, type, force) { * @constructor * @namespace dtd */ -var dtd = (dom.dtd = (function() { - function _(s) { - for (var k in s) { - s[k.toUpperCase()] = s[k]; +var dtd = (dom.dtd = (function () { + function _(s) { + for (var k in s) { + s[k.toUpperCase()] = s[k]; + } + return s; } - return s; - } - var X = utils.extend2; - var A = _({ isindex: 1, fieldset: 1 }), - B = _({ input: 1, button: 1, select: 1, textarea: 1, label: 1 }), - C = X(_({ a: 1 }), B), - D = X({ iframe: 1 }, C), - E = _({ - hr: 1, - ul: 1, - menu: 1, - div: 1, - blockquote: 1, - noscript: 1, - table: 1, - center: 1, - address: 1, - dir: 1, - pre: 1, - h5: 1, - dl: 1, - h4: 1, - noframes: 1, - h6: 1, - ol: 1, - h1: 1, - h3: 1, - h2: 1 - }), - F = _({ ins: 1, del: 1, script: 1, style: 1 }), - G = X( - _({ - mark: 1, - b: 1, - acronym: 1, - bdo: 1, - var: 1, - "#": 1, - abbr: 1, - code: 1, - br: 1, - i: 1, - cite: 1, - kbd: 1, - u: 1, - strike: 1, - s: 1, - tt: 1, - strong: 1, - q: 1, - samp: 1, - em: 1, - dfn: 1, - span: 1 - }), - F - ), - H = X( - _({ - sub: 1, - img: 1, - embed: 1, - object: 1, - sup: 1, - basefont: 1, - map: 1, - applet: 1, - font: 1, - big: 1, - small: 1 - }), - G - ), - I = X(_({ p: 1 }), H), - J = X(_({ iframe: 1 }), H, B), - K = _({ - img: 1, - embed: 1, - noscript: 1, - br: 1, - kbd: 1, - center: 1, - button: 1, - basefont: 1, - h5: 1, - h4: 1, - samp: 1, - h6: 1, - ol: 1, - h1: 1, - h3: 1, - h2: 1, - form: 1, - font: 1, - "#": 1, - select: 1, - menu: 1, - ins: 1, - abbr: 1, - label: 1, - code: 1, - table: 1, - script: 1, - cite: 1, - input: 1, - iframe: 1, - strong: 1, - textarea: 1, - noframes: 1, - big: 1, - small: 1, - span: 1, - hr: 1, - sub: 1, - bdo: 1, - var: 1, - div: 1, - object: 1, - sup: 1, - strike: 1, - dir: 1, - map: 1, - dl: 1, - applet: 1, - del: 1, - isindex: 1, - fieldset: 1, - ul: 1, - b: 1, - acronym: 1, - a: 1, - blockquote: 1, - i: 1, - u: 1, - s: 1, - tt: 1, - address: 1, - q: 1, - pre: 1, - p: 1, - em: 1, - dfn: 1 - }), - L = X(_({ a: 0 }), J), //a不能被切开,所以把他 - M = _({ tr: 1 }), - N = _({ "#": 1 }), - O = X(_({ param: 1 }), K), - P = X(_({ form: 1 }), A, D, E, I), - Q = _({ li: 1, ol: 1, ul: 1 }), - R = _({ style: 1, script: 1 }), - S = _({ base: 1, link: 1, meta: 1, title: 1 }), - T = X(S, R), - U = _({ head: 1, body: 1 }), - V = _({ html: 1 }); - var block = _({ - address: 1, - blockquote: 1, - center: 1, - dir: 1, - div: 1, - dl: 1, - fieldset: 1, - form: 1, - h1: 1, - h2: 1, - h3: 1, - h4: 1, - h5: 1, - h6: 1, - hr: 1, - isindex: 1, - menu: 1, - noframes: 1, - ol: 1, - p: 1, - pre: 1, - table: 1, - ul: 1 - }), - empty = _({ - area: 1, - base: 1, - basefont: 1, - br: 1, - col: 1, - command: 1, - dialog: 1, - embed: 1, - hr: 1, - img: 1, - input: 1, - isindex: 1, - keygen: 1, - link: 1, - meta: 1, - param: 1, - source: 1, - track: 1, - wbr: 1 + var X = utils.extend2; + var A = _({isindex: 1, fieldset: 1}), + B = _({input: 1, button: 1, select: 1, textarea: 1, label: 1}), + C = X(_({a: 1}), B), + D = X({iframe: 1}, C), + E = _({ + hr: 1, + ul: 1, + menu: 1, + div: 1, + blockquote: 1, + noscript: 1, + table: 1, + center: 1, + address: 1, + dir: 1, + pre: 1, + h5: 1, + dl: 1, + h4: 1, + noframes: 1, + h6: 1, + ol: 1, + h1: 1, + h3: 1, + h2: 1 + }), + F = _({ins: 1, del: 1, script: 1, style: 1}), + G = X( + _({ + mark: 1, + b: 1, + acronym: 1, + bdo: 1, + var: 1, + "#": 1, + abbr: 1, + code: 1, + br: 1, + i: 1, + cite: 1, + kbd: 1, + u: 1, + strike: 1, + s: 1, + tt: 1, + strong: 1, + q: 1, + samp: 1, + em: 1, + dfn: 1, + span: 1 + }), + F + ), + H = X( + _({ + sub: 1, + img: 1, + embed: 1, + object: 1, + sup: 1, + basefont: 1, + map: 1, + applet: 1, + font: 1, + big: 1, + small: 1 + }), + G + ), + I = X(_({p: 1}), H), + J = X(_({iframe: 1}), H, B), + K = _({ + img: 1, + embed: 1, + noscript: 1, + br: 1, + kbd: 1, + center: 1, + button: 1, + basefont: 1, + h5: 1, + h4: 1, + samp: 1, + h6: 1, + ol: 1, + h1: 1, + h3: 1, + h2: 1, + form: 1, + font: 1, + "#": 1, + select: 1, + menu: 1, + ins: 1, + abbr: 1, + label: 1, + code: 1, + table: 1, + script: 1, + cite: 1, + input: 1, + iframe: 1, + strong: 1, + textarea: 1, + noframes: 1, + big: 1, + small: 1, + span: 1, + hr: 1, + sub: 1, + bdo: 1, + var: 1, + div: 1, + object: 1, + sup: 1, + strike: 1, + dir: 1, + map: 1, + dl: 1, + applet: 1, + del: 1, + isindex: 1, + fieldset: 1, + ul: 1, + b: 1, + acronym: 1, + a: 1, + blockquote: 1, + i: 1, + u: 1, + s: 1, + tt: 1, + address: 1, + q: 1, + pre: 1, + p: 1, + em: 1, + dfn: 1 + }), + L = X(_({a: 0}), J), //a不能被切开,所以把他 + M = _({tr: 1}), + N = _({"#": 1}), + O = X(_({param: 1}), K), + P = X(_({form: 1}), A, D, E, I), + Q = _({li: 1, ol: 1, ul: 1}), + R = _({style: 1, script: 1}), + S = _({base: 1, link: 1, meta: 1, title: 1}), + T = X(S, R), + U = _({head: 1, body: 1}), + V = _({html: 1}); + + var block = _({ + address: 1, + blockquote: 1, + center: 1, + dir: 1, + div: 1, + dl: 1, + fieldset: 1, + form: 1, + h1: 1, + h2: 1, + h3: 1, + h4: 1, + h5: 1, + h6: 1, + hr: 1, + isindex: 1, + menu: 1, + noframes: 1, + ol: 1, + p: 1, + pre: 1, + table: 1, + ul: 1 + }), + empty = _({ + area: 1, + base: 1, + basefont: 1, + br: 1, + col: 1, + command: 1, + dialog: 1, + embed: 1, + hr: 1, + img: 1, + input: 1, + isindex: 1, + keygen: 1, + link: 1, + meta: 1, + param: 1, + source: 1, + track: 1, + wbr: 1 + }); + + return _({ + // $ 表示自定的属性 + + // body外的元素列表. + $nonBodyContent: X(V, U, S), + + //块结构元素列表 + $block: block, + + //内联元素列表 + $inline: L, + + $inlineWithA: X(_({a: 1}), L), + + $body: X(_({script: 1, style: 1}), block), + + $cdata: _({script: 1, style: 1}), + + //自闭和元素 + $empty: empty, + + //不是自闭合,但不能让range选中里边 + $nonChild: _({iframe: 1, textarea: 1}), + //列表元素列表 + $listItem: _({dd: 1, dt: 1, li: 1}), + + //列表根元素列表 + $list: _({ul: 1, ol: 1, dl: 1}), + + //不能认为是空的元素 + $isNotEmpty: _({ + table: 1, + ul: 1, + ol: 1, + dl: 1, + iframe: 1, + area: 1, + base: 1, + col: 1, + hr: 1, + img: 1, + embed: 1, + input: 1, + textarea: 1, + link: 1, + meta: 1, + param: 1, + h1: 1, + h2: 1, + h3: 1, + h4: 1, + h5: 1, + h6: 1 + }), + + //如果没有子节点就可以删除的元素列表,像span,a + $removeEmpty: _({ + a: 1, + abbr: 1, + acronym: 1, + address: 1, + b: 1, + bdo: 1, + big: 1, + cite: 1, + code: 1, + del: 1, + dfn: 1, + em: 1, + font: 1, + i: 1, + ins: 1, + label: 1, + kbd: 1, + q: 1, + s: 1, + samp: 1, + small: 1, + span: 1, + strike: 1, + strong: 1, + sub: 1, + sup: 1, + tt: 1, + u: 1, + var: 1 + }), + + $removeEmptyBlock: _({p: 1, div: 1}), + + //在table元素里的元素列表 + $tableContent: _({ + caption: 1, + col: 1, + colgroup: 1, + tbody: 1, + td: 1, + tfoot: 1, + th: 1, + thead: 1, + tr: 1, + table: 1 + }), + //不转换的标签 + $notTransContent: _({pre: 1, script: 1, style: 1, textarea: 1}), + html: U, + head: T, + style: N, + script: N, + body: P, + base: {}, + link: {}, + meta: {}, + title: N, + col: {}, + tr: _({td: 1, th: 1}), + img: {}, + embed: {}, + colgroup: _({thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1}), + noscript: P, + td: P, + br: {}, + th: P, + center: P, + kbd: L, + button: X(I, E), + basefont: {}, + h5: L, + h4: L, + samp: L, + h6: L, + ol: Q, + h1: L, + h3: L, + option: N, + h2: L, + form: X(A, D, E, I), + select: _({optgroup: 1, option: 1}), + font: L, + ins: L, + menu: Q, + abbr: L, + label: L, + table: _({ + thead: 1, + col: 1, + tbody: 1, + tr: 1, + colgroup: 1, + caption: 1, + tfoot: 1 + }), + code: L, + tfoot: M, + cite: L, + li: P, + input: {}, + iframe: P, + strong: L, + textarea: N, + noframes: P, + big: L, + small: L, + //trace: + span: _({ + "#": 1, + br: 1, + b: 1, + strong: 1, + u: 1, + i: 1, + em: 1, + sub: 1, + sup: 1, + strike: 1, + span: 1 + }), + hr: L, + dt: L, + sub: L, + optgroup: _({option: 1}), + param: {}, + bdo: L, + var: L, + div: P, + object: O, + sup: L, + dd: P, + strike: L, + area: {}, + dir: Q, + map: X(_({area: 1, form: 1, p: 1}), A, F, E), + applet: O, + dl: _({dt: 1, dd: 1}), + del: L, + isindex: {}, + fieldset: X(_({legend: 1}), K), + thead: M, + ul: Q, + acronym: L, + b: L, + a: X(_({a: 1}), J), + blockquote: X(_({td: 1, tr: 1, tbody: 1, li: 1}), P), + caption: L, + i: L, + u: L, + tbody: M, + s: L, + address: X(D, I), + tt: L, + legend: L, + q: L, + pre: X(G, C), + p: X(_({a: 1}), L), + em: L, + dfn: L, + mark: L }); - - return _({ - // $ 表示自定的属性 - - // body外的元素列表. - $nonBodyContent: X(V, U, S), - - //块结构元素列表 - $block: block, - - //内联元素列表 - $inline: L, - - $inlineWithA: X(_({ a: 1 }), L), - - $body: X(_({ script: 1, style: 1 }), block), - - $cdata: _({ script: 1, style: 1 }), - - //自闭和元素 - $empty: empty, - - //不是自闭合,但不能让range选中里边 - $nonChild: _({ iframe: 1, textarea: 1 }), - //列表元素列表 - $listItem: _({ dd: 1, dt: 1, li: 1 }), - - //列表根元素列表 - $list: _({ ul: 1, ol: 1, dl: 1 }), - - //不能认为是空的元素 - $isNotEmpty: _({ - table: 1, - ul: 1, - ol: 1, - dl: 1, - iframe: 1, - area: 1, - base: 1, - col: 1, - hr: 1, - img: 1, - embed: 1, - input: 1, - textarea: 1, - link: 1, - meta: 1, - param: 1, - h1: 1, - h2: 1, - h3: 1, - h4: 1, - h5: 1, - h6: 1 - }), - - //如果没有子节点就可以删除的元素列表,像span,a - $removeEmpty: _({ - a: 1, - abbr: 1, - acronym: 1, - address: 1, - b: 1, - bdo: 1, - big: 1, - cite: 1, - code: 1, - del: 1, - dfn: 1, - em: 1, - font: 1, - i: 1, - ins: 1, - label: 1, - kbd: 1, - q: 1, - s: 1, - samp: 1, - small: 1, - span: 1, - strike: 1, - strong: 1, - sub: 1, - sup: 1, - tt: 1, - u: 1, - var: 1 - }), - - $removeEmptyBlock: _({ p: 1, div: 1 }), - - //在table元素里的元素列表 - $tableContent: _({ - caption: 1, - col: 1, - colgroup: 1, - tbody: 1, - td: 1, - tfoot: 1, - th: 1, - thead: 1, - tr: 1, - table: 1 - }), - //不转换的标签 - $notTransContent: _({ pre: 1, script: 1, style: 1, textarea: 1 }), - html: U, - head: T, - style: N, - script: N, - body: P, - base: {}, - link: {}, - meta: {}, - title: N, - col: {}, - tr: _({ td: 1, th: 1 }), - img: {}, - embed: {}, - colgroup: _({ thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1 }), - noscript: P, - td: P, - br: {}, - th: P, - center: P, - kbd: L, - button: X(I, E), - basefont: {}, - h5: L, - h4: L, - samp: L, - h6: L, - ol: Q, - h1: L, - h3: L, - option: N, - h2: L, - form: X(A, D, E, I), - select: _({ optgroup: 1, option: 1 }), - font: L, - ins: L, - menu: Q, - abbr: L, - label: L, - table: _({ - thead: 1, - col: 1, - tbody: 1, - tr: 1, - colgroup: 1, - caption: 1, - tfoot: 1 - }), - code: L, - tfoot: M, - cite: L, - li: P, - input: {}, - iframe: P, - strong: L, - textarea: N, - noframes: P, - big: L, - small: L, - //trace: - span: _({ - "#": 1, - br: 1, - b: 1, - strong: 1, - u: 1, - i: 1, - em: 1, - sub: 1, - sup: 1, - strike: 1, - span: 1 - }), - hr: L, - dt: L, - sub: L, - optgroup: _({ option: 1 }), - param: {}, - bdo: L, - var: L, - div: P, - object: O, - sup: L, - dd: P, - strike: L, - area: {}, - dir: Q, - map: X(_({ area: 1, form: 1, p: 1 }), A, F, E), - applet: O, - dl: _({ dt: 1, dd: 1 }), - del: L, - isindex: {}, - fieldset: X(_({ legend: 1 }), K), - thead: M, - ul: Q, - acronym: L, - b: L, - a: X(_({ a: 1 }), J), - blockquote: X(_({ td: 1, tr: 1, tbody: 1, li: 1 }), P), - caption: L, - i: L, - u: L, - tbody: M, - s: L, - address: X(D, I), - tt: L, - legend: L, - q: L, - pre: X(G, C), - p: X(_({ a: 1 }), L), - em: L, - dfn: L, - mark: L - }); })()); @@ -2192,84 +2221,85 @@ var dtd = (dom.dtd = (function() { * @module UE.dom.domUtils */ function getDomNode(node, start, ltr, startFromChild, fn, guard) { - var tmpNode = startFromChild && node[start], - parent; - !tmpNode && (tmpNode = node[ltr]); - while (!tmpNode && (parent = (parent || node).parentNode)) { - if (parent.tagName == "BODY" || (guard && !guard(parent))) { - return null; + var tmpNode = startFromChild && node[start], + parent; + !tmpNode && (tmpNode = node[ltr]); + while (!tmpNode && (parent = (parent || node).parentNode)) { + if (parent.tagName == "BODY" || (guard && !guard(parent))) { + return null; + } + tmpNode = parent[ltr]; } - tmpNode = parent[ltr]; - } - if (tmpNode && fn && !fn(tmpNode)) { - return getDomNode(tmpNode, start, ltr, false, fn); - } - return tmpNode; + if (tmpNode && fn && !fn(tmpNode)) { + return getDomNode(tmpNode, start, ltr, false, fn); + } + return tmpNode; } -var attrFix = ie && browser.version < 9 - ? { - tabindex: "tabIndex", - readonly: "readOnly", - for: "htmlFor", - class: "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder" - } - : { - tabindex: "tabIndex", - readonly: "readOnly" - }, - styleBlock = utils.listToMap([ - "-webkit-box", - "-moz-box", - "block", - "list-item", - "table", - "table-row-group", - "table-header-group", - "table-footer-group", - "table-row", - "table-column-group", - "table-column", - "table-cell", - "table-caption" - ]); -var domUtils = (dom.domUtils = { - //节点常量 - NODE_ELEMENT: 1, - NODE_DOCUMENT: 9, - NODE_TEXT: 3, - NODE_COMMENT: 8, - NODE_DOCUMENT_FRAGMENT: 11, - //位置关系 - POSITION_IDENTICAL: 0, - POSITION_DISCONNECTED: 1, - POSITION_FOLLOWING: 2, - POSITION_PRECEDING: 4, - POSITION_IS_CONTAINED: 8, - POSITION_CONTAINS: 16, - //ie6使用其他的会有一段空白出现 - fillChar: ie && browser.version == "6" ? "\ufeff" : "\u200B", - //-------------------------Node部分-------------------------------- - keys: { - /*Backspace*/ 8: 1, - /*Delete*/ 46: 1, - /*Shift*/ 16: 1, - /*Ctrl*/ 17: 1, - /*Alt*/ 18: 1, - 37: 1, - 38: 1, - 39: 1, - 40: 1, - 13: 1 /*enter*/ - }, - /** +var attrFix = ie && browser.version < 9 + ? { + tabindex: "tabIndex", + readonly: "readOnly", + for: "htmlFor", + class: "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder" + } + : { + tabindex: "tabIndex", + readonly: "readOnly" + }, + styleBlock = utils.listToMap([ + "-webkit-box", + "-moz-box", + "block", + "list-item", + "table", + "table-row-group", + "table-header-group", + "table-footer-group", + "table-row", + "table-column-group", + "table-column", + "table-cell", + "table-caption" + ]); +var domUtils = (dom.domUtils = { + //节点常量 + NODE_ELEMENT: 1, + NODE_DOCUMENT: 9, + NODE_TEXT: 3, + NODE_COMMENT: 8, + NODE_DOCUMENT_FRAGMENT: 11, + + //位置关系 + POSITION_IDENTICAL: 0, + POSITION_DISCONNECTED: 1, + POSITION_FOLLOWING: 2, + POSITION_PRECEDING: 4, + POSITION_IS_CONTAINED: 8, + POSITION_CONTAINS: 16, + //ie6使用其他的会有一段空白出现 + fillChar: ie && browser.version === "6" ? "\ufeff" : "\u200B", + //-------------------------Node部分-------------------------------- + keys: { + /*Backspace*/ 8: 1, + /*Delete*/ 46: 1, + /*Shift*/ 16: 1, + /*Ctrl*/ 17: 1, + /*Alt*/ 18: 1, + 37: 1, + 38: 1, + 39: 1, + 40: 1, + 13: 1 /*enter*/ + }, + /** * 获取节点A相对于节点B的位置关系 * @method getPosition * @param { Node } nodeA 需要查询位置关系的节点A @@ -2316,54 +2346,55 @@ var domUtils = (dom.domUtils = { * } * ``` */ - getPosition: function(nodeA, nodeB) { - // 如果两个节点是同一个节点 - if (nodeA === nodeB) { - // domUtils.POSITION_IDENTICAL - return 0; - } - var node, - parentsA = [nodeA], - parentsB = [nodeB]; - node = nodeA; - while ((node = node.parentNode)) { - // 如果nodeB是nodeA的祖先节点 - if (node === nodeB) { - // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING - return 10; - } - parentsA.push(node); - } - node = nodeB; - while ((node = node.parentNode)) { - // 如果nodeA是nodeB的祖先节点 - if (node === nodeA) { - // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING - return 20; - } - parentsB.push(node); - } - parentsA.reverse(); - parentsB.reverse(); - if (parentsA[0] !== parentsB[0]) { - // domUtils.POSITION_DISCONNECTED - return 1; - } - var i = -1; - while ((i++, parentsA[i] === parentsB[i])) {} - nodeA = parentsA[i]; - nodeB = parentsB[i]; - while ((nodeA = nodeA.nextSibling)) { - if (nodeA === nodeB) { - // domUtils.POSITION_PRECEDING - return 4; - } - } - // domUtils.POSITION_FOLLOWING - return 2; - }, + getPosition: function (nodeA, nodeB) { + // 如果两个节点是同一个节点 + if (nodeA === nodeB) { + // domUtils.POSITION_IDENTICAL + return 0; + } + var node, + parentsA = [nodeA], + parentsB = [nodeB]; + node = nodeA; + while ((node = node.parentNode)) { + // 如果nodeB是nodeA的祖先节点 + if (node === nodeB) { + // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING + return 10; + } + parentsA.push(node); + } + node = nodeB; + while ((node = node.parentNode)) { + // 如果nodeA是nodeB的祖先节点 + if (node === nodeA) { + // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING + return 20; + } + parentsB.push(node); + } + parentsA.reverse(); + parentsB.reverse(); + if (parentsA[0] !== parentsB[0]) { + // domUtils.POSITION_DISCONNECTED + return 1; + } + var i = -1; + while ((i++, parentsA[i] === parentsB[i])) { + } + nodeA = parentsA[i]; + nodeB = parentsB[i]; + while ((nodeA = nodeA.nextSibling)) { + if (nodeA === nodeB) { + // domUtils.POSITION_PRECEDING + return 4; + } + } + // domUtils.POSITION_FOLLOWING + return 2; + }, - /** + /** * 检测节点node在父节点中的索引位置 * @method getNodeIndex * @param { Node } node 需要检测的节点对象 @@ -2371,7 +2402,7 @@ var domUtils = (dom.domUtils = { * @see UE.dom.domUtils.getNodeIndex(Node,Boolean) */ - /** + /** * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点 * @method getNodeIndex * @param { Node } node 需要检测的节点对象 @@ -2394,22 +2425,22 @@ var domUtils = (dom.domUtils = { * * ``` */ - getNodeIndex: function(node, ignoreTextNode) { - var preNode = node, - i = 0; - while ((preNode = preNode.previousSibling)) { - if (ignoreTextNode && preNode.nodeType == 3) { - if (preNode.nodeType != preNode.nextSibling.nodeType) { - i++; + getNodeIndex: function (node, ignoreTextNode) { + var preNode = node, + i = 0; + while ((preNode = preNode.previousSibling)) { + if (ignoreTextNode && preNode.nodeType == 3) { + if (preNode.nodeType != preNode.nextSibling.nodeType) { + i++; + } + continue; + } + i++; } - continue; - } - i++; - } - return i; - }, + return i; + }, - /** + /** * 检测节点node是否在给定的document对象上 * @method inDoc * @param { Node } node 需要检测的节点对象 @@ -2430,10 +2461,10 @@ var domUtils = (dom.domUtils = { * * ``` */ - inDoc: function(node, doc) { - return domUtils.getPosition(node, doc) == 10; - }, - /** + inDoc: function (node, doc) { + return domUtils.getPosition(node, doc) === 10; + }, + /** * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, * 查找的起点是给定node节点的父节点。 * @method findParent @@ -2457,7 +2488,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点 * @method findParent @@ -2491,21 +2522,21 @@ var domUtils = (dom.domUtils = { * * ``` */ - findParent: function(node, filterFn, includeSelf) { - if (node && !domUtils.isBody(node)) { - node = includeSelf ? node : node.parentNode; - while (node) { - if (!filterFn || filterFn(node) || domUtils.isBody(node)) { - return filterFn && !filterFn(node) && domUtils.isBody(node) - ? null - : node; + findParent: function (node, filterFn, includeSelf) { + if (node && !domUtils.isBody(node)) { + node = includeSelf ? node : node.parentNode; + while (node) { + if (!filterFn || filterFn(node) || domUtils.isBody(node)) { + return filterFn && !filterFn(node) && domUtils.isBody(node) + ? null + : node; + } + node = node.parentNode; + } } - node = node.parentNode; - } - } - return null; - }, - /** + return null; + }, + /** * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 * @method findParentByTagName * @param { Node } node 需要查找的节点对象 @@ -2520,7 +2551,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, * 否则, 起点是node的父节点。 * @method findParentByTagName @@ -2537,17 +2568,17 @@ var domUtils = (dom.domUtils = { * console.log( queryTarget === node ); * ``` */ - findParentByTagName: function(node, tagNames, includeSelf, excludeFn) { - tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); - return domUtils.findParent( - node, - function(node) { - return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); - }, - includeSelf - ); - }, - /** + findParentByTagName: function (node, tagNames, includeSelf, excludeFn) { + tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); + return domUtils.findParent( + node, + function (node) { + return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); + }, + includeSelf + ); + }, + /** * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 * @method findParents * @param { Node } node 需要查找的节点对象 @@ -2558,7 +2589,7 @@ var domUtils = (dom.domUtils = { * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 */ - /** + /** * 查找节点node的祖先节点集合, 如果includeSelf的值为true, * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 * @method findParents @@ -2566,30 +2597,30 @@ var domUtils = (dom.domUtils = { * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 * @return { Array } 给定节点的祖先节点数组 */ - findParents: function(node, includeSelf, filterFn, closerFirst) { - var parents = includeSelf && ((filterFn && filterFn(node)) || !filterFn) - ? [node] - : []; - while ((node = domUtils.findParent(node, filterFn))) { - parents.push(node); - } - return closerFirst ? parents : parents.reverse(); - }, + findParents: function (node, includeSelf, filterFn, closerFirst) { + var parents = includeSelf && ((filterFn && filterFn(node)) || !filterFn) + ? [node] + : []; + while ((node = domUtils.findParent(node, filterFn))) { + parents.push(node); + } + return closerFirst ? parents : parents.reverse(); + }, - /** + /** * 在节点node后面插入新节点newNode * @method insertAfter * @param { Node } node 目标节点 * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 * @return { Node } 新插入的节点 */ - insertAfter: function(node, newNode) { - return node.nextSibling - ? node.parentNode.insertBefore(newNode, node.nextSibling) - : node.parentNode.appendChild(newNode); - }, + insertAfter: function (node, newNode) { + return node.nextSibling + ? node.parentNode.insertBefore(newNode, node.nextSibling) + : node.parentNode.appendChild(newNode); + }, - /** + /** * 删除节点node及其下属的所有节点 * @method remove * @param { Node } node 需要删除的节点对象 @@ -2607,7 +2638,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 删除节点node,并根据keepChildren的值决定是否保留子节点 * @method remove * @param { Node } node 需要删除的节点对象 @@ -2625,21 +2656,21 @@ var domUtils = (dom.domUtils = { * * ``` */ - remove: function(node, keepChildren) { - var parent = node.parentNode, - child; - if (parent) { - if (keepChildren && node.hasChildNodes()) { - while ((child = node.firstChild)) { - parent.insertBefore(child, node); + remove: function (node, keepChildren) { + var parent = node.parentNode, + child; + if (parent) { + if (keepChildren && node.hasChildNodes()) { + while ((child = node.firstChild)) { + parent.insertBefore(child, node); + } + } + parent.removeChild(node); } - } - parent.removeChild(node); - } - return node; - }, + return node; + }, - /** + /** * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 * @method getNextDomNode @@ -2679,7 +2710,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, * 则执行getNextDomNode(Node node)的查找过程。 @@ -2689,27 +2720,27 @@ var domUtils = (dom.domUtils = { * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL * @see UE.dom.domUtils.getNextDomNode(Node) */ - getNextDomNode: function(node, startFromChild, filterFn, guard) { - return getDomNode( - node, - "firstChild", - "nextSibling", - startFromChild, - filterFn, - guard - ); - }, - getPreDomNode: function(node, startFromChild, filterFn, guard) { - return getDomNode( - node, - "lastChild", - "previousSibling", - startFromChild, - filterFn, - guard - ); - }, - /** + getNextDomNode: function (node, startFromChild, filterFn, guard) { + return getDomNode( + node, + "firstChild", + "nextSibling", + startFromChild, + filterFn, + guard + ); + }, + getPreDomNode: function (node, startFromChild, filterFn, guard) { + return getDomNode( + node, + "lastChild", + "previousSibling", + startFromChild, + filterFn, + guard + ); + }, + /** * 检测节点node是否属是UEditor定义的bookmark节点 * @method isBookmarkNode * @private @@ -2725,10 +2756,10 @@ var domUtils = (dom.domUtils = { * * ``` */ - isBookmarkNode: function(node) { - return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); - }, - /** + isBookmarkNode: function (node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** * 获取节点node所属的window对象 * @method getWindow * @param { Node } node 节点对象 @@ -2739,11 +2770,11 @@ var domUtils = (dom.domUtils = { * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); * ``` */ - getWindow: function(node) { - var doc = node.ownerDocument || node; - return doc.defaultView || doc.parentWindow; - }, - /** + getWindow: function (node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** * 获取离nodeA与nodeB最近的公共的祖先节点 * @method getCommonAncestor * @param { Node } nodeA 第一个节点 @@ -2757,29 +2788,30 @@ var domUtils = (dom.domUtils = { * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); * ``` */ - getCommonAncestor: function(nodeA, nodeB) { - if (nodeA === nodeB) return nodeA; - var parentsA = [nodeA], - parentsB = [nodeB], - parent = nodeA, - i = -1; - while ((parent = parent.parentNode)) { - if (parent === nodeB) { - return parent; - } - parentsA.push(parent); - } - parent = nodeB; - while ((parent = parent.parentNode)) { - if (parent === nodeA) return parent; - parentsB.push(parent); - } - parentsA.reverse(); - parentsB.reverse(); - while ((i++, parentsA[i] === parentsB[i])) {} - return i == 0 ? null : parentsA[i - 1]; - }, - /** + getCommonAncestor: function (nodeA, nodeB) { + if (nodeA === nodeB) return nodeA; + var parentsA = [nodeA], + parentsB = [nodeB], + parent = nodeA, + i = -1; + while ((parent = parent.parentNode)) { + if (parent === nodeB) { + return parent; + } + parentsA.push(parent); + } + parent = nodeB; + while ((parent = parent.parentNode)) { + if (parent === nodeA) return parent; + parentsB.push(parent); + } + parentsA.reverse(); + parentsB.reverse(); + while ((i++, parentsA[i] === parentsB[i])) { + } + return i == 0 ? null : parentsA[i - 1]; + }, + /** * 清除node节点左右连续为空的兄弟inline节点 * @method clearEmptySibling * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, @@ -2807,7 +2839,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, * 则忽略对右边兄弟节点的操作。 * @method clearEmptySibling @@ -2817,7 +2849,7 @@ var domUtils = (dom.domUtils = { * @see UE.dom.domUtils.clearEmptySibling(Node) */ - /** + /** * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 * @method clearEmptySibling @@ -2827,27 +2859,28 @@ var domUtils = (dom.domUtils = { * 则这些兄弟节点将被删除 * @see UE.dom.domUtils.clearEmptySibling(Node) */ - clearEmptySibling: function(node, ignoreNext, ignorePre) { - function clear(next, dir) { - var tmpNode; - while ( - next && - !domUtils.isBookmarkNode(next) && - (domUtils.isEmptyInlineElement(next) || - //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 - !new RegExp("[^\t\n\r" + domUtils.fillChar + "]").test( - next.nodeValue - )) - ) { - tmpNode = next[dir]; - domUtils.remove(next); - next = tmpNode; - } - } - !ignoreNext && clear(node.nextSibling, "nextSibling"); - !ignorePre && clear(node.previousSibling, "previousSibling"); - }, - /** + clearEmptySibling: function (node, ignoreNext, ignorePre) { + function clear(next, dir) { + var tmpNode; + while ( + next && + !domUtils.isBookmarkNode(next) && + (domUtils.isEmptyInlineElement(next) || + //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 + !new RegExp("[^\t\n\r" + domUtils.fillChar + "]").test( + next.nodeValue + )) + ) { + tmpNode = next[dir]; + domUtils.remove(next); + next = tmpNode; + } + } + + !ignoreNext && clear(node.nextSibling, "nextSibling"); + !ignorePre && clear(node.previousSibling, "previousSibling"); + }, + /** * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 * @method split * @param { Node } textNode 需要拆分的文本节点对象 @@ -2863,23 +2896,23 @@ var domUtils = (dom.domUtils = { * * ``` */ - split: function(node, offset) { - var doc = node.ownerDocument; - if (browser.ie && offset == node.nodeValue.length) { - var next = doc.createTextNode(""); - return domUtils.insertAfter(node, next); - } - var retval = node.splitText(offset); - //ie8下splitText不会跟新childNodes,我们手动触发他的更新 - if (browser.ie8) { - var tmpNode = doc.createTextNode(""); - domUtils.insertAfter(retval, tmpNode); - domUtils.remove(tmpNode); - } - return retval; - }, + split: function (node, offset) { + var doc = node.ownerDocument; + if (browser.ie && offset == node.nodeValue.length) { + var next = doc.createTextNode(""); + return domUtils.insertAfter(node, next); + } + var retval = node.splitText(offset); + //ie8下splitText不会跟新childNodes,我们手动触发他的更新 + if (browser.ie8) { + var tmpNode = doc.createTextNode(""); + domUtils.insertAfter(retval, tmpNode); + domUtils.remove(tmpNode); + } + return retval; + }, - /** + /** * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) * @method isWhitespace * @param { Node } node 需要检测的节点对象 @@ -2895,12 +2928,12 @@ var domUtils = (dom.domUtils = { * * ``` */ - isWhitespace: function(node) { - return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test( - node.nodeValue - ); - }, - /** + isWhitespace: function (node) { + return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test( + node.nodeValue + ); + }, + /** * 获取元素element相对于viewport的位置坐标 * @method getXY * @param { Node } element 需要计算位置的节点对象 @@ -2914,17 +2947,17 @@ var domUtils = (dom.domUtils = { * console.log( 'test的坐标为: ', location.x, ',', location.y ); * ``` */ - getXY: function(element) { - var x = 0, - y = 0; - while (element.offsetParent) { - y += element.offsetTop; - x += element.offsetLeft; - element = element.offsetParent; - } - return { x: x, y: y }; - }, - /** + getXY: function (element) { + var x = 0, + y = 0; + while (element.offsetParent) { + y += element.offsetTop; + x += element.offsetLeft; + element = element.offsetParent; + } + return {x: x, y: y}; + }, + /** * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 * @method on * @param { Node } element 需要绑定事件的节点对象 @@ -2938,11 +2971,11 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 * @method on * @param { Node } element 需要绑定事件的节点对象 - * @param { Array } type 绑定的事件类型数组 + * @param {string} type 绑定的事件类型数组 * @param { Function } handler 事件处理器 * @example * ```javascript @@ -2951,39 +2984,39 @@ var domUtils = (dom.domUtils = { * }); * ``` */ - on: function(element, type, handler) { - var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), - k = types.length; - if (k) - while (k--) { - type = types[k]; - if (element.addEventListener) { - element.addEventListener(type, handler, false); - } else { - if (!handler._d) { - handler._d = { - els: [] - }; - } - var key = type + handler.toString(), - index = utils.indexOf(handler._d.els, element); - if (!handler._d[key] || index == -1) { - if (index == -1) { - handler._d.els.push(element); - } - if (!handler._d[key]) { - handler._d[key] = function(evt) { - return handler.call(evt.srcElement, evt || window.event); - }; - } + on: function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) + while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els: [] + }; + } + var key = type + handler.toString(), + index = utils.indexOf(handler._d.els, element); + if (!handler._d[key] || index == -1) { + if (index == -1) { + handler._d.els.push(element); + } + if (!handler._d[key]) { + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } - element.attachEvent("on" + type, handler._d[key]); - } - } - } - element = null; - }, - /** + element.attachEvent("on" + type, handler._d[key]); + } + } + } + element = null; + }, + /** * 解除DOM事件绑定 * @method un * @param { Node } element 需要解除事件绑定的节点对象 @@ -2997,7 +3030,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 解除DOM事件绑定 * @method un * @param { Node } element 需要解除事件绑定的节点对象 @@ -3010,34 +3043,35 @@ var domUtils = (dom.domUtils = { * }); * ``` */ - un: function(element, type, handler) { - var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), - k = types.length; - if (k) - while (k--) { - type = types[k]; - if (element.removeEventListener) { - element.removeEventListener(type, handler, false); - } else { - var key = type + handler.toString(); - try { - element.detachEvent( - "on" + type, - handler._d ? handler._d[key] : handler - ); - } catch (e) {} - if (handler._d && handler._d[key]) { - var index = utils.indexOf(handler._d.els, element); - if (index != -1) { - handler._d.els.splice(index, 1); + un: function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) + while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try { + element.detachEvent( + "on" + type, + handler._d ? handler._d[key] : handler + ); + } catch (e) { + } + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els, element); + if (index != -1) { + handler._d.els.splice(index, 1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } } - handler._d.els.length == 0 && delete handler._d[key]; - } - } - } - }, + }, - /** + /** * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 * @method isSameElement * @param { Node } nodeA 需要比较的节点 @@ -3063,59 +3097,59 @@ var domUtils = (dom.domUtils = { * * ``` */ - isSameElement: function(nodeA, nodeB) { - if (nodeA.tagName != nodeB.tagName) { - return false; - } - var thisAttrs = nodeA.attributes, - otherAttrs = nodeB.attributes; - if (!ie && thisAttrs.length != otherAttrs.length) { - return false; - } - var attrA, - attrB, - al = 0, - bl = 0; - for (var i = 0; (attrA = thisAttrs[i++]); ) { - if (attrA.nodeName == "style") { - if (attrA.specified) { - al++; + isSameElement: function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) { + return false; } - if (domUtils.isSameStyle(nodeA, nodeB)) { - continue; - } else { - return false; + var thisAttrs = nodeA.attributes, + otherAttrs = nodeB.attributes; + if (!ie && thisAttrs.length != otherAttrs.length) { + return false; } - } - if (ie) { - if (attrA.specified) { - al++; - attrB = otherAttrs.getNamedItem(attrA.nodeName); - } else { - continue; + var attrA, + attrB, + al = 0, + bl = 0; + for (var i = 0; (attrA = thisAttrs[i++]);) { + if (attrA.nodeName == "style") { + if (attrA.specified) { + al++; + } + if (domUtils.isSameStyle(nodeA, nodeB)) { + continue; + } else { + return false; + } + } + if (ie) { + if (attrA.specified) { + al++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } else { + continue; + } + } else { + attrB = nodeB.attributes[attrA.nodeName]; + } + if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { + return false; + } } - } else { - attrB = nodeB.attributes[attrA.nodeName]; - } - if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { - return false; - } - } - // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 - if (ie) { - for (i = 0; (attrB = otherAttrs[i++]); ) { - if (attrB.specified) { - bl++; + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; (attrB = otherAttrs[i++]);) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } } - } - if (al != bl) { - return false; - } - } - return true; - }, + return true; + }, - /** + /** * 判断节点nodeA与节点nodeB的元素的style属性是否一致 * @method isSameStyle * @param { Node } nodeA 需要比较的节点 @@ -3141,43 +3175,43 @@ var domUtils = (dom.domUtils = { * * ``` */ - isSameStyle: function(nodeA, nodeB) { - var styleA = nodeA.style.cssText - .replace(/( ?; ?)/g, ";") - .replace(/( ?: ?)/g, ":"), - styleB = nodeB.style.cssText - .replace(/( ?; ?)/g, ";") - .replace(/( ?: ?)/g, ":"); - if (browser.opera) { - styleA = nodeA.style; - styleB = nodeB.style; - if (styleA.length != styleB.length) return false; - for (var p in styleA) { - if (/^(\d+|csstext)$/i.test(p)) { - continue; + isSameStyle: function (nodeA, nodeB) { + var styleA = nodeA.style.cssText + .replace(/( ?; ?)/g, ";") + .replace(/( ?: ?)/g, ":"), + styleB = nodeB.style.cssText + .replace(/( ?; ?)/g, ";") + .replace(/( ?: ?)/g, ":"); + if (browser.opera) { + styleA = nodeA.style; + styleB = nodeB.style; + if (styleA.length != styleB.length) return false; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) { + continue; + } + if (styleA[p] != styleB[p]) { + return false; + } + } + return true; } - if (styleA[p] != styleB[p]) { - return false; + if (!styleA || !styleB) { + return styleA == styleB; } - } - return true; - } - if (!styleA || !styleB) { - return styleA == styleB; - } - styleA = styleA.split(";"); - styleB = styleB.split(";"); - if (styleA.length != styleB.length) { - return false; - } - for (var i = 0, ci; (ci = styleA[i++]); ) { - if (utils.indexOf(styleB, ci) == -1) { - return false; - } - } - return true; - }, - /** + styleA = styleA.split(";"); + styleB = styleB.split(";"); + if (styleA.length != styleB.length) { + return false; + } + for (var i = 0, ci; (ci = styleA[i++]);) { + if (utils.indexOf(styleB, ci) == -1) { + return false; + } + } + return true; + }, + /** * 检查节点node是否为block元素 * @method isBlockElm * @param { Node } node 需要检测的节点对象 @@ -3204,15 +3238,15 @@ var domUtils = (dom.domUtils = { * * ``` */ - isBlockElm: function(node) { - return ( - node.nodeType == 1 && - (dtd.$block[node.tagName] || - styleBlock[domUtils.getComputedStyle(node, "display")]) && - !dtd.$nonChild[node.tagName] - ); - }, - /** + isBlockElm: function (node) { + return ( + node.nodeType == 1 && + (dtd.$block[node.tagName] || + styleBlock[domUtils.getComputedStyle(node, "display")]) && + !dtd.$nonChild[node.tagName] + ); + }, + /** * 检测node节点是否为body节点 * @method isBody * @param { Element } node 需要检测的dom元素 @@ -3223,10 +3257,10 @@ var domUtils = (dom.domUtils = { * console.log( UE.dom.domUtils.isBody( document.body ) ); * ``` */ - isBody: function(node) { - return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body"; - }, - /** + isBody: function (node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body"; + }, + /** * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, * 拆分形成的两个节点之间是node节点 * @method breakParent @@ -3255,41 +3289,41 @@ var domUtils = (dom.domUtils = { * * ``` */ - breakParent: function(node, parent) { - var tmpNode, - parentClone = node, - clone = node, - leftNodes, - rightNodes; - do { - parentClone = parentClone.parentNode; - if (leftNodes) { - tmpNode = parentClone.cloneNode(false); - tmpNode.appendChild(leftNodes); - leftNodes = tmpNode; - tmpNode = parentClone.cloneNode(false); - tmpNode.appendChild(rightNodes); - rightNodes = tmpNode; - } else { - leftNodes = parentClone.cloneNode(false); - rightNodes = leftNodes.cloneNode(false); - } - while ((tmpNode = clone.previousSibling)) { - leftNodes.insertBefore(tmpNode, leftNodes.firstChild); - } - while ((tmpNode = clone.nextSibling)) { - rightNodes.appendChild(tmpNode); - } - clone = parentClone; - } while (parent !== parentClone); - tmpNode = parent.parentNode; - tmpNode.insertBefore(leftNodes, parent); - tmpNode.insertBefore(rightNodes, parent); - tmpNode.insertBefore(node, rightNodes); - domUtils.remove(parent); - return node; - }, - /** + breakParent: function (node, parent) { + var tmpNode, + parentClone = node, + clone = node, + leftNodes, + rightNodes; + do { + parentClone = parentClone.parentNode; + if (leftNodes) { + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(leftNodes); + leftNodes = tmpNode; + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(rightNodes); + rightNodes = tmpNode; + } else { + leftNodes = parentClone.cloneNode(false); + rightNodes = leftNodes.cloneNode(false); + } + while ((tmpNode = clone.previousSibling)) { + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); + } + while ((tmpNode = clone.nextSibling)) { + rightNodes.appendChild(tmpNode); + } + clone = parentClone; + } while (parent !== parentClone); + tmpNode = parent.parentNode; + tmpNode.insertBefore(leftNodes, parent); + tmpNode.insertBefore(rightNodes, parent); + tmpNode.insertBefore(node, rightNodes); + domUtils.remove(parent); + return node; + }, + /** * 检查节点node是否是空inline节点 * @method isEmptyInlineElement * @param { Node } node 需要检测的节点对象 @@ -3302,28 +3336,28 @@ var domUtils = (dom.domUtils = { * xx => 0 * ``` */ - isEmptyInlineElement: function(node) { - if (node.nodeType != 1 || !dtd.$removeEmpty[node.tagName]) { - return 0; - } - node = node.firstChild; - while (node) { - //如果是创建的bookmark就跳过 - if (domUtils.isBookmarkNode(node)) { - return 0; - } - if ( - (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node)) || - (node.nodeType == 3 && !domUtils.isWhitespace(node)) - ) { - return 0; - } - node = node.nextSibling; - } - return 1; - }, + isEmptyInlineElement: function (node) { + if (node.nodeType != 1 || !dtd.$removeEmpty[node.tagName]) { + return 0; + } + node = node.firstChild; + while (node) { + //如果是创建的bookmark就跳过 + if (domUtils.isBookmarkNode(node)) { + return 0; + } + if ( + (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node)) || + (node.nodeType == 3 && !domUtils.isWhitespace(node)) + ) { + return 0; + } + node = node.nextSibling; + } + return 1; + }, - /** + /** * 删除node节点下首尾两端的空白文本子节点 * @method trimWhiteTextNode * @param { Element } node 需要执行删除操作的元素对象 @@ -3346,22 +3380,23 @@ var domUtils = (dom.domUtils = { * console.log( node.childNodes.length ); * ``` */ - trimWhiteTextNode: function(node) { - function remove(dir) { - var child; - while ( - (child = node[dir]) && - child.nodeType == 3 && - domUtils.isWhitespace(child) - ) { - node.removeChild(child); - } - } - remove("firstChild"); - remove("lastChild"); - }, + trimWhiteTextNode: function (node) { + function remove(dir) { + var child; + while ( + (child = node[dir]) && + child.nodeType == 3 && + domUtils.isWhitespace(child) + ) { + node.removeChild(child); + } + } - /** + remove("firstChild"); + remove("lastChild"); + }, + + /** * 合并node节点下相同的子节点 * @name mergeChild * @desc @@ -3371,71 +3406,71 @@ var domUtils = (dom.domUtils = { * ==> UE.dom.domUtils.mergeChild(node,'span') *

      xxaaxx

      */ - mergeChild: function(node, tagName, attrs) { - var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); - for (var i = 0, ci; (ci = list[i++]); ) { - if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { - continue; - } - //span单独处理 - if (ci.tagName.toLowerCase() == "span") { - if (node === ci.parentNode) { - domUtils.trimWhiteTextNode(node); - if (node.childNodes.length == 1) { - node.style.cssText = ci.style.cssText + ";" + node.style.cssText; - domUtils.remove(ci, true); - continue; - } - } - ci.style.cssText = node.style.cssText + ";" + ci.style.cssText; - if (attrs) { - var style = attrs.style; - if (style) { - style = style.split(";"); - for (var j = 0, s; (s = style[j++]); ) { - ci.style[utils.cssStyleToDomStyle(s.split(":")[0])] = s.split( - ":" - )[1]; + mergeChild: function (node, tagName, attrs) { + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + for (var i = 0, ci; (ci = list[i++]);) { + if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { + continue; + } + //span单独处理 + if (ci.tagName.toLowerCase() == "span") { + if (node === ci.parentNode) { + domUtils.trimWhiteTextNode(node); + if (node.childNodes.length == 1) { + node.style.cssText = ci.style.cssText + ";" + node.style.cssText; + domUtils.remove(ci, true); + continue; + } + } + ci.style.cssText = node.style.cssText + ";" + ci.style.cssText; + if (attrs) { + var style = attrs.style; + if (style) { + style = style.split(";"); + for (var j = 0, s; (s = style[j++]);) { + ci.style[utils.cssStyleToDomStyle(s.split(":")[0])] = s.split( + ":" + )[1]; + } + } + } + if (domUtils.isSameStyle(ci, node)) { + domUtils.remove(ci, true); + } + continue; + } + if (domUtils.isSameElement(node, ci)) { + domUtils.remove(ci, true); } - } } - if (domUtils.isSameStyle(ci, node)) { - domUtils.remove(ci, true); - } - continue; - } - if (domUtils.isSameElement(node, ci)) { - domUtils.remove(ci, true); - } - } - }, + }, - /** + /** * 原生方法getElementsByTagName的封装 * @method getElementsByTagName * @param { Node } node 目标节点对象 * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 * @return { Array } 符合条件的节点集合 */ - getElementsByTagName: function(node, name, filter) { - if (filter && utils.isString(filter)) { - var className = filter; - filter = function(node) { - return domUtils.hasClass(node, className); - }; - } - name = utils.trim(name).replace(/[ ]{2,}/g, " ").split(" "); - var arr = []; - for (var n = 0, ni; (ni = name[n++]); ) { - var list = node.getElementsByTagName(ni); - for (var i = 0, ci; (ci = list[i++]); ) { - if (!filter || filter(ci)) arr.push(ci); - } - } + getElementsByTagName: function (node, tagName, filter) { + if (filter && utils.isString(filter)) { + var className = filter; + filter = function (node) { + return domUtils.hasClass(node, className); + }; + } + tagName = utils.trim(tagName).replace(/[ ]{2,}/g, " ").split(" "); + var arr = []; + for (var n = 0, ni; (ni = tagName[n++]);) { + var list = node.getElementsByTagName(ni); + for (var i = 0, ci; (ci = list[i++]);) { + if (!filter || filter(ci)) arr.push(ci); + } + } - return arr; - }, - /** + return arr; + }, + /** * 将节点node提取到父节点上 * @method mergeToParent * @param { Element } node 需要提取的元素对象 @@ -3462,39 +3497,39 @@ var domUtils = (dom.domUtils = { * * ``` */ - mergeToParent: function(node) { - var parent = node.parentNode; - while (parent && dtd.$removeEmpty[parent.tagName]) { - if (parent.tagName == node.tagName || parent.tagName == "A") { - //针对a标签单独处理 - domUtils.trimWhiteTextNode(parent); - //span需要特殊处理 不处理这样的情况 xxxxxxxxx - if ( - (parent.tagName == "SPAN" && !domUtils.isSameStyle(parent, node)) || - (parent.tagName == "A" && node.tagName == "SPAN") - ) { - if (parent.childNodes.length > 1 || parent !== node.parentNode) { - node.style.cssText = - parent.style.cssText + ";" + node.style.cssText; - parent = parent.parentNode; - continue; - } else { - parent.style.cssText += ";" + node.style.cssText; - //trace:952 a标签要保持下划线 - if (parent.tagName == "A") { - parent.style.textDecoration = "underline"; + mergeToParent: function (node) { + var parent = node.parentNode; + while (parent && dtd.$removeEmpty[parent.tagName]) { + if (parent.tagName == node.tagName || parent.tagName == "A") { + //针对a标签单独处理 + domUtils.trimWhiteTextNode(parent); + //span需要特殊处理 不处理这样的情况 xxxxxxxxx + if ( + (parent.tagName == "SPAN" && !domUtils.isSameStyle(parent, node)) || + (parent.tagName == "A" && node.tagName == "SPAN") + ) { + if (parent.childNodes.length > 1 || parent !== node.parentNode) { + node.style.cssText = + parent.style.cssText + ";" + node.style.cssText; + parent = parent.parentNode; + continue; + } else { + parent.style.cssText += ";" + node.style.cssText; + //trace:952 a标签要保持下划线 + if (parent.tagName == "A") { + parent.style.textDecoration = "underline"; + } + } + } + if (parent.tagName != "A") { + parent === node.parentNode && domUtils.remove(node, true); + break; + } } - } + parent = parent.parentNode; } - if (parent.tagName != "A") { - parent === node.parentNode && domUtils.remove(node, true); - break; - } - } - parent = parent.parentNode; - } - }, - /** + }, + /** * 合并节点node的左右兄弟节点 * @method mergeSibling * @param { Element } node 需要合并的目标节点 @@ -3511,7 +3546,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 * @method mergeSibling * @param { Element } node 需要合并的目标节点 @@ -3529,7 +3564,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 * @method mergeSibling * @param { Element } node 需要合并的目标节点 @@ -3548,30 +3583,31 @@ var domUtils = (dom.domUtils = { * * ``` */ - mergeSibling: function(node, ignorePre, ignoreNext) { - function merge(rtl, start, node) { - var next; - if ( - (next = node[rtl]) && - !domUtils.isBookmarkNode(next) && - next.nodeType == 1 && - domUtils.isSameElement(node, next) - ) { - while (next.firstChild) { - if (start == "firstChild") { - node.insertBefore(next.lastChild, node.firstChild); - } else { - node.appendChild(next.firstChild); - } + mergeSibling: function (node, ignorePre, ignoreNext) { + function merge(rtl, start, node) { + var next; + if ( + (next = node[rtl]) && + !domUtils.isBookmarkNode(next) && + next.nodeType == 1 && + domUtils.isSameElement(node, next) + ) { + while (next.firstChild) { + if (start == "firstChild") { + node.insertBefore(next.lastChild, node.firstChild); + } else { + node.appendChild(next.firstChild); + } + } + domUtils.remove(next); + } } - domUtils.remove(next); - } - } - !ignorePre && merge("previousSibling", "firstChild", node); - !ignoreNext && merge("nextSibling", "lastChild", node); - }, - /** + !ignorePre && merge("previousSibling", "firstChild", node); + !ignoreNext && merge("nextSibling", "lastChild", node); + }, + + /** * 设置节点node及其子节点不会被选中 * @method unSelectable * @param { Element } node 需要执行操作的dom元素 @@ -3581,35 +3617,35 @@ var domUtils = (dom.domUtils = { * UE.dom.domUtils.unSelectable( document.body ); * ``` */ - unSelectable: (ie && browser.ie9below) || browser.opera - ? function(node) { - //for ie9 - node.onselectstart = function() { - return false; - }; - node.onclick = node.onkeyup = node.onkeydown = function() { - return false; - }; - node.unselectable = "on"; - node.setAttribute("unselectable", "on"); - for (var i = 0, ci; (ci = node.all[i++]); ) { - switch (ci.tagName.toLowerCase()) { - case "iframe": - case "textarea": - case "input": - case "select": - break; - default: - ci.unselectable = "on"; - node.setAttribute("unselectable", "on"); - } + unSelectable: (ie && browser.ie9below) || browser.opera + ? function (node) { + //for ie9 + node.onselectstart = function () { + return false; + }; + node.onclick = node.onkeyup = node.onkeydown = function () { + return false; + }; + node.unselectable = "on"; + node.setAttribute("unselectable", "on"); + for (var i = 0, ci; (ci = node.all[i++]);) { + switch (ci.tagName.toLowerCase()) { + case "iframe": + case "textarea": + case "input": + case "select": + break; + default: + ci.unselectable = "on"; + node.setAttribute("unselectable", "on"); + } + } } - } - : function(node) { - node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = - "none"; - }, - /** + : function (node) { + node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = + "none"; + }, + /** * 删除节点node上的指定属性名称的属性 * @method removeAttributes * @param { Node } node 需要删除属性的节点对象 @@ -3631,7 +3667,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 删除节点node上的指定属性名称的属性 * @method removeAttributes * @param { Node } node 需要删除属性的节点对象 @@ -3652,25 +3688,25 @@ var domUtils = (dom.domUtils = { * * ``` */ - removeAttributes: function(node, attrNames) { - attrNames = utils.isArray(attrNames) - ? attrNames - : utils.trim(attrNames).replace(/[ ]{2,}/g, " ").split(" "); - for (var i = 0, ci; (ci = attrNames[i++]); ) { - ci = attrFix[ci] || ci; - switch (ci) { - case "className": - node[ci] = ""; - break; - case "style": - node.style.cssText = ""; - var val = node.getAttributeNode("style"); - !browser.ie && val && node.removeAttributeNode(val); - } - node.removeAttribute(ci); - } - }, - /** + removeAttributes: function (node, attrNames) { + attrNames = utils.isArray(attrNames) + ? attrNames + : utils.trim(attrNames).replace(/[ ]{2,}/g, " ").split(" "); + for (var i = 0, ci; (ci = attrNames[i++]);) { + ci = attrFix[ci] || ci; + switch (ci) { + case "className": + node[ci] = ""; + break; + case "style": + node.style.cssText = ""; + var val = node.getAttributeNode("style"); + !browser.ie && val && node.removeAttributeNode(val); + } + node.removeAttribute(ci); + } + }, + /** * 在doc下创建一个标签名为tag,属性为attrs的元素 * @method createElement * @param { DomDocument } doc 新创建的元素属于该document节点创建 @@ -3691,10 +3727,10 @@ var domUtils = (dom.domUtils = { * * ``` */ - createElement: function(doc, tag, attrs) { - return domUtils.setAttributes(doc.createElement(tag), attrs); - }, - /** + createElement: function (doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs); + }, + /** * 为节点node添加属性attrs,attrs为属性键值对 * @method setAttributes * @param { Element } node 需要设置属性的元素对象 @@ -3716,41 +3752,41 @@ var domUtils = (dom.domUtils = { * * */ - setAttributes: function(node, attrs) { - for (var attr in attrs) { - if('_propertyDelete'===attr){ - for(var j=0;j * ``` */ - getComputedStyle: function(element, styleName) { - //一下的属性单独处理 - var pros = "width height top left"; + getComputedStyle: function (element, styleName) { + //以下的属性单独处理 + var pros = "width height top left"; - if (pros.indexOf(styleName) > -1) { - return ( - element[ - "offset" + - styleName.replace(/^\w/, function(s) { - return s.toUpperCase(); - }) - ] + "px" - ); - } - //忽略文本节点 - if (element.nodeType == 3) { - element = element.parentNode; - } - //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. - if ( - browser.ie && - browser.version < 9 && - styleName == "font-size" && - !element.style.fontSize && - !dtd.$empty[element.tagName] && - !dtd.$nonChild[element.tagName] - ) { - var span = element.ownerDocument.createElement("span"); - span.style.cssText = "padding:0;border:0;font-family:simsun;"; - span.innerHTML = "."; - element.appendChild(span); - var result = span.offsetHeight; - element.removeChild(span); - span = null; - return result + "px"; - } - try { - var value = - domUtils.getStyle(element, styleName) || - (window.getComputedStyle - ? domUtils - .getWindow(element) - .getComputedStyle(element, "") - .getPropertyValue(styleName) - : (element.currentStyle || element.style)[ - utils.cssStyleToDomStyle(styleName) - ]); - } catch (e) { - return ""; - } - return utils.transUnitToPx(utils.fixColor(styleName, value)); - }, - /** + if (pros.indexOf(styleName) > -1) { + return ( + element[ + "offset" + + styleName.replace(/^\w/, function (s) { + return s.toUpperCase(); + }) + ] + "px" + ); + } + //忽略文本节点 + if (element.nodeType === 3) { + element = element.parentNode; + } + //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. + if ( + browser.ie && + browser.version < 9 && + styleName === "font-size" && + !element.style.fontSize && + !dtd.$empty[element.tagName] && + !dtd.$nonChild[element.tagName] + ) { + var span = element.ownerDocument.createElement("span"); + span.style.cssText = "padding:0;border:0;font-family:simsun;"; + span.innerHTML = "."; + element.appendChild(span); + var result = span.offsetHeight; + element.removeChild(span); + span = null; + return result + "px"; + } + try { + var value = + domUtils.getStyle(element, styleName) || + (window.getComputedStyle + ? domUtils + .getWindow(element) + .getComputedStyle(element, "") + .getPropertyValue(styleName) + : (element.currentStyle || element.style)[ + utils.cssStyleToDomStyle(styleName) + ]); + } catch (e) { + return ""; + } + return utils.transUnitToPx(utils.fixColor(styleName, value)); + }, + /** * 删除元素element指定的className * @method removeClasses * @param { Element } ele 需要删除class的元素节点 @@ -3845,7 +3881,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 删除元素element指定的className * @method removeClasses * @param { Element } ele 需要删除class的元素节点 @@ -3865,21 +3901,21 @@ var domUtils = (dom.domUtils = { * * ``` */ - removeClasses: function(elm, classNames) { - classNames = utils.isArray(classNames) - ? classNames - : utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); - for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) { - cls = cls.replace(new RegExp("\\b" + ci + "\\b"), ""); - } - cls = utils.trim(cls).replace(/[ ]{2,}/g, " "); - if (cls) { - elm.className = cls; - } else { - domUtils.removeAttributes(elm, ["class"]); - } - }, - /** + removeClasses: function (elm, classNames) { + classNames = utils.isArray(classNames) + ? classNames + : utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); + for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]);) { + cls = cls.replace(new RegExp("\\b" + ci + "\\b"), ""); + } + cls = utils.trim(cls).replace(/[ ]{2,}/g, " "); + if (cls) { + elm.className = cls; + } else { + domUtils.removeAttributes(elm, ["class"]); + } + }, + /** * 给元素element添加className * @method addClass * @param { Node } ele 需要增加className的元素 @@ -3901,7 +3937,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 给元素element添加className * @method addClass * @param { Node } ele 需要增加className的元素 @@ -3922,17 +3958,17 @@ var domUtils = (dom.domUtils = { * * ``` */ - hasClass: function(element, className) { - if (utils.isRegExp(className)) { - return className.test(element.className); - } - className = utils.trim(className).replace(/[ ]{2,}/g, " ").split(" "); - for (var i = 0, ci, cls = element.className; (ci = className[i++]); ) { - if (!new RegExp("\\b" + ci + "\\b", "i").test(cls)) { - return false; - } - } - return i - 1 == className.length; - }, + hasClass: function (element, className) { + if (utils.isRegExp(className)) { + return className.test(element.className); + } + className = utils.trim(className).replace(/[ ]{2,}/g, " ").split(" "); + for (var i = 0, ci, cls = element.className; (ci = className[i++]);) { + if (!new RegExp("\\b" + ci + "\\b", "i").test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, - /** + /** * 阻止事件默认行为 * @method preventDefault * @param { Event } evt 需要阻止默认行为的事件对象 @@ -3997,10 +4033,10 @@ var domUtils = (dom.domUtils = { * UE.dom.domUtils.preventDefault( evt ); * ``` */ - preventDefault: function(evt) { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - }, - /** + preventDefault: function (evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** * 删除元素element指定的样式 * @method removeStyle * @param { Element } element 需要删除样式的元素 @@ -4021,29 +4057,29 @@ var domUtils = (dom.domUtils = { * * ``` */ - removeStyle: function(element, name) { - if (browser.ie) { - //针对color先单独处理一下 - if (name == "color") { - name = "(^|;)" + name; - } - element.style.cssText = element.style.cssText.replace( - new RegExp(name + "[^:]*:[^;]+;?", "ig"), - "" - ); - } else { - if (element.style.removeProperty) { - element.style.removeProperty(name); - } else { - element.style.removeAttribute(utils.cssStyleToDomStyle(name)); - } - } + removeStyle: function (element, name) { + if (browser.ie) { + //针对color先单独处理一下 + if (name == "color") { + name = "(^|;)" + name; + } + element.style.cssText = element.style.cssText.replace( + new RegExp(name + "[^:]*:[^;]+;?", "ig"), + "" + ); + } else { + if (element.style.removeProperty) { + element.style.removeProperty(name); + } else { + element.style.removeAttribute(utils.cssStyleToDomStyle(name)); + } + } - if (!element.style.cssText) { - domUtils.removeAttributes(element, ["style"]); - } - }, - /** + if (!element.style.cssText) { + domUtils.removeAttributes(element, ["style"]); + } + }, + /** * 获取元素element的style属性的指定值 * @method getStyle * @param { Element } element 需要获取属性值的元素 @@ -4067,11 +4103,11 @@ var domUtils = (dom.domUtils = { * * ``` */ - getStyle: function(element, name) { - var value = element.style[utils.cssStyleToDomStyle(name)]; - return utils.fixColor(name, value); - }, - /** + getStyle: function (element, name) { + var value = element.style[utils.cssStyleToDomStyle(name)]; + return utils.fixColor(name, value); + }, + /** * 为元素element设置样式属性值 * @method setStyle * @param { Element } element 需要设置样式的元素 @@ -4095,13 +4131,13 @@ var domUtils = (dom.domUtils = { * * ``` */ - setStyle: function(element, name, value) { - element.style[utils.cssStyleToDomStyle(name)] = value; - if (!utils.trim(element.style.cssText)) { - this.removeAttributes(element, "style"); - } - }, - /** + setStyle: function (element, name, value) { + element.style[utils.cssStyleToDomStyle(name)] = value; + if (!utils.trim(element.style.cssText)) { + this.removeAttributes(element, "style"); + } + }, + /** * 为元素element设置多个样式属性值 * @method setStyles * @param { Element } element 需要设置样式的元素 @@ -4126,29 +4162,28 @@ var domUtils = (dom.domUtils = { * * ``` */ - setStyles: function(element, styles) { - for (var name in styles) { - if (styles.hasOwnProperty(name)) { - domUtils.setStyle(element, name, styles[name]); - } - } - }, - /** + setStyles: function (element, styles) { + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + domUtils.setStyle(element, name, styles[name]); + } + } + }, + /** * 删除_moz_dirty属性 * @private * @method removeDirtyAttr */ - removeDirtyAttr: function(node) { - for ( - var i = 0, ci, nodes = node.getElementsByTagName("*"); - (ci = nodes[i++]); - - ) { - ci.removeAttribute("_moz_dirty"); - } - node.removeAttribute("_moz_dirty"); - }, - /** + removeDirtyAttr: function (node) { + for ( + var i = 0, ci, nodes = node.getElementsByTagName("*"); + (ci = nodes[i++]); + ) { + ci.removeAttribute("_moz_dirty"); + } + node.removeAttribute("_moz_dirty"); + }, + /** * 获取子节点的数量 * @method getChildCount * @param { Element } node 需要检测的元素 @@ -4168,7 +4203,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 根据给定的过滤规则, 获取符合条件的子节点的数量 * @method getChildCount * @param { Element } node 需要检测的元素 @@ -4192,24 +4227,24 @@ var domUtils = (dom.domUtils = { * * ``` */ - getChildCount: function(node, fn) { - var count = 0, - first = node.firstChild; - fn = - fn || - function() { - return 1; - }; - while (first) { - if (fn(first)) { - count++; - } - first = first.nextSibling; - } - return count; - }, + getChildCount: function (node, fn) { + var count = 0, + first = node.firstChild; + fn = + fn || + function () { + return 1; + }; + while (first) { + if (fn(first)) { + count++; + } + first = first.nextSibling; + } + return count; + }, - /** + /** * 判断给定节点是否为空节点 * @method isEmptyNode * @param { Node } node 需要检测的节点对象 @@ -4219,77 +4254,82 @@ var domUtils = (dom.domUtils = { * UE.dom.domUtils.isEmptyNode( document.body ); * ``` */ - isEmptyNode: function(node) { - return ( - !node.firstChild || - domUtils.getChildCount(node, function(node) { + isEmptyNode: function (node) { return ( - !domUtils.isBr(node) && - !domUtils.isBookmarkNode(node) && - !domUtils.isWhitespace(node) + !node.firstChild || + domUtils.getChildCount(node, function (node) { + return ( + !domUtils.isBr(node) && + !domUtils.isBookmarkNode(node) && + !domUtils.isWhitespace(node) + ); + }) == 0 ); - }) == 0 - ); - }, - clearSelectedArr: function(nodes) { - var node; - while ((node = nodes.pop())) { - domUtils.removeAttributes(node, ["class"]); - } - }, - /** + }, + clearSelectedArr: function (nodes) { + var node; + while ((node = nodes.pop())) { + domUtils.removeAttributes(node, ["class"]); + } + }, + /** * 将显示区域滚动到指定节点的位置 * @method scrollToView * @param {Node} node 节点 * @param {window} win window对象 * @param {Number} offsetTop 距离上方的偏移量 */ - scrollToView: function(node, win, offsetTop) { - var getViewPaneSize = function() { - var doc = win.document, - mode = doc.compatMode == "CSS1Compat"; - return { - width: - (mode ? doc.documentElement.clientWidth : doc.body.clientWidth) || 0, - height: - (mode ? doc.documentElement.clientHeight : doc.body.clientHeight) || 0 - }; - }, - getScrollPosition = function(win) { - if ("pageXOffset" in win) { - return { - x: win.pageXOffset || 0, - y: win.pageYOffset || 0 - }; - } else { - var doc = win.document; - return { - x: doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, - y: doc.documentElement.scrollTop || doc.body.scrollTop || 0 - }; + scrollToView: function (node, win, offsetTop) { + offsetTop = offsetTop || 0 + var getViewPaneSize = function () { + var doc = win.document, + mode = doc.compatMode == "CSS1Compat"; + return { + width: + (mode ? doc.documentElement.clientWidth : doc.body.clientWidth) || 0, + height: + (mode ? doc.documentElement.clientHeight : doc.body.clientHeight) || 0 + }; + }, + getScrollPosition = function (win) { + if ("pageXOffset" in win) { + return { + x: win.pageXOffset || 0, + y: win.pageYOffset || 0 + }; + } else { + var doc = win.document; + return { + x: doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, + y: doc.documentElement.scrollTop || doc.body.scrollTop || 0 + }; + } + }; + var winHeight = getViewPaneSize().height, + offset = winHeight * -1 + offsetTop; + offset += node.offsetHeight || 0; + var elementPosition = domUtils.getXY(node); + offset += elementPosition.y; + var currentScroll = getScrollPosition(win).y; + // console.log({currentScroll,winHeight,offset,y:elementPosition.y}); + // offset += 50; + if (offset > currentScroll || offset < currentScroll - winHeight) { + win.scrollTo({ + top: offset + (offset < 0 ? -20 : 20), + behavior: "smooth" + }); } - }; - var winHeight = getViewPaneSize().height, - offset = winHeight * -1 + offsetTop; - offset += node.offsetHeight || 0; - var elementPosition = domUtils.getXY(node); - offset += elementPosition.y; - var currentScroll = getScrollPosition(win).y; - // offset += 50; - if (offset > currentScroll || offset < currentScroll - winHeight) { - win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); - } - }, - /** + }, + /** * 判断给定节点是否为br * @method isBr * @param { Node } node 需要判断的节点对象 * @return { Boolean } 给定的节点是否是br节点 */ - isBr: function(node) { - return node.nodeType == 1 && node.tagName == "BR"; - }, - /** + isBr: function (node) { + return node.nodeType == 1 && node.tagName == "BR"; + }, + /** * 判断给定的节点是否是一个“填充”节点 * @private * @method isFillChar @@ -4297,73 +4337,73 @@ var domUtils = (dom.domUtils = { * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 * @returns { Boolean } 节点是否是填充节点 */ - isFillChar: function(node, isInStart) { - if (node.nodeType != 3) return false; - var text = node.nodeValue; - if (isInStart) { - return new RegExp("^" + domUtils.fillChar).test(text); - } - return !text.replace(new RegExp(domUtils.fillChar, "g"), "").length; - }, - isStartInblock: function(range) { - var tmpRange = range.cloneRange(), - flag = 0, - start = tmpRange.startContainer, - tmp; - if (start.nodeType == 1 && start.childNodes[tmpRange.startOffset]) { - start = start.childNodes[tmpRange.startOffset]; - var pre = start.previousSibling; - while (pre && domUtils.isFillChar(pre)) { - start = pre; - pre = pre.previousSibling; - } - } - if (this.isFillChar(start, true) && tmpRange.startOffset == 1) { - tmpRange.setStartBefore(start); - start = tmpRange.startContainer; - } - - while (start && domUtils.isFillChar(start)) { - tmp = start; - start = start.previousSibling; - } - if (tmp) { - tmpRange.setStartBefore(tmp); - start = tmpRange.startContainer; - } - if ( - start.nodeType == 1 && - domUtils.isEmptyNode(start) && - tmpRange.startOffset == 1 - ) { - tmpRange.setStart(start, 0).collapse(true); - } - while (!tmpRange.startOffset) { - start = tmpRange.startContainer; - if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { - flag = 1; - break; - } - var pre = tmpRange.startContainer.previousSibling, - tmpNode; - if (!pre) { - tmpRange.setStartBefore(tmpRange.startContainer); - } else { - while (pre && domUtils.isFillChar(pre)) { - tmpNode = pre; - pre = pre.previousSibling; + isFillChar: function (node, isInStart) { + if (node.nodeType != 3) return false; + var text = node.nodeValue; + if (isInStart) { + return new RegExp("^" + domUtils.fillChar).test(text); } - if (tmpNode) { - tmpRange.setStartBefore(tmpNode); - } else { - tmpRange.setStartBefore(tmpRange.startContainer); + return !text.replace(new RegExp(domUtils.fillChar, "g"), "").length; + }, + isStartInblock: function (range) { + var tmpRange = range.cloneRange(), + flag = 0, + start = tmpRange.startContainer, + tmp; + if (start.nodeType == 1 && start.childNodes[tmpRange.startOffset]) { + start = start.childNodes[tmpRange.startOffset]; + var pre = start.previousSibling; + while (pre && domUtils.isFillChar(pre)) { + start = pre; + pre = pre.previousSibling; + } + } + if (this.isFillChar(start, true) && tmpRange.startOffset == 1) { + tmpRange.setStartBefore(start); + start = tmpRange.startContainer; } - } - } - return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; - }, - /** + while (start && domUtils.isFillChar(start)) { + tmp = start; + start = start.previousSibling; + } + if (tmp) { + tmpRange.setStartBefore(tmp); + start = tmpRange.startContainer; + } + if ( + start.nodeType == 1 && + domUtils.isEmptyNode(start) && + tmpRange.startOffset == 1 + ) { + tmpRange.setStart(start, 0).collapse(true); + } + while (!tmpRange.startOffset) { + start = tmpRange.startContainer; + if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { + flag = 1; + break; + } + var pre = tmpRange.startContainer.previousSibling, + tmpNode; + if (!pre) { + tmpRange.setStartBefore(tmpRange.startContainer); + } else { + while (pre && domUtils.isFillChar(pre)) { + tmpNode = pre; + pre = pre.previousSibling; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** * 判断给定的元素是否是一个空元素 * @method isEmptyBlock * @param { Element } node 需要判断的元素 @@ -4379,31 +4419,31 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 根据指定的判断规则判断给定的元素是否是一个空元素 * @method isEmptyBlock * @param { Element } node 需要判断的元素 * @param { RegExp } reg 对内容执行判断的正则表达式对象 * @return { Boolean } 是否是空元素 */ - isEmptyBlock: function(node, reg) { - if (node.nodeType != 1) return 0; - reg = reg || new RegExp("[ \xa0\t\r\n" + domUtils.fillChar + "]", "g"); + isEmptyBlock: function (node, reg) { + if (node.nodeType != 1) return 0; + reg = reg || new RegExp("[ \xa0\t\r\n" + domUtils.fillChar + "]", "g"); - if ( - node[browser.ie ? "innerText" : "textContent"].replace(reg, "").length > 0 - ) { - return 0; - } - for (var n in dtd.$isNotEmpty) { - if (node.getElementsByTagName(n).length) { - return 0; - } - } - return 1; - }, + if ( + node[browser.ie ? "innerText" : "textContent"].replace(reg, "").length > 0 + ) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + }, - /** + /** * 移动元素使得该元素的位置移动指定的偏移量的距离 * @method setViewportOffset * @param { Element } element 需要设置偏移量的元素 @@ -4429,21 +4469,21 @@ var domUtils = (dom.domUtils = { * * ``` */ - setViewportOffset: function(element, offset) { - var left = parseInt(element.style.left) | 0; - var top = parseInt(element.style.top) | 0; - var rect = element.getBoundingClientRect(); - var offsetLeft = offset.left - rect.left; - var offsetTop = offset.top - rect.top; - if (offsetLeft) { - element.style.left = left + offsetLeft + "px"; - } - if (offsetTop) { - element.style.top = top + offsetTop + "px"; - } - }, + setViewportOffset: function (element, offset) { + var left = parseInt(element.style.left) | 0; + var top = parseInt(element.style.top) | 0; + var rect = element.getBoundingClientRect(); + var offsetLeft = offset.left - rect.left; + var offsetTop = offset.top - rect.top; + if (offsetLeft) { + element.style.left = left + offsetLeft + "px"; + } + if (offsetTop) { + element.style.top = top + offsetTop + "px"; + } + }, - /** + /** * 用“填充字符”填充节点 * @method fillNode * @private @@ -4467,15 +4507,15 @@ var domUtils = (dom.domUtils = { * * ``` */ - fillNode: function(doc, node) { - var tmpNode = browser.ie - ? doc.createTextNode(domUtils.fillChar) - : doc.createElement("br"); - node.innerHTML = ""; - node.appendChild(tmpNode); - }, + fillNode: function (doc, node) { + var tmpNode = browser.ie + ? doc.createTextNode(domUtils.fillChar) + : doc.createElement("br"); + node.innerHTML = ""; + node.appendChild(tmpNode); + }, - /** + /** * 把节点src的所有子节点追加到另一个节点tag上去 * @method moveChild * @param { Node } src 源节点, 该节点下的所有子节点将被移除 @@ -4506,7 +4546,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” * @method moveChild * @param { Node } src 源节点, 该节点下的所有子节点将被移除 @@ -4537,17 +4577,17 @@ var domUtils = (dom.domUtils = { * * ``` */ - moveChild: function(src, tag, dir) { - while (src.firstChild) { - if (dir && tag.firstChild) { - tag.insertBefore(src.lastChild, tag.firstChild); - } else { - tag.appendChild(src.firstChild); - } - } - }, + moveChild: function (src, tag, dir) { + while (src.firstChild) { + if (dir && tag.firstChild) { + tag.insertBefore(src.lastChild, tag.firstChild); + } else { + tag.appendChild(src.firstChild); + } + } + }, - /** + /** * 判断节点的标签上是否不存在任何属性 * @method hasNoAttributes * @private @@ -4568,13 +4608,13 @@ var domUtils = (dom.domUtils = { * * ``` */ - hasNoAttributes: function(node) { - return browser.ie - ? /^<\w+\s*?>/.test(node.outerHTML) - : node.attributes.length == 0; - }, + hasNoAttributes: function (node) { + return browser.ie + ? /^<\w+\s*?>/.test(node.outerHTML) + : node.attributes.length == 0; + }, - /** + /** * 检测节点是否是UEditor所使用的辅助节点 * @method isCustomeNode * @private @@ -4582,11 +4622,11 @@ var domUtils = (dom.domUtils = { * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 * @return { Boolean } 给定的节点是否是一个辅助节点 */ - isCustomeNode: function(node) { - return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); - }, + isCustomeNode: function (node) { + return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); + }, - /** + /** * 检测节点的标签是否是给定的标签 * @method isTagNode * @param { Node } node 需要检测的节点对象 @@ -4604,14 +4644,14 @@ var domUtils = (dom.domUtils = { * * ``` */ - isTagNode: function(node, tagNames) { - return ( - node.nodeType == 1 && - new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) - ); - }, + isTagNode: function (node, tagNames) { + return ( + node.nodeType == 1 && + new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) + ); + }, - /** + /** * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 * @method filterNodeList * @param { Array } nodeList 需要过滤的节点数组 @@ -4629,7 +4669,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 * @method filterNodeList * @param { Array } nodeList 需要过滤的节点数组 @@ -4645,7 +4685,7 @@ var domUtils = (dom.domUtils = { * ``` */ - /** + /** * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 * @method filterNodeList @@ -4677,62 +4717,71 @@ var domUtils = (dom.domUtils = { * console.log( node.nodeName ); * ``` */ - filterNodeList: function(nodelist, filter, forAll) { - var results = []; - if (!utils.isFunction(filter)) { - var str = filter; - filter = function(n) { - return ( - utils.indexOf( - utils.isArray(str) ? str : str.split(" "), - n.tagName.toLowerCase() - ) != -1 - ); - }; - } - utils.each(nodelist, function(n) { - filter(n) && results.push(n); - }); - return results.length == 0 - ? null - : results.length == 1 || !forAll ? results[0] : results; - }, + filterNodeList: function (nodelist, filter, forAll) { + var results = []; + if (!utils.isFunction(filter)) { + var str = filter; + filter = function (n) { + return ( + utils.indexOf( + utils.isArray(str) ? str : str.split(" "), + n.tagName.toLowerCase() + ) != -1 + ); + }; + } + utils.each(nodelist, function (n) { + filter(n) && results.push(n); + }); + return results.length == 0 + ? null + : results.length == 1 || !forAll ? results[0] : results; + }, - /** + /** * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 * @method isInNodeEndBoundary * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL * @param node 需要检测的节点对象 * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 */ - isInNodeEndBoundary: function(rng, node) { - var start = rng.startContainer; - if (start.nodeType == 3 && rng.startOffset != start.nodeValue.length) { - return 0; + isInNodeEndBoundary: function (rng, node) { + var start = rng.startContainer; + if (start.nodeType == 3 && rng.startOffset != start.nodeValue.length) { + return 0; + } + if (start.nodeType == 1 && rng.startOffset != start.childNodes.length) { + return 0; + } + while (start !== node) { + if (start.nextSibling) { + return 0; + } + start = start.parentNode; + } + return 1; + }, + isBoundaryNode: function (node, dir) { + var tmp; + while (!domUtils.isBody(node)) { + tmp = node; + node = node.parentNode; + if (tmp !== node[dir]) { + return false; + } + } + return true; + }, + fillHtml: browser.ie11below ? " " : "
      ", + loadScript: function (url, cb) { + var script; + script = document.createElement('script'); + script.src = url; + script.onload = function () { + cb && cb({isNew: true}) + }; + document.getElementsByTagName('head')[0].appendChild(script); } - if (start.nodeType == 1 && rng.startOffset != start.childNodes.length) { - return 0; - } - while (start !== node) { - if (start.nextSibling) { - return 0; - } - start = start.parentNode; - } - return 1; - }, - isBoundaryNode: function(node, dir) { - var tmp; - while (!domUtils.isBody(node)) { - tmp = node; - node = node.parentNode; - if (tmp !== node[dir]) { - return false; - } - } - return true; - }, - fillHtml: browser.ie11below ? " " : "
      " }); var fillCharReg = new RegExp(domUtils.fillChar, "g"); @@ -4759,273 +4808,275 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @class Range */ -(function() { - var guid = 0, - fillChar = domUtils.fillChar, - fillData; +(function () { + var guid = 0, + fillChar = domUtils.fillChar, + fillData; - /** + /** * 更新range的collapse状态 * @param {Range} range range对象 */ - function updateCollapse(range) { - range.collapsed = - range.startContainer && - range.endContainer && - range.startContainer === range.endContainer && - range.startOffset == range.endOffset; - } + function updateCollapse(range) { + range.collapsed = + range.startContainer && + range.endContainer && + range.startContainer === range.endContainer && + range.startOffset === range.endOffset; + } - function selectOneNode(rng) { - return ( - !rng.collapsed && - rng.startContainer.nodeType == 1 && - rng.startContainer === rng.endContainer && - rng.endOffset - rng.startOffset == 1 - ); - } - function setEndPoint(toStart, node, offset, range) { - //如果node是自闭合标签要处理 - if ( - node.nodeType == 1 && - (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName]) - ) { - offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); - node = node.parentNode; + function selectOneNode(rng) { + return ( + !rng.collapsed && + rng.startContainer.nodeType === 1 && + rng.startContainer === rng.endContainer && + rng.endOffset - rng.startOffset === 1 + ); } - if (toStart) { - range.startContainer = node; - range.startOffset = offset; - if (!range.endContainer) { - range.collapse(true); - } - } else { - range.endContainer = node; - range.endOffset = offset; - if (!range.startContainer) { - range.collapse(false); - } - } - updateCollapse(range); - return range; - } - function execContentsAction(range, action) { - //调整边界 - //range.includeBookmark(); - var start = range.startContainer, - end = range.endContainer, - startOffset = range.startOffset, - endOffset = range.endOffset, - doc = range.document, - frag = doc.createDocumentFragment(), - tmpStart, - tmpEnd; - if (start.nodeType == 1) { - start = - start.childNodes[startOffset] || - (tmpStart = start.appendChild(doc.createTextNode(""))); + function setEndPoint(toStart, node, offset, range) { + //如果node是自闭合标签要处理 + if ( + node.nodeType === 1 && + (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName]) + ) { + offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); + node = node.parentNode; + } + if (toStart) { + range.startContainer = node; + range.startOffset = offset; + if (!range.endContainer) { + range.collapse(true); + } + } else { + range.endContainer = node; + range.endOffset = offset; + if (!range.startContainer) { + range.collapse(false); + } + } + updateCollapse(range); + return range; } - if (end.nodeType == 1) { - end = - end.childNodes[endOffset] || - (tmpEnd = end.appendChild(doc.createTextNode(""))); - } - if (start === end && start.nodeType == 3) { - frag.appendChild( - doc.createTextNode( - start.substringData(startOffset, endOffset - startOffset) - ) - ); - //is not clone - if (action) { - start.deleteData(startOffset, endOffset - startOffset); - range.collapse(true); - } - return frag; - } - var current, - currentLevel, - clone = frag, - startParents = domUtils.findParents(start, true), - endParents = domUtils.findParents(end, true); - for (var i = 0; startParents[i] == endParents[i]; ) { - i++; - } - for (var j = i, si; (si = startParents[j]); j++) { - current = si.nextSibling; - if (si == start) { - if (!tmpStart) { - if (range.startContainer.nodeType == 3) { - clone.appendChild( - doc.createTextNode(start.nodeValue.slice(startOffset)) + + function execContentsAction(range, action) { + //调整边界 + //range.includeBookmark(); + var start = range.startContainer, + end = range.endContainer, + startOffset = range.startOffset, + endOffset = range.endOffset, + doc = range.document, + frag = doc.createDocumentFragment(), + tmpStart, + tmpEnd; + if (start.nodeType == 1) { + start = + start.childNodes[startOffset] || + (tmpStart = start.appendChild(doc.createTextNode(""))); + } + if (end.nodeType == 1) { + end = + end.childNodes[endOffset] || + (tmpEnd = end.appendChild(doc.createTextNode(""))); + } + if (start === end && start.nodeType == 3) { + frag.appendChild( + doc.createTextNode( + start.substringData(startOffset, endOffset - startOffset) + ) ); //is not clone if (action) { - start.deleteData( - startOffset, - start.nodeValue.length - startOffset - ); + start.deleteData(startOffset, endOffset - startOffset); + range.collapse(true); } - } else { - clone.appendChild(!action ? start.cloneNode(true) : start); - } + return frag; } - } else { - currentLevel = si.cloneNode(false); - clone.appendChild(currentLevel); - } - while (current) { - if (current === end || current === endParents[j]) { - break; + var current, + currentLevel, + clone = frag, + startParents = domUtils.findParents(start, true), + endParents = domUtils.findParents(end, true); + for (var i = 0; startParents[i] == endParents[i];) { + i++; } - si = current.nextSibling; - clone.appendChild(!action ? current.cloneNode(true) : current); - current = si; - } - clone = currentLevel; - } - clone = frag; - if (!startParents[i]) { - clone.appendChild(startParents[i - 1].cloneNode(false)); - clone = clone.firstChild; - } - for (var j = i, ei; (ei = endParents[j]); j++) { - current = ei.previousSibling; - if (ei == end) { - if (!tmpEnd && range.endContainer.nodeType == 3) { - clone.appendChild( - doc.createTextNode(end.substringData(0, endOffset)) - ); - //is not clone - if (action) { - end.deleteData(0, endOffset); - } + for (var j = i, si; (si = startParents[j]); j++) { + current = si.nextSibling; + if (si == start) { + if (!tmpStart) { + if (range.startContainer.nodeType == 3) { + clone.appendChild( + doc.createTextNode(start.nodeValue.slice(startOffset)) + ); + //is not clone + if (action) { + start.deleteData( + startOffset, + start.nodeValue.length - startOffset + ); + } + } else { + clone.appendChild(!action ? start.cloneNode(true) : start); + } + } + } else { + currentLevel = si.cloneNode(false); + clone.appendChild(currentLevel); + } + while (current) { + if (current === end || current === endParents[j]) { + break; + } + si = current.nextSibling; + clone.appendChild(!action ? current.cloneNode(true) : current); + current = si; + } + clone = currentLevel; } - } else { - currentLevel = ei.cloneNode(false); - clone.appendChild(currentLevel); - } - //如果两端同级,右边第一次已经被开始做了 - if (j != i || !startParents[i]) { - while (current) { - if (current === start) { - break; - } - ei = current.previousSibling; - clone.insertBefore( - !action ? current.cloneNode(true) : current, - clone.firstChild - ); - current = ei; + clone = frag; + if (!startParents[i]) { + clone.appendChild(startParents[i - 1].cloneNode(false)); + clone = clone.firstChild; } - } - clone = currentLevel; + for (var j = i, ei; (ei = endParents[j]); j++) { + current = ei.previousSibling; + if (ei == end) { + if (!tmpEnd && range.endContainer.nodeType == 3) { + clone.appendChild( + doc.createTextNode(end.substringData(0, endOffset)) + ); + //is not clone + if (action) { + end.deleteData(0, endOffset); + } + } + } else { + currentLevel = ei.cloneNode(false); + clone.appendChild(currentLevel); + } + //如果两端同级,右边第一次已经被开始做了 + if (j != i || !startParents[i]) { + while (current) { + if (current === start) { + break; + } + ei = current.previousSibling; + clone.insertBefore( + !action ? current.cloneNode(true) : current, + clone.firstChild + ); + current = ei; + } + } + clone = currentLevel; + } + if (action) { + range + .setStartBefore( + !endParents[i] + ? endParents[i - 1] + : !startParents[i] ? startParents[i - 1] : endParents[i] + ) + .collapse(true); + } + tmpStart && domUtils.remove(tmpStart); + tmpEnd && domUtils.remove(tmpEnd); + return frag; } - if (action) { - range - .setStartBefore( - !endParents[i] - ? endParents[i - 1] - : !startParents[i] ? startParents[i - 1] : endParents[i] - ) - .collapse(true); - } - tmpStart && domUtils.remove(tmpStart); - tmpEnd && domUtils.remove(tmpEnd); - return frag; - } - /** + /** * 创建一个跟document绑定的空的Range实例 * @constructor * @param { Document } document 新建的选区所属的文档对象 */ - /** + /** * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 */ - /** + /** * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 */ - /** + /** * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 */ - /** + /** * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 */ - /** + /** * @property { Boolean } collapsed 当前Range是否闭合 * @default true * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset */ - /** + /** * @property { Document } document 当前Range所属的Document对象 * @remind 不同range的的document属性可以是不同的 */ - var Range = (dom.Range = function(document) { - var me = this; - me.startContainer = me.startOffset = me.endContainer = me.endOffset = null; - me.document = document; - me.collapsed = true; - }); + var Range = (dom.Range = function (document) { + var me = this; + me.startContainer = me.startOffset = me.endContainer = me.endOffset = null; + me.document = document; + me.collapsed = true; + }); - /** + /** * 删除fillData * @param doc * @param excludeNode */ - function removeFillData(doc, excludeNode) { - try { - if (fillData && domUtils.inDoc(fillData, doc)) { - if (!fillData.nodeValue.replace(fillCharReg, "").length) { - var tmpNode = fillData.parentNode; - domUtils.remove(fillData); - while ( - tmpNode && - domUtils.isEmptyInlineElement(tmpNode) && - //safari的contains有bug - (browser.safari - ? !( - domUtils.getPosition(tmpNode, excludeNode) & - domUtils.POSITION_CONTAINS - ) - : !tmpNode.contains(excludeNode)) - ) { - fillData = tmpNode.parentNode; - domUtils.remove(tmpNode); - tmpNode = fillData; - } - } else { - fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ""); + function removeFillData(doc, excludeNode) { + try { + if (fillData && domUtils.inDoc(fillData, doc)) { + if (!fillData.nodeValue.replace(fillCharReg, "").length) { + var tmpNode = fillData.parentNode; + domUtils.remove(fillData); + while ( + tmpNode && + domUtils.isEmptyInlineElement(tmpNode) && + //safari的contains有bug + (browser.safari + ? !( + domUtils.getPosition(tmpNode, excludeNode) & + domUtils.POSITION_CONTAINS + ) + : !tmpNode.contains(excludeNode)) + ) { + fillData = tmpNode.parentNode; + domUtils.remove(tmpNode); + tmpNode = fillData; + } + } else { + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ""); + } + } + } catch (e) { } - } - } catch (e) {} - } + } - /** + /** * @param node * @param dir */ - function mergeSibling(node, dir) { - var tmpNode; - node = node[dir]; - while (node && domUtils.isFillChar(node)) { - tmpNode = node[dir]; - domUtils.remove(node); - node = tmpNode; + function mergeSibling(node, dir) { + var tmpNode; + node = node[dir]; + while (node && domUtils.isFillChar(node)) { + tmpNode = node[dir]; + domUtils.remove(node); + node = tmpNode; + } } - } - Range.prototype = { - /** + Range.prototype = { + /** * 克隆选区的内容到一个DocumentFragment里 * @method cloneContents * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 @@ -5049,11 +5100,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - cloneContents: function() { - return this.collapsed ? null : execContentsAction(this, 0); - }, + cloneContents: function () { + return this.collapsed ? null : execContentsAction(this, 0); + }, - /** + /** * 删除当前选区范围中的所有内容 * @method deleteContents * @remind 执行完该操作后, 当前Range对象变成了闭合状态 @@ -5088,22 +5139,22 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - deleteContents: function() { - var txt; - if (!this.collapsed) { - execContentsAction(this, 1); - } - if (browser.webkit) { - txt = this.startContainer; - if (txt.nodeType == 3 && !txt.nodeValue.length) { - this.setStartBefore(txt).collapse(true); - domUtils.remove(txt); - } - } - return this; - }, + deleteContents: function () { + var txt; + if (!this.collapsed) { + execContentsAction(this, 1); + } + if (browser.webkit) { + txt = this.startContainer; + if (txt.nodeType == 3 && !txt.nodeValue.length) { + this.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + } + return this; + }, - /** + /** * 将当前选区的内容提取到一个DocumentFragment里 * @method extractContents * @remind 执行该操作后, 选区将变成闭合状态 @@ -5144,11 +5195,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * */ - extractContents: function() { - return this.collapsed ? null : execContentsAction(this, 2); - }, + extractContents: function () { + return this.collapsed ? null : execContentsAction(this, 2); + }, - /** + /** * 设置Range的开始容器节点和偏移量 * @method setStart * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, @@ -5190,11 +5241,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - setStart: function(node, offset) { - return setEndPoint(true, node, offset, this); - }, + setStart: function (node, offset) { + return setEndPoint(true, node, offset, this); + }, - /** + /** * 设置Range的结束容器和偏移量 * @method setEnd * @param { Node } node 作为当前选区结束边界容器的节点对象 @@ -5202,11 +5253,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setStart(Node,int) * @return { UE.dom.Range } 当前range对象 */ - setEnd: function(node, offset) { - return setEndPoint(false, node, offset, this); - }, + setEnd: function (node, offset) { + return setEndPoint(false, node, offset, this); + }, - /** + /** * 将Range开始位置设置到node节点之后 * @method setStartAfter * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 @@ -5228,11 +5279,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - setStartAfter: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, + setStartAfter: function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, - /** + /** * 将Range开始位置设置到node节点之前 * @method setStartBefore * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 @@ -5240,11 +5291,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setStartAfter(Node) * @return { UE.dom.Range } 当前range对象 */ - setStartBefore: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); - }, + setStartBefore: function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, - /** + /** * 将Range结束位置设置到node节点之后 * @method setEndAfter * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 @@ -5267,11 +5318,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - setEndAfter: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, + setEndAfter: function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, - /** + /** * 将Range结束位置设置到node节点之前 * @method setEndBefore * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 @@ -5279,11 +5330,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setEndAfter(Node) * @return { UE.dom.Range } 当前range对象 */ - setEndBefore: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); - }, + setEndBefore: function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, - /** + /** * 设置Range的开始位置到node节点内的第一个子节点之前 * @method setStartAtFirst * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 @@ -5307,11 +5358,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - setStartAtFirst: function(node) { - return this.setStart(node, 0); - }, + setStartAtFirst: function (node) { + return this.setStart(node, 0); + }, - /** + /** * 设置Range的开始位置到node节点内的最后一个节点之后 * @method setStartAtLast * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 @@ -5320,14 +5371,14 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ - setStartAtLast: function(node) { - return this.setStart( - node, - node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length - ); - }, + setStartAtLast: function (node) { + return this.setStart( + node, + node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length + ); + }, - /** + /** * 设置Range的结束位置到node节点内的第一个节点之前 * @method setEndAtFirst * @param { Node } node 目标节点 @@ -5336,11 +5387,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ - setEndAtFirst: function(node) { - return this.setEnd(node, 0); - }, + setEndAtFirst: function (node) { + return this.setEnd(node, 0); + }, - /** + /** * 设置Range的结束位置到node节点内的最后一个节点之后 * @method setEndAtLast * @param { Node } node 目标节点 @@ -5349,14 +5400,14 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ - setEndAtLast: function(node) { - return this.setEnd( - node, - node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length - ); - }, + setEndAtLast: function (node) { + return this.setEnd( + node, + node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length + ); + }, - /** + /** * 选中给定节点 * @method selectNode * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, @@ -5379,11 +5430,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - selectNode: function(node) { - return this.setStartBefore(node).setEndAfter(node); - }, + selectNode: function (node) { + return this.setStartBefore(node).setEndAfter(node); + }, - /** + /** * 选中给定节点内部的所有节点 * @method selectNodeContents * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, @@ -5406,24 +5457,24 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - selectNodeContents: function(node) { - return this.setStart(node, 0).setEndAtLast(node); - }, + selectNodeContents: function (node) { + return this.setStart(node, 0).setEndAtLast(node); + }, - /** + /** * clone当前Range对象 * @method cloneRange * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 * @return { UE.dom.Range } 当前range对象的一个副本 */ - cloneRange: function() { - var me = this; - return new Range(me.document) - .setStart(me.startContainer, me.startOffset) - .setEnd(me.endContainer, me.endOffset); - }, + cloneRange: function () { + var me = this; + return new Range(me.document) + .setStart(me.startContainer, me.startOffset) + .setEnd(me.endContainer, me.endOffset); + }, - /** + /** * 向当前选区的结束处闭合选区 * @method collapse * @return { UE.dom.Range } 当前range对象 @@ -5445,7 +5496,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 * @method collapse @@ -5469,20 +5520,20 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - collapse: function(toStart) { - var me = this; - if (toStart) { - me.endContainer = me.startContainer; - me.endOffset = me.startOffset; - } else { - me.startContainer = me.endContainer; - me.startOffset = me.endOffset; - } - me.collapsed = true; - return me; - }, + collapse: function (toStart) { + var me = this; + if (toStart) { + me.endContainer = me.startContainer; + me.endOffset = me.startOffset; + } else { + me.startContainer = me.endContainer; + me.startOffset = me.endOffset; + } + me.collapsed = true; + return me; + }, - /** + /** * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 * @method shrinkBoundary * @return { UE.dom.Range } 当前range对象 @@ -5512,7 +5563,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, * 如果ignoreEnd的值为true,则忽略对结束位置的调整 * @method shrinkBoundary @@ -5520,42 +5571,44 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @return { UE.dom.Range } 当前range对象 * @see UE.dom.domUtils.Range:shrinkBoundary() */ - shrinkBoundary: function(ignoreEnd) { - var me = this, - child, - collapsed = me.collapsed; - function check(node) { - return ( - node.nodeType == 1 && - !domUtils.isBookmarkNode(node) && - !dtd.$empty[node.tagName] && - !dtd.$nonChild[node.tagName] - ); - } - while ( - me.startContainer.nodeType == 1 && //是element - (child = me.startContainer.childNodes[me.startOffset]) && //子节点也是element - check(child) - ) { - me.setStart(child, 0); - } - if (collapsed) { - return me.collapse(true); - } - if (!ignoreEnd) { - while ( - me.endContainer.nodeType == 1 && //是element - me.endOffset > 0 && //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 - (child = me.endContainer.childNodes[me.endOffset - 1]) && //子节点也是element - check(child) - ) { - me.setEnd(child, child.childNodes.length); - } - } - return me; - }, + shrinkBoundary: function (ignoreEnd) { + var me = this, + child, + collapsed = me.collapsed; - /** + function check(node) { + return ( + node.nodeType == 1 && + !domUtils.isBookmarkNode(node) && + !dtd.$empty[node.tagName] && + !dtd.$nonChild[node.tagName] + ); + } + + while ( + me.startContainer.nodeType == 1 && //是element + (child = me.startContainer.childNodes[me.startOffset]) && //子节点也是element + check(child) + ) { + me.setStart(child, 0); + } + if (collapsed) { + return me.collapse(true); + } + if (!ignoreEnd) { + while ( + me.endContainer.nodeType == 1 && //是element + me.endOffset > 0 && //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 + (child = me.endContainer.childNodes[me.endOffset - 1]) && //子节点也是element + check(child) + ) { + me.setEnd(child, child.childNodes.length); + } + } + return me; + }, + + /** * 获取离当前选区内包含的所有节点最近的公共祖先节点, * @method getCommonAncestor * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 @@ -5576,7 +5629,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 @@ -5605,7 +5658,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 @@ -5635,22 +5688,22 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - getCommonAncestor: function(includeSelf, ignoreTextNode) { - var me = this, - start = me.startContainer, - end = me.endContainer; - if (start === end) { - if (includeSelf && selectOneNode(this)) { - start = start.childNodes[me.startOffset]; - if (start.nodeType == 1) return start; - } - //只有在上来就相等的情况下才会出现是文本的情况 - return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; - } - return domUtils.getCommonAncestor(start, end); - }, + getCommonAncestor: function (includeSelf, ignoreTextNode) { + var me = this, + start = me.startContainer, + end = me.endContainer; + if (start === end) { + if (includeSelf && selectOneNode(this)) { + start = start.childNodes[me.startOffset]; + if (start.nodeType == 1) return start; + } + //只有在上来就相等的情况下才会出现是文本的情况 + return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; + } + return domUtils.getCommonAncestor(start, end); + }, - /** + /** * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 * @method trimBoundary * @remind 该操作有可能会引起文本节点被切开 @@ -5672,7 +5725,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 * @method trimBoundary @@ -5695,56 +5748,56 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - trimBoundary: function(ignoreEnd) { - this.txtToElmBoundary(); - var start = this.startContainer, - offset = this.startOffset, - collapsed = this.collapsed, - end = this.endContainer; - if (start.nodeType == 3) { - if (offset == 0) { - this.setStartBefore(start); - } else { - if (offset >= start.nodeValue.length) { - this.setStartAfter(start); - } else { - var textNode = domUtils.split(start, offset); - //跟新结束边界 - if (start === end) { - this.setEnd(textNode, this.endOffset - offset); - } else if (start.parentNode === end) { - this.endOffset += 1; + trimBoundary: function (ignoreEnd) { + this.txtToElmBoundary(); + var start = this.startContainer, + offset = this.startOffset, + collapsed = this.collapsed, + end = this.endContainer; + if (start.nodeType == 3) { + if (offset == 0) { + this.setStartBefore(start); + } else { + if (offset >= start.nodeValue.length) { + this.setStartAfter(start); + } else { + var textNode = domUtils.split(start, offset); + //跟新结束边界 + if (start === end) { + this.setEnd(textNode, this.endOffset - offset); + } else if (start.parentNode === end) { + this.endOffset += 1; + } + this.setStartBefore(textNode); + } + } + if (collapsed) { + return this.collapse(true); + } } - this.setStartBefore(textNode); - } - } - if (collapsed) { - return this.collapse(true); - } - } - if (!ignoreEnd) { - offset = this.endOffset; - end = this.endContainer; - if (end.nodeType == 3) { - if (offset == 0) { - this.setEndBefore(end); - } else { - offset < end.nodeValue.length && domUtils.split(end, offset); - this.setEndAfter(end); - } - } - } - return this; - }, + if (!ignoreEnd) { + offset = this.endOffset; + end = this.endContainer; + if (end.nodeType == 3) { + if (offset == 0) { + this.setEndBefore(end); + } else { + offset < end.nodeValue.length && domUtils.split(end, offset); + this.setEndAfter(end); + } + } + } + return this; + }, - /** + /** * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 * @method txtToElmBoundary * @remind 该操作不会修改dom节点 * @return { UE.dom.Range } 当前range对象 */ - /** + /** * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 * ignoreCollapsed 的值决定是否执行该调整 * @method txtToElmBoundary @@ -5752,75 +5805,75 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 * @return { UE.dom.Range } 当前range对象 */ - txtToElmBoundary: function(ignoreCollapsed) { - function adjust(r, c) { - var container = r[c + "Container"], - offset = r[c + "Offset"]; - if (container.nodeType == 3) { - if (!offset) { - r[ - "set" + - c.replace(/(\w)/, function(a) { - return a.toUpperCase(); - }) + - "Before" - ](container); - } else if (offset >= container.nodeValue.length) { - r[ - "set" + - c.replace(/(\w)/, function(a) { - return a.toUpperCase(); - }) + - "After" - ](container); - } - } - } + txtToElmBoundary: function (ignoreCollapsed) { + function adjust(r, c) { + var container = r[c + "Container"], + offset = r[c + "Offset"]; + if (container.nodeType == 3) { + if (!offset) { + r[ + "set" + + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + + "Before" + ](container); + } else if (offset >= container.nodeValue.length) { + r[ + "set" + + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + + "After" + ](container); + } + } + } - if (ignoreCollapsed || !this.collapsed) { - adjust(this, "start"); - adjust(this, "end"); - } - return this; - }, + if (ignoreCollapsed || !this.collapsed) { + adjust(this, "start"); + adjust(this, "end"); + } + return this; + }, - /** + /** * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 * @method insertNode * @param { Node } node 需要插入的节点 * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 * @return { UE.dom.Range } 当前range对象 */ - insertNode: function(node) { - var first = node, - length = 1; - if (node.nodeType == 11) { - first = node.firstChild; - length = node.childNodes.length; - } - this.trimBoundary(true); - var start = this.startContainer, - offset = this.startOffset; - var nextNode = start.childNodes[offset]; - if (nextNode) { - start.insertBefore(node, nextNode); - } else { - start.appendChild(node); - } - if (first.parentNode === this.endContainer) { - this.endOffset = this.endOffset + length; - } - return this.setStartBefore(first); - }, + insertNode: function (node) { + var first = node, + length = 1; + if (node.nodeType == 11) { + first = node.firstChild; + length = node.childNodes.length; + } + this.trimBoundary(true); + var start = this.startContainer, + offset = this.startOffset; + var nextNode = start.childNodes[offset]; + if (nextNode) { + start.insertBefore(node, nextNode); + } else { + start.appendChild(node); + } + if (first.parentNode === this.endContainer) { + this.endOffset = this.endOffset + length; + } + return this.setStartBefore(first); + }, - /** + /** * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 * @method setCursor * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:collapse() */ - /** + /** * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 * @method setCursor * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, @@ -5828,11 +5881,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:collapse(Boolean) */ - setCursor: function(toEnd, noFillData) { - return this.collapse(!toEnd).select(noFillData); - }, + setCursor: function (toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, - /** + /** * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 * @method createBookmark * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 @@ -5841,199 +5894,199 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 * 返回的记录的类型为ID, 反之则为引用 */ - createBookmark: function(serialize, same) { - var endNode, - startNode = this.document.createElement("span"); - startNode.style.cssText = "display:none;line-height:0px;"; - startNode.appendChild(this.document.createTextNode("\u200D")); - startNode.id = "_baidu_bookmark_start_" + (same ? "" : guid++); + createBookmark: function (serialize, same) { + var endNode, + startNode = this.document.createElement("span"); + startNode.style.cssText = "display:none;line-height:0px;"; + startNode.appendChild(this.document.createTextNode("\u200D")); + startNode.id = "_baidu_bookmark_start_" + (same ? "" : guid++); - if (!this.collapsed) { - endNode = startNode.cloneNode(true); - endNode.id = "_baidu_bookmark_end_" + (same ? "" : guid++); - } - this.insertNode(startNode); - if (endNode) { - this.collapse().insertNode(endNode).setEndBefore(endNode); - } - this.setStartAfter(startNode); - return { - start: serialize ? startNode.id : startNode, - end: endNode ? (serialize ? endNode.id : endNode) : null, - id: serialize - }; - }, + if (!this.collapsed) { + endNode = startNode.cloneNode(true); + endNode.id = "_baidu_bookmark_end_" + (same ? "" : guid++); + } + this.insertNode(startNode); + if (endNode) { + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + this.setStartAfter(startNode); + return { + start: serialize ? startNode.id : startNode, + end: endNode ? (serialize ? endNode.id : endNode) : null, + id: serialize + }; + }, - /** + /** * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 * @method moveToBookmark * @param { BookMark } bookmark createBookmark所创建的标签对象 * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:createBookmark(Boolean) */ - moveToBookmark: function(bookmark) { - var start = bookmark.id - ? this.document.getElementById(bookmark.start) - : bookmark.start, - end = bookmark.end && bookmark.id - ? this.document.getElementById(bookmark.end) - : bookmark.end; - this.setStartBefore(start); - domUtils.remove(start); - if (end) { - this.setEndBefore(end); - domUtils.remove(end); - } else { - this.collapse(true); - } - return this; - }, + moveToBookmark: function (bookmark) { + var start = bookmark.id + ? this.document.getElementById(bookmark.start) + : bookmark.start, + end = bookmark.end && bookmark.id + ? this.document.getElementById(bookmark.end) + : bookmark.end; + this.setStartBefore(start); + domUtils.remove(start); + if (end) { + this.setEndBefore(end); + domUtils.remove(end); + } else { + this.collapse(true); + } + return this; + }, - /** + /** * 调整range的边界,使其"放大"到最近的父节点 * @method enlarge * @remind 会引起选区的变化 * @return { UE.dom.Range } 当前range对象 */ - /** + /** * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 * 要求扩大之后的父节点是block节点 * @method enlarge * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 * @return { UE.dom.Range } 当前range对象 */ - enlarge: function(toBlock, stopFn) { - var isBody = domUtils.isBody, - pre, - node, - tmp = this.document.createTextNode(""); - if (toBlock) { - node = this.startContainer; - if (node.nodeType == 1) { - if (node.childNodes[this.startOffset]) { - pre = node = node.childNodes[this.startOffset]; - } else { - node.appendChild(tmp); - pre = node = tmp; - } - } else { - pre = node; - } - while (1) { - if (domUtils.isBlockElm(node)) { - node = pre; - while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { - node = pre; + enlarge: function (toBlock, stopFn) { + var isBody = domUtils.isBody, + pre, + node, + tmp = this.document.createTextNode(""); + if (toBlock) { + node = this.startContainer; + if (node.nodeType == 1) { + if (node.childNodes[this.startOffset]) { + pre = node = node.childNodes[this.startOffset]; + } else { + node.appendChild(tmp); + pre = node = tmp; + } + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setStartBefore(node); + break; + } + pre = node; + node = node.parentNode; + } + node = this.endContainer; + if (node.nodeType == 1) { + if ((pre = node.childNodes[this.endOffset])) { + node.insertBefore(tmp, pre); + } else { + node.appendChild(tmp); + } + pre = node = tmp; + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setEndAfter(node); + break; + } + pre = node; + node = node.parentNode; + } + if (tmp.parentNode === this.endContainer) { + this.endOffset--; + } + domUtils.remove(tmp); } - this.setStartBefore(node); - break; - } - pre = node; - node = node.parentNode; - } - node = this.endContainer; - if (node.nodeType == 1) { - if ((pre = node.childNodes[this.endOffset])) { - node.insertBefore(tmp, pre); - } else { - node.appendChild(tmp); - } - pre = node = tmp; - } else { - pre = node; - } - while (1) { - if (domUtils.isBlockElm(node)) { - node = pre; - while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { - node = pre; - } - this.setEndAfter(node); - break; - } - pre = node; - node = node.parentNode; - } - if (tmp.parentNode === this.endContainer) { - this.endOffset--; - } - domUtils.remove(tmp); - } - // 扩展边界到最大 - if (!this.collapsed) { - while (this.startOffset == 0) { - if (stopFn && stopFn(this.startContainer)) { - break; - } - if (isBody(this.startContainer)) { - break; - } - this.setStartBefore(this.startContainer); - } - while ( - this.endOffset == - (this.endContainer.nodeType == 1 - ? this.endContainer.childNodes.length - : this.endContainer.nodeValue.length) - ) { - if (stopFn && stopFn(this.endContainer)) { - break; - } - if (isBody(this.endContainer)) { - break; - } - this.setEndAfter(this.endContainer); - } - } - return this; - }, - enlargeToBlockElm: function(ignoreEnd) { - while (!domUtils.isBlockElm(this.startContainer)) { - this.setStartBefore(this.startContainer); - } - if (!ignoreEnd) { - while (!domUtils.isBlockElm(this.endContainer)) { - this.setEndAfter(this.endContainer); - } - } - return this; - }, - /** + // 扩展边界到最大 + if (!this.collapsed) { + while (this.startOffset == 0) { + if (stopFn && stopFn(this.startContainer)) { + break; + } + if (isBody(this.startContainer)) { + break; + } + this.setStartBefore(this.startContainer); + } + while ( + this.endOffset == + (this.endContainer.nodeType == 1 + ? this.endContainer.childNodes.length + : this.endContainer.nodeValue.length) + ) { + if (stopFn && stopFn(this.endContainer)) { + break; + } + if (isBody(this.endContainer)) { + break; + } + this.setEndAfter(this.endContainer); + } + } + return this; + }, + enlargeToBlockElm: function (ignoreEnd) { + while (!domUtils.isBlockElm(this.startContainer)) { + this.setStartBefore(this.startContainer); + } + if (!ignoreEnd) { + while (!domUtils.isBlockElm(this.endContainer)) { + this.setEndAfter(this.endContainer); + } + } + return this; + }, + /** * 调整Range的边界,使其"缩小"到最合适的位置 * @method adjustmentBoundary * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:shrinkBoundary() */ - adjustmentBoundary: function() { - if (!this.collapsed) { - while ( - !domUtils.isBody(this.startContainer) && - this.startOffset == - this.startContainer[ - this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" - ].length && - this.startContainer[ - this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" - ].length - ) { - this.setStartAfter(this.startContainer); - } - while ( - !domUtils.isBody(this.endContainer) && - !this.endOffset && - this.endContainer[ - this.endContainer.nodeType == 3 ? "nodeValue" : "childNodes" - ].length - ) { - this.setEndBefore(this.endContainer); - } - } - return this; - }, + adjustmentBoundary: function () { + if (!this.collapsed) { + while ( + !domUtils.isBody(this.startContainer) && + this.startOffset == + this.startContainer[ + this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" + ].length && + this.startContainer[ + this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" + ].length + ) { + this.setStartAfter(this.startContainer); + } + while ( + !domUtils.isBody(this.endContainer) && + !this.endOffset && + this.endContainer[ + this.endContainer.nodeType == 3 ? "nodeValue" : "childNodes" + ].length + ) { + this.setEndBefore(this.endContainer); + } + } + return this; + }, - /** + /** * 给range选区中的内容添加给定的inline标签 * @method applyInlineStyle * @param { String } tagName 需要添加的标签名 @@ -6043,7 +6096,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 * @method applyInlineStyle * @param { String } tagName 需要添加的标签名 @@ -6063,100 +6116,100 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); *

      xxxx[xxxx]x

      * ``` */ - applyInlineStyle: function(tagName, attrs, list) { - if (this.collapsed) return this; - this.trimBoundary() - .enlarge(false, function(node) { - return node.nodeType == 1 && domUtils.isBlockElm(node); - }) - .adjustmentBoundary(); - var bookmark = this.createBookmark(), - end = bookmark.end, - filterFn = function(node) { - return node.nodeType == 1 - ? node.tagName.toLowerCase() != "br" - : !domUtils.isWhitespace(node); - }, - current = domUtils.getNextDomNode(bookmark.start, false, filterFn), - node, - pre, - range = this.cloneRange(); - while ( - current && - domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING - ) { - if (current.nodeType == 3 || dtd[tagName][current.tagName]) { - range.setStartBefore(current); - node = current; - while ( - node && - (node.nodeType == 3 || dtd[tagName][node.tagName]) && - node !== end - ) { - pre = node; - node = domUtils.getNextDomNode( - node, - node.nodeType == 1, - null, - function(parent) { - return dtd[tagName][parent.tagName]; - } - ); - } - var frag = range.setEndAfter(pre).extractContents(), - elm; - if (list && list.length > 0) { - var level, top; - top = level = list[0].cloneNode(false); - for (var i = 1, ci; (ci = list[i++]); ) { - level.appendChild(ci.cloneNode(false)); - level = level.firstChild; + applyInlineStyle: function (tagName, attrs, list) { + if (this.collapsed) return this; + this.trimBoundary() + .enlarge(false, function (node) { + return node.nodeType == 1 && domUtils.isBlockElm(node); + }) + .adjustmentBoundary(); + var bookmark = this.createBookmark(), + end = bookmark.end, + filterFn = function (node) { + return node.nodeType == 1 + ? node.tagName.toLowerCase() != "br" + : !domUtils.isWhitespace(node); + }, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn), + node, + pre, + range = this.cloneRange(); + while ( + current && + domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING + ) { + if (current.nodeType == 3 || dtd[tagName][current.tagName]) { + range.setStartBefore(current); + node = current; + while ( + node && + (node.nodeType == 3 || dtd[tagName][node.tagName]) && + node !== end + ) { + pre = node; + node = domUtils.getNextDomNode( + node, + node.nodeType == 1, + null, + function (parent) { + return dtd[tagName][parent.tagName]; + } + ); + } + var frag = range.setEndAfter(pre).extractContents(), + elm; + if (list && list.length > 0) { + var level, top; + top = level = list[0].cloneNode(false); + for (var i = 1, ci; (ci = list[i++]);) { + level.appendChild(ci.cloneNode(false)); + level = level.firstChild; + } + elm = level; + } else { + elm = range.document.createElement(tagName); + } + if (attrs) { + domUtils.setAttributes(elm, attrs); + } + elm.appendChild(frag); + //针对嵌套span的全局样式指定,做容错处理 + if (elm.tagName == "SPAN" && attrs && attrs.style) { + utils.each(elm.getElementsByTagName("span"), function (s) { + s.style.cssText = s.style.cssText + ";" + attrs.style; + }); + } + range.insertNode(list ? top : elm); + //处理下滑线在a上的情况 + var aNode; + if ( + tagName == "span" && + attrs.style && + /text\-decoration/.test(attrs.style) && + (aNode = domUtils.findParentByTagName(elm, "a", true)) + ) { + domUtils.setAttributes(aNode, attrs); + domUtils.remove(elm, true); + elm = aNode; + } else { + domUtils.mergeSibling(elm); + domUtils.clearEmptySibling(elm); + } + //去除子节点相同的 + domUtils.mergeChild(elm, attrs); + current = domUtils.getNextDomNode(elm, false, filterFn); + domUtils.mergeToParent(elm); + if (node === end) { + break; + } + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } } - elm = level; - } else { - elm = range.document.createElement(tagName); - } - if (attrs) { - domUtils.setAttributes(elm, attrs); - } - elm.appendChild(frag); - //针对嵌套span的全局样式指定,做容错处理 - if (elm.tagName == "SPAN" && attrs && attrs.style) { - utils.each(elm.getElementsByTagName("span"), function(s) { - s.style.cssText = s.style.cssText + ";" + attrs.style; - }); - } - range.insertNode(list ? top : elm); - //处理下滑线在a上的情况 - var aNode; - if ( - tagName == "span" && - attrs.style && - /text\-decoration/.test(attrs.style) && - (aNode = domUtils.findParentByTagName(elm, "a", true)) - ) { - domUtils.setAttributes(aNode, attrs); - domUtils.remove(elm, true); - elm = aNode; - } else { - domUtils.mergeSibling(elm); - domUtils.clearEmptySibling(elm); - } - //去除子节点相同的 - domUtils.mergeChild(elm, attrs); - current = domUtils.getNextDomNode(elm, false, filterFn); - domUtils.mergeToParent(elm); - if (node === end) { - break; - } - } else { - current = domUtils.getNextDomNode(current, true, filterFn); - } - } - return this.moveToBookmark(bookmark); - }, + return this.moveToBookmark(bookmark); + }, - /** + /** * 移除当前选区内指定的inline标签,但保留其中的内容 * @method removeInlineStyle * @param { String } tagName 需要移除的标签名 @@ -6167,296 +6220,302 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 移除当前选区内指定的一组inline标签,但保留其中的内容 * @method removeInlineStyle * @param { Array } tagNameArr 需要移除的标签名的数组 * @return { UE.dom.Range } 当前的range对象 * @see UE.dom.Range:removeInlineStyle(String) */ - removeInlineStyle: function(tagNames) { - if (this.collapsed) return this; - tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; - this.shrinkBoundary().adjustmentBoundary(); - var start = this.startContainer, - end = this.endContainer; - while (1) { - if (start.nodeType == 1) { - if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { - break; - } - if (start.tagName.toLowerCase() == "body") { - start = null; - break; - } - } - start = start.parentNode; - } - while (1) { - if (end.nodeType == 1) { - if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { - break; - } - if (end.tagName.toLowerCase() == "body") { - end = null; - break; - } - } - end = end.parentNode; - } - var bookmark = this.createBookmark(), - frag, - tmpRange; - if (start) { - tmpRange = this.cloneRange() - .setEndBefore(bookmark.start) - .setStartBefore(start); - frag = tmpRange.extractContents(); - tmpRange.insertNode(frag); - domUtils.clearEmptySibling(start, true); - start.parentNode.insertBefore(bookmark.start, start); - } - if (end) { - tmpRange = this.cloneRange() - .setStartAfter(bookmark.end) - .setEndAfter(end); - frag = tmpRange.extractContents(); - tmpRange.insertNode(frag); - domUtils.clearEmptySibling(end, false, true); - end.parentNode.insertBefore(bookmark.end, end.nextSibling); - } - var current = domUtils.getNextDomNode(bookmark.start, false, function( - node - ) { - return node.nodeType == 1; - }), - next; - while (current && current !== bookmark.end) { - next = domUtils.getNextDomNode(current, true, function(node) { - return node.nodeType == 1; - }); - if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { - domUtils.remove(current, true); - } - current = next; - } - return this.moveToBookmark(bookmark); - }, + removeInlineStyle: function (tagNames) { + if (this.collapsed) return this; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + this.shrinkBoundary().adjustmentBoundary(); + var start = this.startContainer, + end = this.endContainer; + while (1) { + if (start.nodeType == 1) { + if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { + break; + } + if (start.tagName.toLowerCase() == "body") { + start = null; + break; + } + } + start = start.parentNode; + } + while (1) { + if (end.nodeType == 1) { + if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { + break; + } + if (end.tagName.toLowerCase() == "body") { + end = null; + break; + } + } + end = end.parentNode; + } + var bookmark = this.createBookmark(), + frag, + tmpRange; + if (start) { + tmpRange = this.cloneRange() + .setEndBefore(bookmark.start) + .setStartBefore(start); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(start, true); + start.parentNode.insertBefore(bookmark.start, start); + } + if (end) { + tmpRange = this.cloneRange() + .setStartAfter(bookmark.end) + .setEndAfter(end); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(end, false, true); + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + var current = domUtils.getNextDomNode(bookmark.start, false, function ( + node + ) { + return node.nodeType == 1; + }), + next; + while (current && current !== bookmark.end) { + next = domUtils.getNextDomNode(current, true, function (node) { + return node.nodeType == 1; + }); + if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { + domUtils.remove(current, true); + } + current = next; + } + return this.moveToBookmark(bookmark); + }, - /** + /** * 获取当前选中的自闭合的节点 * @method getClosedNode * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL */ - getClosedNode: function() { - var node; - if (!this.collapsed) { - var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); - if (selectOneNode(range)) { - var child = range.startContainer.childNodes[range.startOffset]; - if ( - child && - child.nodeType == 1 && - (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName]) - ) { - node = child; - } - } - } - return node; - }, + getClosedNode: function () { + var node; + if (!this.collapsed) { + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + if (selectOneNode(range)) { + var child = range.startContainer.childNodes[range.startOffset]; + if ( + child && + child.nodeType === 1 && + (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName]) + ) { + node = child; + } + } + } + return node; + }, - /** + /** * 在页面上高亮range所表示的选区 * @method select * @return { UE.dom.Range } 返回当前Range对象 */ - //这里不区分ie9以上,trace:3824 - select: browser.ie - ? function(noFillData, textRange) { - var nativeRange; - if (!this.collapsed) this.shrinkBoundary(); - var node = this.getClosedNode(); - if (node && !textRange) { - try { - nativeRange = this.document.body.createControlRange(); - nativeRange.addElement(node); - nativeRange.select(); - } catch (e) {} - return this; - } - var bookmark = this.createBookmark(), - start = bookmark.start, - end; - nativeRange = this.document.body.createTextRange(); - nativeRange.moveToElementText(start); - nativeRange.moveStart("character", 1); - if (!this.collapsed) { - var nativeRangeEnd = this.document.body.createTextRange(); - end = bookmark.end; - nativeRangeEnd.moveToElementText(end); - nativeRange.setEndPoint("EndToEnd", nativeRangeEnd); - } else { - if (!noFillData && this.startContainer.nodeType != 3) { - //使用|x固定住光标 - var tmpText = this.document.createTextNode(fillChar), - tmp = this.document.createElement("span"); - tmp.appendChild(this.document.createTextNode(fillChar)); - start.parentNode.insertBefore(tmp, start); - start.parentNode.insertBefore(tmpText, start); - //当点b,i,u时,不能清除i上边的b - removeFillData(this.document, tmpText); - fillData = tmpText; - mergeSibling(tmp, "previousSibling"); - mergeSibling(start, "nextSibling"); - nativeRange.moveStart("character", -1); - nativeRange.collapse(true); - } - } - this.moveToBookmark(bookmark); - tmp && domUtils.remove(tmp); - //IE在隐藏状态下不支持range操作,catch一下 - try { - nativeRange.select(); - } catch (e) {} - return this; - } - : function(notInsertFillData) { - function checkOffset(rng) { - function check(node, offset, dir) { - if (node.nodeType == 3 && node.nodeValue.length < offset) { - rng[dir + "Offset"] = node.nodeValue.length; - } - } - check(rng.startContainer, rng.startOffset, "start"); - check(rng.endContainer, rng.endOffset, "end"); - } - var win = domUtils.getWindow(this.document), - sel = win.getSelection(), - txtNode; - //FF下关闭自动长高时滚动条在关闭dialog时会跳 - //ff下如果不body.focus将不能定位闭合光标到编辑器内 - browser.gecko ? this.document.body.focus() : win.focus(); - if (sel) { - sel.removeAllRanges(); - // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 - // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' - if (this.collapsed && !notInsertFillData) { - // //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 - // if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { - // var tmp = this.document.createTextNode(''); - // this.insertNode(tmp).setStart(tmp, 0).collapse(true); - // } - // - //处理光标落在文本节点的情况 - //处理以下的情况 - //|xxxx - //xxxx|xxxx - //xxxx| - var start = this.startContainer, - child = start; - if (start.nodeType == 1) { - child = start.childNodes[this.startOffset]; - } - if ( - !(start.nodeType == 3 && this.startOffset) && - (child - ? !child.previousSibling || - child.previousSibling.nodeType != 3 - : !start.lastChild || start.lastChild.nodeType != 3) - ) { - txtNode = this.document.createTextNode(fillChar); - //跟着前边走 - this.insertNode(txtNode); - removeFillData(this.document, txtNode); - mergeSibling(txtNode, "previousSibling"); - mergeSibling(txtNode, "nextSibling"); - fillData = txtNode; - this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); - } - } - var nativeRange = this.document.createRange(); - if ( - this.collapsed && - browser.opera && - this.startContainer.nodeType == 1 - ) { - var child = this.startContainer.childNodes[this.startOffset]; - if (!child) { - //往前靠拢 - child = this.startContainer.lastChild; - if (child && domUtils.isBr(child)) { - this.setStartBefore(child).collapse(true); + //这里不区分ie9以上,trace:3824 + select: browser.ie + ? function (noFillData, textRange) { + var nativeRange; + if (!this.collapsed) this.shrinkBoundary(); + var node = this.getClosedNode(); + if (node && !textRange) { + try { + nativeRange = this.document.body.createControlRange(); + nativeRange.addElement(node); + nativeRange.select(); + } catch (e) { + } + return this; } - } else { - //向后靠拢 - while (child && domUtils.isBlockElm(child)) { - if (child.nodeType == 1 && child.childNodes[0]) { - child = child.childNodes[0]; - } else { - break; - } + var bookmark = this.createBookmark(), + start = bookmark.start, + end; + nativeRange = this.document.body.createTextRange(); + nativeRange.moveToElementText(start); + nativeRange.moveStart("character", 1); + if (!this.collapsed) { + var nativeRangeEnd = this.document.body.createTextRange(); + end = bookmark.end; + nativeRangeEnd.moveToElementText(end); + nativeRange.setEndPoint("EndToEnd", nativeRangeEnd); + } else { + if (!noFillData && this.startContainer.nodeType != 3) { + //使用|x固定住光标 + var tmpText = this.document.createTextNode(fillChar), + tmp = this.document.createElement("span"); + tmp.appendChild(this.document.createTextNode(fillChar)); + start.parentNode.insertBefore(tmp, start); + start.parentNode.insertBefore(tmpText, start); + //当点b,i,u时,不能清除i上边的b + removeFillData(this.document, tmpText); + fillData = tmpText; + mergeSibling(tmp, "previousSibling"); + mergeSibling(start, "nextSibling"); + nativeRange.moveStart("character", -1); + nativeRange.collapse(true); + } } - child && this.setStartBefore(child).collapse(true); - } + this.moveToBookmark(bookmark); + tmp && domUtils.remove(tmp); + //IE在隐藏状态下不支持range操作,catch一下 + try { + nativeRange.select(); + } catch (e) { + } + return this; } - //是createAddress最后一位算的不准,现在这里进行微调 - checkOffset(this); - nativeRange.setStart(this.startContainer, this.startOffset); - nativeRange.setEnd(this.endContainer, this.endOffset); - sel.addRange(nativeRange); - } - return this; - }, + : function (notInsertFillData) { + function checkOffset(rng) { + function check(node, offset, dir) { + if (node.nodeType == 3 && node.nodeValue.length < offset) { + rng[dir + "Offset"] = node.nodeValue.length; + } + } - /** + check(rng.startContainer, rng.startOffset, "start"); + check(rng.endContainer, rng.endOffset, "end"); + } + + var win = domUtils.getWindow(this.document), + sel = win.getSelection(), + txtNode; + //FF下关闭自动长高时滚动条在关闭dialog时会跳 + //ff下如果不body.focus将不能定位闭合光标到编辑器内 + browser.gecko ? this.document.body.focus() : win.focus(); + if (sel) { + sel.removeAllRanges(); + // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 + // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' + if (this.collapsed && !notInsertFillData) { + // //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 + // if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { + // var tmp = this.document.createTextNode(''); + // this.insertNode(tmp).setStart(tmp, 0).collapse(true); + // } + // + //处理光标落在文本节点的情况 + //处理以下的情况 + //|xxxx + //xxxx|xxxx + //xxxx| + var start = this.startContainer, + child = start; + if (start.nodeType == 1) { + child = start.childNodes[this.startOffset]; + } + if ( + !(start.nodeType == 3 && this.startOffset) && + (child + ? !child.previousSibling || + child.previousSibling.nodeType != 3 + : !start.lastChild || start.lastChild.nodeType != 3) + ) { + txtNode = this.document.createTextNode(fillChar); + //跟着前边走 + this.insertNode(txtNode); + removeFillData(this.document, txtNode); + mergeSibling(txtNode, "previousSibling"); + mergeSibling(txtNode, "nextSibling"); + fillData = txtNode; + this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); + } + } + var nativeRange = this.document.createRange(); + if ( + this.collapsed && + browser.opera && + this.startContainer.nodeType == 1 + ) { + var child = this.startContainer.childNodes[this.startOffset]; + if (!child) { + //往前靠拢 + child = this.startContainer.lastChild; + if (child && domUtils.isBr(child)) { + this.setStartBefore(child).collapse(true); + } + } else { + //向后靠拢 + while (child && domUtils.isBlockElm(child)) { + if (child.nodeType == 1 && child.childNodes[0]) { + child = child.childNodes[0]; + } else { + break; + } + } + child && this.setStartBefore(child).collapse(true); + } + } + //是createAddress最后一位算的不准,现在这里进行微调 + checkOffset(this); + nativeRange.setStart(this.startContainer, this.startOffset); + nativeRange.setEnd(this.endContainer, this.endOffset); + sel.addRange(nativeRange); + } + return this; + }, + + /** * 滚动到当前range开始的位置 * @method scrollToView * @param { Window } win 当前range对象所属的window对象 * @return { UE.dom.Range } 当前Range对象 */ - /** + /** * 滚动到距离当前range开始位置 offset 的位置处 * @method scrollToView * @param { Window } win 当前range对象所属的window对象 * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 * @return { UE.dom.Range } 当前Range对象 */ - scrollToView: function(win, offset) { - win = win ? window : domUtils.getWindow(this.document); - var me = this, - span = me.document.createElement("span"); - //trace:717 - span.innerHTML = " "; - me.cloneRange().insertNode(span); - domUtils.scrollToView(span, win, offset); - domUtils.remove(span); - return me; - }, + scrollToView: function (win, offset) { + win = win ? window : domUtils.getWindow(this.document); + offset = offset || (win.innerHeight - 100); + // console.log('xxx',win, offset); + var me = this, + span = me.document.createElement("span"); + //trace:717 + span.innerHTML = " "; + me.cloneRange().insertNode(span); + domUtils.scrollToView(span, win, offset); + domUtils.remove(span); + return me; + }, - /** + /** * 判断当前选区内容是否占位符 * @private * @method inFillChar * @return { Boolean } 如果是占位符返回true,否则返回false */ - inFillChar: function() { - var start = this.startContainer; - if ( - this.collapsed && - start.nodeType == 3 && - start.nodeValue.replace(new RegExp("^" + domUtils.fillChar), "") - .length + - 1 == - start.nodeValue.length - ) { - return true; - } - return false; - }, + inFillChar: function () { + var start = this.startContainer; + if ( + this.collapsed && + start.nodeType == 3 && + start.nodeValue.replace(new RegExp("^" + domUtils.fillChar), "") + .length + + 1 == + start.nodeValue.length + ) { + return true; + } + return false; + }, - /** + /** * 保存 * @method createAddress * @private @@ -6480,73 +6539,74 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - createAddress: function(ignoreEnd, ignoreTxt) { - var addr = {}, - me = this; + createAddress: function (ignoreEnd, ignoreTxt) { + var addr = {}, + me = this; - function getAddress(isStart) { - var node = isStart ? me.startContainer : me.endContainer; - var parents = domUtils.findParents(node, true, function(node) { - return !domUtils.isBody(node); - }), - addrs = []; - for (var i = 0, ci; (ci = parents[i++]); ) { - addrs.push(domUtils.getNodeIndex(ci, ignoreTxt)); - } - var firstIndex = 0; - - if (ignoreTxt) { - if (node.nodeType == 3) { - var tmpNode = node.previousSibling; - while (tmpNode && tmpNode.nodeType == 3) { - firstIndex += tmpNode.nodeValue.replace(fillCharReg, "").length; - tmpNode = tmpNode.previousSibling; - } - firstIndex += isStart ? me.startOffset : me.endOffset; // - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) - } else { - node = node.childNodes[isStart ? me.startOffset : me.endOffset]; - if (node) { - firstIndex = domUtils.getNodeIndex(node, ignoreTxt); - } else { - node = isStart ? me.startContainer : me.endContainer; - var first = node.firstChild; - while (first) { - if (domUtils.isFillChar(first)) { - first = first.nextSibling; - continue; + function getAddress(isStart) { + var node = isStart ? me.startContainer : me.endContainer; + var parents = domUtils.findParents(node, true, function (node) { + return !domUtils.isBody(node); + }), + addrs = []; + for (var i = 0, ci; (ci = parents[i++]);) { + addrs.push(domUtils.getNodeIndex(ci, ignoreTxt)); } - firstIndex++; - if (first.nodeType == 3) { - while (first && first.nodeType == 3) { - first = first.nextSibling; - } + var firstIndex = 0; + + if (ignoreTxt) { + if (node.nodeType == 3) { + var tmpNode = node.previousSibling; + while (tmpNode && tmpNode.nodeType == 3) { + firstIndex += tmpNode.nodeValue.replace(fillCharReg, "").length; + tmpNode = tmpNode.previousSibling; + } + firstIndex += isStart ? me.startOffset : me.endOffset; // - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) + } else { + node = node.childNodes[isStart ? me.startOffset : me.endOffset]; + if (node) { + firstIndex = domUtils.getNodeIndex(node, ignoreTxt); + } else { + node = isStart ? me.startContainer : me.endContainer; + var first = node.firstChild; + while (first) { + if (domUtils.isFillChar(first)) { + first = first.nextSibling; + continue; + } + firstIndex++; + if (first.nodeType == 3) { + while (first && first.nodeType == 3) { + first = first.nextSibling; + } + } else { + first = first.nextSibling; + } + } + } + } } else { - first = first.nextSibling; + firstIndex = isStart + ? domUtils.isFillChar(node) ? 0 : me.startOffset + : me.endOffset; } - } + if (firstIndex < 0) { + firstIndex = 0; + } + addrs.push(firstIndex); + return addrs; } - } - } else { - firstIndex = isStart - ? domUtils.isFillChar(node) ? 0 : me.startOffset - : me.endOffset; - } - if (firstIndex < 0) { - firstIndex = 0; - } - addrs.push(firstIndex); - return addrs; - } - addr.startAddress = getAddress(true); - if (!ignoreEnd) { - addr.endAddress = me.collapsed - ? [].concat(addr.startAddress) - : getAddress(); - } - return addr; - }, - /** + addr.startAddress = getAddress(true); + if (!ignoreEnd) { + addr.endAddress = me.collapsed + ? [].concat(addr.startAddress) + : getAddress(); + } + return addr; + }, + + /** * 保存 * @method createAddress * @private @@ -6573,56 +6633,58 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - moveToAddress: function(addr, ignoreEnd) { - var me = this; - function getNode(address, isStart) { - var tmpNode = me.document.body, - parentNode, - offset; - for (var i = 0, ci, l = address.length; i < l; i++) { - ci = address[i]; - parentNode = tmpNode; - tmpNode = tmpNode.childNodes[ci]; - if (!tmpNode) { - offset = ci; - break; - } - } - if (isStart) { - if (tmpNode) { - me.setStartBefore(tmpNode); - } else { - me.setStart(parentNode, offset); - } - } else { - if (tmpNode) { - me.setEndBefore(tmpNode); - } else { - me.setEnd(parentNode, offset); - } - } - } - getNode(addr.startAddress, true); - !ignoreEnd && addr.endAddress && getNode(addr.endAddress); - return me; - }, + moveToAddress: function (addr, ignoreEnd) { + var me = this; - /** + function getNode(address, isStart) { + var tmpNode = me.document.body, + parentNode, + offset; + for (var i = 0, ci, l = address.length; i < l; i++) { + ci = address[i]; + parentNode = tmpNode; + tmpNode = tmpNode.childNodes[ci]; + if (!tmpNode) { + offset = ci; + break; + } + } + if (isStart) { + if (tmpNode) { + me.setStartBefore(tmpNode); + } else { + me.setStart(parentNode, offset); + } + } else { + if (tmpNode) { + me.setEndBefore(tmpNode); + } else { + me.setEnd(parentNode, offset); + } + } + } + + getNode(addr.startAddress, true); + !ignoreEnd && addr.endAddress && getNode(addr.endAddress); + return me; + }, + + /** * 判断给定的Range对象是否和当前Range对象表示的是同一个选区 * @method equals * @param { UE.dom.Range } 需要判断的Range对象 * @return { Boolean } 如果给定的Range对象与当前Range对象表示的是同一个选区, 则返回true, 否则返回false */ - equals: function(rng) { - for (var p in this) { - if (this.hasOwnProperty(p)) { - if (this[p] !== rng[p]) return false; - } - } - return true; - }, + equals: function (rng) { + for (var p in this) { + if (this.hasOwnProperty(p)) { + if (this[p] !== rng[p]) return false; + } + } + return true; + }, - /** + /** * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 * 作为其参数。 * @method traversal @@ -6659,7 +6721,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 遍历range内的节点。 * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 * 作为其参数。 @@ -6702,23 +6764,23 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * * ``` */ - traversal: function(doFn, filterFn) { - if (this.collapsed) return this; - var bookmark = this.createBookmark(), - end = bookmark.end, - current = domUtils.getNextDomNode(bookmark.start, false, filterFn); - while ( - current && - current !== end && - domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING - ) { - var tmpNode = domUtils.getNextDomNode(current, false, filterFn); - doFn(current); - current = tmpNode; - } - return this.moveToBookmark(bookmark); - } - }; + traversal: function (doFn, filterFn) { + if (this.collapsed) return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while ( + current && + current !== end && + domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING + ) { + var tmpNode = domUtils.getNextDomNode(current, false, filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; })(); @@ -6737,153 +6799,154 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @module UE.dom * @class Selection */ -(function() { - function getBoundaryInformation(range, start) { - var getIndex = domUtils.getNodeIndex; - range = range.duplicate(); - range.collapse(start); - var parent = range.parentElement(); - //如果节点里没有子节点,直接退出 - if (!parent.hasChildNodes()) { - return { container: parent, offset: 0 }; - } - var siblings = parent.children, - child, - testRange = range.duplicate(), - startIndex = 0, - endIndex = siblings.length - 1, - index = -1, - distance; - while (startIndex <= endIndex) { - index = Math.floor((startIndex + endIndex) / 2); - child = siblings[index]; - testRange.moveToElementText(child); - var position = testRange.compareEndPoints("StartToStart", range); - if (position > 0) { - endIndex = index - 1; - } else if (position < 0) { - startIndex = index + 1; - } else { - //trace:1043 - return { container: parent, offset: getIndex(child) }; - } - } - if (index == -1) { - testRange.moveToElementText(parent); - testRange.setEndPoint("StartToStart", range); - distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; - siblings = parent.childNodes; - if (!distance) { - child = siblings[siblings.length - 1]; - return { container: child, offset: child.nodeValue.length }; - } +(function () { + function getBoundaryInformation(range, start) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse(start); + var parent = range.parentElement(); + //如果节点里没有子节点,直接退出 + if (!parent.hasChildNodes()) { + return {container: parent, offset: 0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, + endIndex = siblings.length - 1, + index = -1, + distance; + while (startIndex <= endIndex) { + index = Math.floor((startIndex + endIndex) / 2); + child = siblings[index]; + testRange.moveToElementText(child); + var position = testRange.compareEndPoints("StartToStart", range); + if (position > 0) { + endIndex = index - 1; + } else if (position < 0) { + startIndex = index + 1; + } else { + //trace:1043 + return {container: parent, offset: getIndex(child)}; + } + } + if (index == -1) { + testRange.moveToElementText(parent); + testRange.setEndPoint("StartToStart", range); + distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; + siblings = parent.childNodes; + if (!distance) { + child = siblings[siblings.length - 1]; + return {container: child, offset: child.nodeValue.length}; + } - var i = siblings.length; - while (distance > 0) { - distance -= siblings[--i].nodeValue.length; - } - return { container: siblings[i], offset: -distance }; - } - testRange.collapse(position > 0); - testRange.setEndPoint(position > 0 ? "StartToStart" : "EndToStart", range); - distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; - if (!distance) { - return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] - ? { - container: parent, - offset: getIndex(child) + (position > 0 ? 0 : 1) - } - : { + var i = siblings.length; + while (distance > 0) { + distance -= siblings[--i].nodeValue.length; + } + return {container: siblings[i], offset: -distance}; + } + testRange.collapse(position > 0); + testRange.setEndPoint(position > 0 ? "StartToStart" : "EndToStart", range); + distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; + if (!distance) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] + ? { + container: parent, + offset: getIndex(child) + (position > 0 ? 0 : 1) + } + : { + container: child, + offset: position > 0 ? 0 : child.childNodes.length + }; + } + while (distance > 0) { + try { + var pre = child; + child = child[position > 0 ? "previousSibling" : "nextSibling"]; + distance -= child.nodeValue.length; + } catch (e) { + return {container: parent, offset: getIndex(pre)}; + } + } + return { container: child, - offset: position > 0 ? 0 : child.childNodes.length - }; + offset: position > 0 ? -distance : child.nodeValue.length + distance + }; } - while (distance > 0) { - try { - var pre = child; - child = child[position > 0 ? "previousSibling" : "nextSibling"]; - distance -= child.nodeValue.length; - } catch (e) { - return { container: parent, offset: getIndex(pre) }; - } - } - return { - container: child, - offset: position > 0 ? -distance : child.nodeValue.length + distance - }; - } - /** + /** * 将ieRange转换为Range对象 * @param {Range} ieRange ieRange对象 * @param {Range} range Range对象 * @return {Range} range 返回转换后的Range对象 */ - function transformIERangeToRange(ieRange, range) { - if (ieRange.item) { - range.selectNode(ieRange.item(0)); - } else { - var bi = getBoundaryInformation(ieRange, true); - range.setStart(bi.container, bi.offset); - if (ieRange.compareEndPoints("StartToEnd", ieRange) != 0) { - bi = getBoundaryInformation(ieRange, false); - range.setEnd(bi.container, bi.offset); - } + function transformIERangeToRange(ieRange, range) { + if (ieRange.item) { + range.selectNode(ieRange.item(0)); + } else { + var bi = getBoundaryInformation(ieRange, true); + range.setStart(bi.container, bi.offset); + if (ieRange.compareEndPoints("StartToEnd", ieRange) != 0) { + bi = getBoundaryInformation(ieRange, false); + range.setEnd(bi.container, bi.offset); + } + } + return range; } - return range; - } - /** + /** * 获得ieRange * @param {Selection} sel Selection对象 * @return {ieRange} 得到ieRange */ - function _getIERange(sel) { - var ieRange; - //ie下有可能报错 - try { - ieRange = sel.getNative().createRange(); - } catch (e) { - return null; - } - var el = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); - if ((el.ownerDocument || el) === sel.document) { - return ieRange; - } - return null; - } - - var Selection = (dom.Selection = function(doc) { - var me = this, - iframe; - me.document = doc; - if (browser.ie9below) { - iframe = domUtils.getWindow(doc).frameElement; - domUtils.on(iframe, "beforedeactivate", function() { - me._bakIERange = me.getIERange(); - }); - domUtils.on(iframe, "activate", function() { + function _getIERange(sel) { + var ieRange; + //ie下有可能报错 try { - if (!_getIERange(me) && me._bakIERange) { - me._bakIERange.select(); - } - } catch (ex) {} - me._bakIERange = null; - }); + ieRange = sel.getNative().createRange(); + } catch (e) { + return null; + } + var el = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); + if ((el.ownerDocument || el) === sel.document) { + return ieRange; + } + return null; } - iframe = doc = null; - }); - Selection.prototype = { - rangeInBody: function(rng, txtRange) { - var node = browser.ie9below || txtRange - ? rng.item ? rng.item() : rng.parentElement() - : rng.startContainer; + var Selection = (dom.Selection = function (doc) { + var me = this, + iframe; + me.document = doc; + if (browser.ie9below) { + iframe = domUtils.getWindow(doc).frameElement; + domUtils.on(iframe, "beforedeactivate", function () { + me._bakIERange = me.getIERange(); + }); + domUtils.on(iframe, "activate", function () { + try { + if (!_getIERange(me) && me._bakIERange) { + me._bakIERange.select(); + } + } catch (ex) { + } + me._bakIERange = null; + }); + } + iframe = doc = null; + }); - return node === this.document.body || domUtils.inDoc(node, this.document); - }, + Selection.prototype = { + rangeInBody: function (rng, txtRange) { + var node = browser.ie9below || txtRange + ? rng.item ? rng.item() : rng.parentElement() + : rng.startContainer; - /** + return node === this.document.body || domUtils.inDoc(node, this.document); + }, + + /** * 获取原生seleciton对象 * @method getNative * @return { Object } 获得selection对象 @@ -6892,20 +6955,20 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getNative(); * ``` */ - getNative: function() { - var doc = this.document; - try { - return !doc - ? null - : browser.ie9below - ? doc.selection - : domUtils.getWindow(doc).getSelection(); - } catch (e) { - return null; - } - }, + getNative: function () { + var doc = this.document; + try { + return !doc + ? null + : browser.ie9below + ? doc.selection + : domUtils.getWindow(doc).getSelection(); + } catch (e) { + return null; + } + }, - /** + /** * 获得ieRange * @method getIERange * @return { Object } 返回ie原生的Range @@ -6914,28 +6977,28 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getIERange(); * ``` */ - getIERange: function() { - var ieRange = _getIERange(this); - if (!ieRange) { - if (this._bakIERange) { - return this._bakIERange; - } - } - return ieRange; - }, + getIERange: function () { + var ieRange = _getIERange(this); + if (!ieRange) { + if (this._bakIERange) { + return this._bakIERange; + } + } + return ieRange; + }, - /** + /** * 缓存当前选区的range和选区的开始节点 * @method cache */ - cache: function() { - this.clear(); - this._cachedRange = this.getRange(); - this._cachedStartElement = this.getStart(); - this._cachedStartElementPath = this.getStartElementPath(); - }, + cache: function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, - /** + /** * 获取选区开始位置的父节点到body * @method getStartElementPath * @return { Array } 返回父节点集合 @@ -6944,43 +7007,43 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getStartElementPath(); * ``` */ - getStartElementPath: function() { - if (this._cachedStartElementPath) { - return this._cachedStartElementPath; - } - var start = this.getStart(); - if (start) { - return domUtils.findParents(start, true, null, true); - } - return []; - }, + getStartElementPath: function () { + if (this._cachedStartElementPath) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if (start) { + return domUtils.findParents(start, true, null, true); + } + return []; + }, - /** + /** * 清空缓存 * @method clear */ - clear: function() { - this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; - }, + clear: function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, - /** + /** * 编辑器是否得到了选区 * @method isFocus */ - isFocus: function() { - try { - if (browser.ie9below) { - var nativeRange = _getIERange(this); - return !!(nativeRange && this.rangeInBody(nativeRange)); - } else { - return !!this.getNative().rangeCount; - } - } catch (e) { - return false; - } - }, + isFocus: function () { + try { + if (browser.ie9below) { + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + } else { + return !!this.getNative().rangeCount; + } + } catch (e) { + return false; + } + }, - /** + /** * 获取选区对应的Range * @method getRange * @return { Object } 得到Range对象 @@ -6989,70 +7052,71 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getRange(); * ``` */ - getRange: function() { - var me = this; - function optimze(range) { - var child = me.document.body.firstChild, - collapsed = range.collapsed; - while (child && child.firstChild) { - range.setStart(child, 0); - child = child.firstChild; - } - if (!range.startContainer) { - range.setStart(me.document.body, 0); - } - if (collapsed) { - range.collapse(true); - } - } + getRange: function () { + var me = this; - if (me._cachedRange != null) { - return this._cachedRange; - } - var range = new baidu.editor.dom.Range(me.document); + function optimze(range) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while (child && child.firstChild) { + range.setStart(child, 0); + child = child.firstChild; + } + if (!range.startContainer) { + range.setStart(me.document.body, 0); + } + if (collapsed) { + range.collapse(true); + } + } - if (browser.ie9below) { - var nativeRange = me.getIERange(); - if (nativeRange) { - //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 - try { - transformIERangeToRange(nativeRange, range); - } catch (e) { - optimze(range); - } - } else { - optimze(range); - } - } else { - var sel = me.getNative(); - if (sel && sel.rangeCount) { - var firstRange = sel.getRangeAt(0); - var lastRange = sel.getRangeAt(sel.rangeCount - 1); - range - .setStart(firstRange.startContainer, firstRange.startOffset) - .setEnd(lastRange.endContainer, lastRange.endOffset); - if ( - range.collapsed && - domUtils.isBody(range.startContainer) && - !range.startOffset - ) { - optimze(range); - } - } else { - //trace:1734 有可能已经不在dom树上了,标识的节点 - if ( - this._bakRange && - domUtils.inDoc(this._bakRange.startContainer, this.document) - ) { - return this._bakRange; - } - optimze(range); - } - } - return (this._bakRange = range); - }, + if (me._cachedRange != null) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range(me.document); - /** + if (browser.ie9below) { + var nativeRange = me.getIERange(); + if (nativeRange) { + //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 + try { + transformIERangeToRange(nativeRange, range); + } catch (e) { + optimze(range); + } + } else { + optimze(range); + } + } else { + var sel = me.getNative(); + if (sel && sel.rangeCount) { + var firstRange = sel.getRangeAt(0); + var lastRange = sel.getRangeAt(sel.rangeCount - 1); + range + .setStart(firstRange.startContainer, firstRange.startOffset) + .setEnd(lastRange.endContainer, lastRange.endOffset); + if ( + range.collapsed && + domUtils.isBody(range.startContainer) && + !range.startOffset + ) { + optimze(range); + } + } else { + //trace:1734 有可能已经不在dom树上了,标识的节点 + if ( + this._bakRange && + domUtils.inDoc(this._bakRange.startContainer, this.document) + ) { + return this._bakRange; + } + optimze(range); + } + } + return (this._bakRange = range); + }, + + /** * 获取开始元素,用于状态反射 * @method getStart * @return { Element } 获得开始元素 @@ -7061,53 +7125,53 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getStart(); * ``` */ - getStart: function() { - if (this._cachedStartElement) { - return this._cachedStartElement; - } - var range = browser.ie9below ? this.getIERange() : this.getRange(), - tmpRange, - start, - tmp, - parent; - if (browser.ie9below) { - if (!range) { - //todo 给第一个值可能会有问题 - return this.document.body.firstChild; - } - //control元素 - if (range.item) { - return range.item(0); - } - tmpRange = range.duplicate(); - //修正ie下x[xx] 闭合后 x|xx - tmpRange.text.length > 0 && tmpRange.moveStart("character", 1); - tmpRange.collapse(1); - start = tmpRange.parentElement(); - parent = tmp = range.parentElement(); - while ((tmp = tmp.parentNode)) { - if (tmp == start) { - start = parent; - break; - } - } - } else { - range.shrinkBoundary(); - start = range.startContainer; - if (start.nodeType == 1 && start.hasChildNodes()) { - start = - start.childNodes[ - Math.min(start.childNodes.length - 1, range.startOffset) - ]; - } - if (start.nodeType == 3) { - return start.parentNode; - } - } - return start; - }, + getStart: function () { + if (this._cachedStartElement) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, + tmp, + parent; + if (browser.ie9below) { + if (!range) { + //todo 给第一个值可能会有问题 + return this.document.body.firstChild; + } + //control元素 + if (range.item) { + return range.item(0); + } + tmpRange = range.duplicate(); + //修正ie下x[xx] 闭合后 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart("character", 1); + tmpRange.collapse(1); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while ((tmp = tmp.parentNode)) { + if (tmp == start) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if (start.nodeType == 1 && start.hasChildNodes()) { + start = + start.childNodes[ + Math.min(start.childNodes.length - 1, range.startOffset) + ]; + } + if (start.nodeType == 3) { + return start.parentNode; + } + } + return start; + }, - /** + /** * 得到选区中的文本 * @method getText * @return { String } 选区中包含的文本 @@ -7116,18 +7180,18 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.getText(); * ``` */ - getText: function() { - var nativeSel, nativeRange; - if (this.isFocus() && (nativeSel = this.getNative())) { - nativeRange = browser.ie9below - ? nativeSel.createRange() - : nativeSel.getRangeAt(0); - return browser.ie9below ? nativeRange.text : nativeRange.toString(); - } - return ""; - }, + getText: function () { + var nativeSel, nativeRange; + if (this.isFocus() && (nativeSel = this.getNative())) { + nativeRange = browser.ie9below + ? nativeSel.createRange() + : nativeSel.getRangeAt(0); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ""; + }, - /** + /** * 清除选区 * @method clearRange * @example @@ -7135,10 +7199,10 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.selection.clearRange(); * ``` */ - clearRange: function() { - this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); - } - }; + clearRange: function () { + this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); + } + }; })(); @@ -7164,72 +7228,73 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @class Editor */ -(function() { - var uid = 0, - _selectionChangeTimer; +(function () { + var uid = 0, + _selectionChangeTimer; - /** + /** * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 * @private * @method setValue * @param { UE.Editor } editor 编辑器事例 */ - function setValue(form, editor) { - var textarea; - if (editor.options.textarea) { - if (utils.isString(editor.options.textarea)) { - for ( - var i = 0, ti, tis = domUtils.getElementsByTagName(form, "textarea"); - (ti = tis[i++]); - - ) { - if (ti.id == "ueditor_textarea_" + editor.options.textarea) { - textarea = ti; - break; - } + function setValue(form, editor) { + if (!editor.options.textarea) { + return; } - } else { + var textarea; textarea = editor.textarea; - } + if (!textarea) { + textarea = domUtils.getElementsByTagName(form, "textarea", function (node) { + return node.id === 'ueditor_textarea_' + editor.options.textarea; + })[0]; + } + if (!textarea) { + textarea = domUtils.getElementsByTagName(form, "textarea", function (node) { + return node.name === editor.options.textarea; + })[0]; + } + if (!textarea) { + form.appendChild( + (textarea = domUtils.createElement(document, "textarea", { + name: editor.options.textarea, + id: "ueditor_textarea_" + editor.options.textarea, + style: "display:none" + })) + ); + } + if (textarea && !editor.textarea) { + editor.textarea = textarea; + } + !textarea.getAttribute("name") && + textarea.setAttribute("name", editor.options.textarea); + textarea.value = editor.hasContents() + ? editor.options.allHtmlEnabled + ? editor.getAllHtml() + : editor.getContent(null, null, true) + : ""; } - if (!textarea) { - form.appendChild( - (textarea = domUtils.createElement(document, "textarea", { - name: editor.options.textarea, - id: "ueditor_textarea_" + editor.options.textarea, - style: "display:none" - })) - ); - //不要产生多个textarea - editor.textarea = textarea; - } - !textarea.getAttribute("name") && - textarea.setAttribute("name", editor.options.textarea); - textarea.value = editor.hasContents() - ? editor.options.allHtmlEnabled - ? editor.getAllHtml() - : editor.getContent(null, null, true) - : ""; - } - function loadPlugins(me) { - //初始化插件 - for (var pi in UE.plugins) { - UE.plugins[pi].call(me); - } - } - function checkCurLang(I18N) { - for (var lang in I18N) { - return lang; - } - } - function langReadied(me) { - me.langIsReady = true; + function loadPlugins(me) { + //初始化插件 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + } - me.fireEvent("langReady"); - } + function checkCurLang(I18N) { + for (var lang in I18N) { + return lang; + } + } - /** + function langReadied(me) { + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** * 编辑器准备就绪后会触发该事件 * @module UE * @class Editor @@ -7243,87 +7308,87 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * } ); * ``` */ - /** + /** * 执行destroy方法,会触发该事件 * @module UE * @class Editor * @event destroy * @see UE.Editor:destroy() */ - /** + /** * 执行reset方法,会触发该事件 * @module UE * @class Editor * @event reset * @see UE.Editor:reset() */ - /** + /** * 执行focus方法,会触发该事件 * @module UE * @class Editor * @event focus * @see UE.Editor:focus(Boolean) */ - /** + /** * 语言加载完成会触发该事件 * @module UE * @class Editor * @event langReady */ - /** + /** * 运行命令之后会触发该命令 * @module UE * @class Editor * @event beforeExecCommand */ - /** + /** * 运行命令之后会触发该命令 * @module UE * @class Editor * @event afterExecCommand */ - /** + /** * 运行命令之前会触发该命令 * @module UE * @class Editor * @event firstBeforeExecCommand */ - /** + /** * 在getContent方法执行之前会触发该事件 * @module UE * @class Editor * @event beforeGetContent * @see UE.Editor:getContent() */ - /** + /** * 在getContent方法执行之后会触发该事件 * @module UE * @class Editor * @event afterGetContent * @see UE.Editor:getContent() */ - /** + /** * 在getAllHtml方法执行时会触发该事件 * @module UE * @class Editor * @event getAllHtml * @see UE.Editor:getAllHtml() */ - /** + /** * 在setContent方法执行之前会触发该事件 * @module UE * @class Editor * @event beforeSetContent * @see UE.Editor:setContent(String) */ - /** + /** * 在setContent方法执行之后会触发该事件 * @module UE * @class Editor * @event afterSetContent * @see UE.Editor:setContent(String) */ - /** + /** * 每当编辑器内部选区发生改变时,将触发该事件 * @event selectionchange * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 @@ -7333,28 +7398,28 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * console.log('选区发生改变'); * } */ - /** + /** * 在所有selectionchange的监听函数执行之前,会触发该事件 * @module UE * @class Editor * @event beforeSelectionChange * @see UE.Editor:selectionchange */ - /** + /** * 在所有selectionchange的监听函数执行完之后,会触发该事件 * @module UE * @class Editor * @event afterSelectionChange * @see UE.Editor:selectionchange */ - /** + /** * 编辑器内容发生改变时会触发该事件 * @module UE * @class Editor * @event contentChange */ - /** + /** * 以默认参数构建一个编辑器实例 * @constructor * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 @@ -7366,7 +7431,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @see UE.Config */ - /** + /** * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 * @constructor * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 @@ -7378,54 +7443,54 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` * @see UE.Config */ - var Editor = (UE.Editor = function(options) { - var me = this; - me.uid = uid++; - EventBase.call(me); - me.commands = {}; - me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); - me.shortcutkeys = {}; - me.inputRules = []; - me.outputRules = []; - //设置默认的常用属性 - me.setOpt(Editor.defaultOptions(me)); + var Editor = (UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //设置默认的常用属性 + me.setOpt(Editor.defaultOptions(me)); - /* 尝试异步加载后台配置 */ - me.loadServerConfig(); + /* 尝试异步加载后台配置 */ + me.loadServerConfig(); - if (!utils.isEmptyObject(UE.I18N)) { - //修改默认的语言类型 - me.options.lang = checkCurLang(UE.I18N); - UE.plugin.load(me); - langReadied(me); - } else { - utils.loadFile( - document, - { - src: - me.options.langPath + - me.options.lang + - "/" + - me.options.lang + - ".js?20220907", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - UE.plugin.load(me); - langReadied(me); + if (!utils.isEmptyObject(UE.I18N)) { + //修改默认的语言类型 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + } else { + utils.loadFile( + document, + { + src: + me.options.langPath + + me.options.lang + + "/" + + me.options.lang + + ".js?7a537435", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function () { + UE.plugin.load(me); + langReadied(me); + } + ); } - ); - } - UE.instants["ueditorInstant" + me.uid] = me; - }); - Editor.prototype = { - registerCommand: function(name, obj) { - this.commands[name] = obj; - }, - /** + UE.instants["ueditorInstant" + me.uid] = me; + }); + Editor.prototype = { + registerCommand: function (name, obj) { + this.commands[name] = obj; + }, + /** * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 * @method ready * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 @@ -7439,14 +7504,14 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` * @see UE.Editor.event:ready */ - ready: function(fn) { - var me = this; - if (fn) { - me.isReady ? fn.apply(me) : me.addListener("ready", fn); - } - }, + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener("ready", fn); + } + }, - /** + /** * 该方法是提供给插件里面使用,设置配置项默认值 * @method setOpt * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 @@ -7459,7 +7524,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 * @method setOpt * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 @@ -7472,19 +7537,19 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * } ); * ``` */ - setOpt: function(key, val) { - var obj = {}; - if (utils.isString(key)) { - obj[key] = val; - } else { - obj = key; - } - utils.extend(this.options, obj, true); - }, - getOpt: function(key) { - return this.options[key]; - }, - /** + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val; + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt: function (key) { + return this.options[key]; + }, + /** * 销毁编辑器实例,使用textarea代替 * @method destroy * @example @@ -7492,35 +7557,35 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.destroy(); * ``` */ - destroy: function() { - var me = this; - me.fireEvent("destroy"); - var container = me.container.parentNode; - var textarea = me.textarea; - if (!textarea) { - textarea = document.createElement("textarea"); - container.parentNode.insertBefore(textarea, container); - } else { - textarea.style.display = ""; - } + destroy: function () { + var me = this; + me.fireEvent("destroy"); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement("textarea"); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = ""; + } - textarea.style.width = me.iframe.offsetWidth + "px"; - textarea.style.height = me.iframe.offsetHeight + "px"; - textarea.value = me.getContent(); - textarea.id = me.key; - container.innerHTML = ""; - domUtils.remove(container); - var key = me.key; - //trace:2004 - for (var p in me) { - if (me.hasOwnProperty(p)) { - delete this[p]; - } - } - UE.delEditor(key); - }, + textarea.style.width = me.iframe.offsetWidth + "px"; + textarea.style.height = me.iframe.offsetHeight + "px"; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ""; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, - /** + /** * 渲染编辑器的DOM到指定容器 * @method render * @param { String } containerId 指定一个容器ID @@ -7528,257 +7593,265 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @warning 必须且只能调用一次 */ - /** + /** * 渲染编辑器的DOM到指定容器 * @method render * @param { Element } containerDom 直接指定容器对象 * @remind 执行该方法,会触发ready事件 * @warning 必须且只能调用一次 */ - render: function(container) { - var me = this, - options = me.options, - getStyleValue = function(attr) { - return parseInt(domUtils.getComputedStyle(container, attr)); - }; - if (utils.isString(container)) { - container = document.getElementById(container); - } - if (container) { - if (options.initialFrameWidth) { - options.minFrameWidth = options.initialFrameWidth; - } else { - options.minFrameWidth = options.initialFrameWidth = - container.offsetWidth; - } - if (options.initialFrameHeight) { - options.minFrameHeight = options.initialFrameHeight; - } else { - options.initialFrameHeight = options.minFrameHeight = - container.offsetHeight; - } + render: function (container) { + var me = this, + options = me.options, + getStyleValue = function (attr) { + return parseInt(domUtils.getComputedStyle(container, attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if (options.initialFrameWidth) { + options.minFrameWidth = options.initialFrameWidth; + } else { + options.minFrameWidth = options.initialFrameWidth = + container.offsetWidth; + } + if (options.initialFrameHeight) { + options.minFrameHeight = options.initialFrameHeight; + } else { + options.initialFrameHeight = options.minFrameHeight = + container.offsetHeight; + } - container.style.width = /%$/.test(options.initialFrameWidth) - ? "100%" - : options.initialFrameWidth - - getStyleValue("padding-left") - - getStyleValue("padding-right") + - "px"; - container.style.height = /%$/.test(options.initialFrameHeight) - ? "100%" - : options.initialFrameHeight - - getStyleValue("padding-top") - - getStyleValue("padding-bottom") + - "px"; + container.style.width = /%$/.test(options.initialFrameWidth) + ? "100%" + : options.initialFrameWidth - + getStyleValue("padding-left") - + getStyleValue("padding-right") + + "px"; + container.style.height = /%$/.test(options.initialFrameHeight) + ? "100%" + : options.initialFrameHeight - + getStyleValue("padding-top") - + getStyleValue("padding-bottom") + + "px"; - container.style.zIndex = options.zIndex; - var additionCssHtml = []; - for(var i in options.iframeCssUrlsAddition){ - additionCssHtml.push("") - } - var html = - (ie && browser.version < 9 ? "" : "") + - "" + - "" + - "" + - (options.iframeCssUrl - ? "" - : "") + - (options.initialStyle - ? "" - : "") + - additionCssHtml.join("") + - "" + - "" + - "" + - (options.iframeJsUrl - ? "" - : "") + - ""; + container.style.zIndex = options.zIndex; + var additionCssHtml = []; + for (var i in options.iframeCssUrlsAddition) { + additionCssHtml.push("") + } + var html = + (ie && browser.version < 9 ? "" : "") + + "" + + "" + + "" + + (options.iframeCssUrl + ? "" + : "") + + (options.initialStyle + ? "" + : "") + + additionCssHtml.join("") + + "" + + "" + + "" + + (options.iframeJsUrl + ? "" + : "") + + ""; - container.appendChild( - domUtils.createElement(document, "iframe", { - id: "ueditor_" + me.uid, - width: "100%", - height: "100%", - frameborder: "0", - //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 - // scrolling :'no', - src: - "javascript:void(function(){document.open();" + - (options.customDomain && document.domain != location.hostname - ? 'document.domain="' + document.domain + '";' - : "") + - 'document.write("' + - html + - '");document.close();}())' - }) - ); - container.style.overflow = "hidden"; - //解决如果是给定的百分比,会导致高度算不对的问题 - setTimeout(function() { - if (/%$/.test(options.initialFrameWidth)) { - options.minFrameWidth = options.initialFrameWidth = - container.offsetWidth; - //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 - // container.style.width = options.initialFrameWidth + 'px'; - } - if (/%$/.test(options.initialFrameHeight)) { - options.minFrameHeight = options.initialFrameHeight = - container.offsetHeight; - container.style.height = options.initialFrameHeight + "px"; - } - }); - } - }, + container.appendChild( + domUtils.createElement(document, "iframe", { + id: "ueditor_" + me.uid, + width: "100%", + height: "100%", + frameborder: "0", + //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 + // scrolling :'no', + src: + "javascript:void(function(){document.open();" + + (options.customDomain && document.domain != location.hostname + ? 'document.domain="' + document.domain + '";' + : "") + + 'document.write("' + + html + + '");document.close();}())' + }) + ); + container.style.overflow = "hidden"; + //解决如果是给定的百分比,会导致高度算不对的问题 + setTimeout(function () { + if (/%$/.test(options.initialFrameWidth)) { + options.minFrameWidth = options.initialFrameWidth = + container.offsetWidth; + //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 + // container.style.width = options.initialFrameWidth + 'px'; + } + if (/%$/.test(options.initialFrameHeight)) { + options.minFrameHeight = options.initialFrameHeight = + container.offsetHeight; + container.style.height = options.initialFrameHeight + "px"; + } + }); + } + }, - /** + /** * 编辑器初始化 * @method _setup * @private * @param { Element } doc 编辑器Iframe中的文档对象 */ - _setup: function(doc) { - var me = this, - options = me.options; - if (ie) { - doc.body.disabled = true; - doc.body.contentEditable = true; - doc.body.disabled = false; - } else { - doc.body.contentEditable = true; - } - doc.body.spellcheck = false; - me.document = doc; - me.window = doc.defaultView || doc.parentWindow; - me.iframe = me.window.frameElement; - me.body = doc.body; - me.selection = new dom.Selection(doc); - //gecko初始化就能得到range,无法判断isFocus了 - var geckoSel; - if (browser.gecko && (geckoSel = this.selection.getNative())) { - geckoSel.removeAllRanges(); - } - this._initEvents(); - //为form提交提供一个隐藏的textarea - for ( - var form = this.iframe.parentNode; - !domUtils.isBody(form); - form = form.parentNode - ) { - if (form.tagName == "FORM") { - me.form = form; - if (me.options.autoSyncData) { - domUtils.on(me.window, "blur", function() { - setValue(form, me); - }); - } else { - domUtils.on(form, "submit", function() { - setValue(this, me); - }); - } - break; - } - } - if (options.initialContent) { - if (options.autoClearinitialContent) { - var oldExecCommand = me.execCommand; - me.execCommand = function() { - me.fireEvent("firstBeforeExecCommand"); - return oldExecCommand.apply(me, arguments); - }; - this._setDefaultContent(options.initialContent); - } else this.setContent(options.initialContent, false, true); - } - - //编辑器不能为空内容 - - if (domUtils.isEmptyNode(me.body)) { - me.body.innerHTML = "

      " + (browser.ie ? "" : "
      ") + "

      "; - } - //如果要求focus, 就把光标定位到内容开始 - if (options.focus) { - setTimeout(function() { - me.focus(me.options.focusInEnd); - //如果自动清除开着,就不需要做selectionchange; - !me.options.autoClearinitialContent && me._selectionChange(); - }, 0); - } - if (!me.container) { - me.container = this.iframe.parentNode; - } - if (options.fullscreen && me.ui) { - me.ui.setFullScreen(true); - } - - try { - me.document.execCommand("2D-position", false, false); - } catch (e) {} - try { - me.document.execCommand("enableInlineTableEditing", false, false); - } catch (e) {} - try { - me.document.execCommand("enableObjectResizing", false, false); - } catch (e) {} - - //挂接快捷键 - me._bindshortcutKeys(); - me.isReady = 1; - me.fireEvent("ready"); - options.onready && options.onready.call(me); - if (!browser.ie9below) { - domUtils.on(me.window, ["blur", "focus"], function(e) { - //chrome下会出现alt+tab切换时,导致选区位置不对 - if (e.type == "blur") { - me._bakRange = me.selection.getRange(); - try { - me._bakNativeRange = me.selection.getNative().getRangeAt(0); - me.selection.getNative().removeAllRanges(); - } catch (e) { - me._bakNativeRange = null; + _setup: function (doc) { + var me = this, + options = me.options; + if (ie) { + doc.body.disabled = true; + doc.body.contentEditable = true; + doc.body.disabled = false; + } else { + doc.body.contentEditable = true; } - } else { + doc.body.spellcheck = false; + me.document = doc; + me.window = doc.defaultView || doc.parentWindow; + me.iframe = me.window.frameElement; + me.body = doc.body; + me.selection = new dom.Selection(doc); + //gecko初始化就能得到range,无法判断isFocus了 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + this._initEvents(); + //为form提交提供一个隐藏的textarea + for ( + var form = this.iframe.parentNode; + !domUtils.isBody(form); + form = form.parentNode + ) { + if (form.tagName === "FORM") { + me.form = form; + if (me.options.autoSyncData) { + domUtils.on(me.window, "blur", function () { + setValue(form, me); + }); + domUtils.on(form, "submit", function () { + me.fireEvent("beforesubmit"); + }); + } else { + domUtils.on(form, "submit", function () { + setValue(this, me); + me.fireEvent("beforesubmit"); + }); + } + break; + } + } + if (options.initialContent) { + if (options.autoClearinitialContent) { + var oldExecCommand = me.execCommand; + me.execCommand = function () { + me.fireEvent("firstBeforeExecCommand"); + return oldExecCommand.apply(me, arguments); + }; + this._setDefaultContent(options.initialContent); + } else this.setContent(options.initialContent, false, true); + } + + //编辑器不能为空内容 + + if (domUtils.isEmptyNode(me.body)) { + me.body.innerHTML = "

      " + (browser.ie ? "" : "
      ") + "

      "; + } + //如果要求focus, 就把光标定位到内容开始 + if (options.focus) { + setTimeout(function () { + me.focus(me.options.focusInEnd); + //如果自动清除开着,就不需要做selectionchange; + !me.options.autoClearinitialContent && me._selectionChange(); + }, 0); + } + if (!me.container) { + me.container = this.iframe.parentNode; + } + if (options.fullscreen && me.ui) { + me.ui.setFullScreen(true); + } + try { - me._bakRange && me._bakRange.select(); - } catch (e) {} - } - }); - } - //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 - if (browser.gecko && browser.version <= 10902) { - //修复ff3.6初始化进来,不能点击获得焦点 - me.body.contentEditable = false; - setTimeout(function() { - me.body.contentEditable = true; - }, 100); - setInterval(function() { - me.body.style.height = me.iframe.offsetHeight - 20 + "px"; - }, 100); - } + me.document.execCommand("2D-position", false, false); + } catch (e) { + } + try { + me.document.execCommand("enableInlineTableEditing", false, false); + } catch (e) { + } + try { + me.document.execCommand("enableObjectResizing", false, false); + } catch (e) { + } - !options.isShow && me.setHide(); - options.readonly && me.setDisabled(); - }, + //挂接快捷键 + me._bindshortcutKeys(); + me.isReady = 1; + me.fireEvent("ready"); + options.onready && options.onready.call(me); + if (!browser.ie9below) { + domUtils.on(me.window, ["blur", "focus"], function (e) { + //chrome下会出现alt+tab切换时,导致选区位置不对 + if (e.type == "blur") { + me._bakRange = me.selection.getRange(); + try { + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + me.selection.getNative().removeAllRanges(); + } catch (e) { + me._bakNativeRange = null; + } + } else { + try { + me._bakRange && me._bakRange.select(); + } catch (e) { + } + } + }); + } + //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 + if (browser.gecko && browser.version <= 10902) { + //修复ff3.6初始化进来,不能点击获得焦点 + me.body.contentEditable = false; + setTimeout(function () { + me.body.contentEditable = true; + }, 100); + setInterval(function () { + me.body.style.height = me.iframe.offsetHeight - 20 + "px"; + }, 100); + } - /** + !options.isShow && me.setHide(); + options.readonly && me.setDisabled(); + }, + + /** * 同步数据到编辑器所在的form * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 @@ -7790,44 +7863,44 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 * @method sync * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 */ - sync: function(formId) { - var me = this, - form = formId - ? document.getElementById(formId) - : domUtils.findParent( - me.iframe.parentNode, - function(node) { - return node.tagName == "FORM"; - }, - true - ); - form && setValue(form, me); - }, + sync: function (formId) { + var me = this, + form = formId + ? document.getElementById(formId) + : domUtils.findParent( + me.iframe.parentNode, + function (node) { + return node.tagName === "FORM"; + }, + true + ); + form && setValue(form, me); + }, - /** - * 手动触发更新按钮栏状态 - */ - syncCommandState: function(){ - this.fireEvent("selectionchange"); - }, + /** + * 手动触发更新按钮栏状态 + */ + syncCommandState: function () { + this.fireEvent("selectionchange"); + }, - /** - * 设置编辑器宽度 - * @param width - */ - setWidth: function(width){ - if (width !== parseInt(this.iframe.parentNode.parentNode.style.width)) { - this.iframe.parentNode.parentNode.style.width = width + "px"; - } - }, + /** + * 设置编辑器宽度 + * @param width + */ + setWidth: function (width) { + if (width !== parseInt(this.iframe.parentNode.parentNode.style.width)) { + this.iframe.parentNode.parentNode.style.width = width + "px"; + } + }, - /** + /** * 设置编辑器高度 * @method setHeight * @remind 当配置项autoHeightEnabled为真时,该方法无效 @@ -7837,17 +7910,17 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.setHeight(number); * ``` */ - setHeight: function(height, notSetHeight) { - if (height !== parseInt(this.iframe.parentNode.style.height)) { - this.iframe.parentNode.style.height = height + "px"; - } - !notSetHeight && - (this.options.minFrameHeight = this.options.initialFrameHeight = height); - this.body.style.height = height + "px"; - !notSetHeight && this.trigger("setHeight"); - }, + setHeight: function (height, notSetHeight) { + if (height !== parseInt(this.iframe.parentNode.style.height)) { + this.iframe.parentNode.style.height = height + "px"; + } + !notSetHeight && + (this.options.minFrameHeight = this.options.initialFrameHeight = height); + this.body.style.height = height + "px"; + !notSetHeight && this.trigger("setHeight"); + }, - /** + /** * 为编辑器的编辑命令提供快捷键 * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 * @method addshortcutkey @@ -7860,7 +7933,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * }); * ``` */ - /** + /** * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 * @method addshortcutkey * @param { String } cmd 触发快捷键时,响应的命令 @@ -7870,53 +7943,53 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.addshortcutkey("Underline", "ctrl+85"); //^U * ``` */ - addshortcutkey: function(cmd, keys) { - var obj = {}; - if (keys) { - obj[cmd] = keys; - } else { - obj = cmd; - } - utils.extend(this.shortcutkeys, obj); - }, + addshortcutkey: function (cmd, keys) { + var obj = {}; + if (keys) { + obj[cmd] = keys; + } else { + obj = cmd; + } + utils.extend(this.shortcutkeys, obj); + }, - /** + /** * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 * @method _bindshortcutKeys * @private */ - _bindshortcutKeys: function() { - var me = this, - shortcutkeys = this.shortcutkeys; - me.addListener("keydown", function(type, e) { - var keyCode = e.keyCode || e.which; - for (var i in shortcutkeys) { - var tmp = shortcutkeys[i].split(","); - for (var t = 0, ti; (ti = tmp[t++]); ) { - ti = ti.split(":"); - var key = ti[0], - param = ti[1]; - if ( - /^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || - /^(\d+)$/.test(key) - ) { - if ( - ((RegExp.$1 == "ctrl" ? e.ctrlKey || e.metaKey : 0) && - (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) && - keyCode == RegExp.$3) || - keyCode == RegExp.$1 - ) { - if (me.queryCommandState(i, param) != -1) - me.execCommand(i, param); - domUtils.preventDefault(e); - } - } - } - } - }); - }, + _bindshortcutKeys: function () { + var me = this, + shortcutkeys = this.shortcutkeys; + me.addListener("keydown", function (type, e) { + var keyCode = e.keyCode || e.which; + for (var i in shortcutkeys) { + var tmp = shortcutkeys[i].split(","); + for (var t = 0, ti; (ti = tmp[t++]);) { + ti = ti.split(":"); + var key = ti[0], + param = ti[1]; + if ( + /^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || + /^(\d+)$/.test(key) + ) { + if ( + ((RegExp.$1 == "ctrl" ? e.ctrlKey || e.metaKey : 0) && + (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) && + keyCode == RegExp.$3) || + keyCode == RegExp.$1 + ) { + if (me.queryCommandState(i, param) != -1) + me.execCommand(i, param); + domUtils.preventDefault(e); + } + } + } + } + }); + }, - /** + /** * 获取编辑器的内容 * @method getContent * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 @@ -7928,7 +8001,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 * @method getContent * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, @@ -7946,23 +8019,23 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * } ); * ``` */ - getContent: function(cmd, fn, notSetCursor, ignoreBlank, formatter) { - var me = this; - if (cmd && utils.isFunction(cmd)) { - fn = cmd; - cmd = ""; - } - if (fn ? !fn() : !this.hasContents()) { - return ""; - } - me.fireEvent("beforegetcontent"); - var root = UE.htmlparser(me.body.innerHTML, ignoreBlank); - me.filterOutputRule(root); - me.fireEvent("aftergetcontent", cmd, root); - return root.toHtml(formatter); - }, + getContent: function (cmd, fn, notSetCursor, ignoreBlank, formatter) { + var me = this; + if (cmd && utils.isFunction(cmd)) { + fn = cmd; + cmd = ""; + } + if (fn ? !fn() : !this.hasContents()) { + return ""; + } + me.fireEvent("beforegetcontent"); + var root = UE.htmlparser(me.body.innerHTML, ignoreBlank); + me.filterOutputRule(root); + me.fireEvent("aftergetcontent", cmd, root); + return root.toHtml(formatter); + }, - /** + /** * 取得完整的html代码,可以直接显示成完整的html文档 * @method getAllHtml * @return { String } 编辑器的内容html文档字符串 @@ -7971,42 +8044,42 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.getAllHtml(); //返回格式大致是: ...... * ``` */ - getAllHtml: function() { - var me = this, - headHtml = [], - html = ""; - me.fireEvent("getAllHtml", headHtml); - if (browser.ie && browser.version > 8) { - var headHtmlForIE9 = ""; - utils.each(me.document.styleSheets, function(si) { - headHtmlForIE9 += si.href - ? '' - : ""; - }); - utils.each(me.document.getElementsByTagName("script"), function(si) { - headHtmlForIE9 += si.outerHTML; - }); - } - return ( - "" + - (me.options.charset - ? '' - : "") + - (headHtmlForIE9 || - me.document.getElementsByTagName("head")[0].innerHTML) + - headHtml.join("\n") + - "" + - "" + - me.getContent(null, null, true) + - "" - ); - }, + getAllHtml: function () { + var me = this, + headHtml = [], + html = ""; + me.fireEvent("getAllHtml", headHtml); + if (browser.ie && browser.version > 8) { + var headHtmlForIE9 = ""; + utils.each(me.document.styleSheets, function (si) { + headHtmlForIE9 += si.href + ? '' + : ""; + }); + utils.each(me.document.getElementsByTagName("script"), function (si) { + headHtmlForIE9 += si.outerHTML; + }); + } + return ( + "" + + (me.options.charset + ? '' + : "") + + (headHtmlForIE9 || + me.document.getElementsByTagName("head")[0].innerHTML) + + headHtml.join("\n") + + "" + + "" + + me.getContent(null, null, true) + + "" + ); + }, - /** + /** * 得到编辑器的纯文本内容,但会保留段落格式 * @method getPlainTxt * @return { String } 编辑器带段落格式的纯文本内容字符串 @@ -8016,24 +8089,24 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * console.log(editor.getPlainTxt()); //输出:"1\n2\n * ``` */ - getPlainTxt: function() { - var reg = new RegExp(domUtils.fillChar, "g"), - html = this.body.innerHTML.replace(/[\n\r]/g, ""); //ie要先去了\n在处理 - html = html - .replace(/<(p|div)[^>]*>(| )<\/\1>/gi, "\n") - .replace(//gi, "\n") - .replace(/<[^>/]+>/g, "") - .replace(/(\n)?<\/([^>]+)>/g, function(a, b, c) { - return dtd.$block[c] ? "\n" : b ? b : ""; - }); - //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 - return html - .replace(reg, "") - .replace(/\u00a0/g, " ") - .replace(/ /g, " "); - }, + getPlainTxt: function () { + var reg = new RegExp(domUtils.fillChar, "g"), + html = this.body.innerHTML.replace(/[\n\r]/g, ""); //ie要先去了\n在处理 + html = html + .replace(/<(p|div)[^>]*>(| )<\/\1>/gi, "\n") + .replace(//gi, "\n") + .replace(/<[^>/]+>/g, "") + .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { + return dtd.$block[c] ? "\n" : b ? b : ""; + }); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return html + .replace(reg, "") + .replace(/\u00a0/g, " ") + .replace(/ /g, " "); + }, - /** + /** * 获取编辑器中的纯文本内容,没有段落格式 * @method getContentTxt * @return { String } 编辑器不带段落格式的纯文本内容字符串 @@ -8043,15 +8116,15 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * console.log(editor.getPlainTxt()); //输出:"12 * ``` */ - getContentTxt: function() { - var reg = new RegExp(domUtils.fillChar, "g"); - //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 - return this.body[browser.ie ? "innerText" : "textContent"] - .replace(reg, "") - .replace(/\u00a0/g, " "); - }, + getContentTxt: function () { + var reg = new RegExp(domUtils.fillChar, "g"); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return this.body[browser.ie ? "innerText" : "textContent"] + .replace(reg, "") + .replace(/\u00a0/g, " "); + }, - /** + /** * 设置编辑器的内容,可修改编辑器当前的html内容 * @method setContent * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 @@ -8063,93 +8136,95 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 设置编辑器的内容,可修改编辑器当前的html内容 * @method setContent * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 * @warning 该方法会触发selectionchange事件 * @param { String } html 要插入的html内容 * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @param { Boolean } notFireSelectionchange 是否阻止触发选区变化,true为阻止,false为不阻止 * @example * ```javascript * //假设设置前的编辑器内容是

      old text

      * editor.setContent('

      new text

      ', true); //插入的结果是

      old text

      new text

      * ``` */ - setContent: function(html, isAppendTo, notFireSelectionchange) { - var me = this; + setContent: function (html, isAppendTo, notFireSelectionchange) { + var me = this; - me.fireEvent("beforesetcontent", html); - var root = UE.htmlparser(html); - me.filterInputRule(root); - html = root.toHtml(); + me.fireEvent("beforesetcontent", html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); - me.body.innerHTML = (isAppendTo ? me.body.innerHTML : "") + html; + me.body.innerHTML = (isAppendTo ? me.body.innerHTML : "") + html; - function isCdataDiv(node) { - return node.tagName == "DIV" && node.getAttribute("cdata_tag"); - } - //给文本或者inline节点套p标签 - if (me.options.enterTag == "p") { - var child = this.body.firstChild, - tmpNode; - if ( - !child || - (child.nodeType == 1 && - (dtd.$cdata[child.tagName] || - isCdataDiv(child) || - domUtils.isCustomeNode(child)) && - child === this.body.lastChild) - ) { - this.body.innerHTML = - "

      " + - (browser.ie ? " " : "
      ") + - "

      " + - this.body.innerHTML; - } else { - var p = me.document.createElement("p"); - while (child) { - while ( - child && - (child.nodeType == 3 || - (child.nodeType == 1 && - dtd.p[child.tagName] && - !dtd.$cdata[child.tagName])) - ) { - tmpNode = child.nextSibling; - p.appendChild(child); - child = tmpNode; + function isCdataDiv(node) { + return node.tagName == "DIV" && node.getAttribute("cdata_tag"); } - if (p.firstChild) { - if (!child) { - me.body.appendChild(p); - break; - } else { - child.parentNode.insertBefore(p, child); - p = me.document.createElement("p"); - } + + //给文本或者inline节点套p标签 + if (me.options.enterTag == "p") { + var child = this.body.firstChild, + tmpNode; + if ( + !child || + (child.nodeType == 1 && + (dtd.$cdata[child.tagName] || + isCdataDiv(child) || + domUtils.isCustomeNode(child)) && + child === this.body.lastChild) + ) { + this.body.innerHTML = + "

      " + + (browser.ie ? " " : "
      ") + + "

      " + + this.body.innerHTML; + } else { + var p = me.document.createElement("p"); + while (child) { + while ( + child && + (child.nodeType == 3 || + (child.nodeType == 1 && + dtd.p[child.tagName] && + !dtd.$cdata[child.tagName])) + ) { + tmpNode = child.nextSibling; + p.appendChild(child); + child = tmpNode; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement("p"); + } + } + child = child.nextSibling; + } + } } - child = child.nextSibling; - } - } - } - me.fireEvent("aftersetcontent"); - me.fireEvent("contentchange"); + me.fireEvent("aftersetcontent"); + me.fireEvent("contentchange"); - !notFireSelectionchange && me._selectionChange(); - //清除保存的选区 - me._bakRange = me._bakIERange = me._bakNativeRange = null; - //trace:1742 setContent后gecko能得到焦点问题 - var geckoSel; - if (browser.gecko && (geckoSel = this.selection.getNative())) { - geckoSel.removeAllRanges(); - } - if (me.options.autoSyncData) { - me.form && setValue(me.form, me); - } - }, + !notFireSelectionchange && me._selectionChange(); + //清除保存的选区 + me._bakRange = me._bakIERange = me._bakNativeRange = null; + //trace:1742 setContent后gecko能得到焦点问题 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + if (me.options.autoSyncData) { + me.form && setValue(me.form, me); + } + }, - /** + /** * 让编辑器获得焦点,默认focus到编辑器头部 * @method focus * @example @@ -8158,7 +8233,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 让编辑器获得焦点,toEnd确定focus位置 * @method focus * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 @@ -8167,182 +8242,203 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.focus(true) * ``` */ - focus: function(toEnd) { - try { - var me = this, - rng = me.selection.getRange(); - if (toEnd) { - var node = me.body.lastChild; - if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { - if (domUtils.isEmptyBlock(node)) { - rng.setStartAtFirst(node); + focus: function (toEnd) { + try { + var me = this, + rng = me.selection.getRange(); + if (toEnd) { + var node = me.body.lastChild; + if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { + if (domUtils.isEmptyBlock(node)) { + rng.setStartAtFirst(node); + } else { + rng.setStartAtLast(node); + } + rng.collapse(true); + } + rng.setCursor(true); + } else { + if ( + !rng.collapsed && + domUtils.isBody(rng.startContainer) && + rng.startOffset == 0 + ) { + var node = me.body.firstChild; + if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { + rng.setStartAtFirst(node).collapse(true); + } + } + + rng.select(true); + } + this.fireEvent("focus selectionchange"); + } catch (e) { + } + }, + isFocus: function () { + return this.selection.isFocus(); + }, + blur: function () { + var sel = this.selection.getNative(); + if (sel.empty && browser.ie) { + var nativeRng = document.body.createTextRange(); + nativeRng.moveToElementText(document.body); + nativeRng.collapse(true); + nativeRng.select(); + sel.empty(); } else { - rng.setStartAtLast(node); + sel.removeAllRanges(); } - rng.collapse(true); - } - rng.setCursor(true); - } else { - if ( - !rng.collapsed && - domUtils.isBody(rng.startContainer) && - rng.startOffset == 0 - ) { - var node = me.body.firstChild; - if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { - rng.setStartAtFirst(node).collapse(true); - } - } - rng.select(true); - } - this.fireEvent("focus selectionchange"); - } catch (e) {} - }, - isFocus: function() { - return this.selection.isFocus(); - }, - blur: function() { - var sel = this.selection.getNative(); - if (sel.empty && browser.ie) { - var nativeRng = document.body.createTextRange(); - nativeRng.moveToElementText(document.body); - nativeRng.collapse(true); - nativeRng.select(); - sel.empty(); - } else { - sel.removeAllRanges(); - } - - //this.fireEvent('blur selectionchange'); - }, - /** + //this.fireEvent('blur selectionchange'); + }, + /** * 初始化UE事件及部分事件代理 * @method _initEvents * @private */ - _initEvents: function() { - var me = this, - doc = me.document, - win = me.window; - me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); - domUtils.on( - doc, - [ - "click", - "contextmenu", - "mousedown", - "keydown", - "keyup", - "keypress", - "mouseup", - "mouseover", - "mouseout", - "selectstart" - ], - me._proxyDomEvent - ); - domUtils.on(win, ["focus", "blur"], me._proxyDomEvent); - domUtils.on(me.body, "drop", function(e) { - //阻止ff下默认的弹出新页面打开图片 - if (browser.gecko && e.stopPropagation) { - e.stopPropagation(); - } - me.fireEvent("contentchange"); - }); - domUtils.on(doc, ["mouseup", "keydown"], function(evt) { - //特殊键不触发selectionchange - if ( - evt.type == "keydown" && - (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey) - ) { - return; - } - if (evt.button == 2) return; - me._selectionChange(250, evt); - }); - }, - /** + _initEvents: function () { + var me = this, + doc = me.document, + win = me.window; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + domUtils.on( + doc, + [ + "click", + "contextmenu", + "mousedown", + "keydown", + "keyup", + "keypress", + "mouseup", + "mouseover", + "mouseout", + "selectstart" + ], + me._proxyDomEvent + ); + domUtils.on(win, ["focus", "blur"], me._proxyDomEvent); + domUtils.on(me.body, "drop", function (e) { + //阻止ff下默认的弹出新页面打开图片 + if (browser.gecko && e.stopPropagation) { + e.stopPropagation(); + } + me.fireEvent("contentchange"); + }); + // 当内容最末尾为非字符时,比较难以在最后插入字符,所以在点击时,自动添加一个空的p标签 + domUtils.on(me.body, "dblclick", function (e) { + try { + var node = me.body.lastChild; + if (!node) { + return; + } + var rect = node.getBoundingClientRect(); + if (e.clientY > rect.top + rect.height) { + var p = document.createElement('p'); + p.innerHTML = '
      '; + me.body.appendChild(p); + setTimeout(function () { + me.focus(true); + }, 100); + } + } catch (e) { + console.error('auto insert p at end', e); + } + }); + domUtils.on(doc, ["mouseup", "keydown"], function (evt) { + //特殊键不触发selectionchange + if ( + evt.type === "keydown" && + (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey) + ) { + return; + } + if (evt.button === 2) return; + me._selectionChange(250, evt); + }); + }, + /** * 触发事件代理 * @method _proxyDomEvent * @private * @return { * } fireEvent的返回值 * @see UE.EventBase:fireEvent(String) */ - _proxyDomEvent: function(evt) { - if ( - this.fireEvent("before" + evt.type.replace(/^on/, "").toLowerCase()) === - false - ) { - return false; - } - if (this.fireEvent(evt.type.replace(/^on/, ""), evt) === false) { - return false; - } - return this.fireEvent( - "after" + evt.type.replace(/^on/, "").toLowerCase() - ); - }, - /** + _proxyDomEvent: function (evt) { + if ( + this.fireEvent("before" + evt.type.replace(/^on/, "").toLowerCase()) === + false + ) { + return false; + } + if (this.fireEvent(evt.type.replace(/^on/, ""), evt) === false) { + return false; + } + return this.fireEvent( + "after" + evt.type.replace(/^on/, "").toLowerCase() + ); + }, + /** * 变化选区 * @method _selectionChange * @private */ - _selectionChange: function(delay, evt) { - var me = this; - //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) - // if ( !me.selection.isFocus() ){ - // return; - // } + _selectionChange: function (delay, evt) { + var me = this; + //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) + // if ( !me.selection.isFocus() ){ + // return; + // } - var hackForMouseUp = false; - var mouseX, mouseY; - if (browser.ie && browser.version < 9 && evt && evt.type == "mouseup") { - var range = this.selection.getRange(); - if (!range.collapsed) { - hackForMouseUp = true; - mouseX = evt.clientX; - mouseY = evt.clientY; - } - } - clearTimeout(_selectionChangeTimer); - _selectionChangeTimer = setTimeout(function() { - if (!me.selection || !me.selection.getNative()) { - return; - } - //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. - //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 - var ieRange; - if (hackForMouseUp && me.selection.getNative().type == "None") { - ieRange = me.document.body.createTextRange(); - try { - ieRange.moveToPoint(mouseX, mouseY); - } catch (ex) { - ieRange = null; - } - } - var bakGetIERange; - if (ieRange) { - bakGetIERange = me.selection.getIERange; - me.selection.getIERange = function() { - return ieRange; - }; - } - me.selection.cache(); - if (bakGetIERange) { - me.selection.getIERange = bakGetIERange; - } - if (me.selection._cachedRange && me.selection._cachedStartElement) { - me.fireEvent("beforeselectionchange"); - // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. - me.fireEvent("selectionchange", !!evt); - me.fireEvent("afterselectionchange"); - me.selection.clear(); - } - }, delay || 50); - }, + var hackForMouseUp = false; + var mouseX, mouseY; + if (browser.ie && browser.version < 9 && evt && evt.type == "mouseup") { + var range = this.selection.getRange(); + if (!range.collapsed) { + hackForMouseUp = true; + mouseX = evt.clientX; + mouseY = evt.clientY; + } + } + clearTimeout(_selectionChangeTimer); + _selectionChangeTimer = setTimeout(function () { + if (!me.selection || !me.selection.getNative()) { + return; + } + //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. + //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 + var ieRange; + if (hackForMouseUp && me.selection.getNative().type == "None") { + ieRange = me.document.body.createTextRange(); + try { + ieRange.moveToPoint(mouseX, mouseY); + } catch (ex) { + ieRange = null; + } + } + var bakGetIERange; + if (ieRange) { + bakGetIERange = me.selection.getIERange; + me.selection.getIERange = function () { + return ieRange; + }; + } + me.selection.cache(); + if (bakGetIERange) { + me.selection.getIERange = bakGetIERange; + } + if (me.selection._cachedRange && me.selection._cachedStartElement) { + me.fireEvent("beforeselectionchange"); + // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. + me.fireEvent("selectionchange", !!evt); + me.fireEvent("afterselectionchange"); + me.selection.clear(); + } + }, delay || 50); + }, - /** + /** * 执行编辑命令 * @method _callCmdFn * @private @@ -8350,21 +8446,21 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @param { * } args 传给命令函数的参数 * @return { * } 返回命令函数运行的返回值 */ - _callCmdFn: function(fnName, args) { - var cmdName = args[0].toLowerCase(), - cmd, - cmdFn; - cmd = this.commands[cmdName] || UE.commands[cmdName]; - cmdFn = cmd && cmd[fnName]; - //没有querycommandstate或者没有command的都默认返回0 - if ((!cmd || !cmdFn) && fnName == "queryCommandState") { - return 0; - } else if (cmdFn) { - return cmdFn.apply(this, args); - } - }, + _callCmdFn: function (fnName, args) { + var cmdName = args[0].toLowerCase(), + cmd, + cmdFn; + cmd = this.commands[cmdName] || UE.commands[cmdName]; + cmdFn = cmd && cmd[fnName]; + //没有querycommandstate或者没有command的都默认返回0 + if ((!cmd || !cmdFn) && fnName == "queryCommandState") { + return 0; + } else if (cmdFn) { + return cmdFn.apply(this, args); + } + }, - /** + /** * 执行编辑命令cmdName,完成富文本编辑效果 * @method execCommand * @param { String } cmdName 需要执行的命令 @@ -8375,47 +8471,47 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.execCommand(cmdName); * ``` */ - execCommand: function(cmdName) { - cmdName = cmdName.toLowerCase(); - var me = this, - result, - cmd = me.commands[cmdName] || UE.commands[cmdName]; - if (!cmd || !cmd.execCommand) { - return null; - } - if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { - me.__hasEnterExecCommand = true; - if (me.queryCommandState.apply(me, arguments) != -1) { - me.fireEvent("saveScene"); - me.fireEvent.apply( - me, - ["beforeexeccommand", cmdName].concat(arguments) - ); - result = this._callCmdFn("execCommand", arguments); - //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 - // (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); - me.fireEvent.apply( - me, - ["afterexeccommand", cmdName].concat(arguments) - ); - me.fireEvent("saveScene"); - } - me.__hasEnterExecCommand = false; - } else { - result = this._callCmdFn("execCommand", arguments); - !me.__hasEnterExecCommand && - !cmd.ignoreContentChange && - !me._ignoreContentChange && - me.fireEvent("contentchange"); - } - !me.__hasEnterExecCommand && - !cmd.ignoreContentChange && - !me._ignoreContentChange && - me._selectionChange(); - return result; - }, + execCommand: function (cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me, arguments) != -1) { + me.fireEvent("saveScene"); + me.fireEvent.apply( + me, + ["beforeexeccommand", cmdName].concat(arguments) + ); + result = this._callCmdFn("execCommand", arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 + // (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply( + me, + ["afterexeccommand", cmdName].concat(arguments) + ); + me.fireEvent("saveScene"); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn("execCommand", arguments); + !me.__hasEnterExecCommand && + !cmd.ignoreContentChange && + !me._ignoreContentChange && + me.fireEvent("contentchange"); + } + !me.__hasEnterExecCommand && + !cmd.ignoreContentChange && + !me._ignoreContentChange && + me._selectionChange(); + return result; + }, - /** + /** * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 * @method queryCommandState * @param { String } cmdName 需要查询的命令名称 @@ -8427,11 +8523,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` * @see COMMAND.LIST */ - queryCommandState: function(cmdName) { - return this._callCmdFn("queryCommandState", arguments); - }, + queryCommandState: function (cmdName) { + return this._callCmdFn("queryCommandState", arguments); + }, - /** + /** * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 * @method queryCommandValue * @param { String } cmdName 需要查询的命令名称 @@ -8441,11 +8537,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * @grammar editor.queryCommandValue(cmdName) => {*} * @see COMMAND.LIST */ - queryCommandValue: function(cmdName) { - return this._callCmdFn("queryCommandValue", arguments); - }, + queryCommandValue: function (cmdName) { + return this._callCmdFn("queryCommandValue", arguments); + }, - /** + /** * 检查编辑区域中是否有内容 * @method hasContents * @remind 默认有文本内容,或者有以下节点都不认为是空 @@ -8457,7 +8553,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** + /** * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true * @method hasContents * @param { Array } tags 传入数组判断时用到的节点类型 @@ -8467,40 +8563,40 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.hasContents(['span']); * ``` */ - hasContents: function(tags) { - if (tags) { - for (var i = 0, ci; (ci = tags[i++]); ) { - if (this.document.getElementsByTagName(ci).length > 0) { - return true; - } - } - } - if (!domUtils.isEmptyBlock(this.body)) { - return true; - } - // 随时添加,定义的特殊标签如果存在,不能认为是空 - tags = ["div"]; - for (i = 0; (ci = tags[i++]); ) { - var nodes = domUtils.getElementsByTagName(this.document, ci); - for (var n = 0, cn; (cn = nodes[n++]); ) { - if (domUtils.isCustomeNode(cn)) { - return true; - } - } - } - // 部分如媒体标签,不能认为为空 - tags = [ "video","iframe" ] - for (i = 0; (ci = tags[i++]); ) { - var nodes = domUtils.getElementsByTagName(this.document, ci); - for (var n = 0, cn; (cn = nodes[n++]); ) { - return true; - } - } - return false; - }, + hasContents: function (tags) { + if (tags) { + for (var i = 0, ci; (ci = tags[i++]);) { + if (this.document.getElementsByTagName(ci).length > 0) { + return true; + } + } + } + if (!domUtils.isEmptyBlock(this.body)) { + return true; + } + // 随时添加,定义的特殊标签如果存在,不能认为是空 + tags = ["div"]; + for (i = 0; (ci = tags[i++]);) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; (cn = nodes[n++]);) { + if (domUtils.isCustomeNode(cn)) { + return true; + } + } + } + // 部分如媒体标签,不能认为为空 + tags = ["video", "iframe"] + for (i = 0; (ci = tags[i++]);) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; (cn = nodes[n++]);) { + return true; + } + } + return false; + }, - /** - * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + /** + * 重置编辑器,可用来做多个tab 使用同一个编辑器实例 * @method reset * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 * @example @@ -8508,11 +8604,25 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.reset() * ``` */ - reset: function() { - this.fireEvent("reset"); - }, + reset: function () { + this.clear(); + this.fireEvent("reset"); + }, - /** + /** + * 清空编辑器内容 + * @method clear + * @remind 此方法会清空编辑器内容 + * @example + * ```javascript + * editor.clear() + * ``` + */ + clear: function () { + this.setContent(""); + }, + + /** * 设置当前编辑区域可以编辑 * @method setEnabled * @example @@ -8520,40 +8630,40 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.setEnabled() * ``` */ - setEnabled: function() { - var me = this, - range; - if (me.body.contentEditable == "false") { - me.body.contentEditable = true; - range = me.selection.getRange(); - //有可能内容丢失了 - try { - range.moveToBookmark(me.lastBk); - delete me.lastBk; - } catch (e) { - range.setStartAtFirst(me.body).collapse(true); - } - range.select(true); - if (me.bkqueryCommandState) { - me.queryCommandState = me.bkqueryCommandState; - delete me.bkqueryCommandState; - } - if (me.bkqueryCommandValue) { - me.queryCommandValue = me.bkqueryCommandValue; - delete me.bkqueryCommandValue; - } - me.fireEvent("selectionchange"); - } - }, - enable: function() { - return this.setEnabled(); - }, + setEnabled: function () { + var me = this, + range; + if (me.body.contentEditable === "false") { + me.body.contentEditable = true; + range = me.selection.getRange(); + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk; + } catch (e) { + range.setStartAtFirst(me.body).collapse(true); + } + range.select(true); + if (me.bkqueryCommandState) { + me.queryCommandState = me.bkqueryCommandState; + delete me.bkqueryCommandState; + } + if (me.bkqueryCommandValue) { + me.queryCommandValue = me.bkqueryCommandValue; + delete me.bkqueryCommandValue; + } + me.fireEvent("selectionchange"); + } + }, + enable: function () { + return this.setEnabled(); + }, - /** 设置当前编辑区域不可编辑 + /** 设置当前编辑区域不可编辑 * @method setDisabled */ - /** 设置当前编辑区域不可编辑,except中的命令除外 + /** 设置当前编辑区域不可编辑,except中的命令除外 * @method setDisabled * @param { String } except 例外命令的字符串 * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 @@ -8563,7 +8673,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` */ - /** 设置当前编辑区域不可编辑,except中的命令除外 + /** 设置当前编辑区域不可编辑,except中的命令除外 * @method setDisabled * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 @@ -8572,63 +8682,63 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 * ``` */ - setDisabled: function(except) { - var me = this; - except = except ? (utils.isArray(except) ? except : [except]) : []; - if (me.body.contentEditable == "true") { - if (!me.lastBk) { - me.lastBk = me.selection.getRange().createBookmark(true); - } - me.body.contentEditable = false; - me.bkqueryCommandState = me.queryCommandState; - me.bkqueryCommandValue = me.queryCommandValue; - me.queryCommandState = function(type) { - if (utils.indexOf(except, type) != -1) { - return me.bkqueryCommandState.apply(me, arguments); - } - return -1; - }; - me.queryCommandValue = function(type) { - if (utils.indexOf(except, type) != -1) { - return me.bkqueryCommandValue.apply(me, arguments); - } - return null; - }; - me.fireEvent("selectionchange"); - } - }, - disable: function(except) { - return this.setDisabled(except); - }, + setDisabled: function (except) { + var me = this; + except = except ? (utils.isArray(except) ? except : [except]) : []; + if (me.body.contentEditable == "true") { + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.body.contentEditable = false; + me.bkqueryCommandState = me.queryCommandState; + me.bkqueryCommandValue = me.queryCommandValue; + me.queryCommandState = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandState.apply(me, arguments); + } + return -1; + }; + me.queryCommandValue = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandValue.apply(me, arguments); + } + return null; + }; + me.fireEvent("selectionchange"); + } + }, + disable: function (except) { + return this.setDisabled(except); + }, - /** + /** * 设置默认内容 * @method _setDefaultContent * @private * @param { String } cont 要存入的内容 */ - _setDefaultContent: (function() { - function clear() { - var me = this; - if (me.document.getElementById("initContent")) { - me.body.innerHTML = "

      " + (ie ? "" : "
      ") + "

      "; - me.removeListener("firstBeforeExecCommand focus", clear); - setTimeout(function() { - me.focus(); - me._selectionChange(); - }, 0); - } - } + _setDefaultContent: (function () { + function clear() { + var me = this; + if (me.document.getElementById("initContent")) { + me.body.innerHTML = "

      " + (ie ? "" : "
      ") + "

      "; + me.removeListener("firstBeforeExecCommand focus", clear); + setTimeout(function () { + me.focus(); + me._selectionChange(); + }, 0); + } + } - return function(cont) { - var me = this; - me.body.innerHTML = '

      ' + cont + "

      "; + return function (cont) { + var me = this; + me.body.innerHTML = '

      ' + cont + "

      "; - me.addListener("firstBeforeExecCommand focus", clear); - }; - })(), + me.addListener("firstBeforeExecCommand focus", clear); + }; + })(), - /** + /** * 显示编辑器 * @method setShow * @example @@ -8636,28 +8746,28 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.setShow() * ``` */ - setShow: function() { - var me = this, - range = me.selection.getRange(); - if (me.container.style.display == "none") { - //有可能内容丢失了 - try { - range.moveToBookmark(me.lastBk); - delete me.lastBk; - } catch (e) { - range.setStartAtFirst(me.body).collapse(true); - } - //ie下focus实效,所以做了个延迟 - setTimeout(function() { - range.select(true); - }, 100); - me.container.style.display = ""; - } - }, - show: function() { - return this.setShow(); - }, - /** + setShow: function () { + var me = this, + range = me.selection.getRange(); + if (me.container.style.display == "none") { + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk; + } catch (e) { + range.setStartAtFirst(me.body).collapse(true); + } + //ie下focus实效,所以做了个延迟 + setTimeout(function () { + range.select(true); + }, 100); + me.container.style.display = ""; + } + }, + show: function () { + return this.setShow(); + }, + /** * 隐藏编辑器 * @method setHide * @example @@ -8665,18 +8775,18 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.setHide() * ``` */ - setHide: function() { - var me = this; - if (!me.lastBk) { - me.lastBk = me.selection.getRange().createBookmark(true); - } - me.container.style.display = "none"; - }, - hide: function() { - return this.setHide(); - }, + setHide: function () { + var me = this; + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.container.style.display = "none"; + }, + hide: function () { + return this.setHide(); + }, - /** + /** * 根据指定的路径,获取对应的语言资源 * @method getLang * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 @@ -8686,20 +8796,20 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' * ``` */ - getLang: function(path) { - var lang = UE.I18N[this.options.lang]; - if (!lang) { - throw Error("not import language file"); - } - path = (path || "").split("."); - for (var i = 0, ci; (ci = path[i++]); ) { - lang = lang[ci]; - if (!lang) break; - } - return lang; - }, + getLang: function (path) { + var lang = UE.I18N[this.options.lang]; + if (!lang) { + throw Error("not import language file"); + } + path = (path || "").split("."); + for (var i = 0, ci; (ci = path[i++]);) { + lang = lang[ci]; + if (!lang) break; + } + return lang; + }, - /** + /** * 计算编辑器html内容字符串的长度 * @method getContentLength * @return { Number } 返回计算的长度 @@ -8709,7 +8819,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.getContentLength() //返回27 * ``` */ - /** + /** * 计算编辑器当前纯文本内容的长度 * @method getContentLength * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 @@ -8720,19 +8830,26 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.getContentLength() //返回3 * ``` */ - getContentLength: function(ingoneHtml, tagNames) { - var count = this.getContent(false, false, true).length; - if (ingoneHtml) { - tagNames = (tagNames || []).concat(["hr", "img", "iframe"]); - count = this.getContentTxt().replace(/[\t\r\n]+/g, "").length; - for (var i = 0, ci; (ci = tagNames[i++]); ) { - count += this.document.getElementsByTagName(ci).length; - } - } - return count; - }, + getContentLength: function (ingoneHtml, tagNames) { + var count = this.getContent(false, false, true).length; + if (ingoneHtml) { + tagNames = (tagNames || []).concat(["hr", "img", "iframe"]); + count = this.getContentTxt().replace(/[\t\r\n]+/g, "").length; + for (var i = 0, ci; (ci = tagNames[i++]);) { + count += this.document.getElementsByTagName(ci).length; + } + } + return count; + }, - /** + getScrollTop: function () { + return Math.max(this.document.documentElement.scrollTop, this.document.body.scrollTop); + }, + getScrollLeft: function () { + return Math.max(this.document.documentElement.scrollLeft, this.document.body.scrollLeft); + }, + + /** * 注册输入过滤规则 * @method addInputRule * @param { Function } rule 要添加的过滤规则 @@ -8745,11 +8862,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * }); * ``` */ - addInputRule: function(rule) { - this.inputRules.push(rule); - }, + addInputRule: function (rule) { + this.inputRules.push(rule); + }, - /** + /** * 执行注册的过滤规则 * @method filterInputRule * @param { UE.uNode } root 要过滤的uNode节点 @@ -8760,13 +8877,13 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` * @see UE.Editor:addInputRule */ - filterInputRule: function(root) { - for (var i = 0, ci; (ci = this.inputRules[i++]); ) { - ci.call(this, root); - } - }, + filterInputRule: function (root) { + for (var i = 0, ci; (ci = this.inputRules[i++]);) { + ci.call(this, root); + } + }, - /** + /** * 注册输出过滤规则 * @method addOutputRule * @param { Function } rule 要添加的过滤规则 @@ -8779,11 +8896,11 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * }); * ``` */ - addOutputRule: function(rule) { - this.outputRules.push(rule); - }, + addOutputRule: function (rule) { + this.outputRules.push(rule); + }, - /** + /** * 根据输出过滤规则,过滤编辑器内容 * @method filterOutputRule * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 @@ -8794,13 +8911,13 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * ``` * @see UE.Editor:addOutputRule */ - filterOutputRule: function(root) { - for (var i = 0, ci; (ci = this.outputRules[i++]); ) { - ci.call(this, root); - } - }, + filterOutputRule: function (root) { + for (var i = 0, ci; (ci = this.outputRules[i++]);) { + ci.call(this, root); + } + }, - /** + /** * 根据action名称获取请求的路径 * @method getActionUrl * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 @@ -8813,140 +8930,151 @@ var fillCharReg = new RegExp(domUtils.fillChar, "g"); * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" * ``` */ - getActionUrl: function(action) { - var actionName = this.getOpt(action) || action, - imageUrl = this.getOpt("imageUrl"), - serverUrl = this.getOpt("serverUrl"); + getActionUrl: function (action) { + var serverUrl = this.getOpt("serverUrl") + if (!action) { + return serverUrl; + } + var actionName = this.getOpt(action) || action, + imageUrl = this.getOpt("imageUrl"); - if (!serverUrl && imageUrl) { - serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); - } - - if (serverUrl) { - serverUrl = - serverUrl + - (serverUrl.indexOf("?") == -1 ? "?" : "&") + - "action=" + - (actionName || ""); - return utils.formatUrl(serverUrl); - } else { - return ""; - } - } - }; - utils.inherits(Editor, EventBase); + if (!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); + } + if (serverUrl) { + serverUrl = + serverUrl + + (serverUrl.indexOf("?") === -1 ? "?" : "&") + + "action=" + + (actionName || ""); + return utils.formatUrl(serverUrl); + } else { + return ""; + } + } + }; + utils.inherits(Editor, EventBase); })(); // core/Editor.defaultoptions.js //维护编辑器一下默认的不在插件中的配置项 -UE.Editor.defaultOptions = function(editor) { - var _url = editor.options.UEDITOR_HOME_URL; - return { - isShow: true, - initialContent: "", - initialStyle: "", - autoClearinitialContent: false, - iframeCssUrl: _url + "themes/iframe.css?20220503", - iframeCssUrlsAddition: [], - textarea: "editorValue", - focus: false, - focusInEnd: true, - autoClearEmptyNode: true, - fullscreen: false, - readonly: false, - zIndex: 999, - imagePopup: true, - enterTag: "p", - customDomain: false, - lang: "zh-cn", - langPath: _url + "lang/", - theme: "default", - themePath: _url + "themes/", - allHtmlEnabled: false, - scaleEnabled: false, - tableNativeEditInFF: false, - autoSyncData: true, - fileNameFormat: "{time}{rand:6}" - }; +UE.Editor.defaultOptions = function (editor) { + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: "", + initialStyle: "", + autoClearinitialContent: false, + iframeCssUrl: _url + "themes/iframe.css?c20ec247", + iframeCssUrlsAddition: [], + textarea: '', + focus: false, + focusInEnd: true, + autoClearEmptyNode: true, + fullscreen: false, + readonly: false, + zIndex: 999, + imagePopup: true, + enterTag: "p", + customDomain: false, + lang: "zh-cn", + langPath: _url + "lang/", + theme: "default", + themePath: _url + "themes/", + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData: true, + fileNameFormat: "{time}{rand:6}" + }; }; // core/loadconfig.js -(function() { - UE.Editor.prototype.loadServerConfig = function() { - var me = this; - setTimeout(function() { - try { - me.options.imageUrl && - me.setOpt( - "serverUrl", - me.options.imageUrl.replace( - /^(.*[\/]).+([\.].+)$/, - "$1controller$2" - ) - ); +(function () { + UE.Editor.prototype.loadServerConfig = function () { + var me = this; + setTimeout(function () { - var configUrl = me.getActionUrl("config"), - isJsonp = utils.isCrossDomainUrl(configUrl); - - /* 发出ajax请求 */ - me._serverConfigLoaded = false; - - configUrl && - UE.ajax.request(configUrl, { - method: "GET", - dataType: isJsonp ? "jsonp" : "", - onsuccess: function(r) { - try { - var config = isJsonp ? r : eval("(" + r.responseText + ")"); - utils.extend(me.options, config); - // console.log('me.options.before',me.options); - // console.log('server.config',config); - // console.log('me.options.after',me.options); - me.fireEvent("serverConfigLoaded"); - me._serverConfigLoaded = true; - } catch (e) { - showErrorMsg(me.getLang("loadconfigFormatError")); - } - }, - onerror: function() { - showErrorMsg(me.getLang("loadconfigHttpError")); + if(me.options.loadConfigFromServer===false){ + return; } - }); - } catch (e) { - showErrorMsg(me.getLang("loadconfigError")); - } - }); - function showErrorMsg(msg) { - console && console.error(msg); - //me.fireEvent('showMessage', { - // 'title': msg, - // 'type': 'error' - //}); - } - }; + try { + me.options.imageUrl && + me.setOpt( + "serverUrl", + me.options.imageUrl.replace( + /^(.*[\/]).+([\.].+)$/, + "$1controller$2" + ) + ); - UE.Editor.prototype.isServerConfigLoaded = function() { - var me = this; - return me._serverConfigLoaded || false; - }; + var configUrl = me.getActionUrl("config"), + isJsonp = utils.isCrossDomainUrl(configUrl); - UE.Editor.prototype.afterConfigReady = function(handler) { - if (!handler || !utils.isFunction(handler)) return; - var me = this; - var readyHandler = function() { - handler.apply(me, arguments); - me.removeListener("serverConfigLoaded", readyHandler); + /* 发出ajax请求 */ + me._serverConfigLoaded = false; + + configUrl && + UE.ajax.request(configUrl, { + method: "GET", + dataType: isJsonp ? "jsonp" : "", + headers: me.options.serverHeaders || {}, + onsuccess: function (r) { + try { + var config = isJsonp ? r : eval("(" + r.responseText + ")"); + config = me.options.serverResponsePrepare( config ) + // console.log('me.options.before', me.options.audioConfig); + me.options = utils.merge(me.options, config); + // console.log('server.config', config.audioConfig); + // console.log('me.options.after', me.options.audioConfig); + me.fireEvent("serverConfigLoaded"); + me._serverConfigLoaded = true; + } catch (e) { + showErrorMsg(me.getLang("loadconfigFormatError")); + } + }, + onerror: function () { + showErrorMsg(me.getLang("loadconfigHttpError")); + } + }); + + + } catch (e) { + showErrorMsg(me.getLang("loadconfigError")); + } + }); + + function showErrorMsg(msg) { + console && console.error(msg); + //me.fireEvent('showMessage', { + // 'title': msg, + // 'type': 'error' + //}); + } }; - if (me.isServerConfigLoaded()) { - handler.call(me, "serverConfigLoaded"); - } else { - me.addListener("serverConfigLoaded", readyHandler); - } - }; + UE.Editor.prototype.isServerConfigLoaded = function () { + var me = this; + return me._serverConfigLoaded || false; + }; + + UE.Editor.prototype.afterConfigReady = function (handler) { + if (!handler || !utils.isFunction(handler)) return; + var me = this; + var readyHandler = function () { + handler.apply(me, arguments); + me.removeListener("serverConfigLoaded", readyHandler); + }; + + if (me.isServerConfigLoaded()) { + handler.call(me, "serverConfigLoaded"); + } else { + me.addListener("serverConfigLoaded", readyHandler); + } + }; })(); @@ -8961,202 +9089,216 @@ UE.Editor.defaultOptions = function(editor) { * 提供对ajax请求的支持 * @module UE.ajax */ -UE.ajax = (function() { - //创建一个ajaxRequest对象 - var fnStr = "XMLHttpRequest()"; - try { - new ActiveXObject("Msxml2.XMLHTTP"); - fnStr = "ActiveXObject('Msxml2.XMLHTTP')"; - } catch (e) { +UE.ajax = (function () { + //创建一个ajaxRequest对象 + var fnStr = "XMLHttpRequest()"; try { - new ActiveXObject("Microsoft.XMLHTTP"); - fnStr = "ActiveXObject('Microsoft.XMLHTTP')"; - } catch (e) {} - } - var creatAjaxRequest = new Function("return new " + fnStr); + new ActiveXObject("Msxml2.XMLHTTP"); + fnStr = "ActiveXObject('Msxml2.XMLHTTP')"; + } catch (e) { + try { + new ActiveXObject("Microsoft.XMLHTTP"); + fnStr = "ActiveXObject('Microsoft.XMLHTTP')"; + } catch (e) { + } + } + var creatAjaxRequest = new Function("return new " + fnStr); - /** + /** * 将json参数转化成适合ajax提交的参数列表 * @param json */ - function json2str(json) { - var strArr = []; - for (var i in json) { - //忽略默认的几个参数 - if ( - i == "method" || - i == "timeout" || - i == "async" || - i == "dataType" || - i == "callback" - ) - continue; - //忽略控制 - if (json[i] == undefined || json[i] == null) continue; - //传递过来的对象和函数不在提交之列 - if ( - !( - (typeof json[i]).toLowerCase() == "function" || - (typeof json[i]).toLowerCase() == "object" - ) - ) { - strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])); - } else if (utils.isArray(json[i])) { - //支持传数组内容 - for (var j = 0; j < json[i].length; j++) { - strArr.push( - encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j]) - ); + function json2str(json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if ( + i == "method" || + i == "timeout" || + i == "async" || + i == "dataType" || + i == "callback" + ) + continue; + //忽略控制 + if (json[i] == undefined || json[i] == null) continue; + //传递过来的对象和函数不在提交之列 + if ( + !( + (typeof json[i]).toLowerCase() == "function" || + (typeof json[i]).toLowerCase() == "object" + ) + ) { + strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for (var j = 0; j < json[i].length; j++) { + strArr.push( + encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j]) + ); + } + } } - } + return strArr.join("&"); } - return strArr.join("&"); - } - function doAjax(url, ajaxOptions) { - var xhr = creatAjaxRequest(), - //是否超时 - timeIsOut = false, - //默认参数 - defaultAjaxOptions = { - method: "POST", - timeout: 5000, - async: true, - data: {}, //需要传递对象的话只能覆盖 - onsuccess: function() {}, - onerror: function() {} - }; + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method: "POST", + timeout: 5000, + async: true, + headers: {}, + data: {}, //需要传递对象的话只能覆盖 + onsuccess: function () { + }, + onerror: function () { + } + }; - if (typeof url === "object") { - ajaxOptions = url; - url = ajaxOptions.url; - } - if (!xhr || !url) return; - var ajaxOpts = ajaxOptions - ? utils.extend(defaultAjaxOptions, ajaxOptions) - : defaultAjaxOptions; + if (typeof url === "object") { + ajaxOptions = url; + url = ajaxOptions.url; + } + if (!xhr || !url) return; + var ajaxOpts = ajaxOptions + ? utils.extend(defaultAjaxOptions, ajaxOptions) + : defaultAjaxOptions; - var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" - //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 - if (!utils.isEmptyObject(ajaxOpts.data)) { - submitStr += (submitStr ? "&" : "") + json2str(ajaxOpts.data); - } - //超时检测 - var timerID = setTimeout(function() { - if (xhr.readyState != 4) { - timeIsOut = true; - xhr.abort(); - clearTimeout(timerID); - } - }, ajaxOpts.timeout); + // console.log('ajaxOpts',ajaxOpts); - var method = ajaxOpts.method.toUpperCase(); - var str = - url + - (url.indexOf("?") == -1 ? "?" : "&") + - (method == "POST" ? "" : submitStr + "&noCache=" + +new Date()); - xhr.open(method, str, ajaxOpts.async); - xhr.onreadystatechange = function() { - if (xhr.readyState == 4) { - if (!timeIsOut && xhr.status == 200) { - ajaxOpts.onsuccess(xhr); + var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(ajaxOpts.data)) { + submitStr += (submitStr ? "&" : "") + json2str(ajaxOpts.data); + } + //超时检测 + var timerID = setTimeout(function () { + if (xhr.readyState !== 4) { + timeIsOut = true; + xhr.abort(); + clearTimeout(timerID); + } + }, ajaxOpts.timeout); + + var method = ajaxOpts.method.toUpperCase(); + var str = + url + + (url.indexOf("?") === -1 ? "?" : "&") + + (method === "POST" ? "" : submitStr + "&noCache=" + +new Date()); + xhr.open(method, str, ajaxOpts.async); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (!timeIsOut && xhr.status === 200) { + ajaxOpts.onsuccess(xhr); + } else { + ajaxOpts.onerror(xhr); + } + } + }; + if (ajaxOpts.headers) { + for (var key in ajaxOpts.headers) { + xhr.setRequestHeader(key, ajaxOpts.headers[key]); + } + } + if (method === "POST") { + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + xhr.send(submitStr); } else { - ajaxOpts.onerror(xhr); + xhr.send(null); } - } - }; - if (method == "POST") { - xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - xhr.send(submitStr); - } else { - xhr.send(null); - } - } - - function doJsonp(url, opts) { - var successhandler = opts.onsuccess || function() {}, - scr = document.createElement("SCRIPT"), - options = opts || {}, - charset = options["charset"], - callbackField = options["jsonp"] || "callback", - callbackFnName, - timeOut = options["timeOut"] || 0, - timer, - reg = new RegExp("(\\?|&)" + callbackField + "=([^&]*)"), - matches; - - if (utils.isFunction(successhandler)) { - callbackFnName = - "bd__editor__" + Math.floor(Math.random() * 2147483648).toString(36); - window[callbackFnName] = getCallBack(0); - } else if (utils.isString(successhandler)) { - callbackFnName = successhandler; - } else { - if ((matches = reg.exec(url))) { - callbackFnName = matches[2]; - } } - url = url.replace(reg, "\x241" + callbackField + "=" + callbackFnName); + function doJsonp(url, opts) { + var successhandler = opts.onsuccess || function () { + }, + scr = document.createElement("SCRIPT"), + options = opts || {}, + charset = options["charset"], + callbackField = options["jsonp"] || "callback", + callbackFnName, + timeOut = options["timeOut"] || 0, + timer, + reg = new RegExp("(\\?|&)" + callbackField + "=([^&]*)"), + matches; - if (url.search(reg) < 0) { - url += - (url.indexOf("?") < 0 ? "?" : "&") + - callbackField + - "=" + - callbackFnName; - } - - var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" - //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 - if (!utils.isEmptyObject(opts.data)) { - queryStr += (queryStr ? "&" : "") + json2str(opts.data); - } - if (queryStr) { - url = url.replace(/\?/, "?" + queryStr + "&"); - } - - scr.onerror = getCallBack(1); - if (timeOut) { - timer = setTimeout(getCallBack(1), timeOut); - } - createScriptTag(scr, url, charset); - - function createScriptTag(scr, url, charset) { - scr.setAttribute("type", "text/javascript"); - scr.setAttribute("defer", "defer"); - charset && scr.setAttribute("charset", charset); - scr.setAttribute("src", url); - document.getElementsByTagName("head")[0].appendChild(scr); - } - - function getCallBack(onTimeOut) { - return function() { - try { - if (onTimeOut) { - options.onerror && options.onerror(); - } else { - try { - clearTimeout(timer); - successhandler.apply(window, arguments); - } catch (e) {} - } - } catch (exception) { - options.onerror && options.onerror.call(window, exception); - } finally { - options.oncomplete && options.oncomplete.apply(window, arguments); - scr.parentNode && scr.parentNode.removeChild(scr); - window[callbackFnName] = null; - try { - delete window[callbackFnName]; - } catch (e) {} + if (utils.isFunction(successhandler)) { + callbackFnName = + "bd__editor__" + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackFnName] = getCallBack(0); + } else if (utils.isString(successhandler)) { + callbackFnName = successhandler; + } else { + if ((matches = reg.exec(url))) { + callbackFnName = matches[2]; + } } - }; - } - } - return { - /** + url = url.replace(reg, "\x241" + callbackField + "=" + callbackFnName); + + if (url.search(reg) < 0) { + url += + (url.indexOf("?") < 0 ? "?" : "&") + + callbackField + + "=" + + callbackFnName; + } + + var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(opts.data)) { + queryStr += (queryStr ? "&" : "") + json2str(opts.data); + } + if (queryStr) { + url = url.replace(/\?/, "?" + queryStr + "&"); + } + + scr.onerror = getCallBack(1); + if (timeOut) { + timer = setTimeout(getCallBack(1), timeOut); + } + createScriptTag(scr, url, charset); + + function createScriptTag(scr, url, charset) { + scr.setAttribute("type", "text/javascript"); + scr.setAttribute("defer", "defer"); + charset && scr.setAttribute("charset", charset); + scr.setAttribute("src", url); + document.getElementsByTagName("head")[0].appendChild(scr); + } + + function getCallBack(onTimeOut) { + return function () { + try { + if (onTimeOut) { + options.onerror && options.onerror(); + } else { + try { + clearTimeout(timer); + successhandler.apply(window, arguments); + } catch (e) { + } + } + } catch (exception) { + options.onerror && options.onerror.call(window, exception); + } finally { + options.oncomplete && options.oncomplete.apply(window, arguments); + scr.parentNode && scr.parentNode.removeChild(scr); + window[callbackFnName] = null; + try { + delete window[callbackFnName]; + } catch (e) { + } + } + }; + } + } + + return { + /** * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 * @method request @@ -9195,7 +9337,7 @@ UE.ajax = (function() { * ``` */ - /** + /** * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 * @method request @@ -9213,21 +9355,3279 @@ UE.ajax = (function() { * } ); * ``` */ - request: function(url, opts) { - if (opts && opts.dataType == "jsonp") { - doJsonp(url, opts); - } else { - doAjax(url, opts); - } - }, - getJSONP: function(url, data, fn) { - var opts = { - data: data, - oncomplete: fn - }; - doJsonp(url, opts); + request: function (url, opts) { + if (opts && opts.dataType === "jsonp") { + doJsonp(url, opts); + } else { + doAjax(url, opts); + } + }, + getJSONP: function (url, data, fn) { + var opts = { + data: data, + oncomplete: fn + }; + doJsonp(url, opts); + } + }; +})(); + + +// core/api.js +UE.api = (function () { + // axios import + var axios = null; + !function (e, t) { + axios = t() + }(this, (function () { + "use strict"; + + function e(t) { + 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 + }, e(t) + } + + function t(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + } + + function n(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + + function r(e, t, r) { + return t && n(e.prototype, t), r && n(e, r), Object.defineProperty(e, "prototype", {writable: !1}), e + } + + function o(e, t) { + return function (e) { + if (Array.isArray(e)) return e + }(e) || function (e, t) { + var n = null == e ? null : "undefined" != typeof Symbol && e[Symbol.iterator] || e["@@iterator"]; + if (null == n) return; + var r, o, i = [], a = !0, s = !1; + try { + for (n = n.call(e); !(a = (r = n.next()).done) && (i.push(r.value), !t || i.length !== t); a = !0) ; + } catch (e) { + s = !0, o = e + } finally { + try { + a || null == n.return || n.return() + } finally { + if (s) throw o + } + } + return i + }(e, t) || function (e, t) { + if (!e) return; + if ("string" == typeof e) return i(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + "Object" === n && e.constructor && (n = e.constructor.name); + if ("Map" === n || "Set" === n) return Array.from(e); + if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return i(e, t) + }(e, t) || function () { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") + }() + } + + function i(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r + } + + function a(e, t) { + return function () { + return e.apply(t, arguments) + } + } + + var s, u = Object.prototype.toString, c = Object.getPrototypeOf, f = (s = Object.create(null), function (e) { + var t = u.call(e); + return s[t] || (s[t] = t.slice(8, -1).toLowerCase()) + }), l = function (e) { + return e = e.toLowerCase(), function (t) { + return f(t) === e + } + }, d = function (t) { + return function (n) { + return e(n) === t + } + }, p = Array.isArray, h = d("undefined"); + var m = l("ArrayBuffer"); + var y = d("string"), v = d("function"), b = d("number"), g = function (t) { + return null !== t && "object" === e(t) + }, w = function (e) { + if ("object" !== f(e)) return !1; + var t = c(e); + return !(null !== t && t !== Object.prototype && null !== Object.getPrototypeOf(t) || Symbol.toStringTag in e || Symbol.iterator in e) + }, E = l("Date"), O = l("File"), S = l("Blob"), R = l("FileList"), A = l("URLSearchParams"); + + function T(t, n) { + var r, o, i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, a = i.allOwnKeys, + s = void 0 !== a && a; + if (null != t) if ("object" !== e(t) && (t = [t]), p(t)) for (r = 0, o = t.length; r < o; r++) n.call(null, t[r], r, t); else { + var u, c = s ? Object.getOwnPropertyNames(t) : Object.keys(t), f = c.length; + for (r = 0; r < f; r++) u = c[r], n.call(null, t[u], u, t) + } + } + + function j(e, t) { + t = t.toLowerCase(); + for (var n, r = Object.keys(e), o = r.length; o-- > 0;) if (t === (n = r[o]).toLowerCase()) return n; + return null + } + + var N = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : global, + C = function (e) { + return !h(e) && e !== N + }; + var x, P = (x = "undefined" != typeof Uint8Array && c(Uint8Array), function (e) { + return x && e instanceof x + }), k = l("HTMLFormElement"), U = function (e) { + var t = Object.prototype.hasOwnProperty; + return function (e, n) { + return t.call(e, n) + } + }(), _ = l("RegExp"), F = function (e, t) { + var n = Object.getOwnPropertyDescriptors(e), r = {}; + T(n, (function (n, o) { + !1 !== t(n, o, e) && (r[o] = n) + })), Object.defineProperties(e, r) + }, B = "abcdefghijklmnopqrstuvwxyz", L = "0123456789", + D = {DIGIT: L, ALPHA: B, ALPHA_DIGIT: B + B.toUpperCase() + L}; + var I = l("AsyncFunction"), q = { + isArray: p, + isArrayBuffer: m, + isBuffer: function (e) { + return null !== e && !h(e) && null !== e.constructor && !h(e.constructor) && v(e.constructor.isBuffer) && e.constructor.isBuffer(e) + }, + isFormData: function (e) { + var t; + return e && ("function" == typeof FormData && e instanceof FormData || v(e.append) && ("formdata" === (t = f(e)) || "object" === t && v(e.toString) && "[object FormData]" === e.toString())) + }, + isArrayBufferView: function (e) { + return "undefined" != typeof ArrayBuffer && ArrayBuffer.isView ? ArrayBuffer.isView(e) : e && e.buffer && m(e.buffer) + }, + isString: y, + isNumber: b, + isBoolean: function (e) { + return !0 === e || !1 === e + }, + isObject: g, + isPlainObject: w, + isUndefined: h, + isDate: E, + isFile: O, + isBlob: S, + isRegExp: _, + isFunction: v, + isStream: function (e) { + return g(e) && v(e.pipe) + }, + isURLSearchParams: A, + isTypedArray: P, + isFileList: R, + forEach: T, + merge: function e() { + for (var t = C(this) && this || {}, n = t.caseless, r = {}, o = function (t, o) { + var i = n && j(r, o) || o; + w(r[i]) && w(t) ? r[i] = e(r[i], t) : w(t) ? r[i] = e({}, t) : p(t) ? r[i] = t.slice() : r[i] = t + }, i = 0, a = arguments.length; i < a; i++) arguments[i] && T(arguments[i], o); + return r + }, + extend: function (e, t, n) { + var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, o = r.allOwnKeys; + return T(t, (function (t, r) { + n && v(t) ? e[r] = a(t, n) : e[r] = t + }), {allOwnKeys: o}), e + }, + trim: function (e) { + return e.trim ? e.trim() : e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") + }, + stripBOM: function (e) { + return 65279 === e.charCodeAt(0) && (e = e.slice(1)), e + }, + inherits: function (e, t, n, r) { + e.prototype = Object.create(t.prototype, r), e.prototype.constructor = e, Object.defineProperty(e, "super", {value: t.prototype}), n && Object.assign(e.prototype, n) + }, + toFlatObject: function (e, t, n, r) { + var o, i, a, s = {}; + if (t = t || {}, null == e) return t; + do { + for (i = (o = Object.getOwnPropertyNames(e)).length; i-- > 0;) a = o[i], r && !r(a, e, t) || s[a] || (t[a] = e[a], s[a] = !0); + e = !1 !== n && c(e) + } while (e && (!n || n(e, t)) && e !== Object.prototype); + return t + }, + kindOf: f, + kindOfTest: l, + endsWith: function (e, t, n) { + e = String(e), (void 0 === n || n > e.length) && (n = e.length), n -= t.length; + var r = e.indexOf(t, n); + return -1 !== r && r === n + }, + toArray: function (e) { + if (!e) return null; + if (p(e)) return e; + var t = e.length; + if (!b(t)) return null; + for (var n = new Array(t); t-- > 0;) n[t] = e[t]; + return n + }, + forEachEntry: function (e, t) { + for (var n, r = (e && e[Symbol.iterator]).call(e); (n = r.next()) && !n.done;) { + var o = n.value; + t.call(e, o[0], o[1]) + } + }, + matchAll: function (e, t) { + for (var n, r = []; null !== (n = e.exec(t));) r.push(n); + return r + }, + isHTMLForm: k, + hasOwnProperty: U, + hasOwnProp: U, + reduceDescriptors: F, + freezeMethods: function (e) { + F(e, (function (t, n) { + if (v(e) && -1 !== ["arguments", "caller", "callee"].indexOf(n)) return !1; + var r = e[n]; + v(r) && (t.enumerable = !1, "writable" in t ? t.writable = !1 : t.set || (t.set = function () { + throw Error("Can not rewrite read-only method '" + n + "'") + })) + })) + }, + toObjectSet: function (e, t) { + var n = {}, r = function (e) { + e.forEach((function (e) { + n[e] = !0 + })) + }; + return p(e) ? r(e) : r(String(e).split(t)), n + }, + toCamelCase: function (e) { + return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, (function (e, t, n) { + return t.toUpperCase() + n + })) + }, + noop: function () { + }, + toFiniteNumber: function (e, t) { + return e = +e, Number.isFinite(e) ? e : t + }, + findKey: j, + global: N, + isContextDefined: C, + ALPHABET: D, + generateString: function () { + for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 16, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : D.ALPHA_DIGIT, n = "", r = t.length; e--;) n += t[Math.random() * r | 0]; + return n + }, + isSpecCompliantForm: function (e) { + return !!(e && v(e.append) && "FormData" === e[Symbol.toStringTag] && e[Symbol.iterator]) + }, + toJSONObject: function (e) { + var t = new Array(10); + return function e(n, r) { + if (g(n)) { + if (t.indexOf(n) >= 0) return; + if (!("toJSON" in n)) { + t[r] = n; + var o = p(n) ? [] : {}; + return T(n, (function (t, n) { + var i = e(t, r + 1); + !h(i) && (o[n] = i) + })), t[r] = void 0, o + } + } + return n + }(e, 0) + }, + isAsyncFn: I, + isThenable: function (e) { + return e && (g(e) || v(e)) && v(e.then) && v(e.catch) + } + }; + + function M(e, t, n, r, o) { + Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = (new Error).stack, this.message = e, this.name = "AxiosError", t && (this.code = t), n && (this.config = n), r && (this.request = r), o && (this.response = o) + } + + q.inherits(M, Error, { + toJSON: function () { + return { + message: this.message, + name: this.name, + description: this.description, + number: this.number, + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + config: q.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + } + } + }); + var z = M.prototype, H = {}; + ["ERR_BAD_OPTION_VALUE", "ERR_BAD_OPTION", "ECONNABORTED", "ETIMEDOUT", "ERR_NETWORK", "ERR_FR_TOO_MANY_REDIRECTS", "ERR_DEPRECATED", "ERR_BAD_RESPONSE", "ERR_BAD_REQUEST", "ERR_CANCELED", "ERR_NOT_SUPPORT", "ERR_INVALID_URL"].forEach((function (e) { + H[e] = {value: e} + })), Object.defineProperties(M, H), Object.defineProperty(z, "isAxiosError", {value: !0}), M.from = function (e, t, n, r, o, i) { + var a = Object.create(z); + return q.toFlatObject(e, a, (function (e) { + return e !== Error.prototype + }), (function (e) { + return "isAxiosError" !== e + })), M.call(a, e.message, t, n, r, o), a.cause = e, a.name = e.name, i && Object.assign(a, i), a + }; + + function J(e) { + return q.isPlainObject(e) || q.isArray(e) + } + + function W(e) { + return q.endsWith(e, "[]") ? e.slice(0, -2) : e + } + + function K(e, t, n) { + return e ? e.concat(t).map((function (e, t) { + return e = W(e), !n && t ? "[" + e + "]" : e + })).join(n ? "." : "") : t + } + + var V = q.toFlatObject(q, {}, null, (function (e) { + return /^is[A-Z]/.test(e) + })); + + function G(t, n, r) { + if (!q.isObject(t)) throw new TypeError("target must be an object"); + n = n || new FormData; + var o = (r = q.toFlatObject(r, {metaTokens: !0, dots: !1, indexes: !1}, !1, (function (e, t) { + return !q.isUndefined(t[e]) + }))).metaTokens, i = r.visitor || f, a = r.dots, s = r.indexes, + u = (r.Blob || "undefined" != typeof Blob && Blob) && q.isSpecCompliantForm(n); + if (!q.isFunction(i)) throw new TypeError("visitor must be a function"); + + function c(e) { + if (null === e) return ""; + if (q.isDate(e)) return e.toISOString(); + if (!u && q.isBlob(e)) throw new M("Blob is not supported. Use a Buffer instead."); + return q.isArrayBuffer(e) || q.isTypedArray(e) ? u && "function" == typeof Blob ? new Blob([e]) : Buffer.from(e) : e + } + + function f(t, r, i) { + var u = t; + if (t && !i && "object" === e(t)) if (q.endsWith(r, "{}")) r = o ? r : r.slice(0, -2), t = JSON.stringify(t); else if (q.isArray(t) && function (e) { + return q.isArray(e) && !e.some(J) + }(t) || (q.isFileList(t) || q.endsWith(r, "[]")) && (u = q.toArray(t))) return r = W(r), u.forEach((function (e, t) { + !q.isUndefined(e) && null !== e && n.append(!0 === s ? K([r], t, a) : null === s ? r : r + "[]", c(e)) + })), !1; + return !!J(t) || (n.append(K(i, r, a), c(t)), !1) + } + + var l = [], d = Object.assign(V, {defaultVisitor: f, convertValue: c, isVisitable: J}); + if (!q.isObject(t)) throw new TypeError("data must be an object"); + return function e(t, r) { + if (!q.isUndefined(t)) { + if (-1 !== l.indexOf(t)) throw Error("Circular reference detected in " + r.join(".")); + l.push(t), q.forEach(t, (function (t, o) { + !0 === (!(q.isUndefined(t) || null === t) && i.call(n, t, q.isString(o) ? o.trim() : o, r, d)) && e(t, r ? r.concat(o) : [o]) + })), l.pop() + } + }(t), n + } + + function $(e) { + var t = {"!": "%21", "'": "%27", "(": "%28", ")": "%29", "~": "%7E", "%20": "+", "%00": "\0"}; + return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g, (function (e) { + return t[e] + })) + } + + function X(e, t) { + this._pairs = [], e && G(e, this, t) + } + + var Q = X.prototype; + + function Z(e) { + return encodeURIComponent(e).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]") + } + + function Y(e, t, n) { + if (!t) return e; + var r, o = n && n.encode || Z, i = n && n.serialize; + if (r = i ? i(t, n) : q.isURLSearchParams(t) ? t.toString() : new X(t, n).toString(o)) { + var a = e.indexOf("#"); + -1 !== a && (e = e.slice(0, a)), e += (-1 === e.indexOf("?") ? "?" : "&") + r + } + return e + } + + Q.append = function (e, t) { + this._pairs.push([e, t]) + }, Q.toString = function (e) { + var t = e ? function (t) { + return e.call(this, t, $) + } : $; + return this._pairs.map((function (e) { + return t(e[0]) + "=" + t(e[1]) + }), "").join("&") + }; + var ee, te = function () { + function e() { + t(this, e), this.handlers = [] + } + + return r(e, [{ + key: "use", value: function (e, t, n) { + return this.handlers.push({ + fulfilled: e, + rejected: t, + synchronous: !!n && n.synchronous, + runWhen: n ? n.runWhen : null + }), this.handlers.length - 1 + } + }, { + key: "eject", value: function (e) { + this.handlers[e] && (this.handlers[e] = null) + } + }, { + key: "clear", value: function () { + this.handlers && (this.handlers = []) + } + }, { + key: "forEach", value: function (e) { + q.forEach(this.handlers, (function (t) { + null !== t && e(t) + })) + } + }]), e + }(), ne = {silentJSONParsing: !0, forcedJSONParsing: !0, clarifyTimeoutError: !1}, re = { + isBrowser: !0, + classes: { + URLSearchParams: "undefined" != typeof URLSearchParams ? URLSearchParams : X, + FormData: "undefined" != typeof FormData ? FormData : null, + Blob: "undefined" != typeof Blob ? Blob : null + }, + isStandardBrowserEnv: ("undefined" == typeof navigator || "ReactNative" !== (ee = navigator.product) && "NativeScript" !== ee && "NS" !== ee) && "undefined" != typeof window && "undefined" != typeof document, + isStandardBrowserWebWorkerEnv: "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope && "function" == typeof self.importScripts, + protocols: ["http", "https", "file", "blob", "url", "data"] + }; + + function oe(e) { + function t(e, n, r, o) { + var i = e[o++], a = Number.isFinite(+i), s = o >= e.length; + return i = !i && q.isArray(r) ? r.length : i, s ? (q.hasOwnProp(r, i) ? r[i] = [r[i], n] : r[i] = n, !a) : (r[i] && q.isObject(r[i]) || (r[i] = []), t(e, n, r[i], o) && q.isArray(r[i]) && (r[i] = function (e) { + var t, n, r = {}, o = Object.keys(e), i = o.length; + for (t = 0; t < i; t++) r[n = o[t]] = e[n]; + return r + }(r[i])), !a) + } + + if (q.isFormData(e) && q.isFunction(e.entries)) { + var n = {}; + return q.forEachEntry(e, (function (e, r) { + t(function (e) { + return q.matchAll(/\w+|\[(\w*)]/g, e).map((function (e) { + return "[]" === e[0] ? "" : e[1] || e[0] + })) + }(e), r, n, 0) + })), n + } + return null + } + + var ie = {"Content-Type": void 0}; + var ae = { + transitional: ne, + adapter: ["xhr", "http"], + transformRequest: [function (e, t) { + var n, r = t.getContentType() || "", o = r.indexOf("application/json") > -1, i = q.isObject(e); + if (i && q.isHTMLForm(e) && (e = new FormData(e)), q.isFormData(e)) return o && o ? JSON.stringify(oe(e)) : e; + if (q.isArrayBuffer(e) || q.isBuffer(e) || q.isStream(e) || q.isFile(e) || q.isBlob(e)) return e; + if (q.isArrayBufferView(e)) return e.buffer; + if (q.isURLSearchParams(e)) return t.setContentType("application/x-www-form-urlencoded;charset=utf-8", !1), e.toString(); + if (i) { + if (r.indexOf("application/x-www-form-urlencoded") > -1) return function (e, t) { + return G(e, new re.classes.URLSearchParams, Object.assign({ + visitor: function (e, t, n, r) { + return re.isNode && q.isBuffer(e) ? (this.append(t, e.toString("base64")), !1) : r.defaultVisitor.apply(this, arguments) + } + }, t)) + }(e, this.formSerializer).toString(); + if ((n = q.isFileList(e)) || r.indexOf("multipart/form-data") > -1) { + var a = this.env && this.env.FormData; + return G(n ? {"files[]": e} : e, a && new a, this.formSerializer) + } + } + return i || o ? (t.setContentType("application/json", !1), function (e, t, n) { + if (q.isString(e)) try { + return (t || JSON.parse)(e), q.trim(e) + } catch (e) { + if ("SyntaxError" !== e.name) throw e + } + return (n || JSON.stringify)(e) + }(e)) : e + }], + transformResponse: [function (e) { + var t = this.transitional || ae.transitional, n = t && t.forcedJSONParsing, + r = "json" === this.responseType; + if (e && q.isString(e) && (n && !this.responseType || r)) { + var o = !(t && t.silentJSONParsing) && r; + try { + return JSON.parse(e) + } catch (e) { + if (o) { + if ("SyntaxError" === e.name) throw M.from(e, M.ERR_BAD_RESPONSE, this, null, this.response); + throw e + } + } + } + return e + }], + timeout: 0, + xsrfCookieName: "XSRF-TOKEN", + xsrfHeaderName: "X-XSRF-TOKEN", + maxContentLength: -1, + maxBodyLength: -1, + env: {FormData: re.classes.FormData, Blob: re.classes.Blob}, + validateStatus: function (e) { + return e >= 200 && e < 300 + }, + headers: {common: {Accept: "application/json, text/plain, */*"}} + }; + q.forEach(["delete", "get", "head"], (function (e) { + ae.headers[e] = {} + })), q.forEach(["post", "put", "patch"], (function (e) { + ae.headers[e] = q.merge(ie) + })); + var se = ae, + ue = q.toObjectSet(["age", "authorization", "content-length", "content-type", "etag", "expires", "from", "host", "if-modified-since", "if-unmodified-since", "last-modified", "location", "max-forwards", "proxy-authorization", "referer", "retry-after", "user-agent"]), + ce = Symbol("internals"); + + function fe(e) { + return e && String(e).trim().toLowerCase() + } + + function le(e) { + return !1 === e || null == e ? e : q.isArray(e) ? e.map(le) : String(e) + } + + function de(e, t, n, r, o) { + return q.isFunction(r) ? r.call(this, t, n) : (o && (t = n), q.isString(t) ? q.isString(r) ? -1 !== t.indexOf(r) : q.isRegExp(r) ? r.test(t) : void 0 : void 0) + } + + var pe = function (e, n) { + function i(e) { + t(this, i), e && this.set(e) + } + + return r(i, [{ + key: "set", value: function (e, t, n) { + var r = this; + + function o(e, t, n) { + var o = fe(t); + if (!o) throw new Error("header name must be a non-empty string"); + var i = q.findKey(r, o); + (!i || void 0 === r[i] || !0 === n || void 0 === n && !1 !== r[i]) && (r[i || t] = le(e)) + } + + var i, a, s, u, c, f = function (e, t) { + return q.forEach(e, (function (e, n) { + return o(e, n, t) + })) + }; + return q.isPlainObject(e) || e instanceof this.constructor ? f(e, t) : q.isString(e) && (e = e.trim()) && !/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()) ? f((c = {}, (i = e) && i.split("\n").forEach((function (e) { + u = e.indexOf(":"), a = e.substring(0, u).trim().toLowerCase(), s = e.substring(u + 1).trim(), !a || c[a] && ue[a] || ("set-cookie" === a ? c[a] ? c[a].push(s) : c[a] = [s] : c[a] = c[a] ? c[a] + ", " + s : s) + })), c), t) : null != e && o(t, e, n), this + } + }, { + key: "get", value: function (e, t) { + if (e = fe(e)) { + var n = q.findKey(this, e); + if (n) { + var r = this[n]; + if (!t) return r; + if (!0 === t) return function (e) { + for (var t, n = Object.create(null), r = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; t = r.exec(e);) n[t[1]] = t[2]; + return n + }(r); + if (q.isFunction(t)) return t.call(this, r, n); + if (q.isRegExp(t)) return t.exec(r); + throw new TypeError("parser must be boolean|regexp|function") + } + } + } + }, { + key: "has", value: function (e, t) { + if (e = fe(e)) { + var n = q.findKey(this, e); + return !(!n || void 0 === this[n] || t && !de(0, this[n], n, t)) + } + return !1 + } + }, { + key: "delete", value: function (e, t) { + var n = this, r = !1; + + function o(e) { + if (e = fe(e)) { + var o = q.findKey(n, e); + !o || t && !de(0, n[o], o, t) || (delete n[o], r = !0) + } + } + + return q.isArray(e) ? e.forEach(o) : o(e), r + } + }, { + key: "clear", value: function (e) { + for (var t = Object.keys(this), n = t.length, r = !1; n--;) { + var o = t[n]; + e && !de(0, this[o], o, e, !0) || (delete this[o], r = !0) + } + return r + } + }, { + key: "normalize", value: function (e) { + var t = this, n = {}; + return q.forEach(this, (function (r, o) { + var i = q.findKey(n, o); + if (i) return t[i] = le(r), void delete t[o]; + var a = e ? function (e) { + return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (function (e, t, n) { + return t.toUpperCase() + n + })) + }(o) : String(o).trim(); + a !== o && delete t[o], t[a] = le(r), n[a] = !0 + })), this + } + }, { + key: "concat", value: function () { + for (var e, t = arguments.length, n = new Array(t), r = 0; r < t; r++) n[r] = arguments[r]; + return (e = this.constructor).concat.apply(e, [this].concat(n)) + } + }, { + key: "toJSON", value: function (e) { + var t = Object.create(null); + return q.forEach(this, (function (n, r) { + null != n && !1 !== n && (t[r] = e && q.isArray(n) ? n.join(", ") : n) + })), t + } + }, { + key: Symbol.iterator, value: function () { + return Object.entries(this.toJSON())[Symbol.iterator]() + } + }, { + key: "toString", value: function () { + return Object.entries(this.toJSON()).map((function (e) { + var t = o(e, 2); + return t[0] + ": " + t[1] + })).join("\n") + } + }, { + key: Symbol.toStringTag, get: function () { + return "AxiosHeaders" + } + }], [{ + key: "from", value: function (e) { + return e instanceof this ? e : new this(e) + } + }, { + key: "concat", value: function (e) { + for (var t = new this(e), n = arguments.length, r = new Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++) r[o - 1] = arguments[o]; + return r.forEach((function (e) { + return t.set(e) + })), t + } + }, { + key: "accessor", value: function (e) { + var t = (this[ce] = this[ce] = {accessors: {}}).accessors, n = this.prototype; + + function r(e) { + var r = fe(e); + t[r] || (!function (e, t) { + var n = q.toCamelCase(" " + t); + ["get", "set", "has"].forEach((function (r) { + Object.defineProperty(e, r + n, { + value: function (e, n, o) { + return this[r].call(this, t, e, n, o) + }, configurable: !0 + }) + })) + }(n, e), t[r] = !0) + } + + return q.isArray(e) ? e.forEach(r) : r(e), this + } + }]), i + }(); + pe.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]), q.freezeMethods(pe.prototype), q.freezeMethods(pe); + var he = pe; + + function me(e, t) { + var n = this || se, r = t || n, o = he.from(r.headers), i = r.data; + return q.forEach(e, (function (e) { + i = e.call(n, i, o.normalize(), t ? t.status : void 0) + })), o.normalize(), i + } + + function ye(e) { + return !(!e || !e.__CANCEL__) + } + + function ve(e, t, n) { + M.call(this, null == e ? "canceled" : e, M.ERR_CANCELED, t, n), this.name = "CanceledError" + } + + q.inherits(ve, M, {__CANCEL__: !0}); + var be = re.isStandardBrowserEnv ? { + write: function (e, t, n, r, o, i) { + var a = []; + a.push(e + "=" + encodeURIComponent(t)), q.isNumber(n) && a.push("expires=" + new Date(n).toGMTString()), q.isString(r) && a.push("path=" + r), q.isString(o) && a.push("domain=" + o), !0 === i && a.push("secure"), document.cookie = a.join("; ") + }, read: function (e) { + var t = document.cookie.match(new RegExp("(^|;\\s*)(" + e + ")=([^;]*)")); + return t ? decodeURIComponent(t[3]) : null + }, remove: function (e) { + this.write(e, "", Date.now() - 864e5) + } + } : { + write: function () { + }, read: function () { + return null + }, remove: function () { + } + }; + + function ge(e, t) { + return e && !/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t) ? function (e, t) { + return t ? e.replace(/\/+$/, "") + "/" + t.replace(/^\/+/, "") : e + }(e, t) : t + } + + var we = re.isStandardBrowserEnv ? function () { + var e, t = /(msie|trident)/i.test(navigator.userAgent), n = document.createElement("a"); + + function r(e) { + var r = e; + return t && (n.setAttribute("href", r), r = n.href), n.setAttribute("href", r), { + href: n.href, + protocol: n.protocol ? n.protocol.replace(/:$/, "") : "", + host: n.host, + search: n.search ? n.search.replace(/^\?/, "") : "", + hash: n.hash ? n.hash.replace(/^#/, "") : "", + hostname: n.hostname, + port: n.port, + pathname: "/" === n.pathname.charAt(0) ? n.pathname : "/" + n.pathname + } + } + + return e = r(window.location.href), function (t) { + var n = q.isString(t) ? r(t) : t; + return n.protocol === e.protocol && n.host === e.host + } + }() : function () { + return !0 + }; + + function Ee(e, t) { + var n = 0, r = function (e, t) { + e = e || 10; + var n, r = new Array(e), o = new Array(e), i = 0, a = 0; + return t = void 0 !== t ? t : 1e3, function (s) { + var u = Date.now(), c = o[a]; + n || (n = u), r[i] = s, o[i] = u; + for (var f = a, l = 0; f !== i;) l += r[f++], f %= e; + if ((i = (i + 1) % e) === a && (a = (a + 1) % e), !(u - n < t)) { + var d = c && u - c; + return d ? Math.round(1e3 * l / d) : void 0 + } + } + }(50, 250); + return function (o) { + var i = o.loaded, a = o.lengthComputable ? o.total : void 0, s = i - n, u = r(s); + n = i; + var c = { + loaded: i, + total: a, + progress: a ? i / a : void 0, + bytes: s, + rate: u || void 0, + estimated: u && a && i <= a ? (a - i) / u : void 0, + event: o + }; + c[t ? "download" : "upload"] = !0, e(c) + } + } + + var Oe = { + http: null, xhr: "undefined" != typeof XMLHttpRequest && function (e) { + return new Promise((function (t, n) { + var r, o = e.data, i = he.from(e.headers).normalize(), a = e.responseType; + + function s() { + e.cancelToken && e.cancelToken.unsubscribe(r), e.signal && e.signal.removeEventListener("abort", r) + } + + q.isFormData(o) && (re.isStandardBrowserEnv || re.isStandardBrowserWebWorkerEnv ? i.setContentType(!1) : i.setContentType("multipart/form-data;", !1)); + var u = new XMLHttpRequest; + if (e.auth) { + var c = e.auth.username || "", + f = e.auth.password ? unescape(encodeURIComponent(e.auth.password)) : ""; + i.set("Authorization", "Basic " + btoa(c + ":" + f)) + } + var l = ge(e.baseURL, e.url); + + function d() { + if (u) { + var r = he.from("getAllResponseHeaders" in u && u.getAllResponseHeaders()); + !function (e, t, n) { + var r = n.config.validateStatus; + n.status && r && !r(n.status) ? t(new M("Request failed with status code " + n.status, [M.ERR_BAD_REQUEST, M.ERR_BAD_RESPONSE][Math.floor(n.status / 100) - 4], n.config, n.request, n)) : e(n) + }((function (e) { + t(e), s() + }), (function (e) { + n(e), s() + }), { + data: a && "text" !== a && "json" !== a ? u.response : u.responseText, + status: u.status, + statusText: u.statusText, + headers: r, + config: e, + request: u + }), u = null + } + } + + if (u.open(e.method.toUpperCase(), Y(l, e.params, e.paramsSerializer), !0), u.timeout = e.timeout, "onloadend" in u ? u.onloadend = d : u.onreadystatechange = function () { + u && 4 === u.readyState && (0 !== u.status || u.responseURL && 0 === u.responseURL.indexOf("file:")) && setTimeout(d) + }, u.onabort = function () { + u && (n(new M("Request aborted", M.ECONNABORTED, e, u)), u = null) + }, u.onerror = function () { + n(new M("Network Error", M.ERR_NETWORK, e, u)), u = null + }, u.ontimeout = function () { + var t = e.timeout ? "timeout of " + e.timeout + "ms exceeded" : "timeout exceeded", + r = e.transitional || ne; + e.timeoutErrorMessage && (t = e.timeoutErrorMessage), n(new M(t, r.clarifyTimeoutError ? M.ETIMEDOUT : M.ECONNABORTED, e, u)), u = null + }, re.isStandardBrowserEnv) { + var p = (e.withCredentials || we(l)) && e.xsrfCookieName && be.read(e.xsrfCookieName); + p && i.set(e.xsrfHeaderName, p) + } + void 0 === o && i.setContentType(null), "setRequestHeader" in u && q.forEach(i.toJSON(), (function (e, t) { + u.setRequestHeader(t, e) + })), q.isUndefined(e.withCredentials) || (u.withCredentials = !!e.withCredentials), a && "json" !== a && (u.responseType = e.responseType), "function" == typeof e.onDownloadProgress && u.addEventListener("progress", Ee(e.onDownloadProgress, !0)), "function" == typeof e.onUploadProgress && u.upload && u.upload.addEventListener("progress", Ee(e.onUploadProgress)), (e.cancelToken || e.signal) && (r = function (t) { + u && (n(!t || t.type ? new ve(null, e, u) : t), u.abort(), u = null) + }, e.cancelToken && e.cancelToken.subscribe(r), e.signal && (e.signal.aborted ? r() : e.signal.addEventListener("abort", r))); + var h, m = (h = /^([-+\w]{1,25})(:?\/\/|:)/.exec(l)) && h[1] || ""; + m && -1 === re.protocols.indexOf(m) ? n(new M("Unsupported protocol " + m + ":", M.ERR_BAD_REQUEST, e)) : u.send(o || null) + })) + } + }; + q.forEach(Oe, (function (e, t) { + if (e) { + try { + Object.defineProperty(e, "name", {value: t}) + } catch (e) { + } + Object.defineProperty(e, "adapterName", {value: t}) + } + })); + var Se = function (e) { + for (var t, n, r = (e = q.isArray(e) ? e : [e]).length, o = 0; o < r && (t = e[o], !(n = q.isString(t) ? Oe[t.toLowerCase()] : t)); o++) ; + if (!n) { + if (!1 === n) throw new M("Adapter ".concat(t, " is not supported by the environment"), "ERR_NOT_SUPPORT"); + throw new Error(q.hasOwnProp(Oe, t) ? "Adapter '".concat(t, "' is not available in the build") : "Unknown adapter '".concat(t, "'")) + } + if (!q.isFunction(n)) throw new TypeError("adapter is not a function"); + return n + }; + + function Re(e) { + if (e.cancelToken && e.cancelToken.throwIfRequested(), e.signal && e.signal.aborted) throw new ve(null, e) + } + + function Ae(e) { + return Re(e), e.headers = he.from(e.headers), e.data = me.call(e, e.transformRequest), -1 !== ["post", "put", "patch"].indexOf(e.method) && e.headers.setContentType("application/x-www-form-urlencoded", !1), Se(e.adapter || se.adapter)(e).then((function (t) { + return Re(e), t.data = me.call(e, e.transformResponse, t), t.headers = he.from(t.headers), t + }), (function (t) { + return ye(t) || (Re(e), t && t.response && (t.response.data = me.call(e, e.transformResponse, t.response), t.response.headers = he.from(t.response.headers))), Promise.reject(t) + })) + } + + var Te = function (e) { + return e instanceof he ? e.toJSON() : e + }; + + function je(e, t) { + t = t || {}; + var n = {}; + + function r(e, t, n) { + return q.isPlainObject(e) && q.isPlainObject(t) ? q.merge.call({caseless: n}, e, t) : q.isPlainObject(t) ? q.merge({}, t) : q.isArray(t) ? t.slice() : t + } + + function o(e, t, n) { + return q.isUndefined(t) ? q.isUndefined(e) ? void 0 : r(void 0, e, n) : r(e, t, n) + } + + function i(e, t) { + if (!q.isUndefined(t)) return r(void 0, t) + } + + function a(e, t) { + return q.isUndefined(t) ? q.isUndefined(e) ? void 0 : r(void 0, e) : r(void 0, t) + } + + function s(n, o, i) { + return i in t ? r(n, o) : i in e ? r(void 0, n) : void 0 + } + + var u = { + url: i, + method: i, + data: i, + baseURL: a, + transformRequest: a, + transformResponse: a, + paramsSerializer: a, + timeout: a, + timeoutMessage: a, + withCredentials: a, + adapter: a, + responseType: a, + xsrfCookieName: a, + xsrfHeaderName: a, + onUploadProgress: a, + onDownloadProgress: a, + decompress: a, + maxContentLength: a, + maxBodyLength: a, + beforeRedirect: a, + transport: a, + httpAgent: a, + httpsAgent: a, + cancelToken: a, + socketPath: a, + responseEncoding: a, + validateStatus: s, + headers: function (e, t) { + return o(Te(e), Te(t), !0) + } + }; + return q.forEach(Object.keys(Object.assign({}, e, t)), (function (r) { + var i = u[r] || o, a = i(e[r], t[r], r); + q.isUndefined(a) && i !== s || (n[r] = a) + })), n + } + + var Ne = "1.4.0", Ce = {}; + ["object", "boolean", "number", "function", "string", "symbol"].forEach((function (t, n) { + Ce[t] = function (r) { + return e(r) === t || "a" + (n < 1 ? "n " : " ") + t + } + })); + var xe = {}; + Ce.transitional = function (e, t, n) { + function r(e, t) { + return "[Axios v1.4.0] Transitional option '" + e + "'" + t + (n ? ". " + n : "") + } + + return function (n, o, i) { + if (!1 === e) throw new M(r(o, " has been removed" + (t ? " in " + t : "")), M.ERR_DEPRECATED); + return t && !xe[o] && (xe[o] = !0, console.warn(r(o, " has been deprecated since v" + t + " and will be removed in the near future"))), !e || e(n, o, i) + } + }; + var Pe = { + assertOptions: function (t, n, r) { + if ("object" !== e(t)) throw new M("options must be an object", M.ERR_BAD_OPTION_VALUE); + for (var o = Object.keys(t), i = o.length; i-- > 0;) { + var a = o[i], s = n[a]; + if (s) { + var u = t[a], c = void 0 === u || s(u, a, t); + if (!0 !== c) throw new M("option " + a + " must be " + c, M.ERR_BAD_OPTION_VALUE) + } else if (!0 !== r) throw new M("Unknown option " + a, M.ERR_BAD_OPTION) + } + }, validators: Ce + }, ke = Pe.validators, Ue = function () { + function e(n) { + t(this, e), this.defaults = n, this.interceptors = {request: new te, response: new te} + } + + return r(e, [{ + key: "request", value: function (e, t) { + "string" == typeof e ? (t = t || {}).url = e : t = e || {}; + var n, r = t = je(this.defaults, t), o = r.transitional, i = r.paramsSerializer, a = r.headers; + void 0 !== o && Pe.assertOptions(o, { + silentJSONParsing: ke.transitional(ke.boolean), + forcedJSONParsing: ke.transitional(ke.boolean), + clarifyTimeoutError: ke.transitional(ke.boolean) + }, !1), null != i && (q.isFunction(i) ? t.paramsSerializer = {serialize: i} : Pe.assertOptions(i, { + encode: ke.function, + serialize: ke.function + }, !0)), t.method = (t.method || this.defaults.method || "get").toLowerCase(), (n = a && q.merge(a.common, a[t.method])) && q.forEach(["delete", "get", "head", "post", "put", "patch", "common"], (function (e) { + delete a[e] + })), t.headers = he.concat(n, a); + var s = [], u = !0; + this.interceptors.request.forEach((function (e) { + "function" == typeof e.runWhen && !1 === e.runWhen(t) || (u = u && e.synchronous, s.unshift(e.fulfilled, e.rejected)) + })); + var c, f = []; + this.interceptors.response.forEach((function (e) { + f.push(e.fulfilled, e.rejected) + })); + var l, d = 0; + if (!u) { + var p = [Ae.bind(this), void 0]; + for (p.unshift.apply(p, s), p.push.apply(p, f), l = p.length, c = Promise.resolve(t); d < l;) c = c.then(p[d++], p[d++]); + return c + } + l = s.length; + var h = t; + for (d = 0; d < l;) { + var m = s[d++], y = s[d++]; + try { + h = m(h) + } catch (e) { + y.call(this, e); + break + } + } + try { + c = Ae.call(this, h) + } catch (e) { + return Promise.reject(e) + } + for (d = 0, l = f.length; d < l;) c = c.then(f[d++], f[d++]); + return c + } + }, { + key: "getUri", value: function (e) { + return Y(ge((e = je(this.defaults, e)).baseURL, e.url), e.params, e.paramsSerializer) + } + }]), e + }(); + q.forEach(["delete", "get", "head", "options"], (function (e) { + Ue.prototype[e] = function (t, n) { + return this.request(je(n || {}, {method: e, url: t, data: (n || {}).data})) + } + })), q.forEach(["post", "put", "patch"], (function (e) { + function t(t) { + return function (n, r, o) { + return this.request(je(o || {}, { + method: e, + headers: t ? {"Content-Type": "multipart/form-data"} : {}, + url: n, + data: r + })) + } + } + + Ue.prototype[e] = t(), Ue.prototype[e + "Form"] = t(!0) + })); + var _e = Ue, Fe = function () { + function e(n) { + if (t(this, e), "function" != typeof n) throw new TypeError("executor must be a function."); + var r; + this.promise = new Promise((function (e) { + r = e + })); + var o = this; + this.promise.then((function (e) { + if (o._listeners) { + for (var t = o._listeners.length; t-- > 0;) o._listeners[t](e); + o._listeners = null + } + })), this.promise.then = function (e) { + var t, n = new Promise((function (e) { + o.subscribe(e), t = e + })).then(e); + return n.cancel = function () { + o.unsubscribe(t) + }, n + }, n((function (e, t, n) { + o.reason || (o.reason = new ve(e, t, n), r(o.reason)) + })) + } + + return r(e, [{ + key: "throwIfRequested", value: function () { + if (this.reason) throw this.reason + } + }, { + key: "subscribe", value: function (e) { + this.reason ? e(this.reason) : this._listeners ? this._listeners.push(e) : this._listeners = [e] + } + }, { + key: "unsubscribe", value: function (e) { + if (this._listeners) { + var t = this._listeners.indexOf(e); + -1 !== t && this._listeners.splice(t, 1) + } + } + }], [{ + key: "source", value: function () { + var t; + return { + token: new e((function (e) { + t = e + })), cancel: t + } + } + }]), e + }(); + var Be = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511 + }; + Object.entries(Be).forEach((function (e) { + var t = o(e, 2), n = t[0], r = t[1]; + Be[r] = n + })); + var Le = Be; + var De = function e(t) { + var n = new _e(t), r = a(_e.prototype.request, n); + return q.extend(r, _e.prototype, n, {allOwnKeys: !0}), q.extend(r, n, null, {allOwnKeys: !0}), r.create = function (n) { + return e(je(t, n)) + }, r + }(se); + return De.Axios = _e, De.CanceledError = ve, De.CancelToken = Fe, De.isCancel = ye, De.VERSION = Ne, De.toFormData = G, De.AxiosError = M, De.Cancel = De.CanceledError, De.all = function (e) { + return Promise.all(e) + }, De.spread = function (e) { + return function (t) { + return e.apply(null, t) + } + }, De.isAxiosError = function (e) { + return q.isObject(e) && !0 === e.isAxiosError + }, De.mergeConfig = je, De.AxiosHeaders = he, De.formToJSON = function (e) { + return oe(q.isHTMLForm(e) ? new FormData(e) : e) + }, De.HttpStatusCode = Le, De.default = De, De + })); + return { + requestAction: function (me, action, config) { + // config.url = me.getOpt('serverUrl'); + config.url = me.getActionUrl(); + config.method = 'post'; + config.params = config.params || {}; + config.params = Object.assign(config.params, me.getOpt('serverparam')); + config.params.action = action; + return this.request(me, config); + }, + request: function (me, config) { + config.headers = config.headers || {}; + var customHeaders = me.getOpt('serverHeaders'); + if (customHeaders) { + for (var key in customHeaders) { + config.headers[key] = customHeaders[key]; + } + } + return axios(config); + } + } +})(); + + +// core/image.js +UE.image = (function () { + // import browser-image-compression + // https://www.npmjs.com/package/browser-image-compression + var imageCompression = null; + !function (e, t) { + imageCompression = t(); + }(this, (function () { + "use strict"; + + function _mergeNamespaces(e, t) { + return t.forEach((function (t) { + t && "string" != typeof t && !Array.isArray(t) && Object.keys(t).forEach((function (r) { + if ("default" !== r && !(r in e)) { + var i = Object.getOwnPropertyDescriptor(t, r); + Object.defineProperty(e, r, i.get ? i : { + enumerable: !0, get: function () { + return t[r] + } + }) + } + })) + })), Object.freeze(e) + } + + function copyExifWithoutOrientation(e, t) { + return new Promise((function (r, i) { + let o; + return getApp1Segment(e).then((function (e) { + try { + return o = e, r(new Blob([t.slice(0, 2), o, t.slice(2)], {type: "image/jpeg"})) + } catch (e) { + return i(e) + } + }), i) + })) + } + + const getApp1Segment = e => new Promise(((t, r) => { + const i = new FileReader; + i.addEventListener("load", (({target: {result: e}}) => { + const i = new DataView(e); + let o = 0; + if (65496 !== i.getUint16(o)) return r("not a valid JPEG"); + for (o += 2; ;) { + const a = i.getUint16(o); + if (65498 === a) break; + const s = i.getUint16(o + 2); + if (65505 === a && 1165519206 === i.getUint32(o + 4)) { + const a = o + 10; + let f; + switch (i.getUint16(a)) { + case 18761: + f = !0; + break; + case 19789: + f = !1; + break; + default: + return r("TIFF header contains invalid endian") + } + if (42 !== i.getUint16(a + 2, f)) return r("TIFF header contains invalid version"); + const l = i.getUint32(a + 4, f), c = a + l + 2 + 12 * i.getUint16(a + l, f); + for (let e = a + l + 2; e < c; e += 12) { + if (274 == i.getUint16(e, f)) { + if (3 !== i.getUint16(e + 2, f)) return r("Orientation data type is invalid"); + if (1 !== i.getUint32(e + 4, f)) return r("Orientation data count is invalid"); + i.setUint16(e + 8, 1, f); + break + } + } + return t(e.slice(o, o + 2 + s)) + } + o += 2 + s + } + return t(new Blob) + })), i.readAsArrayBuffer(e) + })); + var e = {}; + !function (e) { + var t, r, UZIP = {}; + e.exports = UZIP, UZIP.parse = function (e, t) { + for (var r = UZIP.bin.readUshort, i = UZIP.bin.readUint, o = 0, a = {}, s = new Uint8Array(e), f = s.length - 4; 101010256 != i(s, f);) f--; + o = f; + o += 4; + var l = r(s, o += 4); + r(s, o += 2); + var c = i(s, o += 2), u = i(s, o += 4); + o += 4, o = u; + for (var h = 0; h < l; h++) { + i(s, o), o += 4, o += 4, o += 4, i(s, o += 4); + c = i(s, o += 4); + var d = i(s, o += 4), A = r(s, o += 4), g = r(s, o + 2), p = r(s, o + 4); + o += 6; + var m = i(s, o += 8); + o += 4, o += A + g + p, UZIP._readLocal(s, m, a, c, d, t) + } + return a + }, UZIP._readLocal = function (e, t, r, i, o, a) { + var s = UZIP.bin.readUshort, f = UZIP.bin.readUint; + f(e, t), s(e, t += 4), s(e, t += 2); + var l = s(e, t += 2); + f(e, t += 2), f(e, t += 4), t += 4; + var c = s(e, t += 8), u = s(e, t += 2); + t += 2; + var h = UZIP.bin.readUTF8(e, t, c); + if (t += c, t += u, a) r[h] = {size: o, csize: i}; else { + var d = new Uint8Array(e.buffer, t); + if (0 == l) r[h] = new Uint8Array(d.buffer.slice(t, t + i)); else { + if (8 != l) throw"unknown compression method: " + l; + var A = new Uint8Array(o); + UZIP.inflateRaw(d, A), r[h] = A + } + } + }, UZIP.inflateRaw = function (e, t) { + return UZIP.F.inflate(e, t) + }, UZIP.inflate = function (e, t) { + return e[0], e[1], UZIP.inflateRaw(new Uint8Array(e.buffer, e.byteOffset + 2, e.length - 6), t) + }, UZIP.deflate = function (e, t) { + null == t && (t = {level: 6}); + var r = 0, i = new Uint8Array(50 + Math.floor(1.1 * e.length)); + i[r] = 120, i[r + 1] = 156, r += 2, r = UZIP.F.deflateRaw(e, i, r, t.level); + var o = UZIP.adler(e, 0, e.length); + return i[r + 0] = o >>> 24 & 255, i[r + 1] = o >>> 16 & 255, i[r + 2] = o >>> 8 & 255, i[r + 3] = o >>> 0 & 255, new Uint8Array(i.buffer, 0, r + 4) + }, UZIP.deflateRaw = function (e, t) { + null == t && (t = {level: 6}); + var r = new Uint8Array(50 + Math.floor(1.1 * e.length)), i = UZIP.F.deflateRaw(e, r, i, t.level); + return new Uint8Array(r.buffer, 0, i) + }, UZIP.encode = function (e, t) { + null == t && (t = !1); + var r = 0, i = UZIP.bin.writeUint, o = UZIP.bin.writeUshort, a = {}; + for (var s in e) { + var f = !UZIP._noNeed(s) && !t, l = e[s], c = UZIP.crc.crc(l, 0, l.length); + a[s] = {cpr: f, usize: l.length, crc: c, file: f ? UZIP.deflateRaw(l) : l} + } + for (var s in a) r += a[s].file.length + 30 + 46 + 2 * UZIP.bin.sizeUTF8(s); + r += 22; + var u = new Uint8Array(r), h = 0, d = []; + for (var s in a) { + var A = a[s]; + d.push(h), h = UZIP._writeHeader(u, h, s, A, 0) + } + var g = 0, p = h; + for (var s in a) { + A = a[s]; + d.push(h), h = UZIP._writeHeader(u, h, s, A, 1, d[g++]) + } + var m = h - p; + return i(u, h, 101010256), h += 4, o(u, h += 4, g), o(u, h += 2, g), i(u, h += 2, m), i(u, h += 4, p), h += 4, h += 2, u.buffer + }, UZIP._noNeed = function (e) { + var t = e.split(".").pop().toLowerCase(); + return -1 != "png,jpg,jpeg,zip".indexOf(t) + }, UZIP._writeHeader = function (e, t, r, i, o, a) { + var s = UZIP.bin.writeUint, f = UZIP.bin.writeUshort, l = i.file; + return s(e, t, 0 == o ? 67324752 : 33639248), t += 4, 1 == o && (t += 2), f(e, t, 20), f(e, t += 2, 0), f(e, t += 2, i.cpr ? 8 : 0), s(e, t += 2, 0), s(e, t += 4, i.crc), s(e, t += 4, l.length), s(e, t += 4, i.usize), f(e, t += 4, UZIP.bin.sizeUTF8(r)), f(e, t += 2, 0), t += 2, 1 == o && (t += 2, t += 2, s(e, t += 6, a), t += 4), t += UZIP.bin.writeUTF8(e, t, r), 0 == o && (e.set(l, t), t += l.length), t + }, UZIP.crc = { + table: function () { + for (var e = new Uint32Array(256), t = 0; t < 256; t++) { + for (var r = t, i = 0; i < 8; i++) 1 & r ? r = 3988292384 ^ r >>> 1 : r >>>= 1; + e[t] = r + } + return e + }(), update: function (e, t, r, i) { + for (var o = 0; o < i; o++) e = UZIP.crc.table[255 & (e ^ t[r + o])] ^ e >>> 8; + return e + }, crc: function (e, t, r) { + return 4294967295 ^ UZIP.crc.update(4294967295, e, t, r) + } + }, UZIP.adler = function (e, t, r) { + for (var i = 1, o = 0, a = t, s = t + r; a < s;) { + for (var f = Math.min(a + 5552, s); a < f;) o += i += e[a++]; + i %= 65521, o %= 65521 + } + return o << 16 | i + }, UZIP.bin = { + readUshort: function (e, t) { + return e[t] | e[t + 1] << 8 + }, writeUshort: function (e, t, r) { + e[t] = 255 & r, e[t + 1] = r >> 8 & 255 + }, readUint: function (e, t) { + return 16777216 * e[t + 3] + (e[t + 2] << 16 | e[t + 1] << 8 | e[t]) + }, writeUint: function (e, t, r) { + e[t] = 255 & r, e[t + 1] = r >> 8 & 255, e[t + 2] = r >> 16 & 255, e[t + 3] = r >> 24 & 255 + }, readASCII: function (e, t, r) { + for (var i = "", o = 0; o < r; o++) i += String.fromCharCode(e[t + o]); + return i + }, writeASCII: function (e, t, r) { + for (var i = 0; i < r.length; i++) e[t + i] = r.charCodeAt(i) + }, pad: function (e) { + return e.length < 2 ? "0" + e : e + }, readUTF8: function (e, t, r) { + for (var i, o = "", a = 0; a < r; a++) o += "%" + UZIP.bin.pad(e[t + a].toString(16)); + try { + i = decodeURIComponent(o) + } catch (i) { + return UZIP.bin.readASCII(e, t, r) + } + return i + }, writeUTF8: function (e, t, r) { + for (var i = r.length, o = 0, a = 0; a < i; a++) { + var s = r.charCodeAt(a); + if (0 == (4294967168 & s)) e[t + o] = s, o++; else if (0 == (4294965248 & s)) e[t + o] = 192 | s >> 6, e[t + o + 1] = 128 | s >> 0 & 63, o += 2; else if (0 == (4294901760 & s)) e[t + o] = 224 | s >> 12, e[t + o + 1] = 128 | s >> 6 & 63, e[t + o + 2] = 128 | s >> 0 & 63, o += 3; else { + if (0 != (4292870144 & s)) throw"e"; + e[t + o] = 240 | s >> 18, e[t + o + 1] = 128 | s >> 12 & 63, e[t + o + 2] = 128 | s >> 6 & 63, e[t + o + 3] = 128 | s >> 0 & 63, o += 4 + } + } + return o + }, sizeUTF8: function (e) { + for (var t = e.length, r = 0, i = 0; i < t; i++) { + var o = e.charCodeAt(i); + if (0 == (4294967168 & o)) r++; else if (0 == (4294965248 & o)) r += 2; else if (0 == (4294901760 & o)) r += 3; else { + if (0 != (4292870144 & o)) throw"e"; + r += 4 + } + } + return r + } + }, UZIP.F = {}, UZIP.F.deflateRaw = function (e, t, r, i) { + var o = [[0, 0, 0, 0, 0], [4, 4, 8, 4, 0], [4, 5, 16, 8, 0], [4, 6, 16, 16, 0], [4, 10, 16, 32, 0], [8, 16, 32, 32, 0], [8, 16, 128, 128, 0], [8, 32, 128, 256, 0], [32, 128, 258, 1024, 1], [32, 258, 258, 4096, 1]][i], + a = UZIP.F.U, s = UZIP.F._goodIndex; + UZIP.F._hash; + var f = UZIP.F._putsE, l = 0, c = r << 3, u = 0, h = e.length; + if (0 == i) { + for (; l < h;) { + f(t, c, l + (_ = Math.min(65535, h - l)) == h ? 1 : 0), c = UZIP.F._copyExact(e, l, _, t, c + 8), l += _ + } + return c >>> 3 + } + var d = a.lits, A = a.strt, g = a.prev, p = 0, m = 0, w = 0, v = 0, b = 0, y = 0; + for (h > 2 && (A[y = UZIP.F._hash(e, 0)] = 0), l = 0; l < h; l++) { + if (b = y, l + 1 < h - 2) { + y = UZIP.F._hash(e, l + 1); + var E = l + 1 & 32767; + g[E] = A[y], A[y] = E + } + if (u <= l) { + (p > 14e3 || m > 26697) && h - l > 100 && (u < l && (d[p] = l - u, p += 2, u = l), c = UZIP.F._writeBlock(l == h - 1 || u == h ? 1 : 0, d, p, v, e, w, l - w, t, c), p = m = v = 0, w = l); + var F = 0; + l < h - 2 && (F = UZIP.F._bestMatch(e, l, g, b, Math.min(o[2], h - l), o[3])); + var _ = F >>> 16, B = 65535 & F; + if (0 != F) { + B = 65535 & F; + var U = s(_ = F >>> 16, a.of0); + a.lhst[257 + U]++; + var C = s(B, a.df0); + a.dhst[C]++, v += a.exb[U] + a.dxb[C], d[p] = _ << 23 | l - u, d[p + 1] = B << 16 | U << 8 | C, p += 2, u = l + _ + } else a.lhst[e[l]]++; + m++ + } + } + for (w == l && 0 != e.length || (u < l && (d[p] = l - u, p += 2, u = l), c = UZIP.F._writeBlock(1, d, p, v, e, w, l - w, t, c), p = 0, m = 0, p = m = v = 0, w = l); 0 != (7 & c);) c++; + return c >>> 3 + }, UZIP.F._bestMatch = function (e, t, r, i, o, a) { + var s = 32767 & t, f = r[s], l = s - f + 32768 & 32767; + if (f == s || i != UZIP.F._hash(e, t - l)) return 0; + for (var c = 0, u = 0, h = Math.min(32767, t); l <= h && 0 != --a && f != s;) { + if (0 == c || e[t + c] == e[t + c - l]) { + var d = UZIP.F._howLong(e, t, l); + if (d > c) { + if (u = l, (c = d) >= o) break; + l + 2 < d && (d = l + 2); + for (var A = 0, g = 0; g < d - 2; g++) { + var p = t - l + g + 32768 & 32767, m = p - r[p] + 32768 & 32767; + m > A && (A = m, f = p) + } + } + } + l += (s = f) - (f = r[s]) + 32768 & 32767 + } + return c << 16 | u + }, UZIP.F._howLong = function (e, t, r) { + if (e[t] != e[t - r] || e[t + 1] != e[t + 1 - r] || e[t + 2] != e[t + 2 - r]) return 0; + var i = t, o = Math.min(e.length, t + 258); + for (t += 3; t < o && e[t] == e[t - r];) t++; + return t - i + }, UZIP.F._hash = function (e, t) { + return (e[t] << 8 | e[t + 1]) + (e[t + 2] << 4) & 65535 + }, UZIP.saved = 0, UZIP.F._writeBlock = function (e, t, r, i, o, a, s, f, l) { + var c, u, h, d, A, g, p, m, w, v = UZIP.F.U, b = UZIP.F._putsF, y = UZIP.F._putsE; + v.lhst[256]++, u = (c = UZIP.F.getTrees())[0], h = c[1], d = c[2], A = c[3], g = c[4], p = c[5], m = c[6], w = c[7]; + var E = 32 + (0 == (l + 3 & 7) ? 0 : 8 - (l + 3 & 7)) + (s << 3), + F = i + UZIP.F.contSize(v.fltree, v.lhst) + UZIP.F.contSize(v.fdtree, v.dhst), + _ = i + UZIP.F.contSize(v.ltree, v.lhst) + UZIP.F.contSize(v.dtree, v.dhst); + _ += 14 + 3 * p + UZIP.F.contSize(v.itree, v.ihst) + (2 * v.ihst[16] + 3 * v.ihst[17] + 7 * v.ihst[18]); + for (var B = 0; B < 286; B++) v.lhst[B] = 0; + for (B = 0; B < 30; B++) v.dhst[B] = 0; + for (B = 0; B < 19; B++) v.ihst[B] = 0; + var U = E < F && E < _ ? 0 : F < _ ? 1 : 2; + if (b(f, l, e), b(f, l + 1, U), l += 3, 0 == U) { + for (; 0 != (7 & l);) l++; + l = UZIP.F._copyExact(o, a, s, f, l) + } else { + var C, I; + if (1 == U && (C = v.fltree, I = v.fdtree), 2 == U) { + UZIP.F.makeCodes(v.ltree, u), UZIP.F.revCodes(v.ltree, u), UZIP.F.makeCodes(v.dtree, h), UZIP.F.revCodes(v.dtree, h), UZIP.F.makeCodes(v.itree, d), UZIP.F.revCodes(v.itree, d), C = v.ltree, I = v.dtree, y(f, l, A - 257), y(f, l += 5, g - 1), y(f, l += 5, p - 4), l += 4; + for (var Q = 0; Q < p; Q++) y(f, l + 3 * Q, v.itree[1 + (v.ordr[Q] << 1)]); + l += 3 * p, l = UZIP.F._codeTiny(m, v.itree, f, l), l = UZIP.F._codeTiny(w, v.itree, f, l) + } + for (var M = a, x = 0; x < r; x += 2) { + for (var T = t[x], S = T >>> 23, R = M + (8388607 & T); M < R;) l = UZIP.F._writeLit(o[M++], C, f, l); + if (0 != S) { + var O = t[x + 1], P = O >> 16, H = O >> 8 & 255, L = 255 & O; + y(f, l = UZIP.F._writeLit(257 + H, C, f, l), S - v.of0[H]), l += v.exb[H], b(f, l = UZIP.F._writeLit(L, I, f, l), P - v.df0[L]), l += v.dxb[L], M += S + } + } + l = UZIP.F._writeLit(256, C, f, l) + } + return l + }, UZIP.F._copyExact = function (e, t, r, i, o) { + var a = o >>> 3; + return i[a] = r, i[a + 1] = r >>> 8, i[a + 2] = 255 - i[a], i[a + 3] = 255 - i[a + 1], a += 4, i.set(new Uint8Array(e.buffer, t, r), a), o + (r + 4 << 3) + }, UZIP.F.getTrees = function () { + for (var e = UZIP.F.U, t = UZIP.F._hufTree(e.lhst, e.ltree, 15), r = UZIP.F._hufTree(e.dhst, e.dtree, 15), i = [], o = UZIP.F._lenCodes(e.ltree, i), a = [], s = UZIP.F._lenCodes(e.dtree, a), f = 0; f < i.length; f += 2) e.ihst[i[f]]++; + for (f = 0; f < a.length; f += 2) e.ihst[a[f]]++; + for (var l = UZIP.F._hufTree(e.ihst, e.itree, 7), c = 19; c > 4 && 0 == e.itree[1 + (e.ordr[c - 1] << 1)];) c--; + return [t, r, l, o, s, c, i, a] + }, UZIP.F.getSecond = function (e) { + for (var t = [], r = 0; r < e.length; r += 2) t.push(e[r + 1]); + return t + }, UZIP.F.nonZero = function (e) { + for (var t = "", r = 0; r < e.length; r += 2) 0 != e[r + 1] && (t += (r >> 1) + ","); + return t + }, UZIP.F.contSize = function (e, t) { + for (var r = 0, i = 0; i < t.length; i++) r += t[i] * e[1 + (i << 1)]; + return r + }, UZIP.F._codeTiny = function (e, t, r, i) { + for (var o = 0; o < e.length; o += 2) { + var a = e[o], s = e[o + 1]; + i = UZIP.F._writeLit(a, t, r, i); + var f = 16 == a ? 2 : 17 == a ? 3 : 7; + a > 15 && (UZIP.F._putsE(r, i, s, f), i += f) + } + return i + }, UZIP.F._lenCodes = function (e, t) { + for (var r = e.length; 2 != r && 0 == e[r - 1];) r -= 2; + for (var i = 0; i < r; i += 2) { + var o = e[i + 1], a = i + 3 < r ? e[i + 3] : -1, s = i + 5 < r ? e[i + 5] : -1, + f = 0 == i ? -1 : e[i - 1]; + if (0 == o && a == o && s == o) { + for (var l = i + 5; l + 2 < r && e[l + 2] == o;) l += 2; + (c = Math.min(l + 1 - i >>> 1, 138)) < 11 ? t.push(17, c - 3) : t.push(18, c - 11), i += 2 * c - 2 + } else if (o == f && a == o && s == o) { + for (l = i + 5; l + 2 < r && e[l + 2] == o;) l += 2; + var c = Math.min(l + 1 - i >>> 1, 6); + t.push(16, c - 3), i += 2 * c - 2 + } else t.push(o, 0) + } + return r >>> 1 + }, UZIP.F._hufTree = function (e, t, r) { + var i = [], o = e.length, a = t.length, s = 0; + for (s = 0; s < a; s += 2) t[s] = 0, t[s + 1] = 0; + for (s = 0; s < o; s++) 0 != e[s] && i.push({lit: s, f: e[s]}); + var f = i.length, l = i.slice(0); + if (0 == f) return 0; + if (1 == f) { + var c = i[0].lit; + l = 0 == c ? 1 : 0; + return t[1 + (c << 1)] = 1, t[1 + (l << 1)] = 1, 1 + } + i.sort((function (e, t) { + return e.f - t.f + })); + var u = i[0], h = i[1], d = 0, A = 1, g = 2; + for (i[0] = { + lit: -1, + f: u.f + h.f, + l: u, + r: h, + d: 0 + }; A != f - 1;) u = d != A && (g == f || i[d].f < i[g].f) ? i[d++] : i[g++], h = d != A && (g == f || i[d].f < i[g].f) ? i[d++] : i[g++], i[A++] = { + lit: -1, + f: u.f + h.f, + l: u, + r: h + }; + var p = UZIP.F.setDepth(i[A - 1], 0); + for (p > r && (UZIP.F.restrictDepth(l, r, p), p = r), s = 0; s < f; s++) t[1 + (l[s].lit << 1)] = l[s].d; + return p + }, UZIP.F.setDepth = function (e, t) { + return -1 != e.lit ? (e.d = t, t) : Math.max(UZIP.F.setDepth(e.l, t + 1), UZIP.F.setDepth(e.r, t + 1)) + }, UZIP.F.restrictDepth = function (e, t, r) { + var i = 0, o = 1 << r - t, a = 0; + for (e.sort((function (e, t) { + return t.d == e.d ? e.f - t.f : t.d - e.d + })), i = 0; i < e.length && e[i].d > t; i++) { + var s = e[i].d; + e[i].d = t, a += o - (1 << r - s) + } + for (a >>>= r - t; a > 0;) { + (s = e[i].d) < t ? (e[i].d++, a -= 1 << t - s - 1) : i++ + } + for (; i >= 0; i--) e[i].d == t && a < 0 && (e[i].d--, a++); + 0 != a && console.log("debt left") + }, UZIP.F._goodIndex = function (e, t) { + var r = 0; + return t[16 | r] <= e && (r |= 16), t[8 | r] <= e && (r |= 8), t[4 | r] <= e && (r |= 4), t[2 | r] <= e && (r |= 2), t[1 | r] <= e && (r |= 1), r + }, UZIP.F._writeLit = function (e, t, r, i) { + return UZIP.F._putsF(r, i, t[e << 1]), i + t[1 + (e << 1)] + }, UZIP.F.inflate = function (e, t) { + var r = Uint8Array; + if (3 == e[0] && 0 == e[1]) return t || new r(0); + var i = UZIP.F, o = i._bitsF, a = i._bitsE, s = i._decodeTiny, f = i.makeCodes, l = i.codes2map, + c = i._get17, u = i.U, h = null == t; + h && (t = new r(e.length >>> 2 << 3)); + for (var d, A, g = 0, p = 0, m = 0, w = 0, v = 0, b = 0, y = 0, E = 0, F = 0; 0 == g;) if (g = o(e, F, 1), p = o(e, F + 1, 2), F += 3, 0 != p) { + if (h && (t = UZIP.F._check(t, E + (1 << 17))), 1 == p && (d = u.flmap, A = u.fdmap, b = 511, y = 31), 2 == p) { + m = a(e, F, 5) + 257, w = a(e, F + 5, 5) + 1, v = a(e, F + 10, 4) + 4, F += 14; + for (var _ = 0; _ < 38; _ += 2) u.itree[_] = 0, u.itree[_ + 1] = 0; + var B = 1; + for (_ = 0; _ < v; _++) { + var U = a(e, F + 3 * _, 3); + u.itree[1 + (u.ordr[_] << 1)] = U, U > B && (B = U) + } + F += 3 * v, f(u.itree, B), l(u.itree, B, u.imap), d = u.lmap, A = u.dmap, F = s(u.imap, (1 << B) - 1, m + w, e, F, u.ttree); + var C = i._copyOut(u.ttree, 0, m, u.ltree); + b = (1 << C) - 1; + var I = i._copyOut(u.ttree, m, w, u.dtree); + y = (1 << I) - 1, f(u.ltree, C), l(u.ltree, C, d), f(u.dtree, I), l(u.dtree, I, A) + } + for (; ;) { + var Q = d[c(e, F) & b]; + F += 15 & Q; + var M = Q >>> 4; + if (M >>> 8 == 0) t[E++] = M; else { + if (256 == M) break; + var x = E + M - 254; + if (M > 264) { + var T = u.ldef[M - 257]; + x = E + (T >>> 3) + a(e, F, 7 & T), F += 7 & T + } + var S = A[c(e, F) & y]; + F += 15 & S; + var R = S >>> 4, O = u.ddef[R], P = (O >>> 4) + o(e, F, 15 & O); + for (F += 15 & O, h && (t = UZIP.F._check(t, E + (1 << 17))); E < x;) t[E] = t[E++ - P], t[E] = t[E++ - P], t[E] = t[E++ - P], t[E] = t[E++ - P]; + E = x + } + } + } else { + 0 != (7 & F) && (F += 8 - (7 & F)); + var H = 4 + (F >>> 3), L = e[H - 4] | e[H - 3] << 8; + h && (t = UZIP.F._check(t, E + L)), t.set(new r(e.buffer, e.byteOffset + H, L), E), F = H + L << 3, E += L + } + return t.length == E ? t : t.slice(0, E) + }, UZIP.F._check = function (e, t) { + var r = e.length; + if (t <= r) return e; + var i = new Uint8Array(Math.max(r << 1, t)); + return i.set(e, 0), i + }, UZIP.F._decodeTiny = function (e, t, r, i, o, a) { + for (var s = UZIP.F._bitsE, f = UZIP.F._get17, l = 0; l < r;) { + var c = e[f(i, o) & t]; + o += 15 & c; + var u = c >>> 4; + if (u <= 15) a[l] = u, l++; else { + var h = 0, d = 0; + 16 == u ? (d = 3 + s(i, o, 2), o += 2, h = a[l - 1]) : 17 == u ? (d = 3 + s(i, o, 3), o += 3) : 18 == u && (d = 11 + s(i, o, 7), o += 7); + for (var A = l + d; l < A;) a[l] = h, l++ + } + } + return o + }, UZIP.F._copyOut = function (e, t, r, i) { + for (var o = 0, a = 0, s = i.length >>> 1; a < r;) { + var f = e[a + t]; + i[a << 1] = 0, i[1 + (a << 1)] = f, f > o && (o = f), a++ + } + for (; a < s;) i[a << 1] = 0, i[1 + (a << 1)] = 0, a++; + return o + }, UZIP.F.makeCodes = function (e, t) { + for (var r, i, o, a, s = UZIP.F.U, f = e.length, l = s.bl_count, c = 0; c <= t; c++) l[c] = 0; + for (c = 1; c < f; c += 2) l[e[c]]++; + var u = s.next_code; + for (r = 0, l[0] = 0, i = 1; i <= t; i++) r = r + l[i - 1] << 1, u[i] = r; + for (o = 0; o < f; o += 2) 0 != (a = e[o + 1]) && (e[o] = u[a], u[a]++) + }, UZIP.F.codes2map = function (e, t, r) { + for (var i = e.length, o = UZIP.F.U.rev15, a = 0; a < i; a += 2) if (0 != e[a + 1]) for (var s = a >> 1, f = e[a + 1], l = s << 4 | f, c = t - f, u = e[a] << c, h = u + (1 << c); u != h;) { + r[o[u] >>> 15 - t] = l, u++ + } + }, UZIP.F.revCodes = function (e, t) { + for (var r = UZIP.F.U.rev15, i = 15 - t, o = 0; o < e.length; o += 2) { + var a = e[o] << t - e[o + 1]; + e[o] = r[a] >>> i + } + }, UZIP.F._putsE = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8 + }, UZIP.F._putsF = function (e, t, r) { + r <<= 7 & t; + var i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8, e[i + 2] |= r >>> 16 + }, UZIP.F._bitsE = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8) >>> (7 & t) & (1 << r) - 1 + }, UZIP.F._bitsF = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) & (1 << r) - 1 + }, UZIP.F._get17 = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) + }, UZIP.F._get25 = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16 | e[3 + (t >>> 3)] << 24) >>> (7 & t) + }, UZIP.F.U = (t = Uint16Array, r = Uint32Array, { + next_code: new t(16), + bl_count: new t(16), + ordr: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + of0: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999], + exb: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0], + ldef: new t(32), + df0: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535], + dxb: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0], + ddef: new r(32), + flmap: new t(512), + fltree: [], + fdmap: new t(32), + fdtree: [], + lmap: new t(32768), + ltree: [], + ttree: [], + dmap: new t(32768), + dtree: [], + imap: new t(512), + itree: [], + rev15: new t(32768), + lhst: new r(286), + dhst: new r(30), + ihst: new r(19), + lits: new r(15e3), + strt: new t(65536), + prev: new t(32768) + }), function () { + for (var e = UZIP.F.U, t = 0; t < 32768; t++) { + var r = t; + r = (4278255360 & (r = (4042322160 & (r = (3435973836 & (r = (2863311530 & r) >>> 1 | (1431655765 & r) << 1)) >>> 2 | (858993459 & r) << 2)) >>> 4 | (252645135 & r) << 4)) >>> 8 | (16711935 & r) << 8, e.rev15[t] = (r >>> 16 | r << 16) >>> 17 + } + + function pushV(e, t, r) { + for (; 0 != t--;) e.push(0, r) + } + + for (t = 0; t < 32; t++) e.ldef[t] = e.of0[t] << 3 | e.exb[t], e.ddef[t] = e.df0[t] << 4 | e.dxb[t]; + pushV(e.fltree, 144, 8), pushV(e.fltree, 112, 9), pushV(e.fltree, 24, 7), pushV(e.fltree, 8, 8), UZIP.F.makeCodes(e.fltree, 9), UZIP.F.codes2map(e.fltree, 9, e.flmap), UZIP.F.revCodes(e.fltree, 9), pushV(e.fdtree, 32, 5), UZIP.F.makeCodes(e.fdtree, 5), UZIP.F.codes2map(e.fdtree, 5, e.fdmap), UZIP.F.revCodes(e.fdtree, 5), pushV(e.itree, 19, 0), pushV(e.ltree, 286, 0), pushV(e.dtree, 30, 0), pushV(e.ttree, 320, 0) + }() + }({ + get exports() { + return e + }, set exports(t) { + e = t + } + }); + var UZIP = _mergeNamespaces({__proto__: null, default: e}, [e]); + const UPNG = function () { + var e = { + nextZero(e, t) { + for (; 0 != e[t];) t++; + return t + }, + readUshort: (e, t) => e[t] << 8 | e[t + 1], + writeUshort(e, t, r) { + e[t] = r >> 8 & 255, e[t + 1] = 255 & r + }, + readUint: (e, t) => 16777216 * e[t] + (e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3]), + writeUint(e, t, r) { + e[t] = r >> 24 & 255, e[t + 1] = r >> 16 & 255, e[t + 2] = r >> 8 & 255, e[t + 3] = 255 & r + }, + readASCII(e, t, r) { + let i = ""; + for (let o = 0; o < r; o++) i += String.fromCharCode(e[t + o]); + return i + }, + writeASCII(e, t, r) { + for (let i = 0; i < r.length; i++) e[t + i] = r.charCodeAt(i) + }, + readBytes(e, t, r) { + const i = []; + for (let o = 0; o < r; o++) i.push(e[t + o]); + return i + }, + pad: e => e.length < 2 ? `0${e}` : e, + readUTF8(t, r, i) { + let o, a = ""; + for (let o = 0; o < i; o++) a += `%${e.pad(t[r + o].toString(16))}`; + try { + o = decodeURIComponent(a) + } catch (o) { + return e.readASCII(t, r, i) + } + return o + } + }; + + function decodeImage(t, r, i, o) { + const a = r * i, s = _getBPP(o), f = Math.ceil(r * s / 8), l = new Uint8Array(4 * a), + c = new Uint32Array(l.buffer), {ctype: u} = o, {depth: h} = o, d = e.readUshort; + if (6 == u) { + const e = a << 2; + if (8 == h) for (var A = 0; A < e; A += 4) l[A] = t[A], l[A + 1] = t[A + 1], l[A + 2] = t[A + 2], l[A + 3] = t[A + 3]; + if (16 == h) for (A = 0; A < e; A++) l[A] = t[A << 1] + } else if (2 == u) { + const e = o.tabs.tRNS; + if (null == e) { + if (8 == h) for (A = 0; A < a; A++) { + var g = 3 * A; + c[A] = 255 << 24 | t[g + 2] << 16 | t[g + 1] << 8 | t[g] + } + if (16 == h) for (A = 0; A < a; A++) { + g = 6 * A; + c[A] = 255 << 24 | t[g + 4] << 16 | t[g + 2] << 8 | t[g] + } + } else { + var p = e[0]; + const r = e[1], i = e[2]; + if (8 == h) for (A = 0; A < a; A++) { + var m = A << 2; + g = 3 * A; + c[A] = 255 << 24 | t[g + 2] << 16 | t[g + 1] << 8 | t[g], t[g] == p && t[g + 1] == r && t[g + 2] == i && (l[m + 3] = 0) + } + if (16 == h) for (A = 0; A < a; A++) { + m = A << 2, g = 6 * A; + c[A] = 255 << 24 | t[g + 4] << 16 | t[g + 2] << 8 | t[g], d(t, g) == p && d(t, g + 2) == r && d(t, g + 4) == i && (l[m + 3] = 0) + } + } + } else if (3 == u) { + const e = o.tabs.PLTE, s = o.tabs.tRNS, c = s ? s.length : 0; + if (1 == h) for (var w = 0; w < i; w++) { + var v = w * f, b = w * r; + for (A = 0; A < r; A++) { + m = b + A << 2; + var y = 3 * (E = t[v + (A >> 3)] >> 7 - ((7 & A) << 0) & 1); + l[m] = e[y], l[m + 1] = e[y + 1], l[m + 2] = e[y + 2], l[m + 3] = E < c ? s[E] : 255 + } + } + if (2 == h) for (w = 0; w < i; w++) for (v = w * f, b = w * r, A = 0; A < r; A++) { + m = b + A << 2, y = 3 * (E = t[v + (A >> 2)] >> 6 - ((3 & A) << 1) & 3); + l[m] = e[y], l[m + 1] = e[y + 1], l[m + 2] = e[y + 2], l[m + 3] = E < c ? s[E] : 255 + } + if (4 == h) for (w = 0; w < i; w++) for (v = w * f, b = w * r, A = 0; A < r; A++) { + m = b + A << 2, y = 3 * (E = t[v + (A >> 1)] >> 4 - ((1 & A) << 2) & 15); + l[m] = e[y], l[m + 1] = e[y + 1], l[m + 2] = e[y + 2], l[m + 3] = E < c ? s[E] : 255 + } + if (8 == h) for (A = 0; A < a; A++) { + var E; + m = A << 2, y = 3 * (E = t[A]); + l[m] = e[y], l[m + 1] = e[y + 1], l[m + 2] = e[y + 2], l[m + 3] = E < c ? s[E] : 255 + } + } else if (4 == u) { + if (8 == h) for (A = 0; A < a; A++) { + m = A << 2; + var F = t[_ = A << 1]; + l[m] = F, l[m + 1] = F, l[m + 2] = F, l[m + 3] = t[_ + 1] + } + if (16 == h) for (A = 0; A < a; A++) { + var _; + m = A << 2, F = t[_ = A << 2]; + l[m] = F, l[m + 1] = F, l[m + 2] = F, l[m + 3] = t[_ + 2] + } + } else if (0 == u) for (p = o.tabs.tRNS ? o.tabs.tRNS : -1, w = 0; w < i; w++) { + const e = w * f, i = w * r; + if (1 == h) for (var B = 0; B < r; B++) { + var U = (F = 255 * (t[e + (B >>> 3)] >>> 7 - (7 & B) & 1)) == 255 * p ? 0 : 255; + c[i + B] = U << 24 | F << 16 | F << 8 | F + } else if (2 == h) for (B = 0; B < r; B++) { + U = (F = 85 * (t[e + (B >>> 2)] >>> 6 - ((3 & B) << 1) & 3)) == 85 * p ? 0 : 255; + c[i + B] = U << 24 | F << 16 | F << 8 | F + } else if (4 == h) for (B = 0; B < r; B++) { + U = (F = 17 * (t[e + (B >>> 1)] >>> 4 - ((1 & B) << 2) & 15)) == 17 * p ? 0 : 255; + c[i + B] = U << 24 | F << 16 | F << 8 | F + } else if (8 == h) for (B = 0; B < r; B++) { + U = (F = t[e + B]) == p ? 0 : 255; + c[i + B] = U << 24 | F << 16 | F << 8 | F + } else if (16 == h) for (B = 0; B < r; B++) { + F = t[e + (B << 1)], U = d(t, e + (B << 1)) == p ? 0 : 255; + c[i + B] = U << 24 | F << 16 | F << 8 | F + } + } + return l + } + + function _decompress(e, r, i, o) { + const a = _getBPP(e), s = Math.ceil(i * a / 8), f = new Uint8Array((s + 1 + e.interlace) * o); + return r = e.tabs.CgBI ? t(r, f) : _inflate(r, f), 0 == e.interlace ? r = _filterZero(r, e, 0, i, o) : 1 == e.interlace && (r = function _readInterlace(e, t) { + const r = t.width, i = t.height, o = _getBPP(t), a = o >> 3, s = Math.ceil(r * o / 8), + f = new Uint8Array(i * s); + let l = 0; + const c = [0, 0, 4, 0, 2, 0, 1], u = [0, 4, 0, 2, 0, 1, 0], h = [8, 8, 8, 4, 4, 2, 2], + d = [8, 8, 4, 4, 2, 2, 1]; + let A = 0; + for (; A < 7;) { + const p = h[A], m = d[A]; + let w = 0, v = 0, b = c[A]; + for (; b < i;) b += p, v++; + let y = u[A]; + for (; y < r;) y += m, w++; + const E = Math.ceil(w * o / 8); + _filterZero(e, t, l, w, v); + let F = 0, _ = c[A]; + for (; _ < i;) { + let t = u[A], i = l + F * E << 3; + for (; t < r;) { + var g; + if (1 == o) g = (g = e[i >> 3]) >> 7 - (7 & i) & 1, f[_ * s + (t >> 3)] |= g << 7 - ((7 & t) << 0); + if (2 == o) g = (g = e[i >> 3]) >> 6 - (7 & i) & 3, f[_ * s + (t >> 2)] |= g << 6 - ((3 & t) << 1); + if (4 == o) g = (g = e[i >> 3]) >> 4 - (7 & i) & 15, f[_ * s + (t >> 1)] |= g << 4 - ((1 & t) << 2); + if (o >= 8) { + const r = _ * s + t * a; + for (let t = 0; t < a; t++) f[r + t] = e[(i >> 3) + t] + } + i += o, t += m + } + F++, _ += p + } + w * v != 0 && (l += v * (1 + E)), A += 1 + } + return f + }(r, e)), r + } + + function _inflate(e, r) { + return t(new Uint8Array(e.buffer, 2, e.length - 6), r) + } + + var t = function () { + const e = {H: {}}; + return e.H.N = function (t, r) { + const i = Uint8Array; + let o, a, s = 0, f = 0, l = 0, c = 0, u = 0, h = 0, d = 0, A = 0, g = 0; + if (3 == t[0] && 0 == t[1]) return r || new i(0); + const p = e.H, m = p.b, w = p.e, v = p.R, b = p.n, y = p.A, E = p.Z, F = p.m, _ = null == r; + for (_ && (r = new i(t.length >>> 2 << 5)); 0 == s;) if (s = m(t, g, 1), f = m(t, g + 1, 2), g += 3, 0 != f) { + if (_ && (r = e.H.W(r, A + (1 << 17))), 1 == f && (o = F.J, a = F.h, h = 511, d = 31), 2 == f) { + l = w(t, g, 5) + 257, c = w(t, g + 5, 5) + 1, u = w(t, g + 10, 4) + 4, g += 14; + let e = 1; + for (var B = 0; B < 38; B += 2) F.Q[B] = 0, F.Q[B + 1] = 0; + for (B = 0; B < u; B++) { + const r = w(t, g + 3 * B, 3); + F.Q[1 + (F.X[B] << 1)] = r, r > e && (e = r) + } + g += 3 * u, b(F.Q, e), y(F.Q, e, F.u), o = F.w, a = F.d, g = v(F.u, (1 << e) - 1, l + c, t, g, F.v); + const r = p.V(F.v, 0, l, F.C); + h = (1 << r) - 1; + const i = p.V(F.v, l, c, F.D); + d = (1 << i) - 1, b(F.C, r), y(F.C, r, o), b(F.D, i), y(F.D, i, a) + } + for (; ;) { + const e = o[E(t, g) & h]; + g += 15 & e; + const i = e >>> 4; + if (i >>> 8 == 0) r[A++] = i; else { + if (256 == i) break; + { + let e = A + i - 254; + if (i > 264) { + const r = F.q[i - 257]; + e = A + (r >>> 3) + w(t, g, 7 & r), g += 7 & r + } + const o = a[E(t, g) & d]; + g += 15 & o; + const s = o >>> 4, f = F.c[s], l = (f >>> 4) + m(t, g, 15 & f); + for (g += 15 & f; A < e;) r[A] = r[A++ - l], r[A] = r[A++ - l], r[A] = r[A++ - l], r[A] = r[A++ - l]; + A = e + } + } + } + } else { + 0 != (7 & g) && (g += 8 - (7 & g)); + const o = 4 + (g >>> 3), a = t[o - 4] | t[o - 3] << 8; + _ && (r = e.H.W(r, A + a)), r.set(new i(t.buffer, t.byteOffset + o, a), A), g = o + a << 3, A += a + } + return r.length == A ? r : r.slice(0, A) + }, e.H.W = function (e, t) { + const r = e.length; + if (t <= r) return e; + const i = new Uint8Array(r << 1); + return i.set(e, 0), i + }, e.H.R = function (t, r, i, o, a, s) { + const f = e.H.e, l = e.H.Z; + let c = 0; + for (; c < i;) { + const e = t[l(o, a) & r]; + a += 15 & e; + const i = e >>> 4; + if (i <= 15) s[c] = i, c++; else { + let e = 0, t = 0; + 16 == i ? (t = 3 + f(o, a, 2), a += 2, e = s[c - 1]) : 17 == i ? (t = 3 + f(o, a, 3), a += 3) : 18 == i && (t = 11 + f(o, a, 7), a += 7); + const r = c + t; + for (; c < r;) s[c] = e, c++ + } + } + return a + }, e.H.V = function (e, t, r, i) { + let o = 0, a = 0; + const s = i.length >>> 1; + for (; a < r;) { + const r = e[a + t]; + i[a << 1] = 0, i[1 + (a << 1)] = r, r > o && (o = r), a++ + } + for (; a < s;) i[a << 1] = 0, i[1 + (a << 1)] = 0, a++; + return o + }, e.H.n = function (t, r) { + const i = e.H.m, o = t.length; + let a, s, f; + let l; + const c = i.j; + for (var u = 0; u <= r; u++) c[u] = 0; + for (u = 1; u < o; u += 2) c[t[u]]++; + const h = i.K; + for (a = 0, c[0] = 0, s = 1; s <= r; s++) a = a + c[s - 1] << 1, h[s] = a; + for (f = 0; f < o; f += 2) l = t[f + 1], 0 != l && (t[f] = h[l], h[l]++) + }, e.H.A = function (t, r, i) { + const o = t.length, a = e.H.m.r; + for (let e = 0; e < o; e += 2) if (0 != t[e + 1]) { + const o = e >> 1, s = t[e + 1], f = o << 4 | s, l = r - s; + let c = t[e] << l; + const u = c + (1 << l); + for (; c != u;) { + i[a[c] >>> 15 - r] = f, c++ + } + } + }, e.H.l = function (t, r) { + const i = e.H.m.r, o = 15 - r; + for (let e = 0; e < t.length; e += 2) { + const a = t[e] << r - t[e + 1]; + t[e] = i[a] >>> o + } + }, e.H.M = function (e, t, r) { + r <<= 7 & t; + const i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8 + }, e.H.I = function (e, t, r) { + r <<= 7 & t; + const i = t >>> 3; + e[i] |= r, e[i + 1] |= r >>> 8, e[i + 2] |= r >>> 16 + }, e.H.e = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8) >>> (7 & t) & (1 << r) - 1 + }, e.H.b = function (e, t, r) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) & (1 << r) - 1 + }, e.H.Z = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16) >>> (7 & t) + }, e.H.i = function (e, t) { + return (e[t >>> 3] | e[1 + (t >>> 3)] << 8 | e[2 + (t >>> 3)] << 16 | e[3 + (t >>> 3)] << 24) >>> (7 & t) + }, e.H.m = function () { + const e = Uint16Array, t = Uint32Array; + return { + K: new e(16), + j: new e(16), + X: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + S: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999], + T: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0], + q: new e(32), + p: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535], + z: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0], + c: new t(32), + J: new e(512), + _: [], + h: new e(32), + $: [], + w: new e(32768), + C: [], + v: [], + d: new e(32768), + D: [], + u: new e(512), + Q: [], + r: new e(32768), + s: new t(286), + Y: new t(30), + a: new t(19), + t: new t(15e3), + k: new e(65536), + g: new e(32768) + } + }(), function () { + const t = e.H.m; + for (var r = 0; r < 32768; r++) { + let e = r; + e = (2863311530 & e) >>> 1 | (1431655765 & e) << 1, e = (3435973836 & e) >>> 2 | (858993459 & e) << 2, e = (4042322160 & e) >>> 4 | (252645135 & e) << 4, e = (4278255360 & e) >>> 8 | (16711935 & e) << 8, t.r[r] = (e >>> 16 | e << 16) >>> 17 + } + + function n(e, t, r) { + for (; 0 != t--;) e.push(0, r) + } + + for (r = 0; r < 32; r++) t.q[r] = t.S[r] << 3 | t.T[r], t.c[r] = t.p[r] << 4 | t.z[r]; + n(t._, 144, 8), n(t._, 112, 9), n(t._, 24, 7), n(t._, 8, 8), e.H.n(t._, 9), e.H.A(t._, 9, t.J), e.H.l(t._, 9), n(t.$, 32, 5), e.H.n(t.$, 5), e.H.A(t.$, 5, t.h), e.H.l(t.$, 5), n(t.Q, 19, 0), n(t.C, 286, 0), n(t.D, 30, 0), n(t.v, 320, 0) + }(), e.H.N + }(); + + function _getBPP(e) { + return [1, null, 3, 1, 2, null, 4][e.ctype] * e.depth + } + + function _filterZero(e, t, r, i, o) { + let a = _getBPP(t); + const s = Math.ceil(i * a / 8); + let f, l; + a = Math.ceil(a / 8); + let c = e[r], u = 0; + if (c > 1 && (e[r] = [0, 0, 1][c - 2]), 3 == c) for (u = a; u < s; u++) e[u + 1] = e[u + 1] + (e[u + 1 - a] >>> 1) & 255; + for (let t = 0; t < o; t++) if (f = r + t * s, l = f + t + 1, c = e[l - 1], u = 0, 0 == c) for (; u < s; u++) e[f + u] = e[l + u]; else if (1 == c) { + for (; u < a; u++) e[f + u] = e[l + u]; + for (; u < s; u++) e[f + u] = e[l + u] + e[f + u - a] + } else if (2 == c) for (; u < s; u++) e[f + u] = e[l + u] + e[f + u - s]; else if (3 == c) { + for (; u < a; u++) e[f + u] = e[l + u] + (e[f + u - s] >>> 1); + for (; u < s; u++) e[f + u] = e[l + u] + (e[f + u - s] + e[f + u - a] >>> 1) + } else { + for (; u < a; u++) e[f + u] = e[l + u] + _paeth(0, e[f + u - s], 0); + for (; u < s; u++) e[f + u] = e[l + u] + _paeth(e[f + u - a], e[f + u - s], e[f + u - a - s]) + } + return e + } + + function _paeth(e, t, r) { + const i = e + t - r, o = i - e, a = i - t, s = i - r; + return o * o <= a * a && o * o <= s * s ? e : a * a <= s * s ? t : r + } + + function _IHDR(t, r, i) { + i.width = e.readUint(t, r), r += 4, i.height = e.readUint(t, r), r += 4, i.depth = t[r], r++, i.ctype = t[r], r++, i.compress = t[r], r++, i.filter = t[r], r++, i.interlace = t[r], r++ + } + + function _copyTile(e, t, r, i, o, a, s, f, l) { + const c = Math.min(t, o), u = Math.min(r, a); + let h = 0, d = 0; + for (let r = 0; r < u; r++) for (let a = 0; a < c; a++) if (s >= 0 && f >= 0 ? (h = r * t + a << 2, d = (f + r) * o + s + a << 2) : (h = (-f + r) * t - s + a << 2, d = r * o + a << 2), 0 == l) i[d] = e[h], i[d + 1] = e[h + 1], i[d + 2] = e[h + 2], i[d + 3] = e[h + 3]; else if (1 == l) { + var A = e[h + 3] * (1 / 255), g = e[h] * A, p = e[h + 1] * A, m = e[h + 2] * A, + w = i[d + 3] * (1 / 255), v = i[d] * w, b = i[d + 1] * w, y = i[d + 2] * w; + const t = 1 - A, r = A + w * t, o = 0 == r ? 0 : 1 / r; + i[d + 3] = 255 * r, i[d + 0] = (g + v * t) * o, i[d + 1] = (p + b * t) * o, i[d + 2] = (m + y * t) * o + } else if (2 == l) { + A = e[h + 3], g = e[h], p = e[h + 1], m = e[h + 2], w = i[d + 3], v = i[d], b = i[d + 1], y = i[d + 2]; + A == w && g == v && p == b && m == y ? (i[d] = 0, i[d + 1] = 0, i[d + 2] = 0, i[d + 3] = 0) : (i[d] = g, i[d + 1] = p, i[d + 2] = m, i[d + 3] = A) + } else if (3 == l) { + A = e[h + 3], g = e[h], p = e[h + 1], m = e[h + 2], w = i[d + 3], v = i[d], b = i[d + 1], y = i[d + 2]; + if (A == w && g == v && p == b && m == y) continue; + if (A < 220 && w > 20) return !1 + } + return !0 + } + + return { + decode: function decode(r) { + const i = new Uint8Array(r); + let o = 8; + const a = e, s = a.readUshort, f = a.readUint, l = {tabs: {}, frames: []}, + c = new Uint8Array(i.length); + let u, h = 0, d = 0; + const A = [137, 80, 78, 71, 13, 10, 26, 10]; + for (var g = 0; g < 8; g++) if (i[g] != A[g]) throw"The input is not a PNG file!"; + for (; o < i.length;) { + const e = a.readUint(i, o); + o += 4; + const r = a.readASCII(i, o, 4); + if (o += 4, "IHDR" == r) _IHDR(i, o, l); else if ("iCCP" == r) { + for (var p = o; 0 != i[p];) p++; + a.readASCII(i, o, p - o), i[p + 1]; + const s = i.slice(p + 2, o + e); + let f = null; + try { + f = _inflate(s) + } catch (e) { + f = t(s) + } + l.tabs[r] = f + } else if ("CgBI" == r) l.tabs[r] = i.slice(o, o + 4); else if ("IDAT" == r) { + for (g = 0; g < e; g++) c[h + g] = i[o + g]; + h += e + } else if ("acTL" == r) l.tabs[r] = { + num_frames: f(i, o), + num_plays: f(i, o + 4) + }, u = new Uint8Array(i.length); else if ("fcTL" == r) { + if (0 != d) (E = l.frames[l.frames.length - 1]).data = _decompress(l, u.slice(0, d), E.rect.width, E.rect.height), d = 0; + const e = {x: f(i, o + 12), y: f(i, o + 16), width: f(i, o + 4), height: f(i, o + 8)}; + let t = s(i, o + 22); + t = s(i, o + 20) / (0 == t ? 100 : t); + const r = {rect: e, delay: Math.round(1e3 * t), dispose: i[o + 24], blend: i[o + 25]}; + l.frames.push(r) + } else if ("fdAT" == r) { + for (g = 0; g < e - 4; g++) u[d + g] = i[o + g + 4]; + d += e - 4 + } else if ("pHYs" == r) l.tabs[r] = [a.readUint(i, o), a.readUint(i, o + 4), i[o + 8]]; else if ("cHRM" == r) { + l.tabs[r] = []; + for (g = 0; g < 8; g++) l.tabs[r].push(a.readUint(i, o + 4 * g)) + } else if ("tEXt" == r || "zTXt" == r) { + null == l.tabs[r] && (l.tabs[r] = {}); + var m = a.nextZero(i, o), w = a.readASCII(i, o, m - o), v = o + e - m - 1; + if ("tEXt" == r) y = a.readASCII(i, m + 1, v); else { + var b = _inflate(i.slice(m + 2, m + 2 + v)); + y = a.readUTF8(b, 0, b.length) + } + l.tabs[r][w] = y + } else if ("iTXt" == r) { + null == l.tabs[r] && (l.tabs[r] = {}); + m = 0, p = o; + m = a.nextZero(i, p); + w = a.readASCII(i, p, m - p); + const t = i[p = m + 1]; + var y; + i[p + 1], p += 2, m = a.nextZero(i, p), a.readASCII(i, p, m - p), p = m + 1, m = a.nextZero(i, p), a.readUTF8(i, p, m - p); + v = e - ((p = m + 1) - o); + if (0 == t) y = a.readUTF8(i, p, v); else { + b = _inflate(i.slice(p, p + v)); + y = a.readUTF8(b, 0, b.length) + } + l.tabs[r][w] = y + } else if ("PLTE" == r) l.tabs[r] = a.readBytes(i, o, e); else if ("hIST" == r) { + const e = l.tabs.PLTE.length / 3; + l.tabs[r] = []; + for (g = 0; g < e; g++) l.tabs[r].push(s(i, o + 2 * g)) + } else if ("tRNS" == r) 3 == l.ctype ? l.tabs[r] = a.readBytes(i, o, e) : 0 == l.ctype ? l.tabs[r] = s(i, o) : 2 == l.ctype && (l.tabs[r] = [s(i, o), s(i, o + 2), s(i, o + 4)]); else if ("gAMA" == r) l.tabs[r] = a.readUint(i, o) / 1e5; else if ("sRGB" == r) l.tabs[r] = i[o]; else if ("bKGD" == r) 0 == l.ctype || 4 == l.ctype ? l.tabs[r] = [s(i, o)] : 2 == l.ctype || 6 == l.ctype ? l.tabs[r] = [s(i, o), s(i, o + 2), s(i, o + 4)] : 3 == l.ctype && (l.tabs[r] = i[o]); else if ("IEND" == r) break; + o += e, a.readUint(i, o), o += 4 + } + var E; + return 0 != d && ((E = l.frames[l.frames.length - 1]).data = _decompress(l, u.slice(0, d), E.rect.width, E.rect.height)), l.data = _decompress(l, c, l.width, l.height), delete l.compress, delete l.interlace, delete l.filter, l + }, toRGBA8: function toRGBA8(e) { + const t = e.width, r = e.height; + if (null == e.tabs.acTL) return [decodeImage(e.data, t, r, e).buffer]; + const i = []; + null == e.frames[0].data && (e.frames[0].data = e.data); + const o = t * r * 4, a = new Uint8Array(o), s = new Uint8Array(o), f = new Uint8Array(o); + for (let c = 0; c < e.frames.length; c++) { + const u = e.frames[c], h = u.rect.x, d = u.rect.y, A = u.rect.width, g = u.rect.height, + p = decodeImage(u.data, A, g, e); + if (0 != c) for (var l = 0; l < o; l++) f[l] = a[l]; + if (0 == u.blend ? _copyTile(p, A, g, a, t, r, h, d, 0) : 1 == u.blend && _copyTile(p, A, g, a, t, r, h, d, 1), i.push(a.buffer.slice(0)), 0 == u.dispose) ; else if (1 == u.dispose) _copyTile(s, A, g, a, t, r, h, d, 0); else if (2 == u.dispose) for (l = 0; l < o; l++) a[l] = f[l] + } + return i + }, _paeth: _paeth, _copyTile: _copyTile, _bin: e + } + }(); + !function () { + const {_copyTile: e} = UPNG, {_bin: t} = UPNG, r = UPNG._paeth; + var i = { + table: function () { + const e = new Uint32Array(256); + for (let t = 0; t < 256; t++) { + let r = t; + for (let e = 0; e < 8; e++) 1 & r ? r = 3988292384 ^ r >>> 1 : r >>>= 1; + e[t] = r + } + return e + }(), update(e, t, r, o) { + for (let a = 0; a < o; a++) e = i.table[255 & (e ^ t[r + a])] ^ e >>> 8; + return e + }, crc: (e, t, r) => 4294967295 ^ i.update(4294967295, e, t, r) + }; + + function addErr(e, t, r, i) { + t[r] += e[0] * i >> 4, t[r + 1] += e[1] * i >> 4, t[r + 2] += e[2] * i >> 4, t[r + 3] += e[3] * i >> 4 + } + + function N(e) { + return Math.max(0, Math.min(255, e)) + } + + function D(e, t) { + const r = e[0] - t[0], i = e[1] - t[1], o = e[2] - t[2], a = e[3] - t[3]; + return r * r + i * i + o * o + a * a + } + + function dither(e, t, r, i, o, a, s) { + null == s && (s = 1); + const f = i.length, l = []; + for (var c = 0; c < f; c++) { + const e = i[c]; + l.push([e >>> 0 & 255, e >>> 8 & 255, e >>> 16 & 255, e >>> 24 & 255]) + } + for (c = 0; c < f; c++) { + let e = 4294967295; + for (var u = 0, h = 0; h < f; h++) { + var d = D(l[c], l[h]); + h != c && d < e && (e = d, u = h) + } + } + const A = new Uint32Array(o.buffer), g = new Int16Array(t * r * 4), + p = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5]; + for (c = 0; c < p.length; c++) p[c] = 255 * ((p[c] + .5) / 16 - .5); + for (let o = 0; o < r; o++) for (let w = 0; w < t; w++) { + var m; + c = 4 * (o * t + w); + if (2 != s) m = [N(e[c] + g[c]), N(e[c + 1] + g[c + 1]), N(e[c + 2] + g[c + 2]), N(e[c + 3] + g[c + 3])]; else { + d = p[4 * (3 & o) + (3 & w)]; + m = [N(e[c] + d), N(e[c + 1] + d), N(e[c + 2] + d), N(e[c + 3] + d)] + } + u = 0; + let v = 16777215; + for (h = 0; h < f; h++) { + const e = D(m, l[h]); + e < v && (v = e, u = h) + } + const b = l[u], y = [m[0] - b[0], m[1] - b[1], m[2] - b[2], m[3] - b[3]]; + 1 == s && (w != t - 1 && addErr(y, g, c + 4, 7), o != r - 1 && (0 != w && addErr(y, g, c + 4 * t - 4, 3), addErr(y, g, c + 4 * t, 5), w != t - 1 && addErr(y, g, c + 4 * t + 4, 1))), a[c >> 2] = u, A[c >> 2] = i[u] + } + } + + function _main(e, r, o, a, s) { + null == s && (s = {}); + const {crc: f} = i, l = t.writeUint, c = t.writeUshort, u = t.writeASCII; + let h = 8; + const d = e.frames.length > 1; + let A, g = !1, p = 33 + (d ? 20 : 0); + if (null != s.sRGB && (p += 13), null != s.pHYs && (p += 21), null != s.iCCP && (A = pako.deflate(s.iCCP), p += 21 + A.length + 4), 3 == e.ctype) { + for (var m = e.plte.length, w = 0; w < m; w++) e.plte[w] >>> 24 != 255 && (g = !0); + p += 8 + 3 * m + 4 + (g ? 8 + 1 * m + 4 : 0) + } + for (var v = 0; v < e.frames.length; v++) { + d && (p += 38), p += (F = e.frames[v]).cimg.length + 12, 0 != v && (p += 4) + } + p += 12; + const b = new Uint8Array(p), y = [137, 80, 78, 71, 13, 10, 26, 10]; + for (w = 0; w < 8; w++) b[w] = y[w]; + if (l(b, h, 13), h += 4, u(b, h, "IHDR"), h += 4, l(b, h, r), h += 4, l(b, h, o), h += 4, b[h] = e.depth, h++, b[h] = e.ctype, h++, b[h] = 0, h++, b[h] = 0, h++, b[h] = 0, h++, l(b, h, f(b, h - 17, 17)), h += 4, null != s.sRGB && (l(b, h, 1), h += 4, u(b, h, "sRGB"), h += 4, b[h] = s.sRGB, h++, l(b, h, f(b, h - 5, 5)), h += 4), null != s.iCCP) { + const e = 13 + A.length; + l(b, h, e), h += 4, u(b, h, "iCCP"), h += 4, u(b, h, "ICC profile"), h += 11, h += 2, b.set(A, h), h += A.length, l(b, h, f(b, h - (e + 4), e + 4)), h += 4 + } + if (null != s.pHYs && (l(b, h, 9), h += 4, u(b, h, "pHYs"), h += 4, l(b, h, s.pHYs[0]), h += 4, l(b, h, s.pHYs[1]), h += 4, b[h] = s.pHYs[2], h++, l(b, h, f(b, h - 13, 13)), h += 4), d && (l(b, h, 8), h += 4, u(b, h, "acTL"), h += 4, l(b, h, e.frames.length), h += 4, l(b, h, null != s.loop ? s.loop : 0), h += 4, l(b, h, f(b, h - 12, 12)), h += 4), 3 == e.ctype) { + l(b, h, 3 * (m = e.plte.length)), h += 4, u(b, h, "PLTE"), h += 4; + for (w = 0; w < m; w++) { + const t = 3 * w, r = e.plte[w], i = 255 & r, o = r >>> 8 & 255, a = r >>> 16 & 255; + b[h + t + 0] = i, b[h + t + 1] = o, b[h + t + 2] = a + } + if (h += 3 * m, l(b, h, f(b, h - 3 * m - 4, 3 * m + 4)), h += 4, g) { + l(b, h, m), h += 4, u(b, h, "tRNS"), h += 4; + for (w = 0; w < m; w++) b[h + w] = e.plte[w] >>> 24 & 255; + h += m, l(b, h, f(b, h - m - 4, m + 4)), h += 4 + } + } + let E = 0; + for (v = 0; v < e.frames.length; v++) { + var F = e.frames[v]; + d && (l(b, h, 26), h += 4, u(b, h, "fcTL"), h += 4, l(b, h, E++), h += 4, l(b, h, F.rect.width), h += 4, l(b, h, F.rect.height), h += 4, l(b, h, F.rect.x), h += 4, l(b, h, F.rect.y), h += 4, c(b, h, a[v]), h += 2, c(b, h, 1e3), h += 2, b[h] = F.dispose, h++, b[h] = F.blend, h++, l(b, h, f(b, h - 30, 30)), h += 4); + const t = F.cimg; + l(b, h, (m = t.length) + (0 == v ? 0 : 4)), h += 4; + const r = h; + u(b, h, 0 == v ? "IDAT" : "fdAT"), h += 4, 0 != v && (l(b, h, E++), h += 4), b.set(t, h), h += m, l(b, h, f(b, r, h - r)), h += 4 + } + return l(b, h, 0), h += 4, u(b, h, "IEND"), h += 4, l(b, h, f(b, h - 4, 4)), h += 4, b.buffer + } + + function compressPNG(e, t, r) { + for (let i = 0; i < e.frames.length; i++) { + const o = e.frames[i]; + o.rect.width; + const a = o.rect.height, s = new Uint8Array(a * o.bpl + a); + o.cimg = _filterZero(o.img, a, o.bpp, o.bpl, s, t, r) + } + } + + function compress(t, r, i, o, a) { + const s = a[0], f = a[1], l = a[2], c = a[3], u = a[4], h = a[5]; + let d = 6, A = 8, g = 255; + for (var p = 0; p < t.length; p++) { + const e = new Uint8Array(t[p]); + for (var m = e.length, w = 0; w < m; w += 4) g &= e[w + 3] + } + const v = 255 != g, b = function framize(t, r, i, o, a, s) { + const f = []; + for (var l = 0; l < t.length; l++) { + const h = new Uint8Array(t[l]), A = new Uint32Array(h.buffer); + var c; + let g = 0, p = 0, m = r, w = i, v = o ? 1 : 0; + if (0 != l) { + const b = s || o || 1 == l || 0 != f[l - 2].dispose ? 1 : 2; + let y = 0, E = 1e9; + for (let e = 0; e < b; e++) { + var u = new Uint8Array(t[l - 1 - e]); + const o = new Uint32Array(t[l - 1 - e]); + let s = r, f = i, c = -1, h = -1; + for (let e = 0; e < i; e++) for (let t = 0; t < r; t++) { + A[d = e * r + t] != o[d] && (t < s && (s = t), t > c && (c = t), e < f && (f = e), e > h && (h = e)) + } + -1 == c && (s = f = c = h = 0), a && (1 == (1 & s) && s--, 1 == (1 & f) && f--); + const v = (c - s + 1) * (h - f + 1); + v < E && (E = v, y = e, g = s, p = f, m = c - s + 1, w = h - f + 1) + } + u = new Uint8Array(t[l - 1 - y]); + 1 == y && (f[l - 1].dispose = 2), c = new Uint8Array(m * w * 4), e(u, r, i, c, m, w, -g, -p, 0), v = e(h, r, i, c, m, w, -g, -p, 3) ? 1 : 0, 1 == v ? _prepareDiff(h, r, i, c, { + x: g, + y: p, + width: m, + height: w + }) : e(h, r, i, c, m, w, -g, -p, 0) + } else c = h.slice(0); + f.push({rect: {x: g, y: p, width: m, height: w}, img: c, blend: v, dispose: 0}) + } + if (o) for (l = 0; l < f.length; l++) { + if (1 == (A = f[l]).blend) continue; + const e = A.rect, o = f[l - 1].rect, s = Math.min(e.x, o.x), c = Math.min(e.y, o.y), u = { + x: s, + y: c, + width: Math.max(e.x + e.width, o.x + o.width) - s, + height: Math.max(e.y + e.height, o.y + o.height) - c + }; + f[l - 1].dispose = 1, l - 1 != 0 && _updateFrame(t, r, i, f, l - 1, u, a), _updateFrame(t, r, i, f, l, u, a) + } + let h = 0; + if (1 != t.length) for (var d = 0; d < f.length; d++) { + var A; + h += (A = f[d]).rect.width * A.rect.height + } + return f + }(t, r, i, s, f, l), y = {}, E = [], F = []; + if (0 != o) { + const e = []; + for (w = 0; w < b.length; w++) e.push(b[w].img.buffer); + const t = function concatRGBA(e) { + let t = 0; + for (var r = 0; r < e.length; r++) t += e[r].byteLength; + const i = new Uint8Array(t); + let o = 0; + for (r = 0; r < e.length; r++) { + const t = new Uint8Array(e[r]), a = t.length; + for (let e = 0; e < a; e += 4) { + let r = t[e], a = t[e + 1], s = t[e + 2]; + const f = t[e + 3]; + 0 == f && (r = a = s = 0), i[o + e] = r, i[o + e + 1] = a, i[o + e + 2] = s, i[o + e + 3] = f + } + o += a + } + return i.buffer + }(e), r = quantize(t, o); + for (w = 0; w < r.plte.length; w++) E.push(r.plte[w].est.rgba); + let i = 0; + for (w = 0; w < b.length; w++) { + const e = (B = b[w]).img.length; + var _ = new Uint8Array(r.inds.buffer, i >> 2, e >> 2); + F.push(_); + const t = new Uint8Array(r.abuf, i, e); + h && dither(B.img, B.rect.width, B.rect.height, E, t, _), B.img.set(t), i += e + } + } else for (p = 0; p < b.length; p++) { + var B = b[p]; + const e = new Uint32Array(B.img.buffer); + var U = B.rect.width; + m = e.length, _ = new Uint8Array(m); + F.push(_); + for (w = 0; w < m; w++) { + const t = e[w]; + if (0 != w && t == e[w - 1]) _[w] = _[w - 1]; else if (w > U && t == e[w - U]) _[w] = _[w - U]; else { + let e = y[t]; + if (null == e && (y[t] = e = E.length, E.push(t), E.length >= 300)) break; + _[w] = e + } + } + } + const C = E.length; + C <= 256 && 0 == u && (A = C <= 2 ? 1 : C <= 4 ? 2 : C <= 16 ? 4 : 8, A = Math.max(A, c)); + for (p = 0; p < b.length; p++) { + (B = b[p]).rect.x, B.rect.y; + U = B.rect.width; + const e = B.rect.height; + let t = B.img; + new Uint32Array(t.buffer); + let r = 4 * U, i = 4; + if (C <= 256 && 0 == u) { + r = Math.ceil(A * U / 8); + var I = new Uint8Array(r * e); + const o = F[p]; + for (let t = 0; t < e; t++) { + w = t * r; + const e = t * U; + if (8 == A) for (var Q = 0; Q < U; Q++) I[w + Q] = o[e + Q]; else if (4 == A) for (Q = 0; Q < U; Q++) I[w + (Q >> 1)] |= o[e + Q] << 4 - 4 * (1 & Q); else if (2 == A) for (Q = 0; Q < U; Q++) I[w + (Q >> 2)] |= o[e + Q] << 6 - 2 * (3 & Q); else if (1 == A) for (Q = 0; Q < U; Q++) I[w + (Q >> 3)] |= o[e + Q] << 7 - 1 * (7 & Q) + } + t = I, d = 3, i = 1 + } else if (0 == v && 1 == b.length) { + I = new Uint8Array(U * e * 3); + const o = U * e; + for (w = 0; w < o; w++) { + const e = 3 * w, r = 4 * w; + I[e] = t[r], I[e + 1] = t[r + 1], I[e + 2] = t[r + 2] + } + t = I, d = 2, i = 3, r = 3 * U + } + B.img = t, B.bpl = r, B.bpp = i + } + return {ctype: d, depth: A, plte: E, frames: b} + } + + function _updateFrame(t, r, i, o, a, s, f) { + const l = Uint8Array, c = Uint32Array, u = new l(t[a - 1]), h = new c(t[a - 1]), + d = a + 1 < t.length ? new l(t[a + 1]) : null, A = new l(t[a]), g = new c(A.buffer); + let p = r, m = i, w = -1, v = -1; + for (let e = 0; e < s.height; e++) for (let t = 0; t < s.width; t++) { + const i = s.x + t, f = s.y + e, l = f * r + i, c = g[l]; + 0 == c || 0 == o[a - 1].dispose && h[l] == c && (null == d || 0 != d[4 * l + 3]) || (i < p && (p = i), i > w && (w = i), f < m && (m = f), f > v && (v = f)) + } + -1 == w && (p = m = w = v = 0), f && (1 == (1 & p) && p--, 1 == (1 & m) && m--), s = { + x: p, + y: m, + width: w - p + 1, + height: v - m + 1 + }; + const b = o[a]; + b.rect = s, b.blend = 1, b.img = new Uint8Array(s.width * s.height * 4), 0 == o[a - 1].dispose ? (e(u, r, i, b.img, s.width, s.height, -s.x, -s.y, 0), _prepareDiff(A, r, i, b.img, s)) : e(A, r, i, b.img, s.width, s.height, -s.x, -s.y, 0) + } + + function _prepareDiff(t, r, i, o, a) { + e(t, r, i, o, a.width, a.height, -a.x, -a.y, 2) + } + + function _filterZero(e, t, r, i, o, a, s) { + const f = []; + let l, c = [0, 1, 2, 3, 4]; + -1 != a ? c = [a] : (t * i > 5e5 || 1 == r) && (c = [0]), s && (l = {level: 0}); + const u = UZIP; + for (var h = 0; h < c.length; h++) { + for (let a = 0; a < t; a++) _filterLine(o, e, a, i, r, c[h]); + f.push(u.deflate(o, l)) + } + let d, A = 1e9; + for (h = 0; h < f.length; h++) f[h].length < A && (d = h, A = f[h].length); + return f[d] + } + + function _filterLine(e, t, i, o, a, s) { + const f = i * o; + let l = f + i; + if (e[l] = s, l++, 0 == s) if (o < 500) for (var c = 0; c < o; c++) e[l + c] = t[f + c]; else e.set(new Uint8Array(t.buffer, f, o), l); else if (1 == s) { + for (c = 0; c < a; c++) e[l + c] = t[f + c]; + for (c = a; c < o; c++) e[l + c] = t[f + c] - t[f + c - a] + 256 & 255 + } else if (0 == i) { + for (c = 0; c < a; c++) e[l + c] = t[f + c]; + if (2 == s) for (c = a; c < o; c++) e[l + c] = t[f + c]; + if (3 == s) for (c = a; c < o; c++) e[l + c] = t[f + c] - (t[f + c - a] >> 1) + 256 & 255; + if (4 == s) for (c = a; c < o; c++) e[l + c] = t[f + c] - r(t[f + c - a], 0, 0) + 256 & 255 + } else { + if (2 == s) for (c = 0; c < o; c++) e[l + c] = t[f + c] + 256 - t[f + c - o] & 255; + if (3 == s) { + for (c = 0; c < a; c++) e[l + c] = t[f + c] + 256 - (t[f + c - o] >> 1) & 255; + for (c = a; c < o; c++) e[l + c] = t[f + c] + 256 - (t[f + c - o] + t[f + c - a] >> 1) & 255 + } + if (4 == s) { + for (c = 0; c < a; c++) e[l + c] = t[f + c] + 256 - r(0, t[f + c - o], 0) & 255; + for (c = a; c < o; c++) e[l + c] = t[f + c] + 256 - r(t[f + c - a], t[f + c - o], t[f + c - a - o]) & 255 + } + } + } + + function quantize(e, t) { + const r = new Uint8Array(e), i = r.slice(0), o = new Uint32Array(i.buffer), a = getKDtree(i, t), + s = a[0], f = a[1], l = r.length, c = new Uint8Array(l >> 2); + let u; + if (r.length < 2e7) for (var h = 0; h < l; h += 4) { + u = getNearest(s, d = r[h] * (1 / 255), A = r[h + 1] * (1 / 255), g = r[h + 2] * (1 / 255), p = r[h + 3] * (1 / 255)), c[h >> 2] = u.ind, o[h >> 2] = u.est.rgba + } else for (h = 0; h < l; h += 4) { + var d = r[h] * (1 / 255), A = r[h + 1] * (1 / 255), g = r[h + 2] * (1 / 255), + p = r[h + 3] * (1 / 255); + for (u = s; u.left;) u = planeDst(u.est, d, A, g, p) <= 0 ? u.left : u.right; + c[h >> 2] = u.ind, o[h >> 2] = u.est.rgba + } + return {abuf: i.buffer, inds: c, plte: f} + } + + function getKDtree(e, t, r) { + null == r && (r = 1e-4); + const i = new Uint32Array(e.buffer), + o = {i0: 0, i1: e.length, bst: null, est: null, tdst: 0, left: null, right: null}; + o.bst = stats(e, o.i0, o.i1), o.est = estats(o.bst); + const a = [o]; + for (; a.length < t;) { + let t = 0, o = 0; + for (var s = 0; s < a.length; s++) a[s].est.L > t && (t = a[s].est.L, o = s); + if (t < r) break; + const f = a[o], l = splitPixels(e, i, f.i0, f.i1, f.est.e, f.est.eMq255); + if (f.i0 >= l || f.i1 <= l) { + f.est.L = 0; + continue + } + const c = {i0: f.i0, i1: l, bst: null, est: null, tdst: 0, left: null, right: null}; + c.bst = stats(e, c.i0, c.i1), c.est = estats(c.bst); + const u = {i0: l, i1: f.i1, bst: null, est: null, tdst: 0, left: null, right: null}; + u.bst = {R: [], m: [], N: f.bst.N - c.bst.N}; + for (s = 0; s < 16; s++) u.bst.R[s] = f.bst.R[s] - c.bst.R[s]; + for (s = 0; s < 4; s++) u.bst.m[s] = f.bst.m[s] - c.bst.m[s]; + u.est = estats(u.bst), f.left = c, f.right = u, a[o] = c, a.push(u) + } + a.sort(((e, t) => t.bst.N - e.bst.N)); + for (s = 0; s < a.length; s++) a[s].ind = s; + return [o, a] + } + + function getNearest(e, t, r, i, o) { + if (null == e.left) return e.tdst = function dist(e, t, r, i, o) { + const a = t - e[0], s = r - e[1], f = i - e[2], l = o - e[3]; + return a * a + s * s + f * f + l * l + }(e.est.q, t, r, i, o), e; + const a = planeDst(e.est, t, r, i, o); + let s = e.left, f = e.right; + a > 0 && (s = e.right, f = e.left); + const l = getNearest(s, t, r, i, o); + if (l.tdst <= a * a) return l; + const c = getNearest(f, t, r, i, o); + return c.tdst < l.tdst ? c : l + } + + function planeDst(e, t, r, i, o) { + const {e: a} = e; + return a[0] * t + a[1] * r + a[2] * i + a[3] * o - e.eMq + } + + function splitPixels(e, t, r, i, o, a) { + for (i -= 4; r < i;) { + for (; vecDot(e, r, o) <= a;) r += 4; + for (; vecDot(e, i, o) > a;) i -= 4; + if (r >= i) break; + const s = t[r >> 2]; + t[r >> 2] = t[i >> 2], t[i >> 2] = s, r += 4, i -= 4 + } + for (; vecDot(e, r, o) > a;) r -= 4; + return r + 4 + } + + function vecDot(e, t, r) { + return e[t] * r[0] + e[t + 1] * r[1] + e[t + 2] * r[2] + e[t + 3] * r[3] + } + + function stats(e, t, r) { + const i = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], o = [0, 0, 0, 0], a = r - t >> 2; + for (let a = t; a < r; a += 4) { + const t = e[a] * (1 / 255), r = e[a + 1] * (1 / 255), s = e[a + 2] * (1 / 255), + f = e[a + 3] * (1 / 255); + o[0] += t, o[1] += r, o[2] += s, o[3] += f, i[0] += t * t, i[1] += t * r, i[2] += t * s, i[3] += t * f, i[5] += r * r, i[6] += r * s, i[7] += r * f, i[10] += s * s, i[11] += s * f, i[15] += f * f + } + return i[4] = i[1], i[8] = i[2], i[9] = i[6], i[12] = i[3], i[13] = i[7], i[14] = i[11], { + R: i, + m: o, + N: a + } + } + + function estats(e) { + const {R: t} = e, {m: r} = e, {N: i} = e, a = r[0], s = r[1], f = r[2], l = r[3], + c = 0 == i ? 0 : 1 / i, + u = [t[0] - a * a * c, t[1] - a * s * c, t[2] - a * f * c, t[3] - a * l * c, t[4] - s * a * c, t[5] - s * s * c, t[6] - s * f * c, t[7] - s * l * c, t[8] - f * a * c, t[9] - f * s * c, t[10] - f * f * c, t[11] - f * l * c, t[12] - l * a * c, t[13] - l * s * c, t[14] - l * f * c, t[15] - l * l * c], + h = u, d = o; + let A = [Math.random(), Math.random(), Math.random(), Math.random()], g = 0, p = 0; + if (0 != i) for (let e = 0; e < 16 && (A = d.multVec(h, A), p = Math.sqrt(d.dot(A, A)), A = d.sml(1 / p, A), !(0 != e && Math.abs(p - g) < 1e-9)); e++) g = p; + const m = [a * c, s * c, f * c, l * c]; + return { + Cov: u, + q: m, + e: A, + L: g, + eMq255: d.dot(d.sml(255, m), A), + eMq: d.dot(A, m), + rgba: (Math.round(255 * m[3]) << 24 | Math.round(255 * m[2]) << 16 | Math.round(255 * m[1]) << 8 | Math.round(255 * m[0]) << 0) >>> 0 + } + } + + var o = { + multVec: (e, t) => [e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3], e[4] * t[0] + e[5] * t[1] + e[6] * t[2] + e[7] * t[3], e[8] * t[0] + e[9] * t[1] + e[10] * t[2] + e[11] * t[3], e[12] * t[0] + e[13] * t[1] + e[14] * t[2] + e[15] * t[3]], + dot: (e, t) => e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3], + sml: (e, t) => [e * t[0], e * t[1], e * t[2], e * t[3]] + }; + UPNG.encode = function encode(e, t, r, i, o, a, s) { + null == i && (i = 0), null == s && (s = !1); + const f = compress(e, t, r, i, [!1, !1, !1, 0, s, !1]); + return compressPNG(f, -1), _main(f, t, r, o, a) + }, UPNG.encodeLL = function encodeLL(e, t, r, i, o, a, s, f) { + const l = {ctype: 0 + (1 == i ? 0 : 2) + (0 == o ? 0 : 4), depth: a, frames: []}, c = (i + o) * a, + u = c * t; + for (let i = 0; i < e.length; i++) l.frames.push({ + rect: {x: 0, y: 0, width: t, height: r}, + img: new Uint8Array(e[i]), + blend: 0, + dispose: 1, + bpp: Math.ceil(c / 8), + bpl: Math.ceil(u / 8) + }); + return compressPNG(l, 0, !0), _main(l, t, r, s, f) + }, UPNG.encode.compress = compress, UPNG.encode.dither = dither, UPNG.quantize = quantize, UPNG.quantize.getKDtree = getKDtree, UPNG.quantize.getNearest = getNearest + }(); + const t = { + toArrayBuffer(e, r) { + const i = e.width, o = e.height, a = i << 2, s = e.getContext("2d").getImageData(0, 0, i, o), + f = new Uint32Array(s.data.buffer), l = (32 * i + 31) / 32 << 2, c = l * o, u = 122 + c, + h = new ArrayBuffer(u), d = new DataView(h), A = 1 << 20; + let g, p, m, w, v = A, b = 0, y = 0, E = 0; + + function set16(e) { + d.setUint16(y, e, !0), y += 2 + } + + function set32(e) { + d.setUint32(y, e, !0), y += 4 + } + + function seek(e) { + y += e + } + + set16(19778), set32(u), seek(4), set32(122), set32(108), set32(i), set32(-o >>> 0), set16(1), set16(32), set32(3), set32(c), set32(2835), set32(2835), seek(8), set32(16711680), set32(65280), set32(255), set32(4278190080), set32(1466527264), function convert() { + for (; b < o && v > 0;) { + for (w = 122 + b * l, g = 0; g < a;) v--, p = f[E++], m = p >>> 24, d.setUint32(w + g, p << 8 | m), g += 4; + b++ + } + E < f.length ? (v = A, setTimeout(convert, t._dly)) : r(h) + }() + }, toBlob(e, t) { + this.toArrayBuffer(e, (e => { + t(new Blob([e], {type: "image/bmp"})) + })) + }, _dly: 9 + }; + var r = { + CHROME: "CHROME", + FIREFOX: "FIREFOX", + DESKTOP_SAFARI: "DESKTOP_SAFARI", + IE: "IE", + IOS: "IOS", + ETC: "ETC" + }, i = { + [r.CHROME]: 16384, + [r.FIREFOX]: 11180, + [r.DESKTOP_SAFARI]: 16384, + [r.IE]: 8192, + [r.IOS]: 4096, + [r.ETC]: 8192 + }; + const o = "undefined" != typeof window, + a = "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope, + s = o && window.cordova && window.cordova.require && window.cordova.require("cordova/modulemapper"), + CustomFile = (o || a) && (s && s.getOriginalSymbol(window, "File") || "undefined" != typeof File && File), + CustomFileReader = (o || a) && (s && s.getOriginalSymbol(window, "FileReader") || "undefined" != typeof FileReader && FileReader); + + function getFilefromDataUrl(e, t, r = Date.now()) { + return new Promise((i => { + const o = e.split(","), a = o[0].match(/:(.*?);/)[1], s = globalThis.atob(o[1]); + let f = s.length; + const l = new Uint8Array(f); + for (; f--;) l[f] = s.charCodeAt(f); + const c = new Blob([l], {type: a}); + c.name = t, c.lastModified = r, i(c) + })) + } + + function getDataUrlFromFile(e) { + return new Promise(((t, r) => { + const i = new CustomFileReader; + i.onload = () => t(i.result), i.onerror = e => r(e), i.readAsDataURL(e) + })) + } + + function loadImage(e) { + return new Promise(((t, r) => { + const i = new Image; + i.onload = () => t(i), i.onerror = e => r(e), i.src = e + })) + } + + function getBrowserName() { + if (void 0 !== getBrowserName.cachedResult) return getBrowserName.cachedResult; + let e = r.ETC; + const {userAgent: t} = navigator; + return /Chrom(e|ium)/i.test(t) ? e = r.CHROME : /iP(ad|od|hone)/i.test(t) && /WebKit/i.test(t) ? e = r.IOS : /Safari/i.test(t) ? e = r.DESKTOP_SAFARI : /Firefox/i.test(t) ? e = r.FIREFOX : (/MSIE/i.test(t) || !0 == !!document.documentMode) && (e = r.IE), getBrowserName.cachedResult = e, getBrowserName.cachedResult + } + + function approximateBelowMaximumCanvasSizeOfBrowser(e, t) { + const r = getBrowserName(), o = i[r]; + let a = e, s = t, f = a * s; + const l = a > s ? s / a : a / s; + for (; f > o * o;) { + const e = (o + a) / 2, t = (o + s) / 2; + e < t ? (s = t, a = t * l) : (s = e * l, a = e), f = a * s + } + return {width: a, height: s} + } + + function getNewCanvasAndCtx(e, t) { + let r, i; + try { + if (r = new OffscreenCanvas(e, t), i = r.getContext("2d"), null === i) throw new Error("getContext of OffscreenCanvas returns null") + } catch (e) { + r = document.createElement("canvas"), i = r.getContext("2d") + } + return r.width = e, r.height = t, [r, i] + } + + function drawImageInCanvas(e, t) { + const { + width: r, + height: i + } = approximateBelowMaximumCanvasSizeOfBrowser(e.width, e.height), [o, a] = getNewCanvasAndCtx(r, i); + return t && /jpe?g/.test(t) && (a.fillStyle = "white", a.fillRect(0, 0, o.width, o.height)), a.drawImage(e, 0, 0, o.width, o.height), o + } + + function isIOS() { + return void 0 !== isIOS.cachedResult || (isIOS.cachedResult = ["iPad Simulator", "iPhone Simulator", "iPod Simulator", "iPad", "iPhone", "iPod"].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "undefined" != typeof document && "ontouchend" in document), isIOS.cachedResult + } + + function drawFileInCanvas(e, t = {}) { + return new Promise((function (i, o) { + let a, s; + var $Try_2_Post = function () { + try { + return s = drawImageInCanvas(a, t.fileType || e.type), i([a, s]) + } catch (e) { + return o(e) + } + }, $Try_2_Catch = function (t) { + try { + 0; + var $Try_3_Catch = function (e) { + try { + throw e + } catch (e) { + return o(e) + } + }; + try { + let t; + return getDataUrlFromFile(e).then((function (e) { + try { + return t = e, loadImage(t).then((function (e) { + try { + return a = e, function () { + try { + return $Try_2_Post() + } catch (e) { + return o(e) + } + }() + } catch (e) { + return $Try_3_Catch(e) + } + }), $Try_3_Catch) + } catch (e) { + return $Try_3_Catch(e) + } + }), $Try_3_Catch) + } catch (e) { + $Try_3_Catch(e) + } + } catch (e) { + return o(e) + } + }; + try { + if (isIOS() || [r.DESKTOP_SAFARI, r.MOBILE_SAFARI].includes(getBrowserName())) throw new Error("Skip createImageBitmap on IOS and Safari"); + return createImageBitmap(e).then((function (e) { + try { + return a = e, $Try_2_Post() + } catch (e) { + return $Try_2_Catch() + } + }), $Try_2_Catch) + } catch (e) { + $Try_2_Catch() + } + })) + } + + function canvasToFile(e, r, i, o, a = 1) { + return new Promise((function (s, f) { + let l; + if ("image/png" === r) { + let c, u, h; + return c = e.getContext("2d"), ({data: u} = c.getImageData(0, 0, e.width, e.height)), h = UPNG.encode([u.buffer], e.width, e.height, 4096 * a), l = new Blob([h], {type: r}), l.name = i, l.lastModified = o, $If_4.call(this) + } + { + if ("image/bmp" === r) return new Promise((r => t.toBlob(e, r))).then(function (e) { + try { + return l = e, l.name = i, l.lastModified = o, $If_5.call(this) + } catch (e) { + return f(e) + } + }.bind(this), f); + { + if ("function" == typeof OffscreenCanvas && e instanceof OffscreenCanvas) return e.convertToBlob({ + type: r, + quality: a + }).then(function (e) { + try { + return l = e, l.name = i, l.lastModified = o, $If_6.call(this) + } catch (e) { + return f(e) + } + }.bind(this), f); + { + let d; + return d = e.toDataURL(r, a), getFilefromDataUrl(d, i, o).then(function (e) { + try { + return l = e, $If_6.call(this) + } catch (e) { + return f(e) + } + }.bind(this), f) + } + + function $If_6() { + return $If_5.call(this) + } + } + + function $If_5() { + return $If_4.call(this) + } + } + + function $If_4() { + return s(l) + } + })) + } + + function cleanupCanvasMemory(e) { + e.width = 0, e.height = 0 + } + + function isAutoOrientationInBrowser() { + return new Promise((function (e, t) { + let r, i, o, a, s; + return void 0 !== isAutoOrientationInBrowser.cachedResult ? e(isAutoOrientationInBrowser.cachedResult) : (r = "data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==", getFilefromDataUrl("data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==", "test.jpg", Date.now()).then((function (r) { + try { + return i = r, drawFileInCanvas(i).then((function (r) { + try { + return o = r[1], canvasToFile(o, i.type, i.name, i.lastModified).then((function (r) { + try { + return a = r, cleanupCanvasMemory(o), drawFileInCanvas(a).then((function (r) { + try { + return s = r[0], isAutoOrientationInBrowser.cachedResult = 1 === s.width && 2 === s.height, e(isAutoOrientationInBrowser.cachedResult) + } catch (e) { + return t(e) + } + }), t) + } catch (e) { + return t(e) + } + }), t) + } catch (e) { + return t(e) + } + }), t) + } catch (e) { + return t(e) + } + }), t)) + })) + } + + function getExifOrientation(e) { + return new Promise(((t, r) => { + const i = new CustomFileReader; + i.onload = e => { + const r = new DataView(e.target.result); + if (65496 != r.getUint16(0, !1)) return t(-2); + const i = r.byteLength; + let o = 2; + for (; o < i;) { + if (r.getUint16(o + 2, !1) <= 8) return t(-1); + const e = r.getUint16(o, !1); + if (o += 2, 65505 == e) { + if (1165519206 != r.getUint32(o += 2, !1)) return t(-1); + const e = 18761 == r.getUint16(o += 6, !1); + o += r.getUint32(o + 4, e); + const i = r.getUint16(o, e); + o += 2; + for (let a = 0; a < i; a++) if (274 == r.getUint16(o + 12 * a, e)) return t(r.getUint16(o + 12 * a + 8, e)) + } else { + if (65280 != (65280 & e)) break; + o += r.getUint16(o, !1) + } + } + return t(-1) + }, i.onerror = e => r(e), i.readAsArrayBuffer(e) + })) + } + + function handleMaxWidthOrHeight(e, t) { + const {width: r} = e, {height: i} = e, {maxWidthOrHeight: o} = t; + let a, s = e; + return isFinite(o) && (r > o || i > o) && ([s, a] = getNewCanvasAndCtx(r, i), r > i ? (s.width = o, s.height = i / r * o) : (s.width = r / i * o, s.height = o), a.drawImage(e, 0, 0, s.width, s.height), cleanupCanvasMemory(e)), s + } + + function followExifOrientation(e, t) { + const {width: r} = e, {height: i} = e, [o, a] = getNewCanvasAndCtx(r, i); + switch (t > 4 && t < 9 ? (o.width = i, o.height = r) : (o.width = r, o.height = i), t) { + case 2: + a.transform(-1, 0, 0, 1, r, 0); + break; + case 3: + a.transform(-1, 0, 0, -1, r, i); + break; + case 4: + a.transform(1, 0, 0, -1, 0, i); + break; + case 5: + a.transform(0, 1, 1, 0, 0, 0); + break; + case 6: + a.transform(0, 1, -1, 0, i, 0); + break; + case 7: + a.transform(0, -1, -1, 0, i, r); + break; + case 8: + a.transform(0, -1, 1, 0, 0, r) + } + return a.drawImage(e, 0, 0, r, i), cleanupCanvasMemory(e), o + } + + function compress(e, t, r = 0) { + return new Promise((function (i, o) { + let a, s, f, l, c, u, h, d, A, g, p, m, w, v, b, y, E, F, _, B; + + function incProgress(e = 5) { + if (t.signal && t.signal.aborted) throw t.signal.reason; + a += e, t.onProgress(Math.min(a, 100)) + } + + function setProgress(e) { + if (t.signal && t.signal.aborted) throw t.signal.reason; + a = Math.min(Math.max(e, a), 100), t.onProgress(a) + } + + return a = r, s = t.maxIteration || 10, f = 1024 * t.maxSizeMB * 1024, incProgress(), drawFileInCanvas(e, t).then(function (r) { + try { + return [, l] = r, incProgress(), c = handleMaxWidthOrHeight(l, t), incProgress(), new Promise((function (r, i) { + var o; + if (!(o = t.exifOrientation)) return getExifOrientation(e).then(function (e) { + try { + return o = e, $If_2.call(this) + } catch (e) { + return i(e) + } + }.bind(this), i); + + function $If_2() { + return r(o) + } + + return $If_2.call(this) + })).then(function (r) { + try { + return u = r, incProgress(), isAutoOrientationInBrowser().then(function (r) { + try { + return h = r ? c : followExifOrientation(c, u), incProgress(), d = t.initialQuality || 1, A = t.fileType || e.type, canvasToFile(h, A, e.name, e.lastModified, d).then(function (r) { + try { + { + if (g = r, incProgress(), p = g.size > f, m = g.size > e.size, !p && !m) return setProgress(100), i(g); + var a; + + function $Loop_3() { + if (s-- && (b > f || b > w)) { + let t, r; + return t = B ? .95 * _.width : _.width, r = B ? .95 * _.height : _.height, [E, F] = getNewCanvasAndCtx(t, r), F.drawImage(_, 0, 0, t, r), d *= "image/png" === A ? .85 : .95, canvasToFile(E, A, e.name, e.lastModified, d).then((function (e) { + try { + return y = e, cleanupCanvasMemory(_), _ = E, b = y.size, setProgress(Math.min(99, Math.floor((v - b) / (v - f) * 100))), $Loop_3 + } catch (e) { + return o(e) + } + }), o) + } + return [1] + } + + return w = e.size, v = g.size, b = v, _ = h, B = !t.alwaysKeepResolution && p, (a = function (e) { + for (; e;) { + if (e.then) return void e.then(a, o); + try { + if (e.pop) { + if (e.length) return e.pop() ? $Loop_3_exit.call(this) : e; + e = $Loop_3 + } else e = e.call(this) + } catch (e) { + return o(e) + } + } + }.bind(this))($Loop_3); + + function $Loop_3_exit() { + return cleanupCanvasMemory(_), cleanupCanvasMemory(E), cleanupCanvasMemory(c), cleanupCanvasMemory(h), cleanupCanvasMemory(l), setProgress(100), i(y) + } + } + } catch (u) { + return o(u) + } + }.bind(this), o) + } catch (e) { + return o(e) + } + }.bind(this), o) + } catch (e) { + return o(e) + } + }.bind(this), o) + } catch (e) { + return o(e) + } + }.bind(this), o) + })) + } + + const f = "\nlet scriptImported = false\nself.addEventListener('message', async (e) => {\n const { file, id, imageCompressionLibUrl, options } = e.data\n options.onProgress = (progress) => self.postMessage({ progress, id })\n try {\n if (!scriptImported) {\n // console.log('[worker] importScripts', imageCompressionLibUrl)\n self.importScripts(imageCompressionLibUrl)\n scriptImported = true\n }\n // console.log('[worker] self', self)\n const compressedFile = await imageCompression(file, options)\n self.postMessage({ file: compressedFile, id })\n } catch (e) {\n // console.error('[worker] error', e)\n self.postMessage({ error: e.message + '\\n' + e.stack, id })\n }\n})\n"; + let l; + + function compressOnWebWorker(e, t) { + return new Promise(((r, i) => { + l || (l = function createWorkerScriptURL(e) { + const t = []; + return "function" == typeof e ? t.push(`(${e})()`) : t.push(e), URL.createObjectURL(new Blob(t)) + }(f)); + const o = new Worker(l); + o.addEventListener("message", (function handler(e) { + if (t.signal && t.signal.aborted) o.terminate(); else if (void 0 === e.data.progress) { + if (e.data.error) return i(new Error(e.data.error)), void o.terminate(); + r(e.data.file), o.terminate() + } else t.onProgress(e.data.progress) + })), o.addEventListener("error", i), t.signal && t.signal.addEventListener("abort", (() => { + i(t.signal.reason), o.terminate() + })), o.postMessage({ + file: e, + imageCompressionLibUrl: t.libURL, + options: {...t, onProgress: void 0, signal: void 0} + }) + })) + } + + function imageCompression(e, t) { + return new Promise((function (r, i) { + let o, a, s, f, l, c; + if (o = {...t}, s = 0, ({onProgress: f} = o), o.maxSizeMB = o.maxSizeMB || Number.POSITIVE_INFINITY, l = "boolean" != typeof o.useWebWorker || o.useWebWorker, delete o.useWebWorker, o.onProgress = e => { + s = e, "function" == typeof f && f(s) + }, !(1 || e instanceof Blob || e instanceof CustomFile)) return i(new Error("The file given is not an instance of Blob or File")); + if (!/^image/.test(e.type)) return i(new Error("The file given is not an image")); + if (c = "undefined" != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope, !l || "function" != typeof Worker || c) return compress(e, o).then(function (e) { + try { + return a = e, $If_4.call(this) + } catch (e) { + return i(e) + } + }.bind(this), i); + var u = function () { + try { + return $If_4.call(this) + } catch (e) { + return i(e) + } + }.bind(this), $Try_1_Catch = function (t) { + try { + return compress(e, o).then((function (e) { + try { + return a = e, u() + } catch (e) { + return i(e) + } + }), i) + } catch (e) { + return i(e) + } + }; + try { + return o.libURL = o.libURL || "https://cdn.bootcdn.net/ajax/libs/browser-image-compression/2.0.2/browser-image-compression.js", compressOnWebWorker(e, o).then((function (e) { + try { + return a = e, u() + } catch (e) { + return $Try_1_Catch() + } + }), $Try_1_Catch) + } catch (e) { + $Try_1_Catch() + } + + function $If_4() { + try { + a.name = e.name, a.lastModified = e.lastModified + } catch (e) { + } + try { + o.preserveExif && "image/jpeg" === e.type && (!o.fileType || o.fileType && o.fileType === e.type) && (a = copyExifWithoutOrientation(e, a)) + } catch (e) { + } + return r(a) + } + })) + } + + return imageCompression.getDataUrlFromFile = getDataUrlFromFile, imageCompression.getFilefromDataUrl = getFilefromDataUrl, imageCompression.loadImage = loadImage, imageCompression.drawImageInCanvas = drawImageInCanvas, imageCompression.drawFileInCanvas = drawFileInCanvas, imageCompression.canvasToFile = canvasToFile, imageCompression.getExifOrientation = getExifOrientation, imageCompression.handleMaxWidthOrHeight = handleMaxWidthOrHeight, imageCompression.followExifOrientation = followExifOrientation, imageCompression.cleanupCanvasMemory = cleanupCanvasMemory, imageCompression.isAutoOrientationInBrowser = isAutoOrientationInBrowser, imageCompression.approximateBelowMaximumCanvasSizeOfBrowser = approximateBelowMaximumCanvasSizeOfBrowser, imageCompression.copyExifWithoutOrientation = copyExifWithoutOrientation, imageCompression.getBrowserName = getBrowserName, imageCompression.version = "2.0.2", imageCompression + })); + return { + // { + // maxSizeMB: number, // (default: Number.POSITIVE_INFINITY) + // maxWidthOrHeight: number, // compressedFile will scale down by ratio to a point that width or height is smaller than maxWidthOrHeight (default: undefined) + // // but, automatically reduce the size to smaller than the maximum Canvas size supported by each browser. + // // Please check the Caveat part for details. + // onProgress: Function, // optional, a function takes one progress argument (percentage from 0 to 100) + // useWebWorker: boolean, // optional, use multi-thread web worker, fallback to run in main-thread (default: true) + // libURL: string, // optional, the libURL of this library for importing script in Web Worker (default: https://cdn.jsdelivr.net/npm/browser-image-compression/dist/browser-image-compression.js) + // preserveExif: boolean, // optional, use preserve Exif metadata for JPEG image e.g., Camera model, Focal length, etc (default: false) + // + // signal: AbortSignal, // optional, to abort / cancel the compression + // + // // following options are for advanced users + // maxIteration: number, // optional, max number of iteration to compress the image (default: 10) + // exifOrientation: number, // optional, see https://stackoverflow.com/a/32490603/10395024 + // fileType: string, // optional, fileType override e.g., 'image/jpeg', 'image/png' (default: file.type) + // initialQuality: number, // optional, initial quality value between 0 and 1 (default: 1) + // alwaysKeepResolution: boolean // optional, only reduce quality, always keep width and height (default: false) + // } + compress: function (file, option) { + return imageCompression(file, option); + } + }; +})(); + + +// core/dialog.js +UE.dialog = (function () { + return { + loadingPlaceholder: function (me) { + var loadingId = "loading_" + (+new Date()).toString(36); + me.focus(); + me.execCommand( + "inserthtml", + '' + ); + return loadingId; + }, + removeLoadingPlaceholder: function (me, loadingId) { + var loader = me.document.getElementById(loadingId); + if (loader) { + domUtils.remove(loader, false); + } + }, + tipError: function (me, title) { + me.fireEvent("showmessage", { + content: title, + type: "error", + timeout: 4000 + }); + } } - }; })(); @@ -9254,209 +12654,210 @@ UE.ajax = (function() { * UE.filterWord(html); * ``` */ -var filterWord = (UE.filterWord = (function() { - //是否是word过来的内容 - function isWordDocument(str) { - return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test( - str - ); - } - //去掉小数 - function transUnit(v) { - v = v.replace(/[\d.]+\w+/g, function(m) { - return utils.transUnitToPx(m); - }); - return v; - } +var filterWord = (UE.filterWord = (function () { + //是否是word过来的内容 + function isWordDocument(str) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test( + str + ); + } - function filterPasteWord(str) { - return ( - str - .replace(/[\t\r\n]+/g, " ") - .replace(//gi, "") - //转换图片 - .replace(/]*>[\s\S]*?.<\/v:shape>/gi, function(str) { - //opera能自己解析出image所这里直接返回空 - if (browser.opera) { - return ""; - } - try { - //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 - if (/Bitmap/i.test(str)) { - return ""; - } - var width = str.match(/width:([ \d.]*p[tx])/i)[1], - height = str.match(/height:([ \d.]*p[tx])/i)[1], - src = str.match(/src=\s*"([^"]*)"/i)[1]; - return ( - '' - ); - } catch (e) { - return ""; - } - }) - //针对wps添加的多余标签处理 - .replace(/<\/?div[^>]*>/g, "") - //去掉多余的属性 - .replace(/v:\w+=(["']?)[^'"]+\1/g, "") - .replace( - /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, - "" - ) - .replace( - /

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, - "

      $1

      " - ) - //去掉多余的属性 - .replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi, function( - str, - name, - marks, - val - ) { - //保留list的标示 - return name == "class" && val == "MsoListParagraph" ? str : ""; - }) - //清除多余的font/span不能匹配 有可能是空格 - .replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function(a, b, c) { - return c.replace(/[\t\r\n ]+/g, " "); - }) - //处理style的问题 - .replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( - str, - tag, - tmp, - style - ) { - var n = [], - s = style - .replace(/^\s+|\s+$/, "") - .replace(/'/g, "'") - .replace(/"/gi, "'") - .replace(/[\d.]+(cm|pt)/g, function(str) { - return utils.transUnitToPx(str); - }) - .split(/;\s*/g); + //去掉小数 + function transUnit(v) { + v = v.replace(/[\d.]+\w+/g, function (m) { + return utils.transUnitToPx(m); + }); + return v; + } - for (var i = 0, v; (v = s[i]); i++) { - var name, - value, - parts = v.split(":"); + function filterPasteWord(str) { + return ( + str + .replace(/[\t\r\n]+/g, " ") + .replace(//gi, "") + //转换图片 + .replace(/]*>[\s\S]*?.<\/v:shape>/gi, function (str) { + //opera能自己解析出image所这里直接返回空 + if (browser.opera) { + return ""; + } + try { + //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 + if (/Bitmap/i.test(str)) { + return ""; + } + var width = str.match(/width:([ \d.]*p[tx])/i)[1], + height = str.match(/height:([ \d.]*p[tx])/i)[1], + src = str.match(/src=\s*"([^"]*)"/i)[1]; + return ( + '' + ); + } catch (e) { + return ""; + } + }) + //针对wps添加的多余标签处理 + .replace(/<\/?div[^>]*>/g, "") + //去掉多余的属性 + .replace(/v:\w+=(["']?)[^'"]+\1/g, "") + .replace( + /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, + "" + ) + .replace( + /

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, + "

      $1

      " + ) + //去掉多余的属性 + .replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi, function ( + str, + name, + marks, + val + ) { + //保留list的标示 + return name == "class" && val == "MsoListParagraph" ? str : ""; + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function (a, b, c) { + return c.replace(/[\t\r\n ]+/g, " "); + }) + //处理style的问题 + .replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function ( + str, + tag, + tmp, + style + ) { + var n = [], + s = style + .replace(/^\s+|\s+$/, "") + .replace(/'/g, "'") + .replace(/"/gi, "'") + .replace(/[\d.]+(cm|pt)/g, function (str) { + return utils.transUnitToPx(str); + }) + .split(/;\s*/g); - if (parts.length == 2) { - name = parts[0].toLowerCase(); - value = parts[1].toLowerCase(); - if ( - (/^(background)\w*/.test(name) && - value.replace(/(initial|\s)/g, "").length == 0) || - (/^(margin)\w*/.test(name) && /^0\w+$/.test(value)) - ) { - continue; - } + for (var i = 0, v; (v = s[i]); i++) { + var name, + value, + parts = v.split(":"); - switch (name) { - case "mso-padding-alt": - case "mso-padding-top-alt": - case "mso-padding-right-alt": - case "mso-padding-bottom-alt": - case "mso-padding-left-alt": - case "mso-margin-alt": - case "mso-margin-top-alt": - case "mso-margin-right-alt": - case "mso-margin-bottom-alt": - case "mso-margin-left-alt": - //ie下会出现挤到一起的情况 - //case "mso-table-layout-alt": - case "mso-height": - case "mso-width": - case "mso-vertical-align-alt": - //trace:1819 ff下会解析出padding在table上 - if (!/
    " + lang.titleName + "" + lang.titleName + "" + lang.titleName + "
    " + lang.titleName + "" + lang.titleName + "" + lang.cellsName + "
    ]/.test(html)) { - return UE.htmlparser(html).children[0]; - } else { - return new uNode({ - type: "element", - children: [], - tagName: html - }); - } - }; - uNode.createText = function(data, noTrans) { - return new UE.uNode({ - type: "text", - data: noTrans ? data : utils.unhtml(data || "") + var uNode = (UE.uNode = function (obj) { + this.type = obj.type; + this.data = obj.data; + this.tagName = obj.tagName; + this.parentNode = obj.parentNode; + this.attrs = obj.attrs || {}; + this.children = obj.children; }); - }; - function nodeToHtml(node, arr, formatter, current) { - switch (node.type) { - case "root": - for (var i = 0, ci; (ci = node.children[i++]); ) { - //插入新行 - if ( - formatter && - ci.type == "element" && - !dtd.$inlineWithA[ci.tagName] && - i > 1 - ) { - insertLine(arr, current, true); - insertIndent(arr, current); - } - nodeToHtml(ci, arr, formatter, current); + + var notTransAttrs = { + href: 1, + src: 1, + _src: 1, + _href: 1, + cdata_data: 1 + }; + + var notTransTagName = { + style: 1, + script: 1 + }; + + var indentChar = " ", + breakChar = "\n"; + + function insertLine(arr, current, begin) { + arr.push(breakChar); + return current + (begin ? 1 : -1); + } + + function insertIndent(arr, current) { + //插入缩进 + for (var i = 0; i < current; i++) { + arr.push(indentChar); } - break; - case "text": - isText(node, arr); - break; - case "element": - isElement(node, arr, formatter, current); - break; - case "comment": - isComment(node, arr, formatter); } - return arr; - } - function isText(node, arr) { - if (node.parentNode.tagName == "pre") { - //源码模式下输入html标签,不能做转换处理,直接输出 - arr.push(node.data); - } else { - arr.push( - notTransTagName[node.parentNode.tagName] - ? utils.html(node.data) - : node.data.replace(/[ ]{2}/g, "  ") - ); + //创建uNode的静态方法 + //支持标签和html + uNode.createElement = function (html) { + if (/[<>]/.test(html)) { + return UE.htmlparser(html).children[0]; + } else { + return new uNode({ + type: "element", + children: [], + tagName: html + }); + } + }; + uNode.createText = function (data, noTrans) { + return new UE.uNode({ + type: "text", + data: noTrans ? data : utils.unhtml(data || "") + }); + }; + + function nodeToHtml(node, arr, formatter, current) { + switch (node.type) { + case "root": + for (var i = 0, ci; (ci = node.children[i++]);) { + //插入新行 + if ( + formatter && + ci.type == "element" && + !dtd.$inlineWithA[ci.tagName] && + i > 1 + ) { + insertLine(arr, current, true); + insertIndent(arr, current); + } + nodeToHtml(ci, arr, formatter, current); + } + break; + case "text": + isText(node, arr); + break; + case "element": + isElement(node, arr, formatter, current); + break; + case "comment": + isComment(node, arr, formatter); + } + return arr; } - } - function isElement(node, arr, formatter, current) { - var attrhtml = ""; - if (node.attrs) { - attrhtml = []; - var attrs = node.attrs; - for (var a in attrs) { - //这里就针对 - //

    '

    - //这里边的\"做转换,要不用innerHTML直接被截断了,属性src - //有可能做的不够 - attrhtml.push( - a + - (attrs[a] !== undefined - ? '="' + - (notTransAttrs[a] - ? utils.html(attrs[a]).replace(/["]/g, function(a) { - return """; - }) - : utils.unhtml(attrs[a])) + - '"' - : "") + function isText(node, arr) { + if (node.parentNode.tagName == "pre") { + //源码模式下输入html标签,不能做转换处理,直接输出 + arr.push(node.data); + } else { + arr.push( + notTransTagName[node.parentNode.tagName] + ? utils.html(node.data) + : node.data.replace(/[ ]{2}/g, "  ") + ); + } + } + + function isElement(node, arr, formatter, current) { + var attrhtml = ""; + if (node.attrs) { + attrhtml = []; + var attrs = node.attrs; + for (var a in attrs) { + //这里就针对 + //

    '

    + //这里边的\"做转换,要不用innerHTML直接被截断了,属性src + //有可能做的不够 + attrhtml.push( + a + + (attrs[a] !== undefined + ? '="' + + (notTransAttrs[a] + ? utils.html(attrs[a]).replace(/["]/g, function (a) { + return """; + }) + : utils.unhtml(attrs[a])) + + '"' + : "") + ); + } + attrhtml = attrhtml.join(" "); + } + arr.push( + "<" + + node.tagName + + (attrhtml ? " " + attrhtml : "") + + (dtd.$empty[node.tagName] ? "/" : "") + + ">" ); - } - attrhtml = attrhtml.join(" "); - } - arr.push( - "<" + - node.tagName + - (attrhtml ? " " + attrhtml : "") + - (dtd.$empty[node.tagName] ? "/" : "") + - ">" - ); - //插入新行 - if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != "pre") { - if (node.children && node.children.length) { - current = insertLine(arr, current, true); - insertIndent(arr, current); - } - } - if (node.children && node.children.length) { - for (var i = 0, ci; (ci = node.children[i++]); ) { - if ( - formatter && - ci.type == "element" && - !dtd.$inlineWithA[ci.tagName] && - i > 1 - ) { - insertLine(arr, current); - insertIndent(arr, current); + //插入新行 + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != "pre") { + if (node.children && node.children.length) { + current = insertLine(arr, current, true); + insertIndent(arr, current); + } } - nodeToHtml(ci, arr, formatter, current); - } - } - if (!dtd.$empty[node.tagName]) { - if ( - formatter && - !dtd.$inlineWithA[node.tagName] && - node.tagName != "pre" - ) { if (node.children && node.children.length) { - current = insertLine(arr, current); - insertIndent(arr, current); + for (var i = 0, ci; (ci = node.children[i++]);) { + if ( + formatter && + ci.type == "element" && + !dtd.$inlineWithA[ci.tagName] && + i > 1 + ) { + insertLine(arr, current); + insertIndent(arr, current); + } + nodeToHtml(ci, arr, formatter, current); + } } - } - arr.push(""); - } - } - - function isComment(node, arr) { - arr.push(""); - } - - function getNodeById(root, id) { - var node; - if (root.type == "element" && root.getAttr("id") == id) { - return root; - } - if (root.children && root.children.length) { - for (var i = 0, ci; (ci = root.children[i++]); ) { - if ((node = getNodeById(ci, id))) { - return node; + if (!dtd.$empty[node.tagName]) { + if ( + formatter && + !dtd.$inlineWithA[node.tagName] && + node.tagName != "pre" + ) { + if (node.children && node.children.length) { + current = insertLine(arr, current); + insertIndent(arr, current); + } + } + arr.push(""); } - } } - } - function getNodesByTagName(node, tagName, arr) { - if (node.type == "element" && node.tagName == tagName) { - arr.push(node); + function isComment(node, arr) { + arr.push(""); } - if (node.children && node.children.length) { - for (var i = 0, ci; (ci = node.children[i++]); ) { - getNodesByTagName(ci, tagName, arr); - } - } - } - function nodeTraversal(root, fn) { - if (root.children && root.children.length) { - for (var i = 0, ci; (ci = root.children[i]); ) { - nodeTraversal(ci, fn); - //ci被替换的情况,这里就不再走 fn了 - if (ci.parentNode) { - if (ci.children && ci.children.length) { - fn(ci); - } - if (ci.parentNode) i++; + + function getNodeById(root, id) { + var node; + if (root.type == "element" && root.getAttr("id") == id) { + return root; + } + if (root.children && root.children.length) { + for (var i = 0, ci; (ci = root.children[i++]);) { + if ((node = getNodeById(ci, id))) { + return node; + } + } } - } - } else { - fn(root); } - } - uNode.prototype = { - /** + + function getNodesByTagName(node, tagName, arr) { + if (node.type == "element" && node.tagName == tagName) { + arr.push(node); + } + if (node.children && node.children.length) { + for (var i = 0, ci; (ci = node.children[i++]);) { + getNodesByTagName(ci, tagName, arr); + } + } + } + + function nodeTraversal(root, fn) { + if (root.children && root.children.length) { + for (var i = 0, ci; (ci = root.children[i]);) { + nodeTraversal(ci, fn); + //ci被替换的情况,这里就不再走 fn了 + if (ci.parentNode) { + if (ci.children && ci.children.length) { + fn(ci); + } + if (ci.parentNode) i++; + } + } + } else { + fn(root); + } + } + + uNode.prototype = { + /** * 当前节点对象,转换成html文本 * @method toHtml * @return { String } 返回转换后的html字符串 @@ -9717,7 +13121,7 @@ var filterWord = (UE.filterWord = (function() { * ``` */ - /** + /** * 当前节点对象,转换成html文本 * @method toHtml * @param { Boolean } formatter 是否格式化返回值 @@ -9727,13 +13131,13 @@ var filterWord = (UE.filterWord = (function() { * node.toHtml( true ); * ``` */ - toHtml: function(formatter) { - var arr = []; - nodeToHtml(this, arr, formatter, 0); - return arr.join(""); - }, + toHtml: function (formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join(""); + }, - /** + /** * 获取节点的html内容 * @method innerHTML * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 @@ -9744,7 +13148,7 @@ var filterWord = (UE.filterWord = (function() { * ``` */ - /** + /** * 设置节点的html内容 * @method innerHTML * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 @@ -9755,33 +13159,33 @@ var filterWord = (UE.filterWord = (function() { * node.innerHTML('text'); * ``` */ - innerHTML: function(htmlstr) { - if (this.type != "element" || dtd.$empty[this.tagName]) { - return this; - } - if (utils.isString(htmlstr)) { - if (this.children) { - for (var i = 0, ci; (ci = this.children[i++]); ) { - ci.parentNode = null; - } - } - this.children = []; - var tmpRoot = UE.htmlparser(htmlstr); - for (var i = 0, ci; (ci = tmpRoot.children[i++]); ) { - this.children.push(ci); - ci.parentNode = this; - } - return this; - } else { - var tmpRoot = new UE.uNode({ - type: "root", - children: this.children - }); - return tmpRoot.toHtml(); - } - }, + innerHTML: function (htmlstr) { + if (this.type != "element" || dtd.$empty[this.tagName]) { + return this; + } + if (utils.isString(htmlstr)) { + if (this.children) { + for (var i = 0, ci; (ci = this.children[i++]);) { + ci.parentNode = null; + } + } + this.children = []; + var tmpRoot = UE.htmlparser(htmlstr); + for (var i = 0, ci; (ci = tmpRoot.children[i++]);) { + this.children.push(ci); + ci.parentNode = this; + } + return this; + } else { + var tmpRoot = new UE.uNode({ + type: "root", + children: this.children + }); + return tmpRoot.toHtml(); + } + }, - /** + /** * 获取节点的纯文本内容 * @method innerText * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 @@ -9792,7 +13196,7 @@ var filterWord = (UE.filterWord = (function() { * ``` */ - /** + /** * 设置节点的纯文本内容 * @method innerText * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 @@ -9803,25 +13207,25 @@ var filterWord = (UE.filterWord = (function() { * node.innerText('text'); * ``` */ - innerText: function(textStr, noTrans) { - if (this.type != "element" || dtd.$empty[this.tagName]) { - return this; - } - if (textStr) { - if (this.children) { - for (var i = 0, ci; (ci = this.children[i++]); ) { - ci.parentNode = null; - } - } - this.children = []; - this.appendChild(uNode.createText(textStr, noTrans)); - return this; - } else { - return this.toHtml().replace(/<[^>]+>/g, ""); - } - }, + innerText: function (textStr, noTrans) { + if (this.type != "element" || dtd.$empty[this.tagName]) { + return this; + } + if (textStr) { + if (this.children) { + for (var i = 0, ci; (ci = this.children[i++]);) { + ci.parentNode = null; + } + } + this.children = []; + this.appendChild(uNode.createText(textStr, noTrans)); + return this; + } else { + return this.toHtml().replace(/<[^>]+>/g, ""); + } + }, - /** + /** * 获取当前对象的data属性 * @method getData * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 @@ -9830,12 +13234,12 @@ var filterWord = (UE.filterWord = (function() { * node.getData(); * ``` */ - getData: function() { - if (this.type == "element") return ""; - return this.data; - }, + getData: function () { + if (this.type == "element") return ""; + return this.data; + }, - /** + /** * 获取当前节点下的第一个子节点 * @method firstChild * @return { UE.uNode } 返回第一个子节点 @@ -9844,14 +13248,14 @@ var filterWord = (UE.filterWord = (function() { * node.firstChild(); //返回第一个子节点 * ``` */ - firstChild: function() { - // if (this.type != 'element' || dtd.$empty[this.tagName]) { - // return this; - // } - return this.children ? this.children[0] : null; - }, + firstChild: function () { + // if (this.type != 'element' || dtd.$empty[this.tagName]) { + // return this; + // } + return this.children ? this.children[0] : null; + }, - /** + /** * 获取当前节点下的最后一个子节点 * @method lastChild * @return { UE.uNode } 返回最后一个子节点 @@ -9860,14 +13264,14 @@ var filterWord = (UE.filterWord = (function() { * node.lastChild(); //返回最后一个子节点 * ``` */ - lastChild: function() { - // if (this.type != 'element' || dtd.$empty[this.tagName] ) { - // return this; - // } - return this.children ? this.children[this.children.length - 1] : null; - }, + lastChild: function () { + // if (this.type != 'element' || dtd.$empty[this.tagName] ) { + // return this; + // } + return this.children ? this.children[this.children.length - 1] : null; + }, - /** + /** * 获取和当前节点有相同父亲节点的前一个节点 * @method previousSibling * @return { UE.uNode } 返回前一个节点 @@ -9876,16 +13280,16 @@ var filterWord = (UE.filterWord = (function() { * node.children[2].previousSibling(); //返回子节点node.children[1] * ``` */ - previousSibling: function() { - var parent = this.parentNode; - for (var i = 0, ci; (ci = parent.children[i]); i++) { - if (ci === this) { - return i == 0 ? null : parent.children[i - 1]; - } - } - }, + previousSibling: function () { + var parent = this.parentNode; + for (var i = 0, ci; (ci = parent.children[i]); i++) { + if (ci === this) { + return i == 0 ? null : parent.children[i - 1]; + } + } + }, - /** + /** * 获取和当前节点有相同父亲节点的后一个节点 * @method nextSibling * @return { UE.uNode } 返回后一个节点,找不到返回null @@ -9894,16 +13298,16 @@ var filterWord = (UE.filterWord = (function() { * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] * ``` */ - nextSibling: function() { - var parent = this.parentNode; - for (var i = 0, ci; (ci = parent.children[i++]); ) { - if (ci === this) { - return parent.children[i]; - } - } - }, + nextSibling: function () { + var parent = this.parentNode; + for (var i = 0, ci; (ci = parent.children[i++]);) { + if (ci === this) { + return parent.children[i]; + } + } + }, - /** + /** * 用新的节点替换当前节点 * @method replaceChild * @param { UE.uNode } target 要替换成该节点参数 @@ -9914,23 +13318,23 @@ var filterWord = (UE.filterWord = (function() { * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 * ``` */ - replaceChild: function(target, source) { - if (this.children) { - if (target.parentNode) { - target.parentNode.removeChild(target); - } - for (var i = 0, ci; (ci = this.children[i]); i++) { - if (ci === source) { - this.children.splice(i, 1, target); - source.parentNode = null; - target.parentNode = this; - return target; - } - } - } - }, + replaceChild: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; (ci = this.children[i]); i++) { + if (ci === source) { + this.children.splice(i, 1, target); + source.parentNode = null; + target.parentNode = this; + return target; + } + } + } + }, - /** + /** * 在节点的子节点列表最后位置插入一个节点 * @method appendChild * @param { UE.uNode } node 要插入的节点 @@ -9940,30 +13344,30 @@ var filterWord = (UE.filterWord = (function() { * node.appendChild( newNode ); //在node内插入子节点newNode * ``` */ - appendChild: function(node) { - if ( - this.type == "root" || - (this.type == "element" && !dtd.$empty[this.tagName]) - ) { - if (!this.children) { - this.children = []; - } - if (node.parentNode) { - node.parentNode.removeChild(node); - } - for (var i = 0, ci; (ci = this.children[i]); i++) { - if (ci === node) { - this.children.splice(i, 1); - break; - } - } - this.children.push(node); - node.parentNode = this; - return node; - } - }, + appendChild: function (node) { + if ( + this.type == "root" || + (this.type == "element" && !dtd.$empty[this.tagName]) + ) { + if (!this.children) { + this.children = []; + } + if (node.parentNode) { + node.parentNode.removeChild(node); + } + for (var i = 0, ci; (ci = this.children[i]); i++) { + if (ci === node) { + this.children.splice(i, 1); + break; + } + } + this.children.push(node); + node.parentNode = this; + return node; + } + }, - /** + /** * 在传入节点的前面插入一个节点 * @method insertBefore * @param { UE.uNode } target 要插入的节点 @@ -9974,22 +13378,22 @@ var filterWord = (UE.filterWord = (function() { * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode * ``` */ - insertBefore: function(target, source) { - if (this.children) { - if (target.parentNode) { - target.parentNode.removeChild(target); - } - for (var i = 0, ci; (ci = this.children[i]); i++) { - if (ci === source) { - this.children.splice(i, 0, target); - target.parentNode = this; - return target; - } - } - } - }, + insertBefore: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; (ci = this.children[i]); i++) { + if (ci === source) { + this.children.splice(i, 0, target); + target.parentNode = this; + return target; + } + } + } + }, - /** + /** * 在传入节点的后面插入一个节点 * @method insertAfter * @param { UE.uNode } target 要插入的节点 @@ -10000,22 +13404,22 @@ var filterWord = (UE.filterWord = (function() { * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode * ``` */ - insertAfter: function(target, source) { - if (this.children) { - if (target.parentNode) { - target.parentNode.removeChild(target); - } - for (var i = 0, ci; (ci = this.children[i]); i++) { - if (ci === source) { - this.children.splice(i + 1, 0, target); - target.parentNode = this; - return target; - } - } - } - }, + insertAfter: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; (ci = this.children[i]); i++) { + if (ci === source) { + this.children.splice(i + 1, 0, target); + target.parentNode = this; + return target; + } + } + } + }, - /** + /** * 从当前节点的子节点列表中,移除节点 * @method removeChild * @param { UE.uNode } node 要移除的节点引用 @@ -10026,25 +13430,25 @@ var filterWord = (UE.filterWord = (function() { * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 * ``` */ - removeChild: function(node, keepChildren) { - if (this.children) { - for (var i = 0, ci; (ci = this.children[i]); i++) { - if (ci === node) { - this.children.splice(i, 1); - ci.parentNode = null; - if (keepChildren && ci.children && ci.children.length) { - for (var j = 0, cj; (cj = ci.children[j]); j++) { - this.children.splice(i + j, 0, cj); - cj.parentNode = this; - } + removeChild: function (node, keepChildren) { + if (this.children) { + for (var i = 0, ci; (ci = this.children[i]); i++) { + if (ci === node) { + this.children.splice(i, 1); + ci.parentNode = null; + if (keepChildren && ci.children && ci.children.length) { + for (var j = 0, cj; (cj = ci.children[j]); j++) { + this.children.splice(i + j, 0, cj); + cj.parentNode = this; + } + } + return ci; + } + } } - return ci; - } - } - } - }, + }, - /** + /** * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 * @method getAttr * @param { String } attrName 要获取的属性名称 @@ -10054,11 +13458,11 @@ var filterWord = (UE.filterWord = (function() { * node.getAttr('title'); * ``` */ - getAttr: function(attrName) { - return this.attrs && this.attrs[attrName.toLowerCase()]; - }, + getAttr: function (attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()]; + }, - /** + /** * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 * @method setAttr * @param { String } attrName 要设置的属性名称 @@ -10069,32 +13473,32 @@ var filterWord = (UE.filterWord = (function() { * node.setAttr('title','标题'); * ``` */ - setAttr: function(attrName, attrVal) { - if (!attrName) { - delete this.attrs; - return; - } - if (!this.attrs) { - this.attrs = {}; - } - if (utils.isObject(attrName)) { - for (var a in attrName) { - if (!attrName[a]) { - delete this.attrs[a]; - } else { - this.attrs[a.toLowerCase()] = attrName[a]; - } - } - } else { - if (!attrVal) { - delete this.attrs[attrName]; - } else { - this.attrs[attrName.toLowerCase()] = attrVal; - } - } - }, + setAttr: function (attrName, attrVal) { + if (!attrName) { + delete this.attrs; + return; + } + if (!this.attrs) { + this.attrs = {}; + } + if (utils.isObject(attrName)) { + for (var a in attrName) { + if (!attrName[a]) { + delete this.attrs[a]; + } else { + this.attrs[a.toLowerCase()] = attrName[a]; + } + } + } else { + if (!attrVal) { + delete this.attrs[attrName]; + } else { + this.attrs[attrName.toLowerCase()] = attrVal; + } + } + }, - /** + /** * 获取当前节点在父节点下的位置索引 * @method getIndex * @return { Number } 返回索引数值,如果没有父节点,返回-1 @@ -10103,17 +13507,17 @@ var filterWord = (UE.filterWord = (function() { * node.getIndex(); * ``` */ - getIndex: function() { - var parent = this.parentNode; - for (var i = 0, ci; (ci = parent.children[i]); i++) { - if (ci === this) { - return i; - } - } - return -1; - }, + getIndex: function () { + var parent = this.parentNode; + for (var i = 0, ci; (ci = parent.children[i]); i++) { + if (ci === this) { + return i; + } + } + return -1; + }, - /** + /** * 在当前节点下,根据id查找节点 * @method getNodeById * @param { String } id 要查找的id @@ -10123,18 +13527,18 @@ var filterWord = (UE.filterWord = (function() { * node.getNodeById('textId'); * ``` */ - getNodeById: function(id) { - var node; - if (this.children && this.children.length) { - for (var i = 0, ci; (ci = this.children[i++]); ) { - if ((node = getNodeById(ci, id))) { - return node; - } - } - } - }, + getNodeById: function (id) { + var node; + if (this.children && this.children.length) { + for (var i = 0, ci; (ci = this.children[i++]);) { + if ((node = getNodeById(ci, id))) { + return node; + } + } + } + }, - /** + /** * 在当前节点下,根据元素名称查找节点列表 * @method getNodesByTagName * @param { String } tagNames 要查找的元素名称 @@ -10144,21 +13548,21 @@ var filterWord = (UE.filterWord = (function() { * node.getNodesByTagName('span'); * ``` */ - getNodesByTagName: function(tagNames) { - tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, " ").split(" "); - var arr = [], - me = this; - utils.each(tagNames, function(tagName) { - if (me.children && me.children.length) { - for (var i = 0, ci; (ci = me.children[i++]); ) { - getNodesByTagName(ci, tagName, arr); - } - } - }); - return arr; - }, + getNodesByTagName: function (tagNames) { + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, " ").split(" "); + var arr = [], + me = this; + utils.each(tagNames, function (tagName) { + if (me.children && me.children.length) { + for (var i = 0, ci; (ci = me.children[i++]);) { + getNodesByTagName(ci, tagName, arr); + } + } + }); + return arr; + }, - /** + /** * 根据样式名称,获取节点的样式值 * @method getStyle * @param { String } name 要获取的样式名称 @@ -10168,20 +13572,20 @@ var filterWord = (UE.filterWord = (function() { * node.getStyle('font-size'); * ``` */ - getStyle: function(name) { - var cssStyle = this.getAttr("style"); - if (!cssStyle) { - return ""; - } - var reg = new RegExp("(^|;)\\s*" + name + ":([^;]+)", "i"); - var match = cssStyle.match(reg); - if (match && match[0]) { - return match[2]; - } - return ""; - }, + getStyle: function (name) { + var cssStyle = this.getAttr("style"); + if (!cssStyle) { + return ""; + } + var reg = new RegExp("(^|;)\\s*" + name + ":([^;]+)", "i"); + var match = cssStyle.match(reg); + if (match && match[0]) { + return match[2]; + } + return ""; + }, - /** + /** * 给节点设置样式 * @method setStyle * @param { String } name 要设置的的样式名称 @@ -10191,30 +13595,30 @@ var filterWord = (UE.filterWord = (function() { * node.setStyle('font-size', '12px'); * ``` */ - setStyle: function(name, val) { - function exec(name, val) { - var reg = new RegExp("(^|;)\\s*" + name + ":([^;]+;?)", "gi"); - cssStyle = cssStyle.replace(reg, "$1"); - if (val) { - cssStyle = name + ":" + utils.unhtml(val) + ";" + cssStyle; - } - } + setStyle: function (name, val) { + function exec(name, val) { + var reg = new RegExp("(^|;)\\s*" + name + ":([^;]+;?)", "gi"); + cssStyle = cssStyle.replace(reg, "$1"); + if (val) { + cssStyle = name + ":" + utils.unhtml(val) + ";" + cssStyle; + } + } - var cssStyle = this.getAttr("style"); - if (!cssStyle) { - cssStyle = ""; - } - if (utils.isObject(name)) { - for (var a in name) { - exec(a, name[a]); - } - } else { - exec(name, val); - } - this.setAttr("style", utils.trim(cssStyle)); - }, + var cssStyle = this.getAttr("style"); + if (!cssStyle) { + cssStyle = ""; + } + if (utils.isObject(name)) { + for (var a in name) { + exec(a, name[a]); + } + } else { + exec(name, val); + } + this.setAttr("style", utils.trim(cssStyle)); + }, - /** + /** * 传入一个函数,递归遍历当前节点下的所有节点 * @method traversal * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 @@ -10225,13 +13629,13 @@ var filterWord = (UE.filterWord = (function() { * }); * ``` */ - traversal: function(fn) { - if (this.children && this.children.length) { - nodeTraversal(this, fn); - } - return this; - } - }; + traversal: function (fn) { + if (this.children && this.children.length) { + nodeTraversal(this, fn); + } + return this; + } + }; })(); @@ -10261,229 +13665,230 @@ var filterWord = (UE.filterWord = (function() { * ``` */ -var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { - //todo 原来的方式 [^"'<>\/] 有\/就不能配对上
    "); - tempIndex === 0 && tmpl.push(""); + tmpl.push( + '' + ); - tmpl.push( - '' - ); + tempIndex === 2 && tmpl.push(""); + } - tempIndex === 2 && tmpl.push(""); - } - - return ( - '
    ' + - '
    ' + - '
    这样的标签了 - //先去掉了,加上的原因忘了,这里先记录 - //var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, - //以上的正则表达式无法匹配:

    - //修改为如下正则表达式: - var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g, - re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; +var htmlparser = (UE.htmlparser = function (htmlstr, ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上
    这样的标签了 + //先去掉了,加上的原因忘了,这里先记录 + //var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, + //以上的正则表达式无法匹配:

    + //修改为如下正则表达式: + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g, + re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; - //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 - var allowEmptyTags = { - b: 1, - code: 1, - i: 1, - u: 1, - strike: 1, - s: 1, - tt: 1, - strong: 1, - q: 1, - samp: 1, - em: 1, - span: 1, - sub: 1, - img: 1, - sup: 1, - font: 1, - big: 1, - small: 1, - iframe: 1, - a: 1, - br: 1, - pre: 1 - }; - htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, "g"), ""); - if (!ignoreBlank) { - htmlstr = htmlstr.replace( - new RegExp( - "[\\r\\t\\n" + - (ignoreBlank ? "" : " ") + - "]*]*)>[\\r\\t\\n" + - (ignoreBlank ? "" : " ") + - "]*", - "g" - ), - function(a, b) { - //br暂时单独处理 - if (b && allowEmptyTags[b.toLowerCase()]) { - return a.replace(/(^[\n\r]+)|([\n\r]+$)/g, ""); - } - return a - .replace(new RegExp("^[\\r\\n" + (ignoreBlank ? "" : " ") + "]+"), "") - .replace( - new RegExp("[\\r\\n" + (ignoreBlank ? "" : " ") + "]+$"), - "" - ); - } - ); - } + //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 + var allowEmptyTags = { + b: 1, + code: 1, + i: 1, + u: 1, + strike: 1, + s: 1, + tt: 1, + strong: 1, + q: 1, + samp: 1, + em: 1, + span: 1, + sub: 1, + img: 1, + sup: 1, + font: 1, + big: 1, + small: 1, + iframe: 1, + a: 1, + br: 1, + pre: 1 + }; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, "g"), ""); + if (!ignoreBlank) { + htmlstr = htmlstr.replace( + new RegExp( + "[\\r\\t\\n" + + (ignoreBlank ? "" : " ") + + "]*]*)>[\\r\\t\\n" + + (ignoreBlank ? "" : " ") + + "]*", + "g" + ), + function (a, b) { + //br暂时单独处理 + if (b && allowEmptyTags[b.toLowerCase()]) { + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g, ""); + } + return a + .replace(new RegExp("^[\\r\\n" + (ignoreBlank ? "" : " ") + "]+"), "") + .replace( + new RegExp("[\\r\\n" + (ignoreBlank ? "" : " ") + "]+$"), + "" + ); + } + ); + } - var notTransAttrs = { - href: 1, - src: 1 - }; - - var uNode = UE.uNode, - needParentNode = { - td: "tr", - tr: ["tbody", "thead", "tfoot"], - tbody: "table", - th: "tr", - thead: "table", - tfoot: "table", - caption: "table", - li: ["ul", "ol"], - dt: "dl", - dd: "dl", - option: "select" - }, - needChild = { - ol: "li", - ul: "li" + var notTransAttrs = { + href: 1, + src: 1 }; - function text(parent, data) { - if (needChild[parent.tagName]) { - var tmpNode = uNode.createElement(needChild[parent.tagName]); - parent.appendChild(tmpNode); - tmpNode.appendChild(uNode.createText(data)); - parent = tmpNode; - } else { - parent.appendChild(uNode.createText(data)); - } - } + var uNode = UE.uNode, + needParentNode = { + td: "tr", + tr: ["tbody", "thead", "tfoot"], + tbody: "table", + th: "tr", + thead: "table", + tfoot: "table", + caption: "table", + li: ["ul", "ol"], + dt: "dl", + dd: "dl", + option: "select" + }, + needChild = { + ol: "li", + ul: "li" + }; - function element(parent, tagName, htmlattr) { - var needParentTag; - if ((needParentTag = needParentNode[tagName])) { - var tmpParent = parent, - hasParent; - while (tmpParent.type != "root") { - if ( - utils.isArray(needParentTag) - ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 - : needParentTag == tmpParent.tagName - ) { - parent = tmpParent; - hasParent = true; - break; - } - tmpParent = tmpParent.parentNode; - } - if (!hasParent) { - parent = element( - parent, - utils.isArray(needParentTag) ? needParentTag[0] : needParentTag - ); - } - } - //按dtd处理嵌套 - // if(parent.type != 'root' && !dtd[parent.tagName][tagName]) - // parent = parent.parentNode; - var elm = new uNode({ - parentNode: parent, - type: "element", - tagName: tagName.toLowerCase(), - //是自闭合的处理一下 - children: dtd.$empty[tagName] ? null : [] - }); - //如果属性存在,处理属性 - if (htmlattr) { - var attrs = {}, - match; - while ((match = re_attr.exec(htmlattr))) { - attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] - ? match[2] || match[3] || match[4] - : utils.unhtml(match[2] || match[3] || match[4]); - } - elm.attrs = attrs; - } - //trace:3970 - // //如果parent下不能放elm - // if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ - // parent = parent.parentNode; - // elm.parentNode = parent; - // } - parent.children.push(elm); - //如果是自闭合节点返回父亲节点 - return dtd.$empty[tagName] ? parent : elm; - } - - function comment(parent, data) { - parent.children.push( - new uNode({ - type: "comment", - data: data, - parentNode: parent - }) - ); - } - - var match, - currentIndex = 0, - nextIndex = 0; - //设置根节点 - var root = new uNode({ - type: "root", - children: [] - }); - var currentParent = root; - - while ((match = re_tag.exec(htmlstr))) { - currentIndex = match.index; - try { - if (currentIndex > nextIndex) { - //text node - text(currentParent, htmlstr.slice(nextIndex, currentIndex)); - } - if (match[3]) { - if (dtd.$cdata[currentParent.tagName]) { - text(currentParent, match[0]); + function text(parent, data) { + if (needChild[parent.tagName]) { + var tmpNode = uNode.createElement(needChild[parent.tagName]); + parent.appendChild(tmpNode); + tmpNode.appendChild(uNode.createText(data)); + parent = tmpNode; } else { - //start tag - currentParent = element( - currentParent, - match[3].toLowerCase(), - match[4] - ); + parent.appendChild(uNode.createText(data)); } - } else if (match[1]) { - if (currentParent.type != "root") { - if (dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]) { - text(currentParent, match[0]); - } else { - var tmpParent = currentParent; - while ( - currentParent.type == "element" && - currentParent.tagName != match[1].toLowerCase() - ) { - currentParent = currentParent.parentNode; - if (currentParent.type == "root") { - currentParent = tmpParent; - throw "break"; - } - } - //end tag - currentParent = currentParent.parentNode; - } - } - } else if (match[2]) { - //comment - comment(currentParent, match[2]); - } - } catch (e) {} + } - nextIndex = re_tag.lastIndex; - } - //如果结束是文本,就有可能丢掉,所以这里手动判断一下 - //例如
  • sdfsdfsdf
  • sdfsdfsdfsdf - if (nextIndex < htmlstr.length) { - text(currentParent, htmlstr.slice(nextIndex)); - } - return root; + function element(parent, tagName, htmlattr) { + var needParentTag; + if ((needParentTag = needParentNode[tagName])) { + var tmpParent = parent, + hasParent; + while (tmpParent.type != "root") { + if ( + utils.isArray(needParentTag) + ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 + : needParentTag == tmpParent.tagName + ) { + parent = tmpParent; + hasParent = true; + break; + } + tmpParent = tmpParent.parentNode; + } + if (!hasParent) { + parent = element( + parent, + utils.isArray(needParentTag) ? needParentTag[0] : needParentTag + ); + } + } + //按dtd处理嵌套 + // if(parent.type != 'root' && !dtd[parent.tagName][tagName]) + // parent = parent.parentNode; + var elm = new uNode({ + parentNode: parent, + type: "element", + tagName: tagName.toLowerCase(), + //是自闭合的处理一下 + children: dtd.$empty[tagName] ? null : [] + }); + //如果属性存在,处理属性 + if (htmlattr) { + var attrs = {}, + match; + while ((match = re_attr.exec(htmlattr))) { + attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] + ? match[2] || match[3] || match[4] + : utils.unhtml(match[2] || match[3] || match[4]); + } + elm.attrs = attrs; + } + //trace:3970 + // //如果parent下不能放elm + // if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ + // parent = parent.parentNode; + // elm.parentNode = parent; + // } + parent.children.push(elm); + //如果是自闭合节点返回父亲节点 + return dtd.$empty[tagName] ? parent : elm; + } + + function comment(parent, data) { + parent.children.push( + new uNode({ + type: "comment", + data: data, + parentNode: parent + }) + ); + } + + var match, + currentIndex = 0, + nextIndex = 0; + //设置根节点 + var root = new uNode({ + type: "root", + children: [] + }); + var currentParent = root; + + while ((match = re_tag.exec(htmlstr))) { + currentIndex = match.index; + try { + if (currentIndex > nextIndex) { + //text node + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + if (match[3]) { + if (dtd.$cdata[currentParent.tagName]) { + text(currentParent, match[0]); + } else { + //start tag + currentParent = element( + currentParent, + match[3].toLowerCase(), + match[4] + ); + } + } else if (match[1]) { + if (currentParent.type != "root") { + if (dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]) { + text(currentParent, match[0]); + } else { + var tmpParent = currentParent; + while ( + currentParent.type == "element" && + currentParent.tagName != match[1].toLowerCase() + ) { + currentParent = currentParent.parentNode; + if (currentParent.type == "root") { + currentParent = tmpParent; + throw "break"; + } + } + //end tag + currentParent = currentParent.parentNode; + } + } + } else if (match[2]) { + //comment + comment(currentParent, match[2]); + } + } catch (e) { + } + + nextIndex = re_tag.lastIndex; + } + //如果结束是文本,就有可能丢掉,所以这里手动判断一下 + //例如
  • sdfsdfsdf
  • sdfsdfsdfsdf + if (nextIndex < htmlstr.length) { + text(currentParent, htmlstr.slice(nextIndex)); + } + return root; }); @@ -10510,109 +13915,110 @@ var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { * UE.filterNode(root,editor.options.filterRules); * ``` */ -var filterNode = (UE.filterNode = (function() { - function filterNode(node, rules) { - switch (node.type) { - case "text": - break; - case "element": - var val; - if ((val = rules[node.tagName])) { - if (val === "-") { - node.parentNode.removeChild(node); - } else if (utils.isFunction(val)) { - var parentNode = node.parentNode, - index = node.getIndex(); - val(node); - if (node.parentNode) { - if (node.children) { - for (var i = 0, ci; (ci = node.children[i]); ) { - filterNode(ci, rules); - if (ci.parentNode) { - i++; - } - } - } - } else { - for (var i = index, ci; (ci = parentNode.children[i]); ) { - filterNode(ci, rules); - if (ci.parentNode) { - i++; - } - } - } - } else { - var attrs = val["$"]; - if (attrs && node.attrs) { - var tmpAttrs = {}, - tmpVal; - for (var a in attrs) { - tmpVal = node.getAttr(a); - //todo 只先对style单独处理 - if (a == "style" && utils.isArray(attrs[a])) { - var tmpCssStyle = []; - utils.each(attrs[a], function(v) { - var tmp; - if ((tmp = node.getStyle(v))) { - tmpCssStyle.push(v + ":" + tmp); +var filterNode = (UE.filterNode = (function () { + function filterNode(node, rules) { + switch (node.type) { + case "text": + break; + case "element": + var val; + if ((val = rules[node.tagName])) { + if (val === "-") { + node.parentNode.removeChild(node); + } else if (utils.isFunction(val)) { + var parentNode = node.parentNode, + index = node.getIndex(); + val(node); + if (node.parentNode) { + if (node.children) { + for (var i = 0, ci; (ci = node.children[i]);) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } else { + for (var i = index, ci; (ci = parentNode.children[i]);) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } else { + var attrs = val["$"]; + if (attrs && node.attrs) { + var tmpAttrs = {}, + tmpVal; + for (var a in attrs) { + tmpVal = node.getAttr(a); + //todo 只先对style单独处理 + if (a == "style" && utils.isArray(attrs[a])) { + var tmpCssStyle = []; + utils.each(attrs[a], function (v) { + var tmp; + if ((tmp = node.getStyle(v))) { + tmpCssStyle.push(v + ":" + tmp); + } + }); + tmpVal = tmpCssStyle.join(";"); + } + if (tmpVal) { + tmpAttrs[a] = tmpVal; + } + } + node.attrs = tmpAttrs; + } + if (node.children) { + for (var i = 0, ci; (ci = node.children[i]);) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } + } else { + //如果不在名单里扣出子节点并删除该节点,cdata除外 + if (dtd.$cdata[node.tagName]) { + node.parentNode.removeChild(node); + } else { + var parentNode = node.parentNode, + index = node.getIndex(); + node.parentNode.removeChild(node, true); + for (var i = index, ci; (ci = parentNode.children[i]);) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } } - }); - tmpVal = tmpCssStyle.join(";"); } - if (tmpVal) { - tmpAttrs[a] = tmpVal; - } - } - node.attrs = tmpAttrs; - } - if (node.children) { - for (var i = 0, ci; (ci = node.children[i]); ) { - filterNode(ci, rules); - if (ci.parentNode) { - i++; - } - } - } - } - } else { - //如果不在名单里扣出子节点并删除该节点,cdata除外 - if (dtd.$cdata[node.tagName]) { - node.parentNode.removeChild(node); - } else { - var parentNode = node.parentNode, - index = node.getIndex(); - node.parentNode.removeChild(node, true); - for (var i = index, ci; (ci = parentNode.children[i]); ) { - filterNode(ci, rules); - if (ci.parentNode) { - i++; - } - } - } + break; + case "comment": + node.parentNode.removeChild(node); } - break; - case "comment": - node.parentNode.removeChild(node); } - } - return function(root, rules) { - if (utils.isEmptyObject(rules)) { - return root; - } - var val; - if ((val = rules["-"])) { - utils.each(val.split(" "), function(k) { - rules[k] = "-"; - }); - } - for (var i = 0, ci; (ci = root.children[i]); ) { - filterNode(ci, rules); - if (ci.parentNode) { - i++; - } - } - return root; - }; + + return function (root, rules) { + if (utils.isEmptyObject(rules)) { + return root; + } + var val; + if ((val = rules["-"])) { + utils.each(val.split(" "), function (k) { + rules[k] = "-"; + }); + } + for (var i = 0, ci; (ci = root.children[i]);) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + return root; + }; })()); @@ -10624,128 +14030,128 @@ var filterNode = (UE.filterNode = (function() { * Time: 6:15 PM * To change this template use File | Settings | File Templates. */ -UE.plugin = (function() { - var _plugins = {}; - return { - register: function(pluginName, fn, oldOptionName, afterDisabled) { - if (oldOptionName && utils.isFunction(oldOptionName)) { - afterDisabled = oldOptionName; - oldOptionName = null; - } - _plugins[pluginName] = { - optionName: oldOptionName || pluginName, - execFn: fn, - //当插件被禁用时执行 - afterDisabled: afterDisabled - }; - }, - load: function(editor) { - utils.each(_plugins, function(plugin) { - var _export = plugin.execFn.call(editor); - if (editor.options[plugin.optionName] !== false) { - if (_export) { - //后边需要再做扩展 - utils.each(_export, function(v, k) { - switch (k.toLowerCase()) { - case "shortcutkey": - editor.addshortcutkey(v); - break; - case "bindevents": - utils.each(v, function(fn, eventName) { - editor.addListener(eventName, fn); - }); - break; - case "bindmultievents": - utils.each(utils.isArray(v) ? v : [v], function(event) { - var types = utils.trim(event.type).split(/\s+/); - utils.each(types, function(eventName) { - editor.addListener(eventName, event.handler); - }); - }); - break; - case "commands": - utils.each(v, function(execFn, execName) { - editor.commands[execName] = execFn; - }); - break; - case "outputrule": - editor.addOutputRule(v); - break; - case "inputrule": - editor.addInputRule(v); - break; - case "defaultoptions": - editor.setOpt(v); - } +UE.plugin = (function () { + var _plugins = {}; + return { + register: function (pluginName, fn, oldOptionName, afterDisabled) { + if (oldOptionName && utils.isFunction(oldOptionName)) { + afterDisabled = oldOptionName; + oldOptionName = null; + } + _plugins[pluginName] = { + optionName: oldOptionName || pluginName, + execFn: fn, + //当插件被禁用时执行 + afterDisabled: afterDisabled + }; + }, + load: function (editor) { + utils.each(_plugins, function (plugin) { + var _export = plugin.execFn.call(editor); + if (editor.options[plugin.optionName] !== false) { + if (_export) { + //后边需要再做扩展 + utils.each(_export, function (v, k) { + switch (k.toLowerCase()) { + case "shortcutkey": + editor.addshortcutkey(v); + break; + case "bindevents": + utils.each(v, function (fn, eventName) { + editor.addListener(eventName, fn); + }); + break; + case "bindmultievents": + utils.each(utils.isArray(v) ? v : [v], function (event) { + var types = utils.trim(event.type).split(/\s+/); + utils.each(types, function (eventName) { + editor.addListener(eventName, event.handler); + }); + }); + break; + case "commands": + utils.each(v, function (execFn, execName) { + editor.commands[execName] = execFn; + }); + break; + case "outputrule": + editor.addOutputRule(v); + break; + case "inputrule": + editor.addInputRule(v); + break; + case "defaultoptions": + editor.setOpt(v); + } + }); + } + } else if (plugin.afterDisabled) { + plugin.afterDisabled.call(editor); + } }); - } - } else if (plugin.afterDisabled) { - plugin.afterDisabled.call(editor); + //向下兼容 + utils.each(UE.plugins, function (plugin) { + plugin.call(editor); + }); + }, + run: function (pluginName, editor) { + var plugin = _plugins[pluginName]; + if (plugin) { + plugin.exeFn.call(editor); + } } - }); - //向下兼容 - utils.each(UE.plugins, function(plugin) { - plugin.call(editor); - }); - }, - run: function(pluginName, editor) { - var plugin = _plugins[pluginName]; - if (plugin) { - plugin.exeFn.call(editor); - } - } - }; + }; })(); // core/keymap.js var keymap = (UE.keymap = { - Backspace: 8, - Tab: 9, - Enter: 13, + Backspace: 8, + Tab: 9, + Enter: 13, - Shift: 16, - Control: 17, - Alt: 18, - CapsLock: 20, + Shift: 16, + Control: 17, + Alt: 18, + CapsLock: 20, - Esc: 27, + Esc: 27, - Spacebar: 32, + Spacebar: 32, - PageUp: 33, - PageDown: 34, - End: 35, - Home: 36, + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, - Left: 37, - Up: 38, - Right: 39, - Down: 40, + Left: 37, + Up: 38, + Right: 39, + Down: 40, - Insert: 45, + Insert: 45, - Del: 46, + Del: 46, - NumLock: 144, + NumLock: 144, - Cmd: 91, + Cmd: 91, - "=": 187, - "-": 189, + "=": 187, + "-": 189, - b: 66, - i: 73, - //回退 - z: 90, - y: 89, - //粘贴 - v: 86, - x: 88, + b: 66, + i: 73, + //回退 + z: 90, + y: 89, + //粘贴 + v: 86, + x: 88, - s: 83, + s: 83, - n: 78 + n: 78 }); @@ -10824,278 +14230,280 @@ var LocalStorage = (UE.LocalStorage = (function () { ///import core ///plugin 编辑器默认的过滤转换机制 -UE.plugins["defaultfilter"] = function() { - var me = this; - me.setOpt({ - allowDivTransToP: true, - disabledTableInTable: true, - rgb2Hex: true - }); - //默认的过滤处理 - //进入编辑器的内容处理 - me.addInputRule(function(root) { - var allowDivTransToP = this.options.allowDivTransToP; - var val; - function tdParent(node) { - while (node && node.type == "element") { - if (node.tagName == "td") { - return true; - } - node = node.parentNode; - } - return false; - } - //进行默认的处理 - root.traversal(function(node) { - if (node.type == "element") { - if ( - !dtd.$cdata[node.tagName] && - me.options.autoClearEmptyNode && - dtd.$inline[node.tagName] && - !dtd.$empty[node.tagName] && - (!node.attrs || utils.isEmptyObject(node.attrs)) - ) { - if (!node.firstChild()) node.parentNode.removeChild(node); - else if ( - node.tagName == "span" && - (!node.attrs || utils.isEmptyObject(node.attrs)) - ) { - node.parentNode.removeChild(node, true); - } - return; - } - switch (node.tagName) { - case "style": - case "script": - node.setAttr({ - cdata_tag: node.tagName, - cdata_data: node.innerHTML() || "", - _ue_custom_node_: "true" - }); - node.tagName = "div"; - node.innerHTML(""); - break; - case "a": - if ((val = node.getAttr("href"))) { - node.setAttr("_href", val); - } - break; - case "img": - //todo base64暂时去掉,后边做远程图片上传后,干掉这个 - if ((val = node.getAttr("src"))) { - if (/^data:/.test(val)) { - node.parentNode.removeChild(node); - break; - } - } - node.setAttr("_src", node.getAttr("src")); - break; - case "span": - if (browser.webkit && (val = node.getStyle("white-space"))) { - if (/nowrap|normal/.test(val)) { - node.setStyle("white-space", ""); - if ( - me.options.autoClearEmptyNode && - utils.isEmptyObject(node.attrs) - ) { - node.parentNode.removeChild(node, true); - } - } - } - val = node.getAttr("id"); - if (val && /^_baidu_bookmark_/i.test(val)) { - node.parentNode.removeChild(node); - } - break; - case "p": - if ((val = node.getAttr("align"))) { - node.setAttr("align"); - node.setStyle("text-align", val); - } - //trace:3431 - // var cssStyle = node.getAttr('style'); - // if (cssStyle) { - // cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); - // node.setAttr('style', cssStyle) - // - // } - //p标签不允许嵌套 - utils.each(node.children, function(n) { - if (n.type == "element" && n.tagName == "p") { - var next = n.nextSibling(); - node.parentNode.insertAfter(n, node); - var last = n; - while (next) { - var tmp = next.nextSibling(); - node.parentNode.insertAfter(next, last); - last = next; - next = tmp; - } - return false; - } - }); - if (!node.firstChild()) { - node.innerHTML(browser.ie ? " " : "
    "); - } - break; - case "div": - if (node.getAttr("cdata_tag")) { - break; - } - //针对代码这里不处理插入代码的div - val = node.getAttr("class"); - if (val && /^line number\d+/.test(val)) { - break; - } - if (!allowDivTransToP) { - break; - } - var tmpNode, - p = UE.uNode.createElement("p"); - while ((tmpNode = node.firstChild())) { - if ( - tmpNode.type == "text" || - !UE.dom.dtd.$block[tmpNode.tagName] - ) { - p.appendChild(tmpNode); - } else { - if (p.firstChild()) { - node.parentNode.insertBefore(p, node); - p = UE.uNode.createElement("p"); - } else { - node.parentNode.insertBefore(tmpNode, node); - } - } - } - if (p.firstChild()) { - node.parentNode.insertBefore(p, node); - } - node.parentNode.removeChild(node); - break; - case "dl": - node.tagName = "ul"; - break; - case "dt": - case "dd": - node.tagName = "li"; - break; - case "li": - var className = node.getAttr("class"); - if (!className || !/list\-/.test(className)) { - node.setAttr(); - } - var tmpNodes = node.getNodesByTagName("ol ul"); - UE.utils.each(tmpNodes, function(n) { - node.parentNode.insertAfter(n, node); - }); - break; - case "td": - case "th": - case "caption": - if (!node.children || !node.children.length) { - node.appendChild( - browser.ie11below - ? UE.uNode.createText(" ") - : UE.uNode.createElement("br") - ); - } - break; - case "table": - if (me.options.disabledTableInTable && tdParent(node)) { - node.parentNode.insertBefore( - UE.uNode.createText(node.innerText()), - node - ); - node.parentNode.removeChild(node); - } - } - } - // if(node.type == 'comment'){ - // node.parentNode.removeChild(node); - // } +UE.plugins["defaultfilter"] = function () { + var me = this; + me.setOpt({ + allowDivTransToP: true, + disabledTableInTable: true, + rgb2Hex: true }); - }); + //默认的过滤处理 + //进入编辑器的内容处理 + me.addInputRule(function (root) { + var allowDivTransToP = this.options.allowDivTransToP; + var val; - //从编辑器出去的内容处理 - me.addOutputRule(function(root) { - var val; - root.traversal(function(node) { - if (node.type == "element") { - if ( - me.options.autoClearEmptyNode && - dtd.$inline[node.tagName] && - !dtd.$empty[node.tagName] && - (!node.attrs || utils.isEmptyObject(node.attrs)) - ) { - if (!node.firstChild()) node.parentNode.removeChild(node); - else if ( - node.tagName == "span" && - (!node.attrs || utils.isEmptyObject(node.attrs)) - ) { - node.parentNode.removeChild(node, true); - } - return; + function tdParent(node) { + while (node && node.type == "element") { + if (node.tagName == "td") { + return true; + } + node = node.parentNode; + } + return false; } - switch (node.tagName) { - case "div": - if ((val = node.getAttr("cdata_tag"))) { - node.tagName = val; - node.appendChild(UE.uNode.createText(node.getAttr("cdata_data"))); - node.setAttr({ - cdata_tag: "", - cdata_data: "", - _ue_custom_node_: "" - }); - } - break; - case "a": - if ((val = node.getAttr("_href"))) { - node.setAttr({ - href: utils.html(val), - _href: "" - }); - } - break; - break; - case "span": - val = node.getAttr("id"); - if (val && /^_baidu_bookmark_/i.test(val)) { - node.parentNode.removeChild(node); - } - //将color的rgb格式转换为#16进制格式 - if (me.getOpt("rgb2Hex")) { - var cssStyle = node.getAttr("style"); - if (cssStyle) { - node.setAttr( - "style", - cssStyle.replace(/rgba?\(([\d,\s]+)\)/g, function(a, value) { - var array = value.split(","); - if (array.length > 3) return ""; - value = "#"; - for (var i = 0, color; (color = array[i++]); ) { - color = parseInt( - color.replace(/[^\d]/gi, ""), - 10 - ).toString(16); - value += color.length == 1 ? "0" + color : color; + + //进行默认的处理 + root.traversal(function (node) { + if (node.type == "element") { + if ( + !dtd.$cdata[node.tagName] && + me.options.autoClearEmptyNode && + dtd.$inline[node.tagName] && + !dtd.$empty[node.tagName] && + (!node.attrs || utils.isEmptyObject(node.attrs)) + ) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if ( + node.tagName == "span" && + (!node.attrs || utils.isEmptyObject(node.attrs)) + ) { + node.parentNode.removeChild(node, true); } - return value.toUpperCase(); - }) - ); - } + return; + } + switch (node.tagName) { + case "style": + case "script": + node.setAttr({ + cdata_tag: node.tagName, + cdata_data: node.innerHTML() || "", + _ue_custom_node_: "true" + }); + node.tagName = "div"; + node.innerHTML(""); + break; + case "a": + if ((val = node.getAttr("href"))) { + node.setAttr("_href", val); + } + break; + case "img": + //todo base64暂时去掉,后边做远程图片上传后,干掉这个 + if ((val = node.getAttr("src"))) { + if (/^data:/.test(val)) { + node.parentNode.removeChild(node); + break; + } + } + node.setAttr("_src", node.getAttr("src")); + break; + case "span": + if (browser.webkit && (val = node.getStyle("white-space"))) { + if (/nowrap|normal/.test(val)) { + node.setStyle("white-space", ""); + if ( + me.options.autoClearEmptyNode && + utils.isEmptyObject(node.attrs) + ) { + node.parentNode.removeChild(node, true); + } + } + } + val = node.getAttr("id"); + if (val && /^_baidu_bookmark_/i.test(val)) { + node.parentNode.removeChild(node); + } + break; + case "p": + if ((val = node.getAttr("align"))) { + node.setAttr("align"); + node.setStyle("text-align", val); + } + //trace:3431 + // var cssStyle = node.getAttr('style'); + // if (cssStyle) { + // cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); + // node.setAttr('style', cssStyle) + // + // } + //p标签不允许嵌套 + utils.each(node.children, function (n) { + if (n.type == "element" && n.tagName == "p") { + var next = n.nextSibling(); + node.parentNode.insertAfter(n, node); + var last = n; + while (next) { + var tmp = next.nextSibling(); + node.parentNode.insertAfter(next, last); + last = next; + next = tmp; + } + return false; + } + }); + if (!node.firstChild()) { + node.innerHTML(browser.ie ? " " : "
    "); + } + break; + case "div": + if (node.getAttr("cdata_tag")) { + break; + } + //针对代码这里不处理插入代码的div + val = node.getAttr("class"); + if (val && /^line number\d+/.test(val)) { + break; + } + if (!allowDivTransToP) { + break; + } + var tmpNode, + p = UE.uNode.createElement("p"); + while ((tmpNode = node.firstChild())) { + if ( + tmpNode.type == "text" || + !UE.dom.dtd.$block[tmpNode.tagName] + ) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement("p"); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + break; + case "dl": + node.tagName = "ul"; + break; + case "dt": + case "dd": + node.tagName = "li"; + break; + case "li": + var className = node.getAttr("class"); + if (!className || !/list\-/.test(className)) { + node.setAttr(); + } + var tmpNodes = node.getNodesByTagName("ol ul"); + UE.utils.each(tmpNodes, function (n) { + node.parentNode.insertAfter(n, node); + }); + break; + case "td": + case "th": + case "caption": + if (!node.children || !node.children.length) { + node.appendChild( + browser.ie11below + ? UE.uNode.createText(" ") + : UE.uNode.createElement("br") + ); + } + break; + case "table": + if (me.options.disabledTableInTable && tdParent(node)) { + node.parentNode.insertBefore( + UE.uNode.createText(node.innerText()), + node + ); + node.parentNode.removeChild(node); + } + } } - break; - case "img": - if ((val = node.getAttr("_src"))) { - node.setAttr({ - src: node.getAttr("_src"), - _src: "" - }); - } - } - } + // if(node.type == 'comment'){ + // node.parentNode.removeChild(node); + // } + }); + }); + + //从编辑器出去的内容处理 + me.addOutputRule(function (root) { + var val; + root.traversal(function (node) { + if (node.type == "element") { + if ( + me.options.autoClearEmptyNode && + dtd.$inline[node.tagName] && + !dtd.$empty[node.tagName] && + (!node.attrs || utils.isEmptyObject(node.attrs)) + ) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if ( + node.tagName == "span" && + (!node.attrs || utils.isEmptyObject(node.attrs)) + ) { + node.parentNode.removeChild(node, true); + } + return; + } + switch (node.tagName) { + case "div": + if ((val = node.getAttr("cdata_tag"))) { + node.tagName = val; + node.appendChild(UE.uNode.createText(node.getAttr("cdata_data"))); + node.setAttr({ + cdata_tag: "", + cdata_data: "", + _ue_custom_node_: "" + }); + } + break; + case "a": + if ((val = node.getAttr("_href"))) { + node.setAttr({ + href: utils.html(val), + _href: "" + }); + } + break; + break; + case "span": + val = node.getAttr("id"); + if (val && /^_baidu_bookmark_/i.test(val)) { + node.parentNode.removeChild(node); + } + //将color的rgb格式转换为#16进制格式 + if (me.getOpt("rgb2Hex")) { + var cssStyle = node.getAttr("style"); + if (cssStyle) { + node.setAttr( + "style", + cssStyle.replace(/rgba?\(([\d,\s]+)\)/g, function (a, value) { + var array = value.split(","); + if (array.length > 3) return ""; + value = "#"; + for (var i = 0, color; (color = array[i++]);) { + color = parseInt( + color.replace(/[^\d]/gi, ""), + 10 + ).toString(16); + value += color.length == 1 ? "0" + color : color; + } + return value.toUpperCase(); + }) + ); + } + } + break; + case "img": + if ((val = node.getAttr("_src"))) { + node.setAttr({ + src: node.getAttr("_src"), + _src: "" + }); + } + } + } + }); }); - }); }; @@ -11129,252 +14537,253 @@ UE.plugins["defaultfilter"] = function() { */ UE.commands["inserthtml"] = { - execCommand: function(command, html, notNeedFilter) { - var me = this, - range, - div; - if (!html) { - return; - } - if (me.fireEvent("beforeinserthtml", html) === true) { - return; - } - range = me.selection.getRange(); - div = range.document.createElement("div"); - div.style.display = "inline"; + execCommand: function (command, html, notNeedFilter) { + var me = this, + range, + div; + if (!html) { + return; + } + if (me.fireEvent("beforeinserthtml", html) === true) { + return; + } + range = me.selection.getRange(); + div = range.document.createElement("div"); + div.style.display = "inline"; - if (!notNeedFilter) { - var root = UE.htmlparser(html); - //如果给了过滤规则就先进行过滤 - if (me.options.filterRules) { - UE.filterNode(root, me.options.filterRules); - } - //执行默认的处理 - me.filterInputRule(root); - html = root.toHtml(); - } - div.innerHTML = utils.trim(html); - - if (!range.collapsed) { - var tmpNode = range.startContainer; - if (domUtils.isFillChar(tmpNode)) { - range.setStartBefore(tmpNode); - } - tmpNode = range.endContainer; - if (domUtils.isFillChar(tmpNode)) { - range.setEndAfter(tmpNode); - } - range.txtToElmBoundary(); - //结束边界可能放到了br的前边,要把br包含进来 - // x[xxx]
    - if (range.endContainer && range.endContainer.nodeType == 1) { - tmpNode = range.endContainer.childNodes[range.endOffset]; - if (tmpNode && domUtils.isBr(tmpNode)) { - range.setEndAfter(tmpNode); - } - } - if (range.startOffset == 0) { - tmpNode = range.startContainer; - if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { - tmpNode = range.endContainer; - if ( - range.endOffset == - (tmpNode.nodeType == 3 - ? tmpNode.nodeValue.length - : tmpNode.childNodes.length) && - domUtils.isBoundaryNode(tmpNode, "lastChild") - ) { - me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; - range.setStart(me.body.firstChild, 0).collapse(true); - } - } - } - !range.collapsed && range.deleteContents(); - if (range.startContainer.nodeType == 1) { - var child = range.startContainer.childNodes[range.startOffset], - pre; - if ( - child && - domUtils.isBlockElm(child) && - (pre = child.previousSibling) && - domUtils.isBlockElm(pre) - ) { - range.setEnd(pre, pre.childNodes.length).collapse(); - while (child.firstChild) { - pre.appendChild(child.firstChild); - } - domUtils.remove(child); - } - } - } - - var child, - parent, - pre, - tmp, - hadBreak = 0, - nextNode; - //如果当前位置选中了fillchar要干掉,要不会产生空行 - if (range.inFillChar()) { - child = range.startContainer; - if (domUtils.isFillChar(child)) { - range.setStartBefore(child).collapse(true); - domUtils.remove(child); - } else if (domUtils.isFillChar(child, true)) { - child.nodeValue = child.nodeValue.replace(fillCharReg, ""); - range.startOffset--; - range.collapsed && range.collapse(true); - } - } - //列表单独处理 - var li = domUtils.findParentByTagName(range.startContainer, "li", true); - if (li) { - var next, last; - while ((child = div.firstChild)) { - //针对hr单独处理一下先 - while ( - child && - (child.nodeType == 3 || - !domUtils.isBlockElm(child) || - child.tagName == "HR") - ) { - next = child.nextSibling; - range.insertNode(child).collapse(); - last = child; - child = next; - } - if (child) { - if (/^(ol|ul)$/i.test(child.tagName)) { - while (child.firstChild) { - last = child.firstChild; - domUtils.insertAfter(li, child.firstChild); - li = li.nextSibling; + if (!notNeedFilter) { + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); } - domUtils.remove(child); - } else { - var tmpLi; - next = child.nextSibling; - tmpLi = me.document.createElement("li"); - domUtils.insertAfter(li, tmpLi); - tmpLi.appendChild(child); - last = child; - child = next; - li = tmpLi; - } + //执行默认的处理 + me.filterInputRule(root); + html = root.toHtml(); } - } - li = domUtils.findParentByTagName(range.startContainer, "li", true); - if (domUtils.isEmptyBlock(li)) { - domUtils.remove(li); - } - if (last) { - range.setStartAfter(last).collapse(true).select(true); - } - } else { - while ((child = div.firstChild)) { - if (hadBreak) { - var p = me.document.createElement("p"); - while (child && (child.nodeType == 3 || !dtd.$block[child.tagName])) { - nextNode = child.nextSibling; - p.appendChild(child); - child = nextNode; - } - if (p.firstChild) { - child = p; - } - } - range.insertNode(child); - nextNode = child.nextSibling; - if ( - !hadBreak && - child.nodeType == domUtils.NODE_ELEMENT && - domUtils.isBlockElm(child) - ) { - parent = domUtils.findParent(child, function(node) { - return domUtils.isBlockElm(node); - }); - if ( - parent && - parent.tagName.toLowerCase() != "body" && - !( - dtd[parent.tagName][child.nodeName] && child.parentNode === parent - ) - ) { - if (!dtd[parent.tagName][child.nodeName]) { - pre = parent; - } else { - tmp = child.parentNode; - while (tmp !== parent) { - pre = tmp; - tmp = tmp.parentNode; - } + div.innerHTML = utils.trim(html); + + if (!range.collapsed) { + var tmpNode = range.startContainer; + if (domUtils.isFillChar(tmpNode)) { + range.setStartBefore(tmpNode); } - - domUtils.breakParent(child, pre || tmp); - //去掉break后前一个多余的节点

    |<[p> ==>

    |

    - var pre = child.previousSibling; - domUtils.trimWhiteTextNode(pre); - if (!pre.childNodes.length) { - domUtils.remove(pre); + tmpNode = range.endContainer; + if (domUtils.isFillChar(tmpNode)) { + range.setEndAfter(tmpNode); } - //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 - - if ( - !browser.ie && - (next = child.nextSibling) && - domUtils.isBlockElm(next) && - next.lastChild && - !domUtils.isBr(next.lastChild) - ) { - next.appendChild(me.document.createElement("br")); + range.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
    + if (range.endContainer && range.endContainer.nodeType == 1) { + tmpNode = range.endContainer.childNodes[range.endOffset]; + if (tmpNode && domUtils.isBr(tmpNode)) { + range.setEndAfter(tmpNode); + } + } + if (range.startOffset == 0) { + tmpNode = range.startContainer; + if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { + tmpNode = range.endContainer; + if ( + range.endOffset == + (tmpNode.nodeType == 3 + ? tmpNode.nodeValue.length + : tmpNode.childNodes.length) && + domUtils.isBoundaryNode(tmpNode, "lastChild") + ) { + me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; + range.setStart(me.body.firstChild, 0).collapse(true); + } + } + } + !range.collapsed && range.deleteContents(); + if (range.startContainer.nodeType == 1) { + var child = range.startContainer.childNodes[range.startOffset], + pre; + if ( + child && + domUtils.isBlockElm(child) && + (pre = child.previousSibling) && + domUtils.isBlockElm(pre) + ) { + range.setEnd(pre, pre.childNodes.length).collapse(); + while (child.firstChild) { + pre.appendChild(child.firstChild); + } + domUtils.remove(child); + } } - hadBreak = 1; - } } - var next = child.nextSibling; - if (!div.firstChild && next && domUtils.isBlockElm(next)) { - range.setStart(next, 0).collapse(true); - break; + + var child, + parent, + pre, + tmp, + hadBreak = 0, + nextNode; + //如果当前位置选中了fillchar要干掉,要不会产生空行 + if (range.inFillChar()) { + child = range.startContainer; + if (domUtils.isFillChar(child)) { + range.setStartBefore(child).collapse(true); + domUtils.remove(child); + } else if (domUtils.isFillChar(child, true)) { + child.nodeValue = child.nodeValue.replace(fillCharReg, ""); + range.startOffset--; + range.collapsed && range.collapse(true); + } } - range.setEndAfter(child).collapse(); - } - - child = range.startContainer; - - if (nextNode && domUtils.isBr(nextNode)) { - domUtils.remove(nextNode); - } - //用chrome可能有空白展位符 - if (domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)) { - if ((nextNode = child.nextSibling)) { - domUtils.remove(child); - if (nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]) { - range.setStart(nextNode, 0).collapse(true).shrinkBoundary(); - } + //列表单独处理 + var li = domUtils.findParentByTagName(range.startContainer, "li", true); + if (li) { + var next, last; + while ((child = div.firstChild)) { + //针对hr单独处理一下先 + while ( + child && + (child.nodeType == 3 || + !domUtils.isBlockElm(child) || + child.tagName == "HR") + ) { + next = child.nextSibling; + range.insertNode(child).collapse(); + last = child; + child = next; + } + if (child) { + if (/^(ol|ul)$/i.test(child.tagName)) { + while (child.firstChild) { + last = child.firstChild; + domUtils.insertAfter(li, child.firstChild); + li = li.nextSibling; + } + domUtils.remove(child); + } else { + var tmpLi; + next = child.nextSibling; + tmpLi = me.document.createElement("li"); + domUtils.insertAfter(li, tmpLi); + tmpLi.appendChild(child); + last = child; + child = next; + li = tmpLi; + } + } + } + li = domUtils.findParentByTagName(range.startContainer, "li", true); + if (domUtils.isEmptyBlock(li)) { + domUtils.remove(li); + } + if (last) { + range.setStartAfter(last).collapse(true).select(true); + } } else { - try { - child.innerHTML = browser.ie ? domUtils.fillChar : "
    "; - } catch (e) { - range.setStartBefore(child); - domUtils.remove(child); - } - } - } - //加上true因为在删除表情等时会删两次,第一次是删的fillData - try { - range.select(true); - } catch (e) {} - } + while ((child = div.firstChild)) { + if (hadBreak) { + var p = me.document.createElement("p"); + while (child && (child.nodeType == 3 || !dtd.$block[child.tagName])) { + nextNode = child.nextSibling; + p.appendChild(child); + child = nextNode; + } + if (p.firstChild) { + child = p; + } + } + range.insertNode(child); + nextNode = child.nextSibling; + if ( + !hadBreak && + child.nodeType == domUtils.NODE_ELEMENT && + domUtils.isBlockElm(child) + ) { + parent = domUtils.findParent(child, function (node) { + return domUtils.isBlockElm(node); + }); + if ( + parent && + parent.tagName.toLowerCase() != "body" && + !( + dtd[parent.tagName][child.nodeName] && child.parentNode === parent + ) + ) { + if (!dtd[parent.tagName][child.nodeName]) { + pre = parent; + } else { + tmp = child.parentNode; + while (tmp !== parent) { + pre = tmp; + tmp = tmp.parentNode; + } + } - setTimeout(function() { - range = me.selection.getRange(); - range.scrollToView( - me.autoHeightEnabled, - me.autoHeightEnabled ? domUtils.getXY(me.iframe).y : 0 - ); - me.fireEvent("afterinserthtml", html); - }, 200); - } + domUtils.breakParent(child, pre || tmp); + //去掉break后前一个多余的节点

    |<[p> ==>

    |

    + var pre = child.previousSibling; + domUtils.trimWhiteTextNode(pre); + if (!pre.childNodes.length) { + domUtils.remove(pre); + } + //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 + + if ( + !browser.ie && + (next = child.nextSibling) && + domUtils.isBlockElm(next) && + next.lastChild && + !domUtils.isBr(next.lastChild) + ) { + next.appendChild(me.document.createElement("br")); + } + hadBreak = 1; + } + } + var next = child.nextSibling; + if (!div.firstChild && next && domUtils.isBlockElm(next)) { + range.setStart(next, 0).collapse(true); + break; + } + range.setEndAfter(child).collapse(); + } + + child = range.startContainer; + + if (nextNode && domUtils.isBr(nextNode)) { + domUtils.remove(nextNode); + } + //用chrome可能有空白展位符 + if (domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)) { + if ((nextNode = child.nextSibling)) { + domUtils.remove(child); + if (nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]) { + range.setStart(nextNode, 0).collapse(true).shrinkBoundary(); + } + } else { + try { + child.innerHTML = browser.ie ? domUtils.fillChar : "
    "; + } catch (e) { + range.setStartBefore(child); + domUtils.remove(child); + } + } + } + //加上true因为在删除表情等时会删两次,第一次是删的fillData + try { + range.select(true); + } catch (e) { + } + } + + setTimeout(function () { + range = me.selection.getRange(); + range.scrollToView( + me.autoHeightEnabled, + me.autoHeightEnabled ? domUtils.getXY(me.iframe).y : 0 + ); + me.fireEvent("afterinserthtml", html); + }, 200); + } }; @@ -11396,342 +14805,359 @@ UE.commands["inserthtml"] = { * ``` */ -UE.plugins["autotypeset"] = function() { - this.setOpt({ - autotypeset: { - mergeEmptyline: true, //合并空行 - removeClass: true, //去掉冗余的class - removeEmptyline: false, //去掉空行 - textAlign: "left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 - imageBlockLine: "center", //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 - pasteFilter: false, //根据规则过滤没事粘贴进来的内容 - clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 - clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 - removeEmptyNode: false, // 去掉空节点 - //可以去掉的标签 - removeTagNames: utils.extend({ div: 1 }, dtd.$removeEmpty), - indent: false, // 行首缩进 - indentValue: "2em", //行首缩进的大小 - bdc2sb: false, - tobdc: false - } - }); +UE.plugins["autotypeset"] = function () { + this.setOpt({ + // 自动排版参数 + autotypeset: { + // 合并空行 + mergeEmptyline: true, + // 去掉冗余的class + removeClass: true, + // 去掉空行 + removeEmptyline: false, + // 段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + textAlign: "left", + // 图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + imageBlockLine: "center", + // 根据规则过滤没事粘贴进来的内容 + pasteFilter: false, + // 去掉所有的内嵌字号,使用编辑器默认的字号 + clearFontSize: false, + // 去掉所有的内嵌字体,使用编辑器默认的字体 + clearFontFamily: false, + // 去掉空节点 + removeEmptyNode: false, + // 可以去掉的标签 + removeTagNames: utils.extend({div: 1}, dtd.$removeEmpty), + // 行首缩进 + indent: false, + // 行首缩进的大小 + indentValue: "2em", + // 全角转半角 + bdc2sb: false, + // 半角转全角 + tobdc: false + } + }); - var me = this, - opt = me.options.autotypeset, - remainClass = { - selectTdClass: 1, - pagebreak: 1, - anchorclass: 1 - }, - remainTag = { - li: 1 - }, - tags = { - div: 1, - p: 1, - //trace:2183 这些也认为是行 - blockquote: 1, - center: 1, - h1: 1, - h2: 1, - h3: 1, - h4: 1, - h5: 1, - h6: 1, - span: 1 - }, - highlightCont; - //升级了版本,但配置项目里没有autotypeset - if (!opt) { - return; - } - - readLocalOpts(); - - function isLine(node, notEmpty) { - if (!node || node.nodeType == 3) return 0; - if (domUtils.isBr(node)) return 1; - if (node && node.parentNode && tags[node.tagName.toLowerCase()]) { - if ( - (highlightCont && highlightCont.contains(node)) || - node.getAttribute("pagebreak") - ) { - return 0; - } - - return notEmpty - ? !domUtils.isEmptyBlock(node) - : domUtils.isEmptyBlock( - node, - new RegExp("[\\s" + domUtils.fillChar + "]", "g") - ); - } - } - - function removeNotAttributeSpan(node) { - if (!node.style.cssText) { - domUtils.removeAttributes(node, ["style"]); - if ( - node.tagName.toLowerCase() == "span" && - domUtils.hasNoAttributes(node) - ) { - domUtils.remove(node, true); - } - } - } - function autotype(type, html) { var me = this, - cont; - if (html) { - if (!opt.pasteFilter) { + opt = me.options.autotypeset, + remainClass = { + selectTdClass: 1, + pagebreak: 1, + anchorclass: 1 + }, + remainTag = { + li: 1 + }, + tags = { + div: 1, + p: 1, + //trace:2183 这些也认为是行 + blockquote: 1, + center: 1, + h1: 1, + h2: 1, + h3: 1, + h4: 1, + h5: 1, + h6: 1, + span: 1 + }, + highlightCont; + //升级了版本,但配置项目里没有autotypeset + if (!opt) { return; - } - cont = me.document.createElement("div"); - cont.innerHTML = html.html; - } else { - cont = me.document.body; } - var nodes = domUtils.getElementsByTagName(cont, "*"); - // 行首缩进,段落方向,段间距,段内间距 - for (var i = 0, ci; (ci = nodes[i++]); ) { - if (me.fireEvent("excludeNodeinautotype", ci) === true) { - continue; - } - //font-size - if (opt.clearFontSize && ci.style.fontSize) { - domUtils.removeStyle(ci, "font-size"); + readLocalOpts(); - removeNotAttributeSpan(ci); - } - //font-family - if (opt.clearFontFamily && ci.style.fontFamily) { - domUtils.removeStyle(ci, "font-family"); - removeNotAttributeSpan(ci); - } - - if (isLine(ci)) { - //合并空行 - if (opt.mergeEmptyline) { - var next = ci.nextSibling, - tmpNode, - isBr = domUtils.isBr(ci); - while (isLine(next)) { - tmpNode = next; - next = tmpNode.nextSibling; - if (isBr && (!next || (next && !domUtils.isBr(next)))) { - break; + function isLine(node, notEmpty) { + if (!node || node.nodeType == 3) return 0; + if (domUtils.isBr(node)) return 1; + if (node && node.parentNode && tags[node.tagName.toLowerCase()]) { + if ( + (highlightCont && highlightCont.contains(node)) || + node.getAttribute("pagebreak") + ) { + return 0; } - domUtils.remove(tmpNode); - } + + return notEmpty + ? !domUtils.isEmptyBlock(node) + : domUtils.isEmptyBlock( + node, + new RegExp("[\\s" + domUtils.fillChar + "]", "g") + ); } - //去掉空行,保留占位的空行 - if ( - opt.removeEmptyline && - domUtils.inDoc(ci, cont) && - !remainTag[ci.parentNode.tagName.toLowerCase()] - ) { - if (domUtils.isBr(ci)) { - next = ci.nextSibling; - if (next && !domUtils.isBr(next)) { - continue; + } + + function removeNotAttributeSpan(node) { + if (!node.style.cssText) { + domUtils.removeAttributes(node, ["style"]); + if ( + node.tagName.toLowerCase() == "span" && + domUtils.hasNoAttributes(node) + ) { + domUtils.remove(node, true); } - } - domUtils.remove(ci); - continue; } - } - if (isLine(ci, true) && ci.tagName != "SPAN") { - if (opt.indent) { - ci.style.textIndent = opt.indentValue; - } - if (opt.textAlign) { - ci.style.textAlign = opt.textAlign; - } - // if(opt.lineHeight) - // ci.style.lineHeight = opt.lineHeight + 'cm'; - } + } - //去掉class,保留的class不去掉 - if ( - opt.removeClass && - ci.className && - !remainClass[ci.className.toLowerCase()] - ) { - if (highlightCont && highlightCont.contains(ci)) { - continue; - } - domUtils.removeAttributes(ci, ["class"]); - } - - //表情不处理 - if ( - opt.imageBlockLine && - ci.tagName.toLowerCase() == "img" && - !ci.getAttribute("emotion") - ) { + function autotype(type, html) { + var me = this, + cont; if (html) { - var img = ci; - switch (opt.imageBlockLine) { - case "left": - case "right": - case "none": - var pN = img.parentNode, - tmpNode, - pre, - next; - while (dtd.$inline[pN.tagName] || pN.tagName == "A") { - pN = pN.parentNode; - } - tmpNode = pN; - if ( - tmpNode.tagName == "P" && - domUtils.getStyle(tmpNode, "text-align") == "center" - ) { - if ( - !domUtils.isBody(tmpNode) && - domUtils.getChildCount(tmpNode, function(node) { - return !domUtils.isBr(node) && !domUtils.isWhitespace(node); - }) == 1 - ) { - pre = tmpNode.previousSibling; - next = tmpNode.nextSibling; - if ( - pre && - next && - pre.nodeType == 1 && - next.nodeType == 1 && - pre.tagName == next.tagName && - domUtils.isBlockElm(pre) - ) { - pre.appendChild(tmpNode.firstChild); - while (next.firstChild) { - pre.appendChild(next.firstChild); - } - domUtils.remove(tmpNode); - domUtils.remove(next); - } else { - domUtils.setStyle(tmpNode, "text-align", ""); - } - } - } - domUtils.setStyle(img, "float", opt.imageBlockLine); - break; - case "center": - if (me.queryCommandValue("imagefloat") != "center") { - pN = img.parentNode; - domUtils.setStyle(img, "float", "none"); - tmpNode = img; - while ( - pN && - domUtils.getChildCount(pN, function(node) { - return !domUtils.isBr(node) && !domUtils.isWhitespace(node); - }) == 1 && - (dtd.$inline[pN.tagName] || pN.tagName == "A") - ) { - tmpNode = pN; - pN = pN.parentNode; - } - var pNode = me.document.createElement("p"); - domUtils.setAttributes(pNode, { - style: "text-align:center" - }); - tmpNode.parentNode.insertBefore(pNode, tmpNode); - pNode.appendChild(tmpNode); - domUtils.setStyle(tmpNode, "float", ""); - } - } + if (!opt.pasteFilter) { + return; + } + cont = me.document.createElement("div"); + cont.innerHTML = html.html; } else { - var range = me.selection.getRange(); - range.selectNode(ci).select(); - me.execCommand("imagefloat", opt.imageBlockLine); + cont = me.document.body; } - } + var nodes = domUtils.getElementsByTagName(cont, "*"); - //去掉冗余的标签 - if (opt.removeEmptyNode) { - if ( - opt.removeTagNames[ci.tagName.toLowerCase()] && - domUtils.hasNoAttributes(ci) && - domUtils.isEmptyBlock(ci) - ) { - domUtils.remove(ci); + // 行首缩进,段落方向,段间距,段内间距 + for (var i = 0, ci; (ci = nodes[i++]);) { + if (me.fireEvent("excludeNodeinautotype", ci) === true) { + continue; + } + //font-size + if (opt.clearFontSize && ci.style.fontSize) { + domUtils.removeStyle(ci, "font-size"); + + removeNotAttributeSpan(ci); + } + //font-family + if (opt.clearFontFamily && ci.style.fontFamily) { + domUtils.removeStyle(ci, "font-family"); + removeNotAttributeSpan(ci); + } + + if (isLine(ci)) { + //合并空行 + if (opt.mergeEmptyline) { + var next = ci.nextSibling, + tmpNode, + isBr = domUtils.isBr(ci); + while (isLine(next)) { + tmpNode = next; + next = tmpNode.nextSibling; + if (isBr && (!next || (next && !domUtils.isBr(next)))) { + break; + } + domUtils.remove(tmpNode); + } + } + //去掉空行,保留占位的空行 + if ( + opt.removeEmptyline && + domUtils.inDoc(ci, cont) && + !remainTag[ci.parentNode.tagName.toLowerCase()] + ) { + if (domUtils.isBr(ci)) { + next = ci.nextSibling; + if (next && !domUtils.isBr(next)) { + continue; + } + } + domUtils.remove(ci); + continue; + } + } + if (isLine(ci, true) && ci.tagName != "SPAN") { + if (opt.indent) { + ci.style.textIndent = opt.indentValue; + } + if (opt.textAlign) { + ci.style.textAlign = opt.textAlign; + } + // if(opt.lineHeight) + // ci.style.lineHeight = opt.lineHeight + 'cm'; + } + + //去掉class,保留的class不去掉 + if ( + opt.removeClass && + ci.className && + !remainClass[ci.className.toLowerCase()] + ) { + if (highlightCont && highlightCont.contains(ci)) { + continue; + } + domUtils.removeAttributes(ci, ["class"]); + } + + //表情不处理 + if ( + opt.imageBlockLine && + ci.tagName.toLowerCase() == "img" && + !ci.getAttribute("emotion") + ) { + if (html) { + var img = ci; + switch (opt.imageBlockLine) { + case "left": + case "right": + case "none": + var pN = img.parentNode, + tmpNode, + pre, + next; + while (dtd.$inline[pN.tagName] || pN.tagName == "A") { + pN = pN.parentNode; + } + tmpNode = pN; + if ( + tmpNode.tagName == "P" && + domUtils.getStyle(tmpNode, "text-align") == "center" + ) { + if ( + !domUtils.isBody(tmpNode) && + domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + ) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if ( + pre && + next && + pre.nodeType == 1 && + next.nodeType == 1 && + pre.tagName == next.tagName && + domUtils.isBlockElm(pre) + ) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, "text-align", ""); + } + } + } + domUtils.setStyle(img, "float", opt.imageBlockLine); + break; + case "center": + if (me.queryCommandValue("imagefloat") != "center") { + pN = img.parentNode; + domUtils.setStyle(img, "float", "none"); + tmpNode = img; + while ( + pN && + domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 && + (dtd.$inline[pN.tagName] || pN.tagName == "A") + ) { + tmpNode = pN; + pN = pN.parentNode; + } + var pNode = me.document.createElement("p"); + domUtils.setAttributes(pNode, { + style: "text-align:center" + }); + tmpNode.parentNode.insertBefore(pNode, tmpNode); + pNode.appendChild(tmpNode); + domUtils.setStyle(tmpNode, "float", ""); + } + } + } else { + var range = me.selection.getRange(); + range.selectNode(ci).select(); + me.execCommand("imagefloat", opt.imageBlockLine); + } + } + + //去掉冗余的标签 + if (opt.removeEmptyNode) { + if ( + opt.removeTagNames[ci.tagName.toLowerCase()] && + domUtils.hasNoAttributes(ci) && + domUtils.isEmptyBlock(ci) + ) { + domUtils.remove(ci); + } + } } - } - } - if (opt.tobdc) { - var root = UE.htmlparser(cont.innerHTML); - root.traversal(function(node) { - if (node.type == "text") { - node.data = ToDBC(node.data); + if (opt.tobdc) { + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function (node) { + if (node.type == "text") { + node.data = ToDBC(node.data); + } + }); + cont.innerHTML = root.toHtml(); } - }); - cont.innerHTML = root.toHtml(); - } - if (opt.bdc2sb) { - var root = UE.htmlparser(cont.innerHTML); - root.traversal(function(node) { - if (node.type == "text") { - node.data = DBC2SB(node.data); + if (opt.bdc2sb) { + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function (node) { + if (node.type == "text") { + node.data = DBC2SB(node.data); + } + }); + cont.innerHTML = root.toHtml(); + } + if (html) { + html.html = cont.innerHTML; } - }); - cont.innerHTML = root.toHtml(); } - if (html) { - html.html = cont.innerHTML; - } - } - if (opt.pasteFilter) { - me.addListener("beforepaste", autotype); - } - function DBC2SB(str) { - var result = ""; - for (var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); //获取当前字符的unicode编码 - if (code >= 65281 && code <= 65373) { - //在这个unicode编码范围中的是所有的英文字母已经各种字符 - result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 - } else if (code == 12288) { - //空格 - result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); - } else { - result += str.charAt(i); - } - } - return result; - } - function ToDBC(txtstring) { - txtstring = utils.html(txtstring); - var tmp = ""; - var mark = ""; /*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ - for (var i = 0; i < txtstring.length; i++) { - if (txtstring.charCodeAt(i) == 32) { - tmp = tmp + String.fromCharCode(12288); - } else if (txtstring.charCodeAt(i) < 127) { - tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); - } else { - tmp += txtstring.charAt(i); - } - } - return tmp; - } - - function readLocalOpts() { - var cookieOpt = me.getPreferences("autotypeset"); - utils.extend(me.options.autotypeset, cookieOpt); - } - - me.commands["autotypeset"] = { - execCommand: function() { - me.removeListener("beforepaste", autotype); - if (opt.pasteFilter) { + if (opt.pasteFilter) { me.addListener("beforepaste", autotype); - } - autotype.call(me); } - }; + + function DBC2SB(str) { + var result = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); //获取当前字符的unicode编码 + if (code >= 65281 && code <= 65373) { + //在这个unicode编码范围中的是所有的英文字母已经各种字符 + result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 + } else if (code == 12288) { + //空格 + result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); + } else { + result += str.charAt(i); + } + } + return result; + } + + function ToDBC(txtstring) { + txtstring = utils.html(txtstring); + var tmp = ""; + var mark = ""; /*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ + for (var i = 0; i < txtstring.length; i++) { + if (txtstring.charCodeAt(i) == 32) { + tmp = tmp + String.fromCharCode(12288); + } else if (txtstring.charCodeAt(i) < 127) { + tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); + } else { + tmp += txtstring.charAt(i); + } + } + return tmp; + } + + function readLocalOpts() { + var cookieOpt = me.getPreferences("autotypeset"); + utils.extend(me.options.autotypeset, cookieOpt); + } + + me.commands["autotypeset"] = { + execCommand: function () { + me.removeListener("beforepaste", autotype); + if (opt.pasteFilter) { + me.addListener("beforepaste", autotype); + } + autotype.call(me); + } + }; }; @@ -11753,27 +15179,27 @@ UE.plugins["autotypeset"] = function() { * ``` */ -UE.plugin.register("autosubmit", function() { - return { - shortcutkey: { - autosubmit: "ctrl+13" //手动提交 - }, - commands: { - autosubmit: { - execCommand: function() { - var me = this, - form = domUtils.findParentByTagName(me.iframe, "form", false); - if (form) { - if (me.fireEvent("beforesubmit") === false) { - return; +UE.plugin.register("autosubmit", function () { + return { + shortcutkey: { + autosubmit: "ctrl+13" //手动提交 + }, + commands: { + autosubmit: { + execCommand: function () { + var me = this, + form = domUtils.findParentByTagName(me.iframe, "form", false); + if (form) { + if (me.fireEvent("beforesubmit") === false) { + return; + } + me.sync(); + form.submit(); + } + } } - me.sync(); - form.submit(); - } } - } - } - }; + }; }); @@ -11783,130 +15209,131 @@ UE.plugin.register("autosubmit", function() { * @file * @since 1.2.6.1 */ -UE.plugin.register("background", function() { - var me = this, - cssRuleId = "editor_background", - isSetColored, - reg = new RegExp("body[\\s]*\\{(.+)\\}", "i"); +UE.plugin.register("background", function () { + var me = this, + cssRuleId = "editor_background", + isSetColored, + reg = new RegExp("body[\\s]*\\{(.+)\\}", "i"); - function stringToObj(str) { - var obj = {}, - styles = str.split(";"); - utils.each(styles, function(v) { - var index = v.indexOf(":"), - key = utils.trim(v.substr(0, index)).toLowerCase(); - key && (obj[key] = utils.trim(v.substr(index + 1) || "")); - }); - return obj; - } - - function setBackground(obj) { - if (obj) { - var styles = []; - for (var name in obj) { - if (obj.hasOwnProperty(name)) { - styles.push(name + ":" + obj[name] + "; "); - } - } - utils.cssRule( - cssRuleId, - styles.length ? "body{" + styles.join("") + "}" : "", - me.document - ); - } else { - utils.cssRule(cssRuleId, "", me.document); + function stringToObj(str) { + var obj = {}, + styles = str.split(";"); + utils.each(styles, function (v) { + var index = v.indexOf(":"), + key = utils.trim(v.substr(0, index)).toLowerCase(); + key && (obj[key] = utils.trim(v.substr(index + 1) || "")); + }); + return obj; } - } - //重写editor.hasContent方法 - var orgFn = me.hasContents; - me.hasContents = function() { - if (me.queryCommandValue("background")) { - return true; - } - return orgFn.apply(me, arguments); - }; - return { - bindEvents: { - getAllHtml: function(type, headHtml) { - var body = this.body, - su = domUtils.getComputedStyle(body, "background-image"), - url = ""; - if (su.indexOf(me.options.imagePath) > 0) { - url = su - .substring(su.indexOf(me.options.imagePath), su.length - 1) - .replace(/"|\(|\)/gi, ""); + function setBackground(obj) { + if (obj) { + var styles = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + styles.push(name + ":" + obj[name] + "; "); + } + } + utils.cssRule( + cssRuleId, + styles.length ? "body{" + styles.join("") + "}" : "", + me.document + ); } else { - url = su != "none" ? su.replace(/url\("?|"?\)/gi, "") : ""; + utils.cssRule(cssRuleId, "", me.document); } - var html = ' "; - headHtml.push(html); - }, - aftersetcontent: function() { - if (isSetColored == false) setBackground(); - } - }, - inputRule: function(root) { - isSetColored = false; - utils.each(root.getNodesByTagName("p"), function(p) { - var styles = p.getAttr("data-background"); - if (styles) { - isSetColored = true; - setBackground(stringToObj(styles)); - p.parentNode.removeChild(p); - } - }); - }, - outputRule: function(root) { - var me = this, - styles = (utils.cssRule(cssRuleId, me.document) || "") - .replace(/[\n\r]+/g, "") - .match(reg); - if (styles) { - root.appendChild( - UE.uNode.createElement( - '


    ' - ) - ); - } - }, - commands: { - background: { - execCommand: function(cmd, obj) { - setBackground(obj); - }, - queryCommandValue: function() { - var me = this, - styles = (utils.cssRule(cssRuleId, me.document) || "") - .replace(/[\n\r]+/g, "") - .match(reg); - return styles ? stringToObj(styles[1]) : null; - }, - notNeedUndo: true - } } - }; + + //重写editor.hasContent方法 + + var orgFn = me.hasContents; + me.hasContents = function () { + if (me.queryCommandValue("background")) { + return true; + } + return orgFn.apply(me, arguments); + }; + return { + bindEvents: { + getAllHtml: function (type, headHtml) { + var body = this.body, + su = domUtils.getComputedStyle(body, "background-image"), + url = ""; + if (su.indexOf(me.options.imagePath) > 0) { + url = su + .substring(su.indexOf(me.options.imagePath), su.length - 1) + .replace(/"|\(|\)/gi, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/gi, "") : ""; + } + var html = ' "; + headHtml.push(html); + }, + aftersetcontent: function () { + if (isSetColored == false) setBackground(); + } + }, + inputRule: function (root) { + isSetColored = false; + utils.each(root.getNodesByTagName("p"), function (p) { + var styles = p.getAttr("data-background"); + if (styles) { + isSetColored = true; + setBackground(stringToObj(styles)); + p.parentNode.removeChild(p); + } + }); + }, + outputRule: function (root) { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || "") + .replace(/[\n\r]+/g, "") + .match(reg); + if (styles) { + root.appendChild( + UE.uNode.createElement( + '


    ' + ) + ); + } + }, + commands: { + background: { + execCommand: function (cmd, obj) { + setBackground(obj); + }, + queryCommandValue: function () { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || "") + .replace(/[\n\r]+/g, "") + .match(reg); + return styles ? stringToObj(styles[1]) : null; + }, + notNeedUndo: true + } + } + }; }); @@ -11944,150 +15371,150 @@ UE.plugin.register("background", function() { */ UE.commands["imagefloat"] = { - execCommand: function(cmd, align) { - var me = this, - range = me.selection.getRange(); - if (!range.collapsed) { - var img = range.getClosedNode(); - if (img && img.tagName == "IMG") { - switch (align) { - case "left": - case "right": - case "none": - var pN = img.parentNode, - tmpNode, - pre, - next; - while (dtd.$inline[pN.tagName] || pN.tagName == "A") { - pN = pN.parentNode; - } - tmpNode = pN; - if ( - tmpNode.tagName == "P" && - domUtils.getStyle(tmpNode, "text-align") == "center" - ) { - if ( - !domUtils.isBody(tmpNode) && - domUtils.getChildCount(tmpNode, function(node) { - return !domUtils.isBr(node) && !domUtils.isWhitespace(node); - }) == 1 - ) { - pre = tmpNode.previousSibling; - next = tmpNode.nextSibling; - if ( - pre && - next && - pre.nodeType == 1 && - next.nodeType == 1 && - pre.tagName == next.tagName && - domUtils.isBlockElm(pre) - ) { - pre.appendChild(tmpNode.firstChild); - while (next.firstChild) { - pre.appendChild(next.firstChild); - } - domUtils.remove(tmpNode); - domUtils.remove(next); - } else { - domUtils.setStyle(tmpNode, "text-align", ""); + execCommand: function (cmd, align) { + var me = this, + range = me.selection.getRange(); + if (!range.collapsed) { + var img = range.getClosedNode(); + if (img && img.tagName === "IMG") { + switch (align) { + case "left": + case "right": + case "none": + var pN = img.parentNode, + tmpNode, + pre, + next; + while (dtd.$inline[pN.tagName] || pN.tagName == "A") { + pN = pN.parentNode; + } + tmpNode = pN; + if ( + tmpNode.tagName == "P" && + domUtils.getStyle(tmpNode, "text-align") == "center" + ) { + if ( + !domUtils.isBody(tmpNode) && + domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + ) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if ( + pre && + next && + pre.nodeType == 1 && + next.nodeType == 1 && + pre.tagName == next.tagName && + domUtils.isBlockElm(pre) + ) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, "text-align", ""); + } + } + + range.selectNode(img).select(); + } + domUtils.setStyle(img, "float", align == "none" ? "" : align); + if (align == "none") { + domUtils.removeAttributes(img, "align"); + } + + break; + case "center": + if (me.queryCommandValue("imagefloat") != "center") { + pN = img.parentNode; + domUtils.setStyle(img, "float", ""); + domUtils.removeAttributes(img, "align"); + tmpNode = img; + while ( + pN && + domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 && + (dtd.$inline[pN.tagName] || pN.tagName == "A") + ) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement("div"); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, "float", ""); + + me.execCommand( + "insertHtml", + '

    ' + + pN.innerHTML + + "

    " + ); + + tmpNode = me.document.getElementById("_img_parent_tmp"); + tmpNode.removeAttribute("id"); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + } + + break; } - } - - range.selectNode(img).select(); } - domUtils.setStyle(img, "float", align == "none" ? "" : align); - if (align == "none") { - domUtils.removeAttributes(img, "align"); - } - - break; - case "center": - if (me.queryCommandValue("imagefloat") != "center") { - pN = img.parentNode; - domUtils.setStyle(img, "float", ""); - domUtils.removeAttributes(img, "align"); - tmpNode = img; - while ( - pN && - domUtils.getChildCount(pN, function(node) { - return !domUtils.isBr(node) && !domUtils.isWhitespace(node); - }) == 1 && - (dtd.$inline[pN.tagName] || pN.tagName == "A") - ) { - tmpNode = pN; - pN = pN.parentNode; - } - range.setStartBefore(tmpNode).setCursor(false); - pN = me.document.createElement("div"); - pN.appendChild(tmpNode); - domUtils.setStyle(tmpNode, "float", ""); - - me.execCommand( - "insertHtml", - '

    ' + - pN.innerHTML + - "

    " - ); - - tmpNode = me.document.getElementById("_img_parent_tmp"); - tmpNode.removeAttribute("id"); - tmpNode = tmpNode.firstChild; - range.selectNode(tmpNode).select(); - //去掉后边多余的元素 - next = tmpNode.parentNode.nextSibling; - if (next && domUtils.isEmptyNode(next)) { - domUtils.remove(next); - } - } - - break; } - } - } - }, - queryCommandValue: function() { - var range = this.selection.getRange(), - startNode, - floatStyle; - if (range.collapsed) { - return "none"; - } - startNode = range.getClosedNode(); - if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { - floatStyle = - domUtils.getComputedStyle(startNode, "float") || - startNode.getAttribute("align"); + }, + queryCommandValue: function () { + var range = this.selection.getRange(), + startNode, + floatStyle; + if (range.collapsed) { + return "none"; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { + floatStyle = + domUtils.getComputedStyle(startNode, "float") || + startNode.getAttribute("align"); - if (floatStyle == "none") { - floatStyle = domUtils.getComputedStyle( - startNode.parentNode, - "text-align" - ) == "center" - ? "center" - : floatStyle; - } - return { - left: 1, - right: 1, - center: 1 - }[floatStyle] - ? floatStyle - : "none"; - } - return "none"; - }, - queryCommandState: function() { - var range = this.selection.getRange(), - startNode; + if (floatStyle == "none") { + floatStyle = domUtils.getComputedStyle( + startNode.parentNode, + "text-align" + ) == "center" + ? "center" + : floatStyle; + } + return { + left: 1, + right: 1, + center: 1 + }[floatStyle] + ? floatStyle + : "none"; + } + return "none"; + }, + queryCommandState: function () { + var range = this.selection.getRange(), + startNode; - if (range.collapsed) return -1; + if (range.collapsed) return -1; - startNode = range.getClosedNode(); - if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { - return 0; + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType === 1 && startNode.tagName === "IMG") { + return 0; + } + return -1; } - return -1; - } }; /** @@ -12121,98 +15548,98 @@ UE.commands["imagefloat"] = { */ UE.commands["insertimage"] = { - execCommand: function(cmd, opt) { - opt = utils.isArray(opt) ? opt : [opt]; - if (!opt.length) { - return; - } - var me = this, - range = me.selection.getRange(), - img = range.getClosedNode(); - - if (me.fireEvent("beforeinsertimage", opt) === true) { - return; - } - - if ( - img && - /img/i.test(img.tagName) && - (img.className != "edui-faked-video" || - img.className.indexOf("edui-upload-video") != -1) && - !img.getAttribute("data-word-image") - ) { - var first = opt.shift(); - var floatStyle = first["floatStyle"]; - delete first["floatStyle"]; - //// img.style.border = (first.border||0) +"px solid #000"; - //// img.style.margin = (first.margin||0) +"px"; - // img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; - domUtils.setAttributes(img, first); - me.execCommand("imagefloat", floatStyle); - if (opt.length > 0) { - range.setStartAfter(img).setCursor(false, true); - me.execCommand("insertimage", opt); - } - } else { - var html = [], - str = "", - ci; - ci = opt[0]; - if (opt.length == 1) { - str = - '' + ci.alt + '"; - if (ci["floatStyle"] == "center") { - str = '

    ' + str + "

    "; + execCommand: function (cmd, opt) { + opt = utils.isArray(opt) ? opt : [opt]; + if (!opt.length) { + return; } - html.push(str); - } else { - for (var i = 0; (ci = opt[i++]); ) { - str = - "

    "; - html.push(str); + var me = this, + range = me.selection.getRange(), + img = range.getClosedNode(); + + if (me.fireEvent("beforeinsertimage", opt) === true) { + return; } - } - me.execCommand("insertHtml", html.join("")); + if ( + img && + /img/i.test(img.tagName) && + (img.className != "edui-faked-video" || + img.className.indexOf("edui-upload-video") != -1) && + !img.getAttribute("data-word-image") + ) { + var first = opt.shift(); + var floatStyle = first["floatStyle"]; + delete first["floatStyle"]; + //// img.style.border = (first.border||0) +"px solid #000"; + //// img.style.margin = (first.margin||0) +"px"; + // img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; + domUtils.setAttributes(img, first); + me.execCommand("imagefloat", floatStyle); + if (opt.length > 0) { + range.setStartAfter(img).setCursor(false, true); + me.execCommand("insertimage", opt); + } + } else { + var html = [], + str = "", + ci; + ci = opt[0]; + if (opt.length == 1) { + str = + '' + ci.alt + '"; + if (ci["floatStyle"] == "center") { + str = '

    ' + str + "

    "; + } + html.push(str); + } else { + for (var i = 0; (ci = opt[i++]);) { + str = + "

    "; + html.push(str); + } + } + + me.execCommand("insertHtml", html.join("")); + } + + me.fireEvent("afterinsertimage", opt); } - - me.fireEvent("afterinsertimage", opt); - } }; @@ -12246,107 +15673,107 @@ UE.commands["insertimage"] = { * ``` */ -UE.plugins["justify"] = function() { - var me = this, - block = domUtils.isBlockElm, - defaultValue = { - left: 1, - right: 1, - center: 1, - justify: 1 - }, - doJustify = function(range, style) { - var bookmark = range.createBookmark(), - filterFn = function(node) { - return node.nodeType == 1 - ? node.tagName.toLowerCase() != "br" && - !domUtils.isBookmarkNode(node) - : !domUtils.isWhitespace(node); +UE.plugins["justify"] = function () { + var me = this, + block = domUtils.isBlockElm, + defaultValue = { + left: 1, + right: 1, + center: 1, + justify: 1 + }, + doJustify = function (range, style) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 + ? node.tagName.toLowerCase() != "br" && + !domUtils.isBookmarkNode(node) + : !domUtils.isWhitespace(node); + }; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while ( + current && + !( + domUtils.getPosition(current, bookmark2.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + domUtils.setStyles( + common, + utils.isString(style) ? {"text-align": style} : style + ); + current = common; + } else { + var p = range.document.createElement("p"); + domUtils.setStyles( + p, + utils.isString(style) ? {"text-align": style} : style + ); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); }; - range.enlarge(true); - var bookmark2 = range.createBookmark(), - current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), - tmpRange = range.cloneRange(), - tmpNode; - while ( - current && - !( - domUtils.getPosition(current, bookmark2.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - if (current.nodeType == 3 || !block(current)) { - tmpRange.setStartBefore(current); - while (current && current !== bookmark2.end && !block(current)) { - tmpNode = current; - current = domUtils.getNextDomNode(current, false, null, function( - node - ) { - return !block(node); - }); - } - tmpRange.setEndAfter(tmpNode); - var common = tmpRange.getCommonAncestor(); - if (!domUtils.isBody(common) && block(common)) { - domUtils.setStyles( - common, - utils.isString(style) ? { "text-align": style } : style - ); - current = common; - } else { - var p = range.document.createElement("p"); - domUtils.setStyles( - p, - utils.isString(style) ? { "text-align": style } : style - ); - var frag = tmpRange.extractContents(); - p.appendChild(frag); - tmpRange.insertNode(p); - current = p; - } - current = domUtils.getNextDomNode(current, false, filterFn); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); + UE.commands["justify"] = { + execCommand: function (cmdName, align) { + var range = this.selection.getRange(), + txt; + + //闭合时单独处理 + if (range.collapsed) { + txt = this.document.createTextNode("p"); + range.insertNode(txt); + } + doJustify(range, align); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + + return true; + }, + queryCommandValue: function () { + var startNode = this.selection.getStart(), + value = domUtils.getComputedStyle(startNode, "text-align"); + return defaultValue[value] ? value : "left"; + }, + queryCommandState: function () { + var start = this.selection.getStart(), + cell = + start && + domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + + return cell ? -1 : 0; } - } - return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); }; - - UE.commands["justify"] = { - execCommand: function(cmdName, align) { - var range = this.selection.getRange(), - txt; - - //闭合时单独处理 - if (range.collapsed) { - txt = this.document.createTextNode("p"); - range.insertNode(txt); - } - doJustify(range, align); - if (txt) { - range.setStartBefore(txt).collapse(true); - domUtils.remove(txt); - } - - range.select(); - - return true; - }, - queryCommandValue: function() { - var startNode = this.selection.getStart(), - value = domUtils.getComputedStyle(startNode, "text-align"); - return defaultValue[value] ? value : "left"; - }, - queryCommandState: function() { - var start = this.selection.getStart(), - cell = - start && - domUtils.findParentByTagName(start, ["td", "th", "caption"], true); - - return cell ? -1 : 0; - } - }; }; @@ -12482,423 +15909,446 @@ UE.plugins["justify"] = function() { * ``` */ -UE.plugins["font"] = function() { - var me = this, - fonts = { - forecolor: "color", - backcolor: "background-color", - fontsize: "font-size", - fontfamily: "font-family", - underline: "text-decoration", - strikethrough: "text-decoration", - fontborder: "border" - }, - needCmd = { underline: 1, strikethrough: 1, fontborder: 1 }, - needSetChild = { - forecolor: "color", - backcolor: "background-color", - fontsize: "font-size", - fontfamily: "font-family" - }; - me.setOpt({ - fontfamily: [ - { name: "songti", val: "宋体,SimSun" }, - { name: "yahei", val: "微软雅黑,Microsoft YaHei" }, - { name: "kaiti", val: "楷体,楷体_GB2312, SimKai" }, - { name: "heiti", val: "黑体, SimHei" }, - { name: "lishu", val: "隶书, SimLi" }, - { name: "andaleMono", val: "andale mono" }, - { name: "arial", val: "arial, helvetica,sans-serif" }, - { name: "arialBlack", val: "arial black,avant garde" }, - { name: "comicSansMs", val: "comic sans ms" }, - { name: "impact", val: "impact,chicago" }, - { name: "timesNewRoman", val: "times new roman" } - ], - fontsize: [10, 11, 12, 14, 16, 18, 20, 24, 36] - }); +UE.plugins["font"] = function () { + var me = this, + fonts = { + forecolor: "color", + backcolor: "background-color", + fontsize: "font-size", + fontfamily: "font-family", + underline: "text-decoration", + strikethrough: "text-decoration", + fontborder: "border" + }, + lang = me.getLang(), + needCmd = {underline: 1, strikethrough: 1, fontborder: 1}, + needSetChild = { + forecolor: "color", + backcolor: "background-color", + fontsize: "font-size", + fontfamily: "font-family" + }; + me.setOpt({ + fontfamily: [ + {name: "default", val: "default"}, + {name: "songti", val: "宋体,SimSun"}, + {name: "yahei", val: "微软雅黑,Microsoft YaHei"}, + {name: "kaiti", val: "楷体,楷体_GB2312,SimKai"}, + {name: "heiti", val: "黑体,SimHei"}, + {name: "lishu", val: "隶书,SimLi"}, + // { name: "andaleMono", val: "andale mono" }, + {name: "arial", val: "arial,helvetica,sans-serif"}, + // { name: "arialBlack", val: "arial black,avant garde" }, + // { name: "comicSansMs", val: "comic sans ms" }, + // { name: "impact", val: "impact,chicago" }, + {name: "timesNewRoman", val: "times new roman"} + ], + fontsize: [10, 11, 12, 14, 16, 18, 20, 24, 36] + }); - function mergeWithParent(node) { - var parent; - while ((parent = node.parentNode)) { - if ( - parent.tagName == "SPAN" && - domUtils.getChildCount(parent, function(child) { - return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child); - }) == 1 - ) { - parent.style.cssText += node.style.cssText; - domUtils.remove(node, true); - node = parent; - } else { - break; - } - } - } - function mergeChild(rng, cmdName, value) { - if (needSetChild[cmdName]) { - rng.adjustmentBoundary(); - if (!rng.collapsed && rng.startContainer.nodeType == 1) { - var start = rng.startContainer.childNodes[rng.startOffset]; - if (start && domUtils.isTagNode(start, "span")) { - var bk = rng.createBookmark(); - utils.each(domUtils.getElementsByTagName(start, "span"), function( - span - ) { - if (!span.parentNode || domUtils.isBookmarkNode(span)) return; + function mergeWithParent(node) { + var parent; + while ((parent = node.parentNode)) { if ( - cmdName == "backcolor" && - domUtils - .getComputedStyle(span, "background-color") - .toLowerCase() === value + parent.tagName == "SPAN" && + domUtils.getChildCount(parent, function (child) { + return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child); + }) == 1 ) { - return; + parent.style.cssText += node.style.cssText; + domUtils.remove(node, true); + node = parent; + } else { + break; } - domUtils.removeStyle(span, needSetChild[cmdName]); - if (span.style.cssText.replace(/^\s+$/, "").length == 0) { - domUtils.remove(span, true); - } - }); - rng.moveToBookmark(bk); } - } } - } - function mergesibling(rng, cmdName, value) { - var collapsed = rng.collapsed, - bk = rng.createBookmark(), - common; - if (collapsed) { - common = bk.start.parentNode; - while (dtd.$inline[common.tagName]) { - common = common.parentNode; - } - } else { - common = domUtils.getCommonAncestor(bk.start, bk.end); + + function mergeChild(rng, cmdName, value) { + if (needSetChild[cmdName]) { + rng.adjustmentBoundary(); + if (!rng.collapsed && rng.startContainer.nodeType == 1) { + var start = rng.startContainer.childNodes[rng.startOffset]; + if (start && domUtils.isTagNode(start, "span")) { + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, "span"), function ( + span + ) { + if (!span.parentNode || domUtils.isBookmarkNode(span)) return; + if ( + cmdName == "backcolor" && + domUtils + .getComputedStyle(span, "background-color") + .toLowerCase() === value + ) { + return; + } + domUtils.removeStyle(span, needSetChild[cmdName]); + if (span.style.cssText.replace(/^\s+$/, "").length == 0) { + domUtils.remove(span, true); + } + }); + rng.moveToBookmark(bk); + } + } + } } - utils.each(domUtils.getElementsByTagName(common, "span"), function(span) { - if (!span.parentNode || domUtils.isBookmarkNode(span)) return; - if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { - if (/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)) { - domUtils.remove(span, true); + + function mergesibling(rng, cmdName, value) { + var collapsed = rng.collapsed, + bk = rng.createBookmark(), + common; + if (collapsed) { + common = bk.start.parentNode; + while (dtd.$inline[common.tagName]) { + common = common.parentNode; + } } else { - domUtils.removeStyle(span, "border"); + common = domUtils.getCommonAncestor(bk.start, bk.end); } - return; - } - if ( - /border/i.test(span.style.cssText) && - span.parentNode.tagName == "SPAN" && - /border/i.test(span.parentNode.style.cssText) - ) { - span.style.cssText = span.style.cssText.replace( - /border[^:]*:[^;]+;?/gi, - "" - ); - } - if (!(cmdName == "fontborder" && value == "none")) { - var next = span.nextSibling; - while (next && next.nodeType == 1 && next.tagName == "SPAN") { - if (domUtils.isBookmarkNode(next) && cmdName == "fontborder") { - span.appendChild(next); - next = span.nextSibling; - continue; - } - if (next.style.cssText == span.style.cssText) { - domUtils.moveChild(next, span); - domUtils.remove(next); - } - if (span.nextSibling === next) break; - next = span.nextSibling; - } - } + utils.each(domUtils.getElementsByTagName(common, "span"), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span)) return; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + if (/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)) { + domUtils.remove(span, true); + } else { + domUtils.removeStyle(span, "border"); + } + return; + } + if ( + /border/i.test(span.style.cssText) && + span.parentNode.tagName == "SPAN" && + /border/i.test(span.parentNode.style.cssText) + ) { + span.style.cssText = span.style.cssText.replace( + /border[^:]*:[^;]+;?/gi, + "" + ); + } + if (!(cmdName == "fontborder" && value == "none")) { + var next = span.nextSibling; + while (next && next.nodeType == 1 && next.tagName == "SPAN") { + if (domUtils.isBookmarkNode(next) && cmdName == "fontborder") { + span.appendChild(next); + next = span.nextSibling; + continue; + } + if (next.style.cssText == span.style.cssText) { + domUtils.moveChild(next, span); + domUtils.remove(next); + } + if (span.nextSibling === next) break; + next = span.nextSibling; + } + } - mergeWithParent(span); - if (browser.ie && browser.version > 8) { - //拷贝父亲们的特别的属性,这里只做背景颜色的处理 - var parent = domUtils.findParent(span, function(n) { - return ( - n.tagName == "SPAN" && /background-color/.test(n.style.cssText) - ); + mergeWithParent(span); + if (browser.ie && browser.version > 8) { + //拷贝父亲们的特别的属性,这里只做背景颜色的处理 + var parent = domUtils.findParent(span, function (n) { + return ( + n.tagName == "SPAN" && /background-color/.test(n.style.cssText) + ); + }); + if (parent && !/background-color/.test(span.style.cssText)) { + span.style.backgroundColor = parent.style.backgroundColor; + } + } }); - if (parent && !/background-color/.test(span.style.cssText)) { - span.style.backgroundColor = parent.style.backgroundColor; - } - } - }); - rng.moveToBookmark(bk); - mergeChild(rng, cmdName, value); - } + rng.moveToBookmark(bk); + mergeChild(rng, cmdName, value); + } - me.addInputRule(function(root) { - utils.each(root.getNodesByTagName("u s del font strike"), function(node) { - if (node.tagName == "font") { - var cssStyle = []; - for (var p in node.attrs) { - switch (p) { - case "size": - cssStyle.push( - "font-size:" + - ({ - "1": "10", - "2": "12", - "3": "16", - "4": "18", - "5": "24", - "6": "32", - "7": "48" - }[node.attrs[p]] || node.attrs[p]) + - "px" - ); - break; - case "color": - cssStyle.push("color:" + node.attrs[p]); - break; - case "face": - cssStyle.push("font-family:" + node.attrs[p]); - break; - case "style": - cssStyle.push(node.attrs[p]); - } - } - node.attrs = { - style: cssStyle.join(";") - }; - } else { - var val = node.tagName == "u" ? "underline" : "line-through"; - node.attrs = { - style: (node.getAttr("style") || "") + "text-decoration:" + val + ";" - }; - } - node.tagName = "span"; + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName("u s del font strike"), function (node) { + if (node.tagName == "font") { + var cssStyle = []; + for (var p in node.attrs) { + switch (p) { + case "size": + cssStyle.push( + "font-size:" + + ({ + "1": "10", + "2": "12", + "3": "16", + "4": "18", + "5": "24", + "6": "32", + "7": "48" + }[node.attrs[p]] || node.attrs[p]) + + "px" + ); + break; + case "color": + cssStyle.push("color:" + node.attrs[p]); + break; + case "face": + cssStyle.push("font-family:" + node.attrs[p]); + break; + case "style": + cssStyle.push(node.attrs[p]); + } + } + node.attrs = { + style: cssStyle.join(";") + }; + } else { + var val = node.tagName == "u" ? "underline" : "line-through"; + node.attrs = { + style: (node.getAttr("style") || "") + "text-decoration:" + val + ";" + }; + } + node.tagName = "span"; + }); + // utils.each(root.getNodesByTagName('span'), function (node) { + // var val; + // if(val = node.getAttr('class')){ + // if(/fontstrikethrough/.test(val)){ + // node.setStyle('text-decoration','line-through'); + // if(node.attrs['class']){ + // node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); + // }else{ + // node.setAttr('class') + // } + // } + // if(/fontborder/.test(val)){ + // node.setStyle('border','1px solid #000'); + // if(node.attrs['class']){ + // node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); + // }else{ + // node.setAttr('class') + // } + // } + // } + // }); }); + // me.addOutputRule(function(root){ // utils.each(root.getNodesByTagName('span'), function (node) { // var val; - // if(val = node.getAttr('class')){ - // if(/fontstrikethrough/.test(val)){ - // node.setStyle('text-decoration','line-through'); + // if(val = node.getStyle('text-decoration')){ + // if(/line-through/.test(val)){ // if(node.attrs['class']){ - // node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); + // node.attrs['class'] += ' fontstrikethrough'; // }else{ - // node.setAttr('class') + // node.setAttr('class','fontstrikethrough') // } // } - // if(/fontborder/.test(val)){ - // node.setStyle('border','1px solid #000'); + // + // node.setStyle('text-decoration') + // } + // if(val = node.getStyle('border')){ + // if(/1px/.test(val) && /solid/.test(val)){ // if(node.attrs['class']){ - // node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); + // node.attrs['class'] += ' fontborder'; + // // }else{ - // node.setAttr('class') + // node.setAttr('class','fontborder') // } // } + // node.setStyle('border') + // // } // }); - }); - // me.addOutputRule(function(root){ - // utils.each(root.getNodesByTagName('span'), function (node) { - // var val; - // if(val = node.getStyle('text-decoration')){ - // if(/line-through/.test(val)){ - // if(node.attrs['class']){ - // node.attrs['class'] += ' fontstrikethrough'; - // }else{ - // node.setAttr('class','fontstrikethrough') - // } - // } - // - // node.setStyle('text-decoration') - // } - // if(val = node.getStyle('border')){ - // if(/1px/.test(val) && /solid/.test(val)){ - // if(node.attrs['class']){ - // node.attrs['class'] += ' fontborder'; - // - // }else{ - // node.setAttr('class','fontborder') - // } - // } - // node.setStyle('border') - // - // } - // }); - // }); - for (var p in fonts) { - (function(cmd, style) { - UE.commands[cmd] = { - execCommand: function(cmdName, value) { - value = - value || - (this.queryCommandState(cmdName) - ? "none" - : cmdName == "underline" - ? "underline" - : cmdName == "fontborder" ? "1px solid #000" : "line-through"); - var me = this, - range = this.selection.getRange(), - text; + // }); + for (var p in fonts) { + (function (cmd, style) { + UE.commands[cmd] = { + execCommand: function (cmdName, value) { + // console.log("execCommand", cmdName, value); + value = + value || + (this.queryCommandState(cmdName) + ? "none" + : cmdName === "underline" + ? "underline" + : cmdName === "fontborder" ? "1px solid #000" : "line-through"); + var me = this, + range = this.selection.getRange(), + text; - if (value == "default") { - if (range.collapsed) { - text = me.document.createTextNode("font"); - range.insertNode(text).select(); - } - me.execCommand("removeFormat", "span,a", style); - if (text) { - range.setStartBefore(text).collapse(true); - domUtils.remove(text); - } - mergesibling(range, cmdName, value); - range.select(); - } else { - if (!range.collapsed) { - if (needCmd[cmd] && me.queryCommandValue(cmd)) { - me.execCommand("removeFormat", "span,a", style); - } - range = me.selection.getRange(); + if (value === "default") { + if (range.collapsed) { + text = me.document.createTextNode("font"); + range.insertNode(text).select(); + } + me.execCommand("removeFormat", "span,a", style); + if (text) { + range.setStartBefore(text).collapse(true); + domUtils.remove(text); + } + mergesibling(range, cmdName, value); + range.select(); + } else { + if (!range.collapsed) { + if (needCmd[cmd] && me.queryCommandValue(cmd)) { + me.execCommand("removeFormat", "span,a", style); + } + range = me.selection.getRange(); - range.applyInlineStyle("span", { style: style + ":" + value }); - mergesibling(range, cmdName, value); - range.select(); - } else { - var span = domUtils.findParentByTagName( - range.startContainer, - "span", - true - ); - text = me.document.createTextNode("font"); - if ( - span && - !span.children.length && - !span[browser.ie ? "innerText" : "textContent"].replace( - fillCharReg, - "" - ).length - ) { - //for ie hack when enter - range.insertNode(text); - if (needCmd[cmd]) { - range.selectNode(text).select(); - me.execCommand("removeFormat", "span,a", style, null); + range.applyInlineStyle("span", {style: style + ":" + value}); + mergesibling(range, cmdName, value); + range.select(); + } else { + var span = domUtils.findParentByTagName( + range.startContainer, + "span", + true + ); + text = me.document.createTextNode("font"); + if ( + span && + !span.children.length && + !span[browser.ie ? "innerText" : "textContent"].replace( + fillCharReg, + "" + ).length + ) { + //for ie hack when enter + range.insertNode(text); + if (needCmd[cmd]) { + range.selectNode(text).select(); + me.execCommand("removeFormat", "span,a", style, null); - span = domUtils.findParentByTagName(text, "span", true); - range.setStartBefore(text); - } - span && (span.style.cssText += ";" + style + ":" + value); - range.collapse(true).select(); - } else { - range.insertNode(text); - range.selectNode(text).select(); - span = range.document.createElement("span"); + span = domUtils.findParentByTagName(text, "span", true); + range.setStartBefore(text); + } + span && (span.style.cssText += ";" + style + ":" + value); + range.collapse(true).select(); + } else { + range.insertNode(text); + range.selectNode(text).select(); + span = range.document.createElement("span"); - if (needCmd[cmd]) { - //a标签内的不处理跳过 - if (domUtils.findParentByTagName(text, "a", true)) { - range.setStartBefore(text).setCursor(); - domUtils.remove(text); - return; - } - me.execCommand("removeFormat", "span,a", style); - } + if (needCmd[cmd]) { + //a标签内的不处理跳过 + if (domUtils.findParentByTagName(text, "a", true)) { + range.setStartBefore(text).setCursor(); + domUtils.remove(text); + return; + } + me.execCommand("removeFormat", "span,a", style); + } - span.style.cssText = style + ":" + value; + span.style.cssText = style + ":" + value; - text.parentNode.insertBefore(span, text); - //修复,span套span 但样式不继承的问题 - if (!browser.ie || (browser.ie && browser.version == 9)) { - var spanParent = span.parentNode; - while (!domUtils.isBlockElm(spanParent)) { - if (spanParent.tagName == "SPAN") { - //opera合并style不会加入";" - span.style.cssText = - spanParent.style.cssText + ";" + span.style.cssText; + text.parentNode.insertBefore(span, text); + //修复,span套span 但样式不继承的问题 + if (!browser.ie || (browser.ie && browser.version === 9)) { + var spanParent = span.parentNode; + while (!domUtils.isBlockElm(spanParent)) { + if (spanParent.tagName === "SPAN") { + //opera合并style不会加入";" + span.style.cssText = + spanParent.style.cssText + ";" + span.style.cssText; + } + spanParent = spanParent.parentNode; + } + } + + if (opera) { + setTimeout(function () { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName, value); + range.select(); + }); + } else { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName, value); + range.select(); + } + + //trace:981 + //domUtils.mergeToParent(span) + } + domUtils.remove(text); + } + } + return true; + }, + queryCommandValue: function (cmdName) { + var startNode = this.selection.getStart(); + var styleVal; + + //trace:946 + if (cmdName === "underline" || cmdName === "strikethrough") { + var tmpNode = startNode, + value; + while ( + tmpNode && + !domUtils.isBlockElm(tmpNode) && + !domUtils.isBody(tmpNode) + ) { + if (tmpNode.nodeType === 1) { + value = domUtils.getComputedStyle(tmpNode, style); + if (value !== "none") { + return value; + } + } + + tmpNode = tmpNode.parentNode; + } + return "none"; + } else if (cmdName === "fontborder") { + var tmp = startNode, + val; + while (tmp && dtd.$inline[tmp.tagName]) { + if ((val = domUtils.getComputedStyle(tmp, "border"))) { + if (/1px/.test(val) && /solid/.test(val)) { + return val; + } + } + tmp = tmp.parentNode; + } + return ""; + } else if (cmdName === "FontSize") { + styleVal = domUtils.getComputedStyle(startNode, style); + tmp = /^([\d\.]+)(\w+)$/.exec(styleVal); + + if (tmp) { + return Math.floor(tmp[1]) + tmp[2]; + } + + return styleVal; + } else if (cmdName === 'FontFamily') { + styleVal = domUtils.getComputedStyle(startNode, style) + // 移除左右引号 + styleVal = styleVal.replace(/['"]/g, ''); + // 移除字体 宋体, SimSun 转为 宋体,SimSun,否则以下的判断会出错 + styleVal = styleVal.replace(/\s*,\s*/g, ','); + var fontFamily = lang.fontfamily.default; + var fontList = me.options["fontfamily"] || []; + for (var i = 0; i < fontList.length; i++) { + var v = fontList[i]; + // console.log('FontFamily', styleVal, v.val); + if (v.val === styleVal) { + fontFamily = styleVal; + break; + } + } + // console.log('fontList', fontList); + // console.log('FontFamily', styleVal, fontFamily); + return fontFamily; + } + + value = domUtils.getComputedStyle(startNode, style); + return value; + }, + queryCommandState: function (cmdName) { + if (!needCmd[cmdName]) return 0; + var val = this.queryCommandValue(cmdName); + if (cmdName === "fontborder") { + return /1px/.test(val) && /solid/.test(val); + } else { + return cmdName === "underline" + ? /underline/.test(val) + : /line\-through/.test(val); } - spanParent = spanParent.parentNode; - } } - - if (opera) { - setTimeout(function() { - range.setStart(span, 0).collapse(true); - mergesibling(range, cmdName, value); - range.select(); - }); - } else { - range.setStart(span, 0).collapse(true); - mergesibling(range, cmdName, value); - range.select(); - } - - //trace:981 - //domUtils.mergeToParent(span) - } - domUtils.remove(text); - } - } - return true; - }, - queryCommandValue: function(cmdName) { - var startNode = this.selection.getStart(); - - //trace:946 - if (cmdName == "underline" || cmdName == "strikethrough") { - var tmpNode = startNode, - value; - while ( - tmpNode && - !domUtils.isBlockElm(tmpNode) && - !domUtils.isBody(tmpNode) - ) { - if (tmpNode.nodeType == 1) { - value = domUtils.getComputedStyle(tmpNode, style); - if (value != "none") { - return value; - } - } - - tmpNode = tmpNode.parentNode; - } - return "none"; - } - if (cmdName == "fontborder") { - var tmp = startNode, - val; - while (tmp && dtd.$inline[tmp.tagName]) { - if ((val = domUtils.getComputedStyle(tmp, "border"))) { - if (/1px/.test(val) && /solid/.test(val)) { - return val; - } - } - tmp = tmp.parentNode; - } - return ""; - } - - if (cmdName == "FontSize") { - var styleVal = domUtils.getComputedStyle(startNode, style), - tmp = /^([\d\.]+)(\w+)$/.exec(styleVal); - - if (tmp) { - return Math.floor(tmp[1]) + tmp[2]; - } - - return styleVal; - } - - return domUtils.getComputedStyle(startNode, style); - }, - queryCommandState: function(cmdName) { - if (!needCmd[cmdName]) return 0; - var val = this.queryCommandValue(cmdName); - if (cmdName == "fontborder") { - return /1px/.test(val) && /solid/.test(val); - } else { - return cmdName == "underline" - ? /underline/.test(val) - : /line\-through/.test(val); - } - } - }; - })(p, fonts[p]); - } + }; + })(p, fonts[p]); + } }; @@ -12947,155 +16397,157 @@ UE.plugins["font"] = function() { * ``` */ -UE.plugins["link"] = function() { - function optimize(range) { - var start = range.startContainer, - end = range.endContainer; +UE.plugins["link"] = function () { + function optimize(range) { + var start = range.startContainer, + end = range.endContainer; - if ((start = domUtils.findParentByTagName(start, "a", true))) { - range.setStartBefore(start); - } - if ((end = domUtils.findParentByTagName(end, "a", true))) { - range.setEndAfter(end); - } - } - - UE.commands["unlink"] = { - execCommand: function() { - var range = this.selection.getRange(), - bookmark; - if ( - range.collapsed && - !domUtils.findParentByTagName(range.startContainer, "a", true) - ) { - return; - } - bookmark = range.createBookmark(); - optimize(range); - range.removeInlineStyle("a").moveToBookmark(bookmark).select(); - }, - queryCommandState: function() { - return !this.highlight && this.queryCommandValue("link") ? 0 : -1; - } - }; - function doLink(range, opt, me) { - var rngClone = range.cloneRange(), - link = me.queryCommandValue("link"); - optimize((range = range.adjustmentBoundary())); - var start = range.startContainer; - if (start.nodeType == 1 && link) { - start = start.childNodes[range.startOffset]; - if ( - start && - start.nodeType == 1 && - start.tagName == "A" && - /^(?:https?|ftp|file)\s*:\s*\/\//.test( - start[browser.ie ? "innerText" : "textContent"] - ) - ) { - start[browser.ie ? "innerText" : "textContent"] = utils.html( - opt.textValue || opt.href - ); - } - } - if (!rngClone.collapsed || link) { - range.removeInlineStyle("a"); - rngClone = range.cloneRange(); - } - - if (rngClone.collapsed) { - var a = range.document.createElement("a"), - text = ""; - if (opt.textValue) { - text = utils.html(opt.textValue); - delete opt.textValue; - } else { - text = utils.html(opt.href); - } - domUtils.setAttributes(a, opt); - start = domUtils.findParentByTagName(rngClone.startContainer, "a", true); - if (start && domUtils.isInNodeEndBoundary(rngClone, start)) { - range.setStartAfter(start).collapse(true); - } - a[browser.ie ? "innerText" : "textContent"] = text; - range.insertNode(a).selectNode(a); - } else { - range.applyInlineStyle("a", opt); - } - } - UE.commands["link"] = { - execCommand: function(cmdName, opt) { - var range; - opt._href && (opt._href = utils.unhtml(opt._href, /[<">]/g)); - opt.href && (opt.href = utils.unhtml(opt.href, /[<">]/g)); - opt.textValue && (opt.textValue = utils.unhtml(opt.textValue, /[<">]/g)); - doLink((range = this.selection.getRange()), opt, this); - //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 - range.collapse().select(true); - }, - queryCommandValue: function() { - var range = this.selection.getRange(), - node; - if (range.collapsed) { - // node = this.selection.getStart(); - //在ie下getstart()取值偏上了 - node = range.startContainer; - node = node.nodeType == 1 ? node : node.parentNode; - - if ( - node && - (node = domUtils.findParentByTagName(node, "a", true)) && - !domUtils.isInNodeEndBoundary(range, node) - ) { - return node; + if ((start = domUtils.findParentByTagName(start, "a", true))) { + range.setStartBefore(start); } - } else { - //trace:1111 如果是

    xx

    startContainer是p就会找不到a - range.shrinkBoundary(); - var start = range.startContainer.nodeType == 3 || - !range.startContainer.childNodes[range.startOffset] - ? range.startContainer - : range.startContainer.childNodes[range.startOffset], - end = range.endContainer.nodeType == 3 || range.endOffset == 0 - ? range.endContainer - : range.endContainer.childNodes[range.endOffset - 1], - common = range.getCommonAncestor(); - node = domUtils.findParentByTagName(common, "a", true); - if (!node && common.nodeType == 1) { - var as = common.getElementsByTagName("a"), - ps, - pe; + if ((end = domUtils.findParentByTagName(end, "a", true))) { + range.setEndAfter(end); + } + } - for (var i = 0, ci; (ci = as[i++]); ) { - (ps = domUtils.getPosition(ci, start)), (pe = domUtils.getPosition( - ci, - end - )); + UE.commands["unlink"] = { + execCommand: function () { + var range = this.selection.getRange(), + bookmark; if ( - (ps & domUtils.POSITION_FOLLOWING || - ps & domUtils.POSITION_CONTAINS) && - (pe & domUtils.POSITION_PRECEDING || - pe & domUtils.POSITION_CONTAINS) + range.collapsed && + !domUtils.findParentByTagName(range.startContainer, "a", true) ) { - node = ci; - break; + return; } - } + bookmark = range.createBookmark(); + optimize(range); + range.removeInlineStyle("a").moveToBookmark(bookmark).select(); + }, + queryCommandState: function () { + return !this.highlight && this.queryCommandValue("link") ? 0 : -1; + } + }; + + function doLink(range, opt, me) { + var rngClone = range.cloneRange(), + link = me.queryCommandValue("link"); + optimize((range = range.adjustmentBoundary())); + var start = range.startContainer; + if (start.nodeType == 1 && link) { + start = start.childNodes[range.startOffset]; + if ( + start && + start.nodeType == 1 && + start.tagName == "A" && + /^(?:https?|ftp|file)\s*:\s*\/\//.test( + start[browser.ie ? "innerText" : "textContent"] + ) + ) { + start[browser.ie ? "innerText" : "textContent"] = utils.html( + opt.textValue || opt.href + ); + } + } + if (!rngClone.collapsed || link) { + range.removeInlineStyle("a"); + rngClone = range.cloneRange(); + } + + if (rngClone.collapsed) { + var a = range.document.createElement("a"), + text = ""; + if (opt.textValue) { + text = utils.html(opt.textValue); + delete opt.textValue; + } else { + text = utils.html(opt.href); + } + domUtils.setAttributes(a, opt); + start = domUtils.findParentByTagName(rngClone.startContainer, "a", true); + if (start && domUtils.isInNodeEndBoundary(rngClone, start)) { + range.setStartAfter(start).collapse(true); + } + a[browser.ie ? "innerText" : "textContent"] = text; + range.insertNode(a).selectNode(a); + } else { + range.applyInlineStyle("a", opt); } - return node; - } - }, - queryCommandState: function() { - //判断如果是视频的话连接不可用 - //fix 853 - var img = this.selection.getRange().getClosedNode(), - flag = - img && - (img.className == "edui-faked-video" || - img.className.indexOf("edui-upload-video") != -1); - return flag ? -1 : 0; } - }; + + UE.commands["link"] = { + execCommand: function (cmdName, opt) { + var range; + opt._href && (opt._href = utils.unhtml(opt._href, /[<">]/g)); + opt.href && (opt.href = utils.unhtml(opt.href, /[<">]/g)); + opt.textValue && (opt.textValue = utils.unhtml(opt.textValue, /[<">]/g)); + doLink((range = this.selection.getRange()), opt, this); + //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 + range.collapse().select(true); + }, + queryCommandValue: function () { + var range = this.selection.getRange(), + node; + if (range.collapsed) { + // node = this.selection.getStart(); + //在ie下getstart()取值偏上了 + node = range.startContainer; + node = node.nodeType == 1 ? node : node.parentNode; + + if ( + node && + (node = domUtils.findParentByTagName(node, "a", true)) && + !domUtils.isInNodeEndBoundary(range, node) + ) { + return node; + } + } else { + //trace:1111 如果是

    xx

    startContainer是p就会找不到a + range.shrinkBoundary(); + var start = range.startContainer.nodeType == 3 || + !range.startContainer.childNodes[range.startOffset] + ? range.startContainer + : range.startContainer.childNodes[range.startOffset], + end = range.endContainer.nodeType == 3 || range.endOffset == 0 + ? range.endContainer + : range.endContainer.childNodes[range.endOffset - 1], + common = range.getCommonAncestor(); + node = domUtils.findParentByTagName(common, "a", true); + if (!node && common.nodeType == 1) { + var as = common.getElementsByTagName("a"), + ps, + pe; + + for (var i = 0, ci; (ci = as[i++]);) { + (ps = domUtils.getPosition(ci, start)), (pe = domUtils.getPosition( + ci, + end + )); + if ( + (ps & domUtils.POSITION_FOLLOWING || + ps & domUtils.POSITION_CONTAINS) && + (pe & domUtils.POSITION_PRECEDING || + pe & domUtils.POSITION_CONTAINS) + ) { + node = ci; + break; + } + } + } + return node; + } + }, + queryCommandState: function () { + //判断如果是视频的话连接不可用 + //fix 853 + var img = this.selection.getRange().getClosedNode(), + flag = + img && + (img.className == "edui-faked-video" || + img.className.indexOf("edui-upload-video") != -1); + return flag ? -1 : 0; + } + }; }; @@ -13107,15 +16559,16 @@ UE.plugins["link"] = function() { ///commandsTitle 插入Iframe ///commandsDialog dialogs\insertframe -UE.plugins["insertframe"] = function() { - var me = this; - function deleteIframe() { - me._iframe && delete me._iframe; - } +UE.plugins["insertframe"] = function () { + var me = this; - me.addListener("selectionchange", function() { - deleteIframe(); - }); + function deleteIframe() { + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange", function () { + deleteIframe(); + }); }; @@ -13126,9 +16579,9 @@ UE.plugins["insertframe"] = function() { ///commandsTitle 涂鸦 ///commandsDialog dialogs\scrawl UE.commands["scrawl"] = { - queryCommandState: function() { - return browser.ie && browser.version <= 8 ? -1 : 0; - } + queryCommandState: function () { + return browser.ie && browser.version <= 8 ? -1 : 0; + } }; @@ -13153,192 +16606,196 @@ UE.commands["scrawl"] = { * ``` */ -UE.plugins["removeformat"] = function() { - var me = this; - me.setOpt({ - removeFormatTags: - "b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var", - removeFormatAttributes: "class,style,lang,width,height,align,hspace,valign" - }); - me.commands["removeformat"] = { - execCommand: function(cmdName, tags, style, attrs, notIncludeA) { - var tagReg = new RegExp( - "^(?:" + - (tags || this.options.removeFormatTags).replace(/,/g, "|") + - ")$", - "i" - ), - removeFormatAttributes = style - ? [] - : (attrs || this.options.removeFormatAttributes).split(","), - range = new dom.Range(this.document), - bookmark, - node, - parent, - filter = function(node) { - return node.nodeType == 1; - }; +UE.plugins["removeformat"] = function () { + var me = this; + me.setOpt({ + removeFormatTags: + "b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var", + removeFormatAttributes: "class,style,lang,width,height,align,hspace,valign" + }); + me.commands["removeformat"] = { + execCommand: function (cmdName, tags, style, attrs, notIncludeA) { + var tagReg = new RegExp( + "^(?:" + + (tags || this.options.removeFormatTags).replace(/,/g, "|") + + ")$", + "i" + ), + removeFormatAttributes = style + ? [] + : (attrs || this.options.removeFormatAttributes).split(","), + range = new dom.Range(this.document), + bookmark, + node, + parent, + filter = function (node) { + return node.nodeType == 1; + }; - function isRedundantSpan(node) { - if (node.nodeType == 3 || node.tagName.toLowerCase() != "span") { - return 0; - } - if (browser.ie) { - //ie 下判断实效,所以只能简单用style来判断 - //return node.style.cssText == '' ? 1 : 0; - var attrs = node.attributes; - if (attrs.length) { - for (var i = 0, l = attrs.length; i < l; i++) { - if (attrs[i].specified) { - return 0; - } - } - return 1; - } - } - return !node.attributes.length; - } - function doRemove(range) { - var bookmark1 = range.createBookmark(); - if (range.collapsed) { - range.enlarge(true); - } - - //不能把a标签切了 - if (!notIncludeA) { - var aNode = domUtils.findParentByTagName( - range.startContainer, - "a", - true - ); - if (aNode) { - range.setStartBefore(aNode); - } - - aNode = domUtils.findParentByTagName(range.endContainer, "a", true); - if (aNode) { - range.setEndAfter(aNode); - } - } - - bookmark = range.createBookmark(); - - node = bookmark.start; - - //切开始 - while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { - domUtils.breakParent(node, parent); - - domUtils.clearEmptySibling(node); - } - if (bookmark.end) { - //切结束 - node = bookmark.end; - while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { - domUtils.breakParent(node, parent); - domUtils.clearEmptySibling(node); - } - - //开始去除样式 - var current = domUtils.getNextDomNode(bookmark.start, false, filter), - next; - while (current) { - if (current == bookmark.end) { - break; - } - - next = domUtils.getNextDomNode(current, true, filter); - - if ( - !dtd.$empty[current.tagName.toLowerCase()] && - !domUtils.isBookmarkNode(current) - ) { - if (tagReg.test(current.tagName)) { - if (style) { - domUtils.removeStyle(current, style); - if (isRedundantSpan(current) && style != "text-decoration") { - domUtils.remove(current, true); - } - } else { - domUtils.remove(current, true); + function isRedundantSpan(node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != "span") { + return 0; } - } else { - //trace:939 不能把list上的样式去掉 + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if (attrs.length) { + for (var i = 0, l = attrs.length; i < l; i++) { + if (attrs[i].specified) { + return 0; + } + } + return 1; + } + } + return !node.attributes.length; + } + + function doRemove(range) { + var bookmark1 = range.createBookmark(); + if (range.collapsed) { + range.enlarge(true); + } + + //不能把a标签切了 + if (!notIncludeA) { + var aNode = domUtils.findParentByTagName( + range.startContainer, + "a", + true + ); + if (aNode) { + range.setStartBefore(aNode); + } + + aNode = domUtils.findParentByTagName(range.endContainer, "a", true); + if (aNode) { + range.setEndAfter(aNode); + } + } + + bookmark = range.createBookmark(); + + node = bookmark.start; + + //切开始 + while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { + domUtils.breakParent(node, parent); + + domUtils.clearEmptySibling(node); + } + if (bookmark.end) { + //切结束 + node = bookmark.end; + while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { + domUtils.breakParent(node, parent); + domUtils.clearEmptySibling(node); + } + + //开始去除样式 + var current = domUtils.getNextDomNode(bookmark.start, false, filter), + next; + while (current) { + if (current == bookmark.end) { + break; + } + + next = domUtils.getNextDomNode(current, true, filter); + + if ( + !dtd.$empty[current.tagName.toLowerCase()] && + !domUtils.isBookmarkNode(current) + ) { + if (tagReg.test(current.tagName)) { + if (style) { + domUtils.removeStyle(current, style); + if (isRedundantSpan(current) && style != "text-decoration") { + domUtils.remove(current, true); + } + } else { + domUtils.remove(current, true); + } + } else { + //trace:939 不能把list上的样式去掉 + // 清除格式时,默认移除Table、List上的样式 + if ( + true + // !dtd.$tableContent[current.tagName] && !dtd.$list[current.tagName] + ) { + domUtils.removeAttributes(current, removeFormatAttributes); + if (isRedundantSpan(current)) { + domUtils.remove(current, true); + } + } else { + // console.log('current.ignore',current); + } + } + } + current = next; + } + } + //trace:1035 + //trace:1096 不能把td上的样式去掉,比如边框 + var pN = bookmark.start.parentNode; if ( - !dtd.$tableContent[current.tagName] && - !dtd.$list[current.tagName] + domUtils.isBlockElm(pN) && + !dtd.$tableContent[pN.tagName] && + !dtd.$list[pN.tagName] ) { - domUtils.removeAttributes(current, removeFormatAttributes); - if (isRedundantSpan(current)) { - domUtils.remove(current, true); - } + domUtils.removeAttributes(pN, removeFormatAttributes); + } + pN = bookmark.end.parentNode; + if ( + bookmark.end && + domUtils.isBlockElm(pN) && + !dtd.$tableContent[pN.tagName] && + !dtd.$list[pN.tagName] + ) { + domUtils.removeAttributes(pN, removeFormatAttributes); + } + range.moveToBookmark(bookmark).moveToBookmark(bookmark1); + //清除冗余的代码 + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while ( + node.nodeType == 1 && + domUtils.isEmptyNode(node) && + dtd.$removeEmpty[node.tagName] + ) { + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if (range.startContainer === range.endContainer) { + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if (!collapsed) { + node = range.endContainer; + while ( + node.nodeType == 1 && + domUtils.isEmptyNode(node) && + dtd.$removeEmpty[node.tagName] + ) { + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } } - } } - current = next; - } - } - //trace:1035 - //trace:1096 不能把td上的样式去掉,比如边框 - var pN = bookmark.start.parentNode; - if ( - domUtils.isBlockElm(pN) && - !dtd.$tableContent[pN.tagName] && - !dtd.$list[pN.tagName] - ) { - domUtils.removeAttributes(pN, removeFormatAttributes); - } - pN = bookmark.end.parentNode; - if ( - bookmark.end && - domUtils.isBlockElm(pN) && - !dtd.$tableContent[pN.tagName] && - !dtd.$list[pN.tagName] - ) { - domUtils.removeAttributes(pN, removeFormatAttributes); - } - range.moveToBookmark(bookmark).moveToBookmark(bookmark1); - //清除冗余的代码 - var node = range.startContainer, - tmp, - collapsed = range.collapsed; - while ( - node.nodeType == 1 && - domUtils.isEmptyNode(node) && - dtd.$removeEmpty[node.tagName] - ) { - tmp = node.parentNode; - range.setStartBefore(node); - //trace:937 - //更新结束边界 - if (range.startContainer === range.endContainer) { - range.endOffset--; - } - domUtils.remove(node); - node = tmp; - } - if (!collapsed) { - node = range.endContainer; - while ( - node.nodeType == 1 && - domUtils.isEmptyNode(node) && - dtd.$removeEmpty[node.tagName] - ) { - tmp = node.parentNode; - range.setEndBefore(node); - domUtils.remove(node); - - node = tmp; - } + range = this.selection.getRange(); + doRemove(range); + range.select(); } - } - - range = this.selection.getRange(); - doRemove(range); - range.select(); - } - }; + }; }; @@ -13374,162 +16831,164 @@ UE.plugins["removeformat"] = function() { * ``` */ -UE.plugins["blockquote"] = function() { - var me = this; - function getObj(editor) { - return domUtils.filterNodeList( - editor.selection.getStartElementPath(), - "blockquote" - ); - } - me.commands["blockquote"] = { - execCommand: function(cmdName, attrs) { - var range = this.selection.getRange(), - obj = getObj(this), - blockquote = dtd.blockquote, - bookmark = range.createBookmark(); +UE.plugins["blockquote"] = function () { + var me = this; - if (obj) { - var start = range.startContainer, - startBlock = domUtils.isBlockElm(start) - ? start - : domUtils.findParent(start, function(node) { - return domUtils.isBlockElm(node); - }), - end = range.endContainer, - endBlock = domUtils.isBlockElm(end) - ? end - : domUtils.findParent(end, function(node) { - return domUtils.isBlockElm(node); - }); - - //处理一下li - startBlock = - domUtils.findParentByTagName(startBlock, "li", true) || startBlock; - endBlock = - domUtils.findParentByTagName(endBlock, "li", true) || endBlock; - - if ( - startBlock.tagName == "LI" || - startBlock.tagName == "TD" || - startBlock === obj || - domUtils.isBody(startBlock) - ) { - domUtils.remove(obj, true); - } else { - domUtils.breakParent(startBlock, obj); - } - - if (startBlock !== endBlock) { - obj = domUtils.findParentByTagName(endBlock, "blockquote"); - if (obj) { - if ( - endBlock.tagName == "LI" || - endBlock.tagName == "TD" || - domUtils.isBody(endBlock) - ) { - obj.parentNode && domUtils.remove(obj, true); - } else { - domUtils.breakParent(endBlock, obj); - } - } - } - - var blockquotes = domUtils.getElementsByTagName( - this.document, - "blockquote" + function getObj(editor) { + return domUtils.filterNodeList( + editor.selection.getStartElementPath(), + "blockquote" ); - for (var i = 0, bi; (bi = blockquotes[i++]); ) { - if (!bi.childNodes.length) { - domUtils.remove(bi); - } else if ( - domUtils.getPosition(bi, startBlock) & - domUtils.POSITION_FOLLOWING && - domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING - ) { - domUtils.remove(bi, true); - } - } - } else { - var tmpRange = range.cloneRange(), - node = tmpRange.startContainer.nodeType == 1 - ? tmpRange.startContainer - : tmpRange.startContainer.parentNode, - preNode = node, - doEnd = 1; - - //调整开始 - while (1) { - if (domUtils.isBody(node)) { - if (preNode !== node) { - if (range.collapsed) { - tmpRange.selectNode(preNode); - doEnd = 0; - } else { - tmpRange.setStartBefore(preNode); - } - } else { - tmpRange.setStart(node, 0); - } - - break; - } - if (!blockquote[node.tagName]) { - if (range.collapsed) { - tmpRange.selectNode(preNode); - } else { - tmpRange.setStartBefore(preNode); - } - break; - } - - preNode = node; - node = node.parentNode; - } - - //调整结束 - if (doEnd) { - preNode = node = node = tmpRange.endContainer.nodeType == 1 - ? tmpRange.endContainer - : tmpRange.endContainer.parentNode; - while (1) { - if (domUtils.isBody(node)) { - if (preNode !== node) { - tmpRange.setEndAfter(preNode); - } else { - tmpRange.setEnd(node, node.childNodes.length); - } - - break; - } - if (!blockquote[node.tagName]) { - tmpRange.setEndAfter(preNode); - break; - } - - preNode = node; - node = node.parentNode; - } - } - - node = range.document.createElement("blockquote"); - domUtils.setAttributes(node, attrs); - node.appendChild(tmpRange.extractContents()); - tmpRange.insertNode(node); - //去除重复的 - var childs = domUtils.getElementsByTagName(node, "blockquote"); - for (var i = 0, ci; (ci = childs[i++]); ) { - if (ci.parentNode) { - domUtils.remove(ci, true); - } - } - } - range.moveToBookmark(bookmark).select(); - }, - queryCommandState: function() { - return getObj(this) ? 1 : 0; } - }; + + me.commands["blockquote"] = { + execCommand: function (cmdName, attrs) { + var range = this.selection.getRange(), + obj = getObj(this), + blockquote = dtd.blockquote, + bookmark = range.createBookmark(); + + if (obj) { + var start = range.startContainer, + startBlock = domUtils.isBlockElm(start) + ? start + : domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node); + }), + end = range.endContainer, + endBlock = domUtils.isBlockElm(end) + ? end + : domUtils.findParent(end, function (node) { + return domUtils.isBlockElm(node); + }); + + //处理一下li + startBlock = + domUtils.findParentByTagName(startBlock, "li", true) || startBlock; + endBlock = + domUtils.findParentByTagName(endBlock, "li", true) || endBlock; + + if ( + startBlock.tagName == "LI" || + startBlock.tagName == "TD" || + startBlock === obj || + domUtils.isBody(startBlock) + ) { + domUtils.remove(obj, true); + } else { + domUtils.breakParent(startBlock, obj); + } + + if (startBlock !== endBlock) { + obj = domUtils.findParentByTagName(endBlock, "blockquote"); + if (obj) { + if ( + endBlock.tagName == "LI" || + endBlock.tagName == "TD" || + domUtils.isBody(endBlock) + ) { + obj.parentNode && domUtils.remove(obj, true); + } else { + domUtils.breakParent(endBlock, obj); + } + } + } + + var blockquotes = domUtils.getElementsByTagName( + this.document, + "blockquote" + ); + for (var i = 0, bi; (bi = blockquotes[i++]);) { + if (!bi.childNodes.length) { + domUtils.remove(bi); + } else if ( + domUtils.getPosition(bi, startBlock) & + domUtils.POSITION_FOLLOWING && + domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING + ) { + domUtils.remove(bi, true); + } + } + } else { + var tmpRange = range.cloneRange(), + node = tmpRange.startContainer.nodeType == 1 + ? tmpRange.startContainer + : tmpRange.startContainer.parentNode, + preNode = node, + doEnd = 1; + + //调整开始 + while (1) { + if (domUtils.isBody(node)) { + if (preNode !== node) { + if (range.collapsed) { + tmpRange.selectNode(preNode); + doEnd = 0; + } else { + tmpRange.setStartBefore(preNode); + } + } else { + tmpRange.setStart(node, 0); + } + + break; + } + if (!blockquote[node.tagName]) { + if (range.collapsed) { + tmpRange.selectNode(preNode); + } else { + tmpRange.setStartBefore(preNode); + } + break; + } + + preNode = node; + node = node.parentNode; + } + + //调整结束 + if (doEnd) { + preNode = node = node = tmpRange.endContainer.nodeType == 1 + ? tmpRange.endContainer + : tmpRange.endContainer.parentNode; + while (1) { + if (domUtils.isBody(node)) { + if (preNode !== node) { + tmpRange.setEndAfter(preNode); + } else { + tmpRange.setEnd(node, node.childNodes.length); + } + + break; + } + if (!blockquote[node.tagName]) { + tmpRange.setEndAfter(preNode); + break; + } + + preNode = node; + node = node.parentNode; + } + } + + node = range.document.createElement("blockquote"); + domUtils.setAttributes(node, attrs); + node.appendChild(tmpRange.extractContents()); + tmpRange.insertNode(node); + //去除重复的 + var childs = domUtils.getElementsByTagName(node, "blockquote"); + for (var i = 0, ci; (ci = childs[i++]);) { + if (ci.parentNode) { + domUtils.remove(ci, true); + } + } + } + range.moveToBookmark(bookmark).select(); + }, + queryCommandState: function () { + return getObj(this) ? 1 : 0; + } + }; }; @@ -13562,34 +17021,34 @@ UE.plugins["blockquote"] = function() { * ``` */ UE.commands["touppercase"] = UE.commands["tolowercase"] = { - execCommand: function(cmd) { - var me = this; - var rng = me.selection.getRange(); - if (rng.collapsed) { - return rng; + execCommand: function (cmd) { + var me = this; + var rng = me.selection.getRange(); + if (rng.collapsed) { + return rng; + } + var bk = rng.createBookmark(), + bkEnd = bk.end, + filterFn = function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }, + curNode = domUtils.getNextDomNode(bk.start, false, filterFn); + while ( + curNode && + domUtils.getPosition(curNode, bkEnd) & domUtils.POSITION_PRECEDING + ) { + if (curNode.nodeType == 3) { + curNode.nodeValue = curNode.nodeValue[ + cmd == "touppercase" ? "toUpperCase" : "toLowerCase" + ](); + } + curNode = domUtils.getNextDomNode(curNode, true, filterFn); + if (curNode === bkEnd) { + break; + } + } + rng.moveToBookmark(bk).select(); } - var bk = rng.createBookmark(), - bkEnd = bk.end, - filterFn = function(node) { - return !domUtils.isBr(node) && !domUtils.isWhitespace(node); - }, - curNode = domUtils.getNextDomNode(bk.start, false, filterFn); - while ( - curNode && - domUtils.getPosition(curNode, bkEnd) & domUtils.POSITION_PRECEDING - ) { - if (curNode.nodeType == 3) { - curNode.nodeValue = curNode.nodeValue[ - cmd == "touppercase" ? "toUpperCase" : "toLowerCase" - ](); - } - curNode = domUtils.getNextDomNode(curNode, true, filterFn); - if (curNode === bkEnd) { - break; - } - } - rng.moveToBookmark(bk).select(); - } }; @@ -13611,20 +17070,20 @@ UE.commands["touppercase"] = UE.commands["tolowercase"] = { * ``` */ UE.commands["indent"] = { - execCommand: function() { - var me = this, - value = me.queryCommandState("indent") - ? "0em" - : me.options.indentValue || "2em"; - me.execCommand("Paragraph", "p", { style: "text-indent:" + value }); - }, - queryCommandState: function() { - var pN = domUtils.filterNodeList( - this.selection.getStartElementPath(), - "p h1 h2 h3 h4 h5 h6" - ); - return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; - } + execCommand: function () { + var me = this, + value = me.queryCommandState("indent") + ? "0em" + : me.options.indentValue || "2em"; + me.execCommand("Paragraph", "p", {style: "text-indent:" + value}); + }, + queryCommandState: function () { + var pN = domUtils.filterNodeList( + this.selection.getStartElementPath(), + "p h1 h2 h3 h4 h5 h6" + ); + return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; + } }; @@ -13646,10 +17105,10 @@ UE.commands["indent"] = { * ``` */ UE.commands["print"] = { - execCommand: function() { - this.window.print(); - }, - notNeedUndo: 1 + execCommand: function () { + this.window.print(); + }, + notNeedUndo: 1 }; @@ -13671,24 +17130,24 @@ UE.commands["print"] = { * ``` */ UE.commands["preview"] = { - execCommand: function() { - var w = window.open("", "_blank", ""), - d = w.document; - d.open(); - d.write( - '
    " + - this.getContent(null, null, true) + - "
    " - ); - d.close(); - }, - notNeedUndo: 1 + execCommand: function () { + var w = window.open("", "_blank", ""), + d = w.document; + d.open(); + d.write( + '
    " + + this.getContent(null, null, true) + + "
    " + ); + d.close(); + }, + notNeedUndo: 1 }; @@ -13709,31 +17168,31 @@ UE.commands["preview"] = { * editor.execCommand( 'selectall' ); * ``` */ -UE.plugins["selectall"] = function() { - var me = this; - me.commands["selectall"] = { - execCommand: function() { - //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 - var me = this, - body = me.body, - range = me.selection.getRange(); - range.selectNodeContents(body); - if (domUtils.isEmptyBlock(body)) { - //opera不能自动合并到元素的里边,要手动处理一下 - if (browser.opera && body.firstChild && body.firstChild.nodeType == 1) { - range.setStartAtFirst(body.firstChild); - } - range.collapse(true); - } - range.select(true); - }, - notNeedUndo: 1 - }; +UE.plugins["selectall"] = function () { + var me = this; + me.commands["selectall"] = { + execCommand: function () { + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this, + body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if (domUtils.isEmptyBlock(body)) { + //opera不能自动合并到元素的里边,要手动处理一下 + if (browser.opera && body.firstChild && body.firstChild.nodeType == 1) { + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo: 1 + }; - //快捷键 - me.addshortcutkey({ - selectAll: "ctrl+65" - }); + //快捷键 + me.addshortcutkey({ + selectAll: "ctrl+65" + }); }; @@ -13771,190 +17230,190 @@ UE.plugins["selectall"] = function() { * ``` */ -UE.plugins["paragraph"] = function() { - var me = this, - block = domUtils.isBlockElm, - notExchange = ["TD", "LI", "PRE"], - doParagraph = function(range, style, attrs, sourceCmdName) { - var bookmark = range.createBookmark(), - filterFn = function(node) { - return node.nodeType == 1 - ? node.tagName.toLowerCase() != "br" && - !domUtils.isBookmarkNode(node) - : !domUtils.isWhitespace(node); +UE.plugins["paragraph"] = function () { + var me = this, + block = domUtils.isBlockElm, + notExchange = ["TD", "LI", "PRE"], + doParagraph = function (range, style, attrs, sourceCmdName) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 + ? node.tagName.toLowerCase() != "br" && + !domUtils.isBookmarkNode(node) + : !domUtils.isWhitespace(node); + }, + para; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while ( + current && + !( + domUtils.getPosition(current, bookmark2.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + if (current.nodeType === 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + + para = range.document.createElement(style); + if (attrs) { + domUtils.setAttributes(para, attrs); + if ( + sourceCmdName && + sourceCmdName === "customstyle" && + attrs.style + ) { + para.style.cssText = attrs.style; + } + } + para.appendChild(tmpRange.extractContents()); + //需要内容占位 + if (domUtils.isEmptyNode(para)) { + domUtils.fillChar(range.document, para); + } + + tmpRange.insertNode(para); + + var parent = para.parentNode; + //如果para上一级是一个block元素且不是body,td就删除它 + if ( + block(parent) && + !domUtils.isBody(para.parentNode) && + utils.indexOf(notExchange, parent.tagName) === -1 + ) { + //存储dir,style + if (!(sourceCmdName && sourceCmdName === "customstyle")) { + parent.getAttribute("dir") && + para.setAttribute("dir", parent.getAttribute("dir")); + //trace:1070 + parent.style.cssText && + (para.style.cssText = + parent.style.cssText + ";" + para.style.cssText); + //trace:1030 + parent.style.textAlign && + !para.style.textAlign && + (para.style.textAlign = parent.style.textAlign); + parent.style.textIndent && + !para.style.textIndent && + (para.style.textIndent = parent.style.textIndent); + parent.style.padding && + !para.style.padding && + (para.style.padding = parent.style.padding); + } + + //trace:1706 选择的就是h1-6要删除 + if ( + attrs && + /h\d/i.test(parent.tagName) && + !/h\d/i.test(para.tagName) + ) { + domUtils.setAttributes(parent, attrs); + if ( + sourceCmdName && + sourceCmdName === "customstyle" && + attrs.style + ) { + parent.style.cssText = attrs.style; + } + domUtils.remove(para.parentNode, true); + para = parent; + } else { + domUtils.remove(para.parentNode, true); + } + } + if (utils.indexOf(notExchange, parent.tagName) !== -1) { + current = parent; + } else { + current = para; + } + + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + me.setOpt("paragraph", { + p: "", + h1: "", + h2: "", + h3: "", + h4: "", + h5: "", + h6: "" + }); + me.commands["paragraph"] = { + execCommand: function (cmdName, style, attrs, sourceCmdName) { + var range = this.selection.getRange(); + //闭合时单独处理 + if (range.collapsed) { + var txt = this.document.createTextNode("p"); + range.insertNode(txt); + //去掉冗余的fillchar + if (browser.ie) { + var node = txt.previousSibling; + if (node && domUtils.isWhitespace(node)) { + domUtils.remove(node); + } + node = txt.nextSibling; + if (node && domUtils.isWhitespace(node)) { + domUtils.remove(node); + } + } + } + range = doParagraph(range, style, attrs, sourceCmdName); + if (txt) { + range.setStartBefore(txt).collapse(true); + pN = txt.parentNode; + + domUtils.remove(txt); + + if (domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN)) { + domUtils.fillNode(this.document, pN); + } + } + + if ( + browser.gecko && + range.collapsed && + range.startContainer.nodeType === 1 + ) { + var child = range.startContainer.childNodes[range.startOffset]; + if ( + child && + child.nodeType === 1 && + child.tagName.toLowerCase() === style + ) { + range.setStart(child, 0).collapse(true); + } + } + //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 + range.select(); + + return true; }, - para; - - range.enlarge(true); - var bookmark2 = range.createBookmark(), - current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), - tmpRange = range.cloneRange(), - tmpNode; - while ( - current && - !( - domUtils.getPosition(current, bookmark2.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - if (current.nodeType == 3 || !block(current)) { - tmpRange.setStartBefore(current); - while (current && current !== bookmark2.end && !block(current)) { - tmpNode = current; - current = domUtils.getNextDomNode(current, false, null, function( - node - ) { - return !block(node); - }); - } - tmpRange.setEndAfter(tmpNode); - - para = range.document.createElement(style); - if (attrs) { - domUtils.setAttributes(para, attrs); - if ( - sourceCmdName && - sourceCmdName == "customstyle" && - attrs.style - ) { - para.style.cssText = attrs.style; - } - } - para.appendChild(tmpRange.extractContents()); - //需要内容占位 - if (domUtils.isEmptyNode(para)) { - domUtils.fillChar(range.document, para); - } - - tmpRange.insertNode(para); - - var parent = para.parentNode; - //如果para上一级是一个block元素且不是body,td就删除它 - if ( - block(parent) && - !domUtils.isBody(para.parentNode) && - utils.indexOf(notExchange, parent.tagName) == -1 - ) { - //存储dir,style - if (!(sourceCmdName && sourceCmdName == "customstyle")) { - parent.getAttribute("dir") && - para.setAttribute("dir", parent.getAttribute("dir")); - //trace:1070 - parent.style.cssText && - (para.style.cssText = - parent.style.cssText + ";" + para.style.cssText); - //trace:1030 - parent.style.textAlign && - !para.style.textAlign && - (para.style.textAlign = parent.style.textAlign); - parent.style.textIndent && - !para.style.textIndent && - (para.style.textIndent = parent.style.textIndent); - parent.style.padding && - !para.style.padding && - (para.style.padding = parent.style.padding); - } - - //trace:1706 选择的就是h1-6要删除 - if ( - attrs && - /h\d/i.test(parent.tagName) && - !/h\d/i.test(para.tagName) - ) { - domUtils.setAttributes(parent, attrs); - if ( - sourceCmdName && - sourceCmdName == "customstyle" && - attrs.style - ) { - parent.style.cssText = attrs.style; - } - domUtils.remove(para.parentNode, true); - para = parent; - } else { - domUtils.remove(para.parentNode, true); - } - } - if (utils.indexOf(notExchange, parent.tagName) != -1) { - current = parent; - } else { - current = para; - } - - current = domUtils.getNextDomNode(current, false, filterFn); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); + queryCommandValue: function () { + var node = domUtils.filterNodeList( + this.selection.getStartElementPath(), + "p h1 h2 h3 h4 h5 h6" + ); + return node ? node.tagName.toLowerCase() : ""; } - } - return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); }; - me.setOpt("paragraph", { - p: "", - h1: "", - h2: "", - h3: "", - h4: "", - h5: "", - h6: "" - }); - me.commands["paragraph"] = { - execCommand: function(cmdName, style, attrs, sourceCmdName) { - var range = this.selection.getRange(); - //闭合时单独处理 - if (range.collapsed) { - var txt = this.document.createTextNode("p"); - range.insertNode(txt); - //去掉冗余的fillchar - if (browser.ie) { - var node = txt.previousSibling; - if (node && domUtils.isWhitespace(node)) { - domUtils.remove(node); - } - node = txt.nextSibling; - if (node && domUtils.isWhitespace(node)) { - domUtils.remove(node); - } - } - } - range = doParagraph(range, style, attrs, sourceCmdName); - if (txt) { - range.setStartBefore(txt).collapse(true); - pN = txt.parentNode; - - domUtils.remove(txt); - - if (domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN)) { - domUtils.fillNode(this.document, pN); - } - } - - if ( - browser.gecko && - range.collapsed && - range.startContainer.nodeType == 1 - ) { - var child = range.startContainer.childNodes[range.startOffset]; - if ( - child && - child.nodeType == 1 && - child.tagName.toLowerCase() == style - ) { - range.setStart(child, 0).collapse(true); - } - } - //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 - range.select(); - - return true; - }, - queryCommandValue: function() { - var node = domUtils.filterNodeList( - this.selection.getStartElementPath(), - "p h1 h2 h3 h4 h5 h6" - ); - return node ? node.tagName.toLowerCase() : ""; - } - }; }; @@ -13964,88 +17423,88 @@ UE.plugins["paragraph"] = function() { * @file * @since 1.2.6.1 */ -(function() { - var block = domUtils.isBlockElm, - getObj = function(editor) { - // var startNode = editor.selection.getStart(), - // parents; - // if ( startNode ) { - // //查找所有的是block的父亲节点 - // parents = domUtils.findParents( startNode, true, block, true ); - // for ( var i = 0,ci; ci = parents[i++]; ) { - // if ( ci.getAttribute( 'dir' ) ) { - // return ci; - // } - // } - // } - return domUtils.filterNodeList( - editor.selection.getStartElementPath(), - function(n) { - return n && n.nodeType == 1 && n.getAttribute("dir"); - } - ); - }, - doDirectionality = function(range, editor, forward) { - var bookmark, - filterFn = function(node) { - return node.nodeType == 1 - ? !domUtils.isBookmarkNode(node) - : !domUtils.isWhitespace(node); +(function () { + var block = domUtils.isBlockElm, + getObj = function (editor) { + // var startNode = editor.selection.getStart(), + // parents; + // if ( startNode ) { + // //查找所有的是block的父亲节点 + // parents = domUtils.findParents( startNode, true, block, true ); + // for ( var i = 0,ci; ci = parents[i++]; ) { + // if ( ci.getAttribute( 'dir' ) ) { + // return ci; + // } + // } + // } + return domUtils.filterNodeList( + editor.selection.getStartElementPath(), + function (n) { + return n && n.nodeType == 1 && n.getAttribute("dir"); + } + ); }, - obj = getObj(editor); + doDirectionality = function (range, editor, forward) { + var bookmark, + filterFn = function (node) { + return node.nodeType == 1 + ? !domUtils.isBookmarkNode(node) + : !domUtils.isWhitespace(node); + }, + obj = getObj(editor); - if (obj && range.collapsed) { - obj.setAttribute("dir", forward); - return range; - } - bookmark = range.createBookmark(); - range.enlarge(true); - var bookmark2 = range.createBookmark(), - current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), - tmpRange = range.cloneRange(), - tmpNode; - while ( - current && - !( - domUtils.getPosition(current, bookmark2.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - if (current.nodeType == 3 || !block(current)) { - tmpRange.setStartBefore(current); - while (current && current !== bookmark2.end && !block(current)) { - tmpNode = current; - current = domUtils.getNextDomNode(current, false, null, function( - node - ) { - return !block(node); - }); - } - tmpRange.setEndAfter(tmpNode); - var common = tmpRange.getCommonAncestor(); - if (!domUtils.isBody(common) && block(common)) { - //遍历到了block节点 - common.setAttribute("dir", forward); - current = common; - } else { - //没有遍历到,添加一个block节点 - var p = range.document.createElement("p"); - p.setAttribute("dir", forward); - var frag = tmpRange.extractContents(); - p.appendChild(frag); - tmpRange.insertNode(p); - current = p; - } + if (obj && range.collapsed) { + obj.setAttribute("dir", forward); + return range; + } + bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while ( + current && + !( + domUtils.getPosition(current, bookmark2.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + //遍历到了block节点 + common.setAttribute("dir", forward); + current = common; + } else { + //没有遍历到,添加一个block节点 + var p = range.document.createElement("p"); + p.setAttribute("dir", forward); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } - current = domUtils.getNextDomNode(current, false, filterFn); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); - } - } - return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); - }; + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; - /** + /** * 文字输入方向 * @command directionality * @method execCommand @@ -14057,7 +17516,7 @@ UE.plugins["paragraph"] = function() { * ``` */ - /** + /** * 查询当前选区的文字输入方向 * @command directionality * @method queryCommandValue @@ -14068,28 +17527,28 @@ UE.plugins["paragraph"] = function() { * editor.queryCommandValue( 'directionality'); * ``` */ - UE.commands["directionality"] = { - execCommand: function(cmdName, forward) { - var range = this.selection.getRange(); - //闭合时单独处理 - if (range.collapsed) { - var txt = this.document.createTextNode("d"); - range.insertNode(txt); - } - doDirectionality(range, this, forward); - if (txt) { - range.setStartBefore(txt).collapse(true); - domUtils.remove(txt); - } + UE.commands["directionality"] = { + execCommand: function (cmdName, forward) { + var range = this.selection.getRange(); + //闭合时单独处理 + if (range.collapsed) { + var txt = this.document.createTextNode("d"); + range.insertNode(txt); + } + doDirectionality(range, this, forward); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } - range.select(); - return true; - }, - queryCommandValue: function() { - var node = getObj(this); - return node ? node.getAttribute("dir") : "ltr"; - } - }; + range.select(); + return true; + }, + queryCommandValue: function () { + var node = getObj(this); + return node ? node.getAttribute("dir") : "ltr"; + } + }; })(); @@ -14110,91 +17569,91 @@ UE.plugins["paragraph"] = function() { * editor.execCommand( 'horizontal' ); * ``` */ -UE.plugins["horizontal"] = function() { - var me = this; - me.commands["horizontal"] = { - execCommand: function(cmdName) { - var me = this; - if (me.queryCommandState(cmdName) !== -1) { - me.execCommand("insertHtml", "
    "); - var range = me.selection.getRange(), - start = range.startContainer; - if (start.nodeType == 1 && !start.childNodes[range.startOffset]) { - var tmp; - if ((tmp = start.childNodes[range.startOffset - 1])) { - if (tmp.nodeType == 1 && tmp.tagName == "HR") { - if (me.options.enterTag == "p") { - tmp = me.document.createElement("p"); - range.insertNode(tmp); - range.setStart(tmp, 0).setCursor(); - } else { - tmp = me.document.createElement("br"); - range.insertNode(tmp); - range.setStartBefore(tmp).setCursor(); - } +UE.plugins["horizontal"] = function () { + var me = this; + me.commands["horizontal"] = { + execCommand: function (cmdName) { + var me = this; + if (me.queryCommandState(cmdName) !== -1) { + me.execCommand("insertHtml", "
    "); + var range = me.selection.getRange(), + start = range.startContainer; + if (start.nodeType == 1 && !start.childNodes[range.startOffset]) { + var tmp; + if ((tmp = start.childNodes[range.startOffset - 1])) { + if (tmp.nodeType == 1 && tmp.tagName == "HR") { + if (me.options.enterTag == "p") { + tmp = me.document.createElement("p"); + range.insertNode(tmp); + range.setStart(tmp, 0).setCursor(); + } else { + tmp = me.document.createElement("br"); + range.insertNode(tmp); + range.setStartBefore(tmp).setCursor(); + } + } + } + } + return true; } - } + }, + //边界在table里不能加分隔线 + queryCommandState: function () { + return domUtils.filterNodeList( + this.selection.getStartElementPath(), + "table" + ) + ? -1 + : 0; } - return true; - } - }, - //边界在table里不能加分隔线 - queryCommandState: function() { - return domUtils.filterNodeList( - this.selection.getStartElementPath(), - "table" - ) - ? -1 - : 0; - } - }; - // me.addListener('delkeyup',function(){ - // var rng = this.selection.getRange(); - // if(browser.ie && browser.version > 8){ - // rng.txtToElmBoundary(true); - // if(domUtils.isStartInblock(rng)){ - // var tmpNode = rng.startContainer; - // var pre = tmpNode.previousSibling; - // if(pre && domUtils.isTagNode(pre,'hr')){ - // domUtils.remove(pre); - // rng.select(); - // return; - // } - // } - // } - // if(domUtils.isBody(rng.startContainer)){ - // var hr = rng.startContainer.childNodes[rng.startOffset -1]; - // if(hr && hr.nodeName == 'HR'){ - // var next = hr.nextSibling; - // if(next){ - // rng.setStart(next,0) - // }else if(hr.previousSibling){ - // rng.setStartAtLast(hr.previousSibling) - // }else{ - // var p = this.document.createElement('p'); - // hr.parentNode.insertBefore(p,hr); - // domUtils.fillNode(this.document,p); - // rng.setStart(p,0); - // } - // domUtils.remove(hr); - // rng.setCursor(false,true); - // } - // } - // }) - me.addListener("delkeydown", function(name, evt) { - var rng = this.selection.getRange(); - rng.txtToElmBoundary(true); - if (domUtils.isStartInblock(rng)) { - var tmpNode = rng.startContainer; - var pre = tmpNode.previousSibling; - if (pre && domUtils.isTagNode(pre, "hr")) { - domUtils.remove(pre); - rng.select(); - domUtils.preventDefault(evt); - return true; - } - } - }); + }; + // me.addListener('delkeyup',function(){ + // var rng = this.selection.getRange(); + // if(browser.ie && browser.version > 8){ + // rng.txtToElmBoundary(true); + // if(domUtils.isStartInblock(rng)){ + // var tmpNode = rng.startContainer; + // var pre = tmpNode.previousSibling; + // if(pre && domUtils.isTagNode(pre,'hr')){ + // domUtils.remove(pre); + // rng.select(); + // return; + // } + // } + // } + // if(domUtils.isBody(rng.startContainer)){ + // var hr = rng.startContainer.childNodes[rng.startOffset -1]; + // if(hr && hr.nodeName == 'HR'){ + // var next = hr.nextSibling; + // if(next){ + // rng.setStart(next,0) + // }else if(hr.previousSibling){ + // rng.setStartAtLast(hr.previousSibling) + // }else{ + // var p = this.document.createElement('p'); + // hr.parentNode.insertBefore(p,hr); + // domUtils.fillNode(this.document,p); + // rng.setStart(p,0); + // } + // domUtils.remove(hr); + // rng.setCursor(false,true); + // } + // } + // }) + me.addListener("delkeydown", function (name, evt) { + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + if (domUtils.isStartInblock(rng)) { + var tmpNode = rng.startContainer; + var pre = tmpNode.previousSibling; + if (pre && domUtils.isTagNode(pre, "hr")) { + domUtils.remove(pre); + rng.select(); + domUtils.preventDefault(evt); + return true; + } + } + }); }; @@ -14227,34 +17686,35 @@ UE.plugins["horizontal"] = function() { * ``` */ UE.commands["time"] = UE.commands["date"] = { - execCommand: function(cmd, format) { - var date = new Date(); + execCommand: function (cmd, format) { + var date = new Date(); - function formatTime(date, format) { - var hh = ("0" + date.getHours()).slice(-2), - ii = ("0" + date.getMinutes()).slice(-2), - ss = ("0" + date.getSeconds()).slice(-2); - format = format || "hh:ii:ss"; - return format.replace(/hh/gi, hh).replace(/ii/gi, ii).replace(/ss/gi, ss); - } - function formatDate(date, format) { - var yyyy = ("000" + date.getFullYear()).slice(-4), - yy = yyyy.slice(-2), - mm = ("0" + (date.getMonth() + 1)).slice(-2), - dd = ("0" + date.getDate()).slice(-2); - format = format || "yyyy-mm-dd"; - return format - .replace(/yyyy/gi, yyyy) - .replace(/yy/gi, yy) - .replace(/mm/gi, mm) - .replace(/dd/gi, dd); - } + function formatTime(date, format) { + var hh = ("0" + date.getHours()).slice(-2), + ii = ("0" + date.getMinutes()).slice(-2), + ss = ("0" + date.getSeconds()).slice(-2); + format = format || "hh:ii:ss"; + return format.replace(/hh/gi, hh).replace(/ii/gi, ii).replace(/ss/gi, ss); + } - this.execCommand( - "insertHtml", - cmd == "time" ? formatTime(date, format) : formatDate(date, format) - ); - } + function formatDate(date, format) { + var yyyy = ("000" + date.getFullYear()).slice(-4), + yy = yyyy.slice(-2), + mm = ("0" + (date.getMonth() + 1)).slice(-2), + dd = ("0" + date.getDate()).slice(-2); + format = format || "yyyy-mm-dd"; + return format + .replace(/yyyy/gi, yyyy) + .replace(/yy/gi, yy) + .replace(/mm/gi, mm) + .replace(/dd/gi, dd); + } + + this.execCommand( + "insertHtml", + cmd == "time" ? formatTime(date, format) : formatDate(date, format) + ); + } }; @@ -14278,37 +17738,37 @@ UE.commands["time"] = UE.commands["date"] = { * ``` */ -UE.plugins["rowspacing"] = function() { - var me = this; - me.setOpt({ - rowspacingtop: ["5", "10", "15", "20", "25"], - rowspacingbottom: ["5", "10", "15", "20", "25"] - }); - me.commands["rowspacing"] = { - execCommand: function(cmdName, value, dir) { - this.execCommand("paragraph", "p", { - style: "margin-" + dir + ":" + value + "px" - }); - return true; - }, - queryCommandValue: function(cmdName, dir) { - var pN = domUtils.filterNodeList( - this.selection.getStartElementPath(), - function(node) { - return domUtils.isBlockElm(node); +UE.plugins["rowspacing"] = function () { + var me = this; + me.setOpt({ + rowspacingtop: ["5", "10", "15", "20", "25"], + rowspacingbottom: ["5", "10", "15", "20", "25"] + }); + me.commands["rowspacing"] = { + execCommand: function (cmdName, value, dir) { + this.execCommand("paragraph", "p", { + style: "margin-" + dir + ":" + value + "px" + }); + return true; + }, + queryCommandValue: function (cmdName, dir) { + var pN = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function (node) { + return domUtils.isBlockElm(node); + } + ), + value; + //trace:1026 + if (pN) { + value = domUtils + .getComputedStyle(pN, "margin-" + dir) + .replace(/[^\d]/g, ""); + return !value ? 0 : value; + } + return 0; } - ), - value; - //trace:1026 - if (pN) { - value = domUtils - .getComputedStyle(pN, "margin-" + dir) - .replace(/[^\d]/g, ""); - return !value ? 0 : value; - } - return 0; - } - }; + }; }; @@ -14318,11 +17778,11 @@ UE.plugins["rowspacing"] = function() { * @file * @since 1.2.6.1 */ -UE.plugins["lineheight"] = function() { - var me = this; - me.setOpt({ lineheight: ["1", "1.5", "1.75", "2", "3", "4", "5"] }); +UE.plugins["lineheight"] = function () { + var me = this; + me.setOpt({lineheight: ["1", "1.5", "1.75", "2", "3", "4", "5"]}); - /** + /** * 行距 * @command lineheight * @method execCommand @@ -14333,7 +17793,7 @@ UE.plugins["lineheight"] = function() { * editor.execCommand( 'lineheight', 1.5); * ``` */ - /** + /** * 查询当前选区内容的行高大小 * @command lineheight * @method queryCommandValue @@ -14345,26 +17805,26 @@ UE.plugins["lineheight"] = function() { * ``` */ - me.commands["lineheight"] = { - execCommand: function(cmdName, value) { - this.execCommand("paragraph", "p", { - style: "line-height:" + (value == "1" ? "normal" : value + "em") - }); - return true; - }, - queryCommandValue: function() { - var pN = domUtils.filterNodeList( - this.selection.getStartElementPath(), - function(node) { - return domUtils.isBlockElm(node); + me.commands["lineheight"] = { + execCommand: function (cmdName, value) { + this.execCommand("paragraph", "p", { + style: "line-height:" + (value == "1" ? "normal" : value + "em") + }); + return true; + }, + queryCommandValue: function () { + var pN = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function (node) { + return domUtils.isBlockElm(node); + } + ); + if (pN) { + var value = domUtils.getComputedStyle(pN, "line-height"); + return value == "normal" ? 1 : value.replace(/[^\d.]*/gi, ""); + } } - ); - if (pN) { - var value = domUtils.getComputedStyle(pN, "line-height"); - return value == "normal" ? 1 : value.replace(/[^\d.]*/gi, ""); - } - } - }; + }; }; @@ -14375,36 +17835,37 @@ UE.plugins["lineheight"] = function() { * @since 1.2.6.1 */ -UE.plugins["insertcode"] = function() { - var me = this; - me.setOpt("insertcode", { - as3: "ActionScript3", - bash: "Bash/Shell", - cpp: "C/C++", - css: "Css", - cf: "CodeFunction", - "c#": "C#", - delphi: "Delphi", - diff: "Diff", - erlang: "Erlang", - groovy: "Groovy", - html: "Html", - java: "Java", - jfx: "JavaFx", - js: "Javascript", - pl: "Perl", - php: "Php", - plain: "Plain Text", - ps: "PowerShell", - python: "Python", - ruby: "Ruby", - scala: "Scala", - sql: "Sql", - vb: "Vb", - xml: "Xml" - }); +UE.plugins["insertcode"] = function () { + var me = this; + me.setOpt("insertcode", { + as3: "ActionScript3", + bash: "Bash/Shell", + cpp: "C/C++", + css: "Css", + // cf: "CodeFunction", + "c#": "C#", + delphi: "Delphi", + // diff: "Diff", + erlang: "Erlang", + groovy: "Groovy", + html: "Html", + java: "Java", + // jfx: "JavaFx", + js: "Javascript", + pl: "Perl", + php: "PHP", + plain: "Text", + ps: "PowerShell", + python: "Python", + ruby: "Ruby", + scala: "Scala", + sql: "SQL", + vb: "VB", + xml: "XML", + mind: "Mind", + }); - /** + /** * 插入代码 * @command insertcode * @method execCommand @@ -14416,7 +17877,7 @@ UE.plugins["insertcode"] = function() { * ``` */ - /** + /** * 如果选区所在位置是插入插入代码区域,返回代码的语言 * @command insertcode * @method queryCommandValue @@ -14428,551 +17889,551 @@ UE.plugins["insertcode"] = function() { * ``` */ - me.commands["insertcode"] = { - execCommand: function(cmd, lang) { - var me = this, - rng = me.selection.getRange(), - pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); - if (pre) { - pre.className = "brush:" + lang + ";toolbar:false;"; - } else { - var code = ""; - if (rng.collapsed) { - code = browser.ie && browser.ie11below - ? browser.version <= 8 ? " " : "" - : "
    "; - } else { - var frag = rng.extractContents(); - var div = me.document.createElement("div"); - div.appendChild(frag); - - utils.each( - UE.filterNode( - UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, "")), - me.options.filterTxtRules - ).children, - function(node) { - if (browser.ie && browser.ie11below && browser.version > 8) { - if (node.type == "element") { - if (node.tagName == "br") { - code += "\n"; - } else if (!dtd.$empty[node.tagName]) { - utils.each(node.children, function(cn) { - if (cn.type == "element") { - if (cn.tagName == "br") { - code += "\n"; - } else if (!dtd.$empty[node.tagName]) { - code += cn.innerText(); - } - } else { - code += cn.data; - } - }); - if (!/\n$/.test(code)) { - code += "\n"; - } - } - } else { - code += node.data + "\n"; - } - if (!node.nextSibling() && /\n$/.test(code)) { - code = code.replace(/\n$/, ""); - } - } else { - if (browser.ie && browser.ie11below) { - if (node.type == "element") { - if (node.tagName == "br") { - code += "
    "; - } else if (!dtd.$empty[node.tagName]) { - utils.each(node.children, function(cn) { - if (cn.type == "element") { - if (cn.tagName == "br") { - code += "
    "; - } else if (!dtd.$empty[node.tagName]) { - code += cn.innerText(); - } - } else { - code += cn.data; - } - }); - if (!/br>$/.test(code)) { - code += "
    "; - } - } - } else { - code += node.data + "
    "; - } - if (!node.nextSibling() && /
    $/.test(code)) { - code = code.replace(/
    $/, ""); - } - } else { - code += node.type == "element" - ? dtd.$empty[node.tagName] ? "" : node.innerText() - : node.data; - if (!/br\/?\s*>$/.test(code)) { - if (!node.nextSibling()) return; - code += "
    "; - } - } - } - } - ); - } - me.execCommand( - "inserthtml", - '
    ' +
    -            code +
    -            "
    ", - true - ); - - pre = me.document.getElementById("coder"); - domUtils.removeAttributes(pre, "id"); - var tmpNode = pre.previousSibling; - - if ( - tmpNode && - ((tmpNode.nodeType == 3 && - tmpNode.nodeValue.length == 1 && - browser.ie && - browser.version == 6) || - domUtils.isEmptyBlock(tmpNode)) - ) { - domUtils.remove(tmpNode); - } - var rng = me.selection.getRange(); - if (domUtils.isEmptyBlock(pre)) { - rng.setStart(pre, 0).setCursor(false, true); - } else { - rng.selectNodeContents(pre).select(); - } - } - }, - queryCommandValue: function() { - var path = this.selection.getStartElementPath(); - var lang = ""; - utils.each(path, function(node) { - if (node.nodeName == "PRE") { - var match = node.className.match(/brush:([^;]+)/); - lang = match && match[1] ? match[1] : ""; - return false; - } - }); - return lang; - } - }; - - me.addInputRule(function(root) { - utils.each(root.getNodesByTagName("pre"), function(pre) { - var brs = pre.getNodesByTagName("br"); - if (brs.length) { - browser.ie && - browser.ie11below && - browser.version > 8 && - utils.each(brs, function(br) { - var txt = UE.uNode.createText("\n"); - br.parentNode.insertBefore(txt, br); - br.parentNode.removeChild(br); - }); - return; - } - if (browser.ie && browser.ie11below && browser.version > 8) return; - var code = pre.innerText().split(/\n/); - pre.innerHTML(""); - utils.each(code, function(c) { - if (c.length) { - pre.appendChild(UE.uNode.createText(c)); - } - pre.appendChild(UE.uNode.createElement("br")); - }); - }); - }); - me.addOutputRule(function(root) { - utils.each(root.getNodesByTagName("pre"), function(pre) { - var code = ""; - utils.each(pre.children, function(n) { - if (n.type == "text") { - //在ie下文本内容有可能末尾带有\n要去掉 - //trace:3396 - code += n.data.replace(/[ ]/g, " ").replace(/\n$/, ""); - } else { - if (n.tagName == "br") { - code += "\n"; - } else { - code += !dtd.$empty[n.tagName] ? "" : n.innerText(); - } - } - }); - - pre.innerText(code.replace(/( |\n)+$/, "")); - }); - }); - //不需要判断highlight的command列表 - me.notNeedCodeQuery = { - help: 1, - undo: 1, - redo: 1, - source: 1, - print: 1, - searchreplace: 1, - fullscreen: 1, - preview: 1, - insertparagraph: 1, - elementpath: 1, - insertcode: 1, - inserthtml: 1, - selectall: 1 - }; - //将queyCommamndState重置 - var orgQuery = me.queryCommandState; - me.queryCommandState = function(cmd) { - var me = this; - - if ( - !me.notNeedCodeQuery[cmd.toLowerCase()] && - me.selection && - me.queryCommandValue("insertcode") - ) { - return -1; - } - return UE.Editor.prototype.queryCommandState.apply(this, arguments); - }; - me.addListener("beforeenterkeydown", function() { - var rng = me.selection.getRange(); - var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); - if (pre) { - me.fireEvent("saveScene"); - if (!rng.collapsed) { - rng.deleteContents(); - } - if (!browser.ie || browser.ie9above) { - var tmpNode = me.document.createElement("br"), - pre; - rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); - var next = tmpNode.nextSibling; - if (!next && (!browser.ie || browser.version > 10)) { - rng.insertNode(tmpNode.cloneNode(false)); - } else { - rng.setStartAfter(tmpNode); - } - pre = tmpNode.previousSibling; - var tmp; - while (pre) { - tmp = pre; - pre = pre.previousSibling; - if (!pre || pre.nodeName == "BR") { - pre = tmp; - break; - } - } - if (pre) { - var str = ""; - while ( - pre && - pre.nodeName != "BR" && - new RegExp("^[\\s" + domUtils.fillChar + "]*$").test(pre.nodeValue) - ) { - str += pre.nodeValue; - pre = pre.nextSibling; - } - if (pre.nodeName != "BR") { - var match = pre.nodeValue.match( - new RegExp("^([\\s" + domUtils.fillChar + "]+)") - ); - if (match && match[1]) { - str += match[1]; - } - } - if (str) { - str = me.document.createTextNode(str); - rng.insertNode(str).setStartAfter(str); - } - } - rng.collapse(true).select(true); - } else { - if (browser.version > 8) { - var txt = me.document.createTextNode("\n"); - var start = rng.startContainer; - if (rng.startOffset == 0) { - var preNode = start.previousSibling; - if (preNode) { - rng.insertNode(txt); - var fillchar = me.document.createTextNode(" "); - rng - .setStartAfter(txt) - .insertNode(fillchar) - .setStart(fillchar, 0) - .collapse(true) - .select(true); - } - } else { - rng.insertNode(txt).setStartAfter(txt); - var fillchar = me.document.createTextNode(" "); - start = rng.startContainer.childNodes[rng.startOffset]; - if (start && !/^\n/.test(start.nodeValue)) { - rng.setStartBefore(txt); - } - rng - .insertNode(fillchar) - .setStart(fillchar, 0) - .collapse(true) - .select(true); - } - } else { - var tmpNode = me.document.createElement("br"); - rng.insertNode(tmpNode); - rng.insertNode(me.document.createTextNode(domUtils.fillChar)); - rng.setStartAfter(tmpNode); - pre = tmpNode.previousSibling; - var tmp; - while (pre) { - tmp = pre; - pre = pre.previousSibling; - if (!pre || pre.nodeName == "BR") { - pre = tmp; - break; - } - } - if (pre) { - var str = ""; - while ( - pre && - pre.nodeName != "BR" && - new RegExp("^[ " + domUtils.fillChar + "]*$").test(pre.nodeValue) - ) { - str += pre.nodeValue; - pre = pre.nextSibling; - } - if (pre.nodeName != "BR") { - var match = pre.nodeValue.match( - new RegExp("^([ " + domUtils.fillChar + "]+)") - ); - if (match && match[1]) { - str += match[1]; - } - } - - str = me.document.createTextNode(str); - rng.insertNode(str).setStartAfter(str); - } - rng.collapse(true).select(); - } - } - me.fireEvent("saveScene"); - return true; - } - }); - - me.addListener("tabkeydown", function(cmd, evt) { - var rng = me.selection.getRange(); - var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); - if (pre) { - me.fireEvent("saveScene"); - if (evt.shiftKey) { - } else { - if (!rng.collapsed) { - var bk = rng.createBookmark(); - var start = bk.start.previousSibling; - - while (start) { - if (pre.firstChild === start && !domUtils.isBr(start)) { - pre.insertBefore(me.document.createTextNode(" "), start); - - break; - } - if (domUtils.isBr(start)) { - pre.insertBefore( - me.document.createTextNode(" "), - start.nextSibling - ); - - break; - } - start = start.previousSibling; - } - var end = bk.end; - start = bk.start.nextSibling; - if (pre.firstChild === bk.start) { - pre.insertBefore( - me.document.createTextNode(" "), - start.nextSibling - ); - } - while (start && start !== end) { - if (domUtils.isBr(start) && start.nextSibling) { - if (start.nextSibling === end) { - break; - } - pre.insertBefore( - me.document.createTextNode(" "), - start.nextSibling - ); - } - - start = start.nextSibling; - } - rng.moveToBookmark(bk).select(); - } else { - var tmpNode = me.document.createTextNode(" "); - rng - .insertNode(tmpNode) - .setStartAfter(tmpNode) - .collapse(true) - .select(true); - } - } - - me.fireEvent("saveScene"); - return true; - } - }); - - me.addListener("beforeinserthtml", function(evtName, html) { - var me = this, - rng = me.selection.getRange(), - pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); - if (pre) { - if (!rng.collapsed) { - rng.deleteContents(); - } - var htmlstr = ""; - if (browser.ie && browser.version > 8) { - utils.each( - UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules) - .children, - function(node) { - if (node.type == "element") { - if (node.tagName == "br") { - htmlstr += "\n"; - } else if (!dtd.$empty[node.tagName]) { - utils.each(node.children, function(cn) { - if (cn.type == "element") { - if (cn.tagName == "br") { - htmlstr += "\n"; - } else if (!dtd.$empty[node.tagName]) { - htmlstr += cn.innerText(); - } - } else { - htmlstr += cn.data; - } - }); - if (!/\n$/.test(htmlstr)) { - htmlstr += "\n"; - } - } + me.commands["insertcode"] = { + execCommand: function (cmd, lang) { + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + if (pre) { + pre.className = "brush:" + lang + ";toolbar:false;"; } else { - htmlstr += node.data + "\n"; - } - if (!node.nextSibling() && /\n$/.test(htmlstr)) { - htmlstr = htmlstr.replace(/\n$/, ""); - } - } - ); - var tmpNode = me.document.createTextNode( - utils.html(htmlstr.replace(/ /g, " ")) - ); - rng.insertNode(tmpNode).selectNode(tmpNode).select(); - } else { - var frag = me.document.createDocumentFragment(); + var code = ""; + if (rng.collapsed) { + code = browser.ie && browser.ie11below + ? browser.version <= 8 ? " " : "" + : "
    "; + } else { + var frag = rng.extractContents(); + var div = me.document.createElement("div"); + div.appendChild(frag); - utils.each( - UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules) - .children, - function(node) { - if (node.type == "element") { - if (node.tagName == "br") { - frag.appendChild(me.document.createElement("br")); - } else if (!dtd.$empty[node.tagName]) { - utils.each(node.children, function(cn) { - if (cn.type == "element") { - if (cn.tagName == "br") { - frag.appendChild(me.document.createElement("br")); - } else if (!dtd.$empty[node.tagName]) { - frag.appendChild( - me.document.createTextNode( - utils.html(cn.innerText().replace(/ /g, " ")) - ) - ); - } - } else { - frag.appendChild( - me.document.createTextNode( - utils.html(cn.data.replace(/ /g, " ")) - ) + utils.each( + UE.filterNode( + UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, "")), + me.options.filterTxtRules + ).children, + function (node) { + if (browser.ie && browser.ie11below && browser.version > 8) { + if (node.type == "element") { + if (node.tagName == "br") { + code += "\n"; + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == "element") { + if (cn.tagName == "br") { + code += "\n"; + } else if (!dtd.$empty[node.tagName]) { + code += cn.innerText(); + } + } else { + code += cn.data; + } + }); + if (!/\n$/.test(code)) { + code += "\n"; + } + } + } else { + code += node.data + "\n"; + } + if (!node.nextSibling() && /\n$/.test(code)) { + code = code.replace(/\n$/, ""); + } + } else { + if (browser.ie && browser.ie11below) { + if (node.type == "element") { + if (node.tagName == "br") { + code += "
    "; + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == "element") { + if (cn.tagName == "br") { + code += "
    "; + } else if (!dtd.$empty[node.tagName]) { + code += cn.innerText(); + } + } else { + code += cn.data; + } + }); + if (!/br>$/.test(code)) { + code += "
    "; + } + } + } else { + code += node.data + "
    "; + } + if (!node.nextSibling() && /
    $/.test(code)) { + code = code.replace(/
    $/, ""); + } + } else { + code += node.type == "element" + ? dtd.$empty[node.tagName] ? "" : node.innerText() + : node.data; + if (!/br\/?\s*>$/.test(code)) { + if (!node.nextSibling()) return; + code += "
    "; + } + } + } + } ); - } - }); - if (frag.lastChild.nodeName != "BR") { - frag.appendChild(me.document.createElement("br")); } - } - } else { - frag.appendChild( - me.document.createTextNode( - utils.html(node.data.replace(/ /g, " ")) - ) - ); - } - if (!node.nextSibling() && frag.lastChild.nodeName == "BR") { - frag.removeChild(frag.lastChild); - } - } - ); - rng.insertNode(frag).select(); - } + me.execCommand( + "inserthtml", + '
    ' +
    +                    code +
    +                    "
    ", + true + ); - return true; - } - }); - //方向键的处理 - me.addListener("keydown", function(cmd, evt) { - var me = this, - keyCode = evt.keyCode || evt.which; - if (keyCode == 40) { - var rng = me.selection.getRange(), - pre, - start = rng.startContainer; - if ( - rng.collapsed && - (pre = domUtils.findParentByTagName(rng.startContainer, "pre", true)) && - !pre.nextSibling - ) { - var last = pre.lastChild; - while (last && last.nodeName == "BR") { - last = last.previousSibling; + pre = me.document.getElementById("coder"); + domUtils.removeAttributes(pre, "id"); + var tmpNode = pre.previousSibling; + + if ( + tmpNode && + ((tmpNode.nodeType == 3 && + tmpNode.nodeValue.length == 1 && + browser.ie && + browser.version == 6) || + domUtils.isEmptyBlock(tmpNode)) + ) { + domUtils.remove(tmpNode); + } + var rng = me.selection.getRange(); + if (domUtils.isEmptyBlock(pre)) { + rng.setStart(pre, 0).setCursor(false, true); + } else { + rng.selectNodeContents(pre).select(); + } + } + }, + queryCommandValue: function () { + var path = this.selection.getStartElementPath(); + var lang = ""; + utils.each(path, function (node) { + if (node.nodeName == "PRE") { + var match = node.className.match(/brush:([^;]+)/); + lang = match && match[1] ? match[1] : ""; + return false; + } + }); + return lang; } + }; + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName("pre"), function (pre) { + var brs = pre.getNodesByTagName("br"); + if (brs.length) { + browser.ie && + browser.ie11below && + browser.version > 8 && + utils.each(brs, function (br) { + var txt = UE.uNode.createText("\n"); + br.parentNode.insertBefore(txt, br); + br.parentNode.removeChild(br); + }); + return; + } + if (browser.ie && browser.ie11below && browser.version > 8) return; + var code = pre.innerText().split(/\n/); + pre.innerHTML(""); + utils.each(code, function (c) { + if (c.length) { + pre.appendChild(UE.uNode.createText(c)); + } + pre.appendChild(UE.uNode.createElement("br")); + }); + }); + }); + me.addOutputRule(function (root) { + utils.each(root.getNodesByTagName("pre"), function (pre) { + var code = ""; + utils.each(pre.children, function (n) { + if (n.type == "text") { + //在ie下文本内容有可能末尾带有\n要去掉 + //trace:3396 + code += n.data.replace(/[ ]/g, " ").replace(/\n$/, ""); + } else { + if (n.tagName == "br") { + code += "\n"; + } else { + code += !dtd.$empty[n.tagName] ? "" : n.innerText(); + } + } + }); + + pre.innerText(code.replace(/( |\n)+$/, "")); + }); + }); + //不需要判断highlight的command列表 + me.notNeedCodeQuery = { + help: 1, + undo: 1, + redo: 1, + source: 1, + print: 1, + searchreplace: 1, + fullscreen: 1, + preview: 1, + insertparagraph: 1, + elementpath: 1, + insertcode: 1, + inserthtml: 1, + selectall: 1 + }; + //将queyCommamndState重置 + var orgQuery = me.queryCommandState; + me.queryCommandState = function (cmd) { + var me = this; + if ( - last === start || - (rng.startContainer === pre && - rng.startOffset == pre.childNodes.length) + !me.notNeedCodeQuery[cmd.toLowerCase()] && + me.selection && + me.queryCommandValue("insertcode") ) { - me.execCommand("insertparagraph"); - domUtils.preventDefault(evt); + return -1; } - } - } - }); - //trace:3395 - me.addListener("delkeydown", function(type, evt) { - var rng = this.selection.getRange(); - rng.txtToElmBoundary(true); - var start = rng.startContainer; - if ( - domUtils.isTagNode(start, "pre") && - rng.collapsed && - domUtils.isStartInblock(rng) - ) { - var p = me.document.createElement("p"); - domUtils.fillNode(me.document, p); - start.parentNode.insertBefore(p, start); - domUtils.remove(start); - rng.setStart(p, 0).setCursor(false, true); - domUtils.preventDefault(evt); - return true; - } - }); + return UE.Editor.prototype.queryCommandState.apply(this, arguments); + }; + me.addListener("beforeenterkeydown", function () { + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + if (pre) { + me.fireEvent("saveScene"); + if (!rng.collapsed) { + rng.deleteContents(); + } + if (!browser.ie || browser.ie9above) { + var tmpNode = me.document.createElement("br"), + pre; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + var next = tmpNode.nextSibling; + if (!next && (!browser.ie || browser.version > 10)) { + rng.insertNode(tmpNode.cloneNode(false)); + } else { + rng.setStartAfter(tmpNode); + } + pre = tmpNode.previousSibling; + var tmp; + while (pre) { + tmp = pre; + pre = pre.previousSibling; + if (!pre || pre.nodeName == "BR") { + pre = tmp; + break; + } + } + if (pre) { + var str = ""; + while ( + pre && + pre.nodeName != "BR" && + new RegExp("^[\\s" + domUtils.fillChar + "]*$").test(pre.nodeValue) + ) { + str += pre.nodeValue; + pre = pre.nextSibling; + } + if (pre.nodeName != "BR") { + var match = pre.nodeValue.match( + new RegExp("^([\\s" + domUtils.fillChar + "]+)") + ); + if (match && match[1]) { + str += match[1]; + } + } + if (str) { + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + } + rng.collapse(true).select(true); + } else { + if (browser.version > 8) { + var txt = me.document.createTextNode("\n"); + var start = rng.startContainer; + if (rng.startOffset == 0) { + var preNode = start.previousSibling; + if (preNode) { + rng.insertNode(txt); + var fillchar = me.document.createTextNode(" "); + rng + .setStartAfter(txt) + .insertNode(fillchar) + .setStart(fillchar, 0) + .collapse(true) + .select(true); + } + } else { + rng.insertNode(txt).setStartAfter(txt); + var fillchar = me.document.createTextNode(" "); + start = rng.startContainer.childNodes[rng.startOffset]; + if (start && !/^\n/.test(start.nodeValue)) { + rng.setStartBefore(txt); + } + rng + .insertNode(fillchar) + .setStart(fillchar, 0) + .collapse(true) + .select(true); + } + } else { + var tmpNode = me.document.createElement("br"); + rng.insertNode(tmpNode); + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + rng.setStartAfter(tmpNode); + pre = tmpNode.previousSibling; + var tmp; + while (pre) { + tmp = pre; + pre = pre.previousSibling; + if (!pre || pre.nodeName == "BR") { + pre = tmp; + break; + } + } + if (pre) { + var str = ""; + while ( + pre && + pre.nodeName != "BR" && + new RegExp("^[ " + domUtils.fillChar + "]*$").test(pre.nodeValue) + ) { + str += pre.nodeValue; + pre = pre.nextSibling; + } + if (pre.nodeName != "BR") { + var match = pre.nodeValue.match( + new RegExp("^([ " + domUtils.fillChar + "]+)") + ); + if (match && match[1]) { + str += match[1]; + } + } + + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + rng.collapse(true).select(); + } + } + me.fireEvent("saveScene"); + return true; + } + }); + + me.addListener("tabkeydown", function (cmd, evt) { + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + if (pre) { + me.fireEvent("saveScene"); + if (evt.shiftKey) { + } else { + if (!rng.collapsed) { + var bk = rng.createBookmark(); + var start = bk.start.previousSibling; + + while (start) { + if (pre.firstChild === start && !domUtils.isBr(start)) { + pre.insertBefore(me.document.createTextNode(" "), start); + + break; + } + if (domUtils.isBr(start)) { + pre.insertBefore( + me.document.createTextNode(" "), + start.nextSibling + ); + + break; + } + start = start.previousSibling; + } + var end = bk.end; + start = bk.start.nextSibling; + if (pre.firstChild === bk.start) { + pre.insertBefore( + me.document.createTextNode(" "), + start.nextSibling + ); + } + while (start && start !== end) { + if (domUtils.isBr(start) && start.nextSibling) { + if (start.nextSibling === end) { + break; + } + pre.insertBefore( + me.document.createTextNode(" "), + start.nextSibling + ); + } + + start = start.nextSibling; + } + rng.moveToBookmark(bk).select(); + } else { + var tmpNode = me.document.createTextNode(" "); + rng + .insertNode(tmpNode) + .setStartAfter(tmpNode) + .collapse(true) + .select(true); + } + } + + me.fireEvent("saveScene"); + return true; + } + }); + + me.addListener("beforeinserthtml", function (evtName, html) { + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + if (pre) { + if (!rng.collapsed) { + rng.deleteContents(); + } + var htmlstr = ""; + if (browser.ie && browser.version > 8) { + utils.each( + UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules) + .children, + function (node) { + if (node.type == "element") { + if (node.tagName == "br") { + htmlstr += "\n"; + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == "element") { + if (cn.tagName == "br") { + htmlstr += "\n"; + } else if (!dtd.$empty[node.tagName]) { + htmlstr += cn.innerText(); + } + } else { + htmlstr += cn.data; + } + }); + if (!/\n$/.test(htmlstr)) { + htmlstr += "\n"; + } + } + } else { + htmlstr += node.data + "\n"; + } + if (!node.nextSibling() && /\n$/.test(htmlstr)) { + htmlstr = htmlstr.replace(/\n$/, ""); + } + } + ); + var tmpNode = me.document.createTextNode( + utils.html(htmlstr.replace(/ /g, " ")) + ); + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + } else { + var frag = me.document.createDocumentFragment(); + + utils.each( + UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules) + .children, + function (node) { + if (node.type == "element") { + if (node.tagName == "br") { + frag.appendChild(me.document.createElement("br")); + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == "element") { + if (cn.tagName == "br") { + frag.appendChild(me.document.createElement("br")); + } else if (!dtd.$empty[node.tagName]) { + frag.appendChild( + me.document.createTextNode( + utils.html(cn.innerText().replace(/ /g, " ")) + ) + ); + } + } else { + frag.appendChild( + me.document.createTextNode( + utils.html(cn.data.replace(/ /g, " ")) + ) + ); + } + }); + if (frag.lastChild.nodeName != "BR") { + frag.appendChild(me.document.createElement("br")); + } + } + } else { + frag.appendChild( + me.document.createTextNode( + utils.html(node.data.replace(/ /g, " ")) + ) + ); + } + if (!node.nextSibling() && frag.lastChild.nodeName == "BR") { + frag.removeChild(frag.lastChild); + } + } + ); + rng.insertNode(frag).select(); + } + + return true; + } + }); + //方向键的处理 + me.addListener("keydown", function (cmd, evt) { + var me = this, + keyCode = evt.keyCode || evt.which; + if (keyCode == 40) { + var rng = me.selection.getRange(), + pre, + start = rng.startContainer; + if ( + rng.collapsed && + (pre = domUtils.findParentByTagName(rng.startContainer, "pre", true)) && + !pre.nextSibling + ) { + var last = pre.lastChild; + while (last && last.nodeName == "BR") { + last = last.previousSibling; + } + if ( + last === start || + (rng.startContainer === pre && + rng.startOffset == pre.childNodes.length) + ) { + me.execCommand("insertparagraph"); + domUtils.preventDefault(evt); + } + } + } + }); + //trace:3395 + me.addListener("delkeydown", function (type, evt) { + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + var start = rng.startContainer; + if ( + domUtils.isTagNode(start, "pre") && + rng.collapsed && + domUtils.isStartInblock(rng) + ) { + var p = me.document.createElement("p"); + domUtils.fillNode(me.document, p); + start.parentNode.insertBefore(p, start); + domUtils.remove(start); + rng.setStart(p, 0).setCursor(false, true); + domUtils.preventDefault(evt); + return true; + } + }); }; @@ -14996,21 +18457,21 @@ UE.plugins["insertcode"] = function() { */ UE.commands["cleardoc"] = { - execCommand: function(cmdName) { - var me = this, - enterTag = me.options.enterTag, - range = me.selection.getRange(); - if (enterTag == "br") { - me.body.innerHTML = "
    "; - range.setStart(me.body, 0).setCursor(); - } else { - me.body.innerHTML = "

    " + (ie ? "" : "
    ") + "

    "; - range.setStart(me.body.firstChild, 0).setCursor(false, true); + execCommand: function (cmdName) { + var me = this, + enterTag = me.options.enterTag, + range = me.selection.getRange(); + if (enterTag == "br") { + me.body.innerHTML = "
    "; + range.setStart(me.body, 0).setCursor(); + } else { + me.body.innerHTML = "

    " + (ie ? "" : "
    ") + "

    "; + range.setStart(me.body.firstChild, 0).setCursor(false, true); + } + setTimeout(function () { + me.fireEvent("clearDoc"); + }, 0); } - setTimeout(function() { - me.fireEvent("clearDoc"); - }, 0); - } }; @@ -15020,95 +18481,95 @@ UE.commands["cleardoc"] = { * @file * @since 1.2.6.1 */ -UE.plugin.register("anchor", function() { - return { - bindEvents: { - ready: function() { - utils.cssRule( - "anchor", - ".anchorclass{background: url('" + - this.options.themePath + - this.options.theme + - "/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}", - this.document - ); - } - }, - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(a) { - var val; - if ((val = a.getAttr("anchorname"))) { - a.tagName = "a"; - a.setAttr({ - anchorname: "", - name: val, - class: "" - }); - } - }); - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("a"), function(a) { - var val; - if ((val = a.getAttr("name")) && !a.getAttr("href")) { - //过滤掉word冗余标签 - //_Toc\d+有可能勿命中 - if (/^\_Toc\d+$/.test(val)) { - a.parentNode.removeChild(a); - return; - } - a.tagName = "img"; - a.setAttr({ - anchorname: a.getAttr("name"), - class: "anchorclass" - }); - a.setAttr("name"); - } - }); - }, - commands: { - /** - * 插入锚点 - * @command anchor - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } name 锚点名称字符串 - * @example - * ```javascript - * //editor 是编辑器实例 - * editor.execCommand('anchor', 'anchor1'); - * ``` - */ - anchor: { - execCommand: function(cmd, name) { - var range = this.selection.getRange(), - img = range.getClosedNode(); - if (img && img.getAttribute("anchorname")) { - if (name) { - img.setAttribute("anchorname", name); - } else { - range.setStartBefore(img).setCursor(); - domUtils.remove(img); +UE.plugin.register("anchor", function () { + return { + bindEvents: { + ready: function () { + utils.cssRule( + "anchor", + ".anchorclass{background: url('" + + this.options.themePath + + this.options.theme + + "/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}", + this.document + ); } - } else { - if (name) { - //只在选区的开始插入 - var anchor = this.document.createElement("img"); - range.collapse(true); - domUtils.setAttributes(anchor, { - anchorname: name, - class: "anchorclass" - }); - range - .insertNode(anchor) - .setStartAfter(anchor) - .setCursor(false, true); + }, + outputRule: function (root) { + utils.each(root.getNodesByTagName("img"), function (a) { + var val; + if ((val = a.getAttr("anchorname"))) { + a.tagName = "a"; + a.setAttr({ + anchorname: "", + name: val, + class: "" + }); + } + }); + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName("a"), function (a) { + var val; + if ((val = a.getAttr("name")) && !a.getAttr("href")) { + //过滤掉word冗余标签 + //_Toc\d+有可能勿命中 + if (/^\_Toc\d+$/.test(val)) { + a.parentNode.removeChild(a); + return; + } + a.tagName = "img"; + a.setAttr({ + anchorname: a.getAttr("name"), + class: "anchorclass" + }); + a.setAttr("name"); + } + }); + }, + commands: { + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + anchor: { + execCommand: function (cmd, name) { + var range = this.selection.getRange(), + img = range.getClosedNode(); + if (img && img.getAttribute("anchorname")) { + if (name) { + img.setAttribute("anchorname", name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement("img"); + range.collapse(true); + domUtils.setAttributes(anchor, { + anchorname: name, + class: "anchorclass" + }); + range + .insertNode(anchor) + .setStartAfter(anchor) + .setCursor(false, true); + } + } + } } - } } - } - } - }; + }; }); @@ -15125,34 +18586,34 @@ UE.plugin.register("anchor", function() { * To change this template use File | Settings | File Templates. */ -UE.plugins["wordcount"] = function() { - var me = this; - me.setOpt("wordCount", true); - me.addListener("contentchange", function() { - me.fireEvent("wordcount"); - }); - var timer; - me.addListener("ready", function() { +UE.plugins["wordcount"] = function () { var me = this; - domUtils.on(me.body, "keyup", function(evt) { - var code = evt.keyCode || evt.which, - //忽略的按键,ctr,alt,shift,方向键 - ignores = { - "16": 1, - "18": 1, - "20": 1, - "37": 1, - "38": 1, - "39": 1, - "40": 1 - }; - if (code in ignores) return; - clearTimeout(timer); - timer = setTimeout(function() { + me.setOpt("wordCount", true); + me.addListener("contentchange", function () { me.fireEvent("wordcount"); - }, 200); }); - }); + var timer; + me.addListener("ready", function () { + var me = this; + domUtils.on(me.body, "keyup", function (evt) { + var code = evt.keyCode || evt.which, + //忽略的按键,ctr,alt,shift,方向键 + ignores = { + "16": 1, + "18": 1, + "20": 1, + "37": 1, + "38": 1, + "39": 1, + "40": 1 + }; + if (code in ignores) return; + clearTimeout(timer); + timer = setTimeout(function () { + me.fireEvent("wordcount"); + }, 200); + }); + }); }; @@ -15162,67 +18623,70 @@ UE.plugins["wordcount"] = function() { * @file * @since 1.2.6.1 */ -UE.plugins["pagebreak"] = function() { - var me = this, - notBreakTags = ["td"]; - me.setOpt("pageBreakTag", "_ueditor_page_break_tag_"); +UE.plugins["pagebreak"] = function () { + var me = this, + notBreakTags = ["td"]; + me.setOpt("pageBreakTag", "_ueditor_page_break_tag_"); - function fillNode(node) { - if (domUtils.isEmptyBlock(node)) { - var firstChild = node.firstChild, - tmpNode; + function fillNode(node) { + if (domUtils.isEmptyBlock(node)) { + var firstChild = node.firstChild, + tmpNode; - while ( - firstChild && - firstChild.nodeType == 1 && - domUtils.isEmptyBlock(firstChild) - ) { - tmpNode = firstChild; - firstChild = firstChild.firstChild; - } - !tmpNode && (tmpNode = node); - domUtils.fillNode(me.document, tmpNode); + while ( + firstChild && + firstChild.nodeType == 1 && + domUtils.isEmptyBlock(firstChild) + ) { + tmpNode = firstChild; + firstChild = firstChild.firstChild; + } + !tmpNode && (tmpNode = node); + domUtils.fillNode(me.document, tmpNode); + } } - } - //分页符样式添加 - me.ready(function() { - utils.cssRule( - "pagebreak", - ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}", - me.document - ); - }); - function isHr(node) { - return ( - node && - node.nodeType == 1 && - node.tagName == "HR" && - node.className == "pagebreak" - ); - } - me.addInputRule(function(root) { - root.traversal(function(node) { - if (node.type == "text" && node.data == me.options.pageBreakTag) { - var hr = UE.uNode.createElement( - '
    ' + //分页符样式添加 + + me.ready(function () { + utils.cssRule( + "pagebreak", + ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}", + me.document ); - node.parentNode.insertBefore(hr, node); - node.parentNode.removeChild(node); - } }); - }); - me.addOutputRule(function(node) { - utils.each(node.getNodesByTagName("hr"), function(n) { - if (n.getAttr("class") == "pagebreak") { - var txt = UE.uNode.createText(me.options.pageBreakTag); - n.parentNode.insertBefore(txt, n); - n.parentNode.removeChild(n); - } - }); - }); - /** + function isHr(node) { + return ( + node && + node.nodeType == 1 && + node.tagName == "HR" && + node.className == "pagebreak" + ); + } + + me.addInputRule(function (root) { + root.traversal(function (node) { + if (node.type == "text" && node.data == me.options.pageBreakTag) { + var hr = UE.uNode.createElement( + '
    ' + ); + node.parentNode.insertBefore(hr, node); + node.parentNode.removeChild(node); + } + }); + }); + me.addOutputRule(function (node) { + utils.each(node.getNodesByTagName("hr"), function (n) { + if (n.getAttr("class") == "pagebreak") { + var txt = UE.uNode.createText(me.options.pageBreakTag); + n.parentNode.insertBefore(txt, n); + n.parentNode.removeChild(n); + } + }); + }); + + /** * 插入分页符 * @command pagebreak * @method execCommand @@ -15236,103 +18700,103 @@ UE.plugins["pagebreak"] = function() { * ``` */ - me.commands["pagebreak"] = { - execCommand: function() { - var range = me.selection.getRange(), - hr = me.document.createElement("hr"); - domUtils.setAttributes(hr, { - class: "pagebreak", - noshade: "noshade", - size: "5" - }); - domUtils.unSelectable(hr); - //table单独处理 - var node = domUtils.findParentByTagName( - range.startContainer, - notBreakTags, - true - ), - parents = [], - pN; - if (node) { - switch (node.tagName) { - case "TD": - pN = node.parentNode; - if (!pN.previousSibling) { - var table = domUtils.findParentByTagName(pN, "table"); - // var tableWrapDiv = table.parentNode; - // if(tableWrapDiv && tableWrapDiv.nodeType == 1 - // && tableWrapDiv.tagName == 'DIV' - // && tableWrapDiv.getAttribute('dropdrag') - // ){ - // domUtils.remove(tableWrapDiv,true); - // } - table.parentNode.insertBefore(hr, table); - parents = domUtils.findParents(hr, true); + me.commands["pagebreak"] = { + execCommand: function () { + var range = me.selection.getRange(), + hr = me.document.createElement("hr"); + domUtils.setAttributes(hr, { + class: "pagebreak", + noshade: "noshade", + size: "5" + }); + domUtils.unSelectable(hr); + //table单独处理 + var node = domUtils.findParentByTagName( + range.startContainer, + notBreakTags, + true + ), + parents = [], + pN; + if (node) { + switch (node.tagName) { + case "TD": + pN = node.parentNode; + if (!pN.previousSibling) { + var table = domUtils.findParentByTagName(pN, "table"); + // var tableWrapDiv = table.parentNode; + // if(tableWrapDiv && tableWrapDiv.nodeType == 1 + // && tableWrapDiv.tagName == 'DIV' + // && tableWrapDiv.getAttribute('dropdrag') + // ){ + // domUtils.remove(tableWrapDiv,true); + // } + table.parentNode.insertBefore(hr, table); + parents = domUtils.findParents(hr, true); + } else { + pN.parentNode.insertBefore(hr, pN); + parents = domUtils.findParents(hr); + } + pN = parents[1]; + if (hr !== pN) { + domUtils.breakParent(hr, pN); + } + //table要重写绑定一下拖拽 + me.fireEvent("afteradjusttable", me.document); + } } else { - pN.parentNode.insertBefore(hr, pN); - parents = domUtils.findParents(hr); + if (!range.collapsed) { + range.deleteContents(); + var start = range.startContainer; + while ( + !domUtils.isBody(start) && + domUtils.isBlockElm(start) && + domUtils.isEmptyNode(start) + ) { + range.setStartBefore(start).collapse(true); + domUtils.remove(start); + start = range.startContainer; + } + } + range.insertNode(hr); + + var pN = hr.parentNode, + nextNode; + while (!domUtils.isBody(pN)) { + domUtils.breakParent(hr, pN); + nextNode = hr.nextSibling; + if (nextNode && domUtils.isEmptyBlock(nextNode)) { + domUtils.remove(nextNode); + } + pN = hr.parentNode; + } + nextNode = hr.nextSibling; + var pre = hr.previousSibling; + if (isHr(pre)) { + domUtils.remove(pre); + } else { + pre && fillNode(pre); + } + + if (!nextNode) { + var p = me.document.createElement("p"); + + hr.parentNode.appendChild(p); + domUtils.fillNode(me.document, p); + range.setStart(p, 0).collapse(true); + } else { + if (isHr(nextNode)) { + domUtils.remove(nextNode); + } else { + fillNode(nextNode); + } + range.setEndAfter(hr).collapse(false); + } + + range.select(true); } - pN = parents[1]; - if (hr !== pN) { - domUtils.breakParent(hr, pN); - } - //table要重写绑定一下拖拽 - me.fireEvent("afteradjusttable", me.document); } - } else { - if (!range.collapsed) { - range.deleteContents(); - var start = range.startContainer; - while ( - !domUtils.isBody(start) && - domUtils.isBlockElm(start) && - domUtils.isEmptyNode(start) - ) { - range.setStartBefore(start).collapse(true); - domUtils.remove(start); - start = range.startContainer; - } - } - range.insertNode(hr); - - var pN = hr.parentNode, - nextNode; - while (!domUtils.isBody(pN)) { - domUtils.breakParent(hr, pN); - nextNode = hr.nextSibling; - if (nextNode && domUtils.isEmptyBlock(nextNode)) { - domUtils.remove(nextNode); - } - pN = hr.parentNode; - } - nextNode = hr.nextSibling; - var pre = hr.previousSibling; - if (isHr(pre)) { - domUtils.remove(pre); - } else { - pre && fillNode(pre); - } - - if (!nextNode) { - var p = me.document.createElement("p"); - - hr.parentNode.appendChild(p); - domUtils.fillNode(me.document, p); - range.setStart(p, 0).collapse(true); - } else { - if (isHr(nextNode)) { - domUtils.remove(nextNode); - } else { - fillNode(nextNode); - } - range.setEndAfter(hr).collapse(false); - } - - range.select(true); - } - } - }; + }; }; @@ -15343,65 +18807,65 @@ UE.plugins["pagebreak"] = function() { ///commandsTitle 本地图片引导上传 ///commandsDialog dialogs\wordimage -UE.plugin.register("wordimage", function() { - var me = this, - images = []; +UE.plugin.register("wordimage", function () { + var me = this, + images = []; - this.addListener("click", function (type, evt) { - var el = evt.target || evt.srcElement; - if ('IMG' == el.tagName && el.getAttribute('data-word-image')) { - me.ui._dialogs.wordimageDialog && me.ui._dialogs.wordimageDialog.open(); - } - }); - - return { - commands: { - wordimage: { - execCommand: function() { - var images = domUtils.getElementsByTagName(me.body, "img"); - var urlList = []; - for (var i = 0, ci; (ci = images[i++]); ) { - var url = ci.getAttribute("data-word-image"); - url && urlList.push(url); - } - return urlList; - }, - queryCommandState: function() { - images = domUtils.getElementsByTagName(me.body, "img"); - for (var i = 0, ci; (ci = images[i++]); ) { - if (ci.getAttribute("data-word-image")) { - return 1; - } - } - return -1; - }, - notNeedUndo: true - } - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(img) { - var attrs = img.attrs, - flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, - opt = me.options, - src = opt.UEDITOR_HOME_URL + "themes/default/images/spacer.gif"; - if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { - img.setAttr({ - width: attrs.width, - height: attrs.height, - alt: attrs.alt, - 'data-word-image': attrs.src, - src: src, - style: - "background:url(" + - (flag - ? opt.themePath + opt.theme + "/images/word.gif" - : opt.langPath + opt.lang + "/images/localimage.png") + - ") no-repeat center center;border:1px solid #ddd" - }); + this.addListener("click", function (type, evt) { + var el = evt.target || evt.srcElement; + if ('IMG' == el.tagName && el.getAttribute('data-word-image')) { + me.ui._dialogs.wordimageDialog && me.ui._dialogs.wordimageDialog.open(); } - }); - } - }; + }); + + return { + commands: { + wordimage: { + execCommand: function () { + var images = domUtils.getElementsByTagName(me.body, "img"); + var urlList = []; + for (var i = 0, ci; (ci = images[i++]);) { + var url = ci.getAttribute("data-word-image"); + url && urlList.push(url); + } + return urlList; + }, + queryCommandState: function () { + images = domUtils.getElementsByTagName(me.body, "img"); + for (var i = 0, ci; (ci = images[i++]);) { + if (ci.getAttribute("data-word-image")) { + return 1; + } + } + return -1; + }, + notNeedUndo: true + } + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName("img"), function (img) { + var attrs = img.attrs, + flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, + opt = me.options, + src = opt.UEDITOR_HOME_URL + "themes/default/images/spacer.gif"; + if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { + img.setAttr({ + width: attrs.width, + height: attrs.height, + alt: attrs.alt, + 'data-word-image': attrs.src, + src: src, + style: + "background:url(" + + (flag + ? opt.themePath + opt.theme + "/images/word.gif" + : opt.langPath + opt.lang + "/images/localimage.png") + + ") no-repeat center center;border:1px solid #ddd" + }); + } + }); + } + }; }); @@ -15430,6 +18894,7 @@ UE.plugin.register("autosave", function () { return; } + // console.log('autosave', saveKey, saveData); me.setPreferences(saveKey, saveData); editor.fireEvent("afterautosave", { @@ -15461,18 +18926,28 @@ UE.plugin.register("autosave", function () { } if (me.getOpt('autoSaveRestore')) { var data = me.getPreferences(saveKey); + // console.log('saveKey', saveKey, data); if (data) { me.body.innerHTML = data; + me.fireEvent('showmessage', { + type: 'info', + content: me.getLang('autosave').autoRestoreTip + }) } } // console.log('saveKey', saveKey); }, - contentchange: function () { - if (!me.getOpt("autoSaveEnable")) { + beforesubmit: function () { + if (!me.getOpt("autoSaveEnable") || !saveKey) { return; } - - if (!saveKey) { + me.execCommand('clear_auto_save_content'); + }, + contentchange: function () { + if (!me.isReady) { + return; + } + if (!me.getOpt("autoSaveEnable") || !saveKey) { return; } @@ -15482,7 +18957,7 @@ UE.plugin.register("autosave", function () { me._autoSaveTimer = window.setTimeout(function () { save(me); - }, 500); + }, 1000); } }, commands: { @@ -15533,96 +19008,96 @@ UE.plugin.register("autosave", function () { // plugins/formula.js UE.plugin.register("formula", function () { - var me = this, images = []; + var me = this, images = []; - return { - commands: { - formula: { - execCommand: function (cmdName, value) { - var range = me.selection.getRange(), - img = range.getClosedNode(); + return { + commands: { + formula: { + execCommand: function (cmdName, value) { + var range = me.selection.getRange(), + img = range.getClosedNode(); - value = encodeURIComponent(value); - var formulaConfig = me.getOpt('formulaConfig'); - var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value); + value = encodeURIComponent(value); + var formulaConfig = me.getOpt('formulaConfig'); + var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value); - if (img) { - img.setAttribute("src", src); - } else { - me.execCommand("insertHtml", ''); - } + if (img) { + img.setAttribute("src", src); + } else { + me.execCommand("insertHtml", ''); + } + }, + } }, - } - }, - }; + }; }); // plugins/dragdrop.js -UE.plugins["dragdrop"] = function() { - var me = this; - me.ready(function() { - domUtils.on(this.body, "dragend", function() { - var rng = me.selection.getRange(); - var node = rng.getClosedNode() || me.selection.getStart(); +UE.plugins["dragdrop"] = function () { + var me = this; + me.ready(function () { + domUtils.on(this.body, "dragend", function () { + var rng = me.selection.getRange(); + var node = rng.getClosedNode() || me.selection.getStart(); - if (node && node.tagName == "IMG") { - var pre = node.previousSibling, - next; - while ((next = node.nextSibling)) { - if ( - next.nodeType == 1 && - next.tagName == "SPAN" && - !next.firstChild - ) { - domUtils.remove(next); - } else { - break; - } - } + if (node && node.tagName == "IMG") { + var pre = node.previousSibling, + next; + while ((next = node.nextSibling)) { + if ( + next.nodeType == 1 && + next.tagName == "SPAN" && + !next.firstChild + ) { + domUtils.remove(next); + } else { + break; + } + } - if ( - ((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre)) || !pre) && - (!next || (next && !domUtils.isEmptyBlock(next))) - ) { - if (pre && pre.tagName == "P" && !domUtils.isEmptyBlock(pre)) { - pre.appendChild(node); - domUtils.moveChild(next, pre); - domUtils.remove(next); - } else if ( - next && - next.tagName == "P" && - !domUtils.isEmptyBlock(next) - ) { - next.insertBefore(node, next.firstChild); - } + if ( + ((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre)) || !pre) && + (!next || (next && !domUtils.isEmptyBlock(next))) + ) { + if (pre && pre.tagName == "P" && !domUtils.isEmptyBlock(pre)) { + pre.appendChild(node); + domUtils.moveChild(next, pre); + domUtils.remove(next); + } else if ( + next && + next.tagName == "P" && + !domUtils.isEmptyBlock(next) + ) { + next.insertBefore(node, next.firstChild); + } - if (pre && pre.tagName == "P" && domUtils.isEmptyBlock(pre)) { - domUtils.remove(pre); - } - if (next && next.tagName == "P" && domUtils.isEmptyBlock(next)) { - domUtils.remove(next); - } - rng.selectNode(node).select(); - me.fireEvent("saveScene"); - } - } + if (pre && pre.tagName == "P" && domUtils.isEmptyBlock(pre)) { + domUtils.remove(pre); + } + if (next && next.tagName == "P" && domUtils.isEmptyBlock(next)) { + domUtils.remove(next); + } + rng.selectNode(node).select(); + me.fireEvent("saveScene"); + } + } + }); }); - }); - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - if (keyCode == 13) { - var rng = me.selection.getRange(), - node; - if ( - (node = domUtils.findParentByTagName(rng.startContainer, "p", true)) - ) { - if (domUtils.getComputedStyle(node, "text-align") == "center") { - domUtils.removeStyle(node, "text-align"); + me.addListener("keyup", function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var rng = me.selection.getRange(), + node; + if ( + (node = domUtils.findParentByTagName(rng.startContainer, "p", true)) + ) { + if (domUtils.getComputedStyle(node, "text-align") == "center") { + domUtils.removeStyle(node, "text-align"); + } + } } - } - } - }); + }); }; @@ -15655,392 +19130,401 @@ UE.plugins["dragdrop"] = function() { * ``` */ -UE.plugins["undo"] = function() { - var saveSceneTimer; - var me = this, - maxUndoCount = me.options.maxUndoCount || 20, - maxInputCount = me.options.maxInputCount || 20, - fillchar = new RegExp(domUtils.fillChar + "|", "gi"); // ie会产生多余的 - var noNeedFillCharTags = { - ol: 1, - ul: 1, - table: 1, - tbody: 1, - tr: 1, - body: 1 - }; - var orgState = me.options.autoClearEmptyNode; - function compareAddr(indexA, indexB) { - if (indexA.length != indexB.length) return 0; - for (var i = 0, l = indexA.length; i < l; i++) { - if (indexA[i] != indexB[i]) return 0; - } - return 1; - } +UE.plugins["undo"] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + "|", "gi"); // ie会产生多余的 + var noNeedFillCharTags = { + ol: 1, + ul: 1, + table: 1, + tbody: 1, + tr: 1, + body: 1 + }; + var orgState = me.options.autoClearEmptyNode; - function compareRangeAddress(rngAddrA, rngAddrB) { - if (rngAddrA.collapsed != rngAddrB.collapsed) { - return 0; - } - if ( - !compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || - !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress) - ) { - return 0; - } - return 1; - } - - function UndoManager() { - this.list = []; - this.index = 0; - this.hasUndo = false; - this.hasRedo = false; - this.undo = function() { - if (this.hasUndo) { - if (!this.list[this.index - 1] && this.list.length == 1) { - this.reset(); - return; + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) return 0; } - while ( - this.list[this.index].content == this.list[this.index - 1].content + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if ( + !compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || + !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress) ) { - this.index--; - if (this.index == 0) { - return this.restore(0); - } + return 0; } - this.restore(--this.index); - } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while ( + this.list[this.index].content == this.list[this.index - 1].content + ) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while ( + this.list[this.index].content == this.list[this.index + 1].content + ) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UE.htmlparser(scene.content.replace(fillchar, "")); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.document.body.innerHTML = root.toHtml(); + me.fireEvent("afterscencerestore"); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each( + domUtils.getElementsByTagName(me.document, "td th caption p"), + function (node) { + if (domUtils.isEmptyNode(node)) { + domUtils.fillNode(me.document, node); + } + } + ); + } + + try { + var rng = new dom.Range(me.document).moveToAddress(scene.address); + rng.select( + noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()] + ); + } catch (e) { + } + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent("reset", true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false, true); + me.fireEvent("beforegetscene"); + var root = UE.htmlparser(me.body.innerHTML); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + //trace:3461 + //这个会引起回退时导致空格丢失的情况 + // browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent("aftergetscene"); + + return { + address: rngAddress, + content: cont + }; + }; + this.save = function (notCompareRange, notSetCursor) { + + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + if (!lastScene || (lastScene && lastScene.content != currentScene.content)) { + // 使用异步避免直接在事件中取值滞后一个字符 + setTimeout(function () { + me.trigger("contentchange"); + }, 0); + } + //内容相同位置相同不存 + if ( + lastScene && + lastScene.content == currentScene.content && + (notCompareRange + ? 1 + : compareRangeAddress(lastScene.address, currentScene.address)) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + + function saveScene() { + this.undoManger.save(); + } + + me.addListener("saveScene", function () { + var args = Array.prototype.splice.call(arguments, 1); + this.undoManger.save.apply(this.undoManger, args); + }); + + // me.addListener('beforeexeccommand', saveScene); + // me.addListener('afterexeccommand', saveScene); + + me.addListener("reset", function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands["redo"] = me.commands["undo"] = { + execCommand: function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState: function (cmdName) { + return this.undoManger[ + "has" + (cmdName.toLowerCase() == "undo" ? "Undo" : "Redo") + ] + ? 0 + : -1; + }, + notNeedUndo: 1 }; - this.redo = function() { - if (this.hasRedo) { - while ( - this.list[this.index].content == this.list[this.index + 1].content + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16: 1, + /*Ctrl*/ 17: 1, + /*Alt*/ 18: 1, + 37: 1, + 38: 1, + 39: 1, + 40: 1 + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener("ready", function () { + domUtils.on(this.body, "compositionstart", function () { + inputType = true; + }); + domUtils.on(this.body, "compositionend", function () { + inputType = false; + }); + }); + //快捷键 + me.addshortcutkey({ + Undo: "ctrl+90", //undo + Redo: "ctrl+89" //redo + }); + var isCollapsed = true; + me.addListener("keyup", function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if ( + !keys[keyCode] && + !evt.ctrlKey && + !evt.metaKey && + !evt.shiftKey && + !evt.altKey ) { - this.index++; - if (this.index == this.list.length - 1) { - return this.restore(this.index); - } - } - this.restore(++this.index); - } - }; + if (inputType) return; - this.restore = function() { - var me = this.editor; - var scene = this.list[this.index]; - var root = UE.htmlparser(scene.content.replace(fillchar, "")); - me.options.autoClearEmptyNode = false; - me.filterInputRule(root); - me.options.autoClearEmptyNode = orgState; - //trace:873 - //去掉展位符 - me.document.body.innerHTML = root.toHtml(); - me.fireEvent("afterscencerestore"); - //处理undo后空格不展位的问题 - if (browser.ie) { - utils.each( - domUtils.getElementsByTagName(me.document, "td th caption p"), - function(node) { - if (domUtils.isEmptyNode(node)) { - domUtils.fillNode(me.document, node); + if (!me.selection.getRange().collapsed) { + me.undoManger.save(false, true); + isCollapsed = false; + return; } - } - ); - } - - try { - var rng = new dom.Range(me.document).moveToAddress(scene.address); - rng.select( - noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()] - ); - } catch (e) {} - - this.update(); - this.clearKey(); - //不能把自己reset了 - me.fireEvent("reset", true); - }; - - this.getScene = function() { - var me = this.editor; - var rng = me.selection.getRange(), - rngAddress = rng.createAddress(false, true); - me.fireEvent("beforegetscene"); - var root = UE.htmlparser(me.body.innerHTML); - me.options.autoClearEmptyNode = false; - me.filterOutputRule(root); - me.options.autoClearEmptyNode = orgState; - var cont = root.toHtml(); - //trace:3461 - //这个会引起回退时导致空格丢失的情况 - // browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); - me.fireEvent("aftergetscene"); - - return { - address: rngAddress, - content: cont - }; - }; - this.save = function(notCompareRange, notSetCursor) { - - clearTimeout(saveSceneTimer); - var currentScene = this.getScene(notSetCursor), - lastScene = this.list[this.index]; - if (lastScene && lastScene.content != currentScene.content) { - me.trigger("contentchange"); - } - //内容相同位置相同不存 - if ( - lastScene && - lastScene.content == currentScene.content && - (notCompareRange - ? 1 - : compareRangeAddress(lastScene.address, currentScene.address)) - ) { - return; - } - this.list = this.list.slice(0, this.index + 1); - this.list.push(currentScene); - //如果大于最大数量了,就把最前的剔除 - if (this.list.length > maxUndoCount) { - this.list.shift(); - } - this.index = this.list.length - 1; - this.clearKey(); - //跟新undo/redo状态 - this.update(); - }; - this.update = function() { - this.hasRedo = !!this.list[this.index + 1]; - this.hasUndo = !!this.list[this.index - 1]; - }; - this.reset = function() { - this.list = []; - this.index = 0; - this.hasUndo = false; - this.hasRedo = false; - this.clearKey(); - }; - this.clearKey = function() { - keycont = 0; - lastKeyCode = null; - }; - } - - me.undoManger = new UndoManager(); - me.undoManger.editor = me; - function saveScene() { - this.undoManger.save(); - } - - me.addListener("saveScene", function() { - var args = Array.prototype.splice.call(arguments, 1); - this.undoManger.save.apply(this.undoManger, args); - }); - - // me.addListener('beforeexeccommand', saveScene); - // me.addListener('afterexeccommand', saveScene); - - me.addListener("reset", function(type, exclude) { - if (!exclude) { - this.undoManger.reset(); - } - }); - me.commands["redo"] = me.commands["undo"] = { - execCommand: function(cmdName) { - this.undoManger[cmdName](); - }, - queryCommandState: function(cmdName) { - return this.undoManger[ - "has" + (cmdName.toLowerCase() == "undo" ? "Undo" : "Redo") - ] - ? 0 - : -1; - }, - notNeedUndo: 1 - }; - - var keys = { - // /*Backspace*/ 8:1, /*Delete*/ 46:1, - /*Shift*/ 16: 1, - /*Ctrl*/ 17: 1, - /*Alt*/ 18: 1, - 37: 1, - 38: 1, - 39: 1, - 40: 1 - }, - keycont = 0, - lastKeyCode; - //输入法状态下不计算字符数 - var inputType = false; - me.addListener("ready", function() { - domUtils.on(this.body, "compositionstart", function() { - inputType = true; - }); - domUtils.on(this.body, "compositionend", function() { - inputType = false; - }); - }); - //快捷键 - me.addshortcutkey({ - Undo: "ctrl+90", //undo - Redo: "ctrl+89" //redo - }); - var isCollapsed = true; - me.addListener("keydown", function(type, evt) { - var me = this; - var keyCode = evt.keyCode || evt.which; - if ( - !keys[keyCode] && - !evt.ctrlKey && - !evt.metaKey && - !evt.shiftKey && - !evt.altKey - ) { - if (inputType) return; - - if (!me.selection.getRange().collapsed) { - me.undoManger.save(false, true); - isCollapsed = false; - return; - } - if (me.undoManger.list.length == 0) { - me.undoManger.save(true); - } - clearTimeout(saveSceneTimer); - function save(cont) { - cont.undoManger.save(false, true); - cont.fireEvent("selectionchange"); - } - saveSceneTimer = setTimeout(function() { - if (inputType) { - var interalTimer = setInterval(function() { - if (!inputType) { - save(me); - clearInterval(interalTimer); + if (me.undoManger.list.length === 0) { + me.undoManger.save(true); } - }, 300); - return; - } - save(me); - }, 200); + clearTimeout(saveSceneTimer); - lastKeyCode = keyCode; - keycont++; - if (keycont >= maxInputCount) { - save(me); - } - } - }); - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - if ( - !keys[keyCode] && - !evt.ctrlKey && - !evt.metaKey && - !evt.shiftKey && - !evt.altKey - ) { - if (inputType) return; - if (!isCollapsed) { - this.undoManger.save(false, true); - isCollapsed = true; - } - } - }); - //扩展实例,添加关闭和开启命令undo - me.stopCmdUndo = function() { - me.__hasEnterExecCommand = true; - }; - me.startCmdUndo = function() { - me.__hasEnterExecCommand = false; - }; + function save(cont) { + cont.undoManger.save(false, true); + cont.fireEvent("selectionchange"); + } + + saveSceneTimer = setTimeout(function () { + if (inputType) { + var intervalTimer = setInterval(function () { + if (!inputType) { + save(me); + clearInterval(intervalTimer); + } + }, 300); + return; + } + save(me); + }, 200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount) { + save(me); + } + } + }); + me.addListener("keyup", function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if ( + !keys[keyCode] && + !evt.ctrlKey && + !evt.metaKey && + !evt.shiftKey && + !evt.altKey + ) { + if (inputType) return; + if (!isCollapsed) { + this.undoManger.save(false, true); + isCollapsed = true; + } + } + }); + //扩展实例,添加关闭和开启命令undo + me.stopCmdUndo = function () { + me.__hasEnterExecCommand = true; + }; + me.startCmdUndo = function () { + me.__hasEnterExecCommand = false; + }; }; // plugins/copy.js -UE.plugin.register("copy", function() { - var me = this; +UE.plugin.register("copy", function () { + var me = this; - function initZeroClipboard() { - ZeroClipboard.config({ - debug: false, - swfPath: - me.options.UEDITOR_HOME_URL + - "third-party/zeroclipboard/ZeroClipboard.swf" - }); + function initZeroClipboard() { + ZeroClipboard.config({ + debug: false, + swfPath: + me.options.UEDITOR_HOME_URL + + "third-party/zeroclipboard/ZeroClipboard.swf" + }); - var client = (me.zeroclipboard = new ZeroClipboard()); + var client = (me.zeroclipboard = new ZeroClipboard()); - // 复制内容 - client.on("copy", function(e) { - var client = e.client, - rng = me.selection.getRange(), - div = document.createElement("div"); + // 复制内容 + client.on("copy", function (e) { + var client = e.client, + rng = me.selection.getRange(), + div = document.createElement("div"); - div.appendChild(rng.cloneContents()); - client.setText(div.innerText || div.textContent); - client.setHtml(div.innerHTML); - rng.select(); - }); - // hover事件传递到target - client.on("mouseover mouseout", function(e) { - var target = e.target; - if (target) { - if (e.type == "mouseover") { - domUtils.addClass(target, "edui-state-hover"); - } else if (e.type == "mouseout") { - domUtils.removeClasses(target, "edui-state-hover"); - } - } - }); - // flash加载不成功 - client.on("wrongflash noflash", function() { - ZeroClipboard.destroy(); - }); + div.appendChild(rng.cloneContents()); + client.setText(div.innerText || div.textContent); + client.setHtml(div.innerHTML); + rng.select(); + }); + // hover事件传递到target + client.on("mouseover mouseout", function (e) { + var target = e.target; + if (target) { + if (e.type == "mouseover") { + domUtils.addClass(target, "edui-state-hover"); + } else if (e.type == "mouseout") { + domUtils.removeClasses(target, "edui-state-hover"); + } + } + }); + // flash加载不成功 + client.on("wrongflash noflash", function () { + ZeroClipboard.destroy(); + }); - // 触发事件 - me.fireEvent("zeroclipboardready", client); - } - - return { - bindEvents: { - ready: function() { - if (!browser.ie) { - if (window.ZeroClipboard) { - initZeroClipboard(); - } else { - utils.loadFile( - document, - { - src: - me.options.UEDITOR_HOME_URL + - "third-party/zeroclipboard/ZeroClipboard.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - initZeroClipboard(); - } - ); - } - } - } - }, - commands: { - copy: { - execCommand: function(cmd) { - if (!me.document.execCommand("copy")) { - alert(me.getLang("copymsg")); - } - } - } + // 触发事件 + me.fireEvent("zeroclipboardready", client); } - }; + + return { + bindEvents: { + ready: function () { + if (!browser.ie) { + if (window.ZeroClipboard) { + initZeroClipboard(); + } else { + utils.loadFile( + document, + { + src: + me.options.UEDITOR_HOME_URL + + "third-party/zeroclipboard/ZeroClipboard.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function () { + initZeroClipboard(); + } + ); + } + } + } + }, + commands: { + copy: { + execCommand: function (cmd) { + if (!me.document.execCommand("copy")) { + alert(me.getLang("copymsg")); + } + } + } + } + }; }); @@ -16056,345 +19540,346 @@ UE.plugin.register("copy", function() { * @description 粘贴 * @author zhanyi */ -UE.plugins["paste"] = function() { - function getClipboardData(callback) { - var doc = this.document; - if (doc.getElementById("baidu_pastebin")) { - return; - } - var range = this.selection.getRange(), - bk = range.createBookmark(), - //创建剪贴的容器div - pastebin = doc.createElement("div"); - pastebin.id = "baidu_pastebin"; - // Safari 要求div必须有内容,才能粘贴内容进来 - browser.webkit && - pastebin.appendChild( - doc.createTextNode(domUtils.fillChar + domUtils.fillChar) - ); - doc.body.appendChild(pastebin); - //trace:717 隐藏的span不能得到top - //bk.start.innerHTML = ' '; - bk.start.style.display = ""; - pastebin.style.cssText = - "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + - //要在现在光标平行的位置加入,否则会出现跳动的问题 - domUtils.getXY(bk.start).y + - "px"; - - range.selectNodeContents(pastebin).select(true); - - setTimeout(function() { - if (browser.webkit) { - for ( - var i = 0, pastebins = doc.querySelectorAll("#baidu_pastebin"), pi; - (pi = pastebins[i++]); - - ) { - if (domUtils.isEmptyNode(pi)) { - domUtils.remove(pi); - } else { - pastebin = pi; - break; - } +UE.plugins["paste"] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById("baidu_pastebin")) { + return; } - } - try { - pastebin.parentNode.removeChild(pastebin); - } catch (e) {} - range.moveToBookmark(bk).select(true); - callback(pastebin); - }, 0); - } - - var me = this; - - me.setOpt({ - retainOnlyLabelPasted: false - }); - - var txtContent, htmlContent, address; - - function getPureHtml(html) { - return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function( - a, - b, - tagName, - attrs - ) { - tagName = tagName.toLowerCase(); - if ({ img: 1 }[tagName]) { - return a; - } - attrs = attrs.replace( - /([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, - function(str, atr, val) { - if ( - { - src: 1, - href: 1, - name: 1 - }[atr.toLowerCase()] - ) { - return atr + "=" + val + " "; - } - return ""; - } - ); - if ( - { - span: 1, - div: 1 - }[tagName] - ) { - return ""; - } else { - return "<" + b + tagName + " " + utils.trim(attrs) + ">"; - } - }); - } - function filter(div) { - var html; - if (div.firstChild) { - //去掉cut中添加的边界值 - var nodes = domUtils.getElementsByTagName(div, "span"); - for (var i = 0, ni; (ni = nodes[i++]); ) { - if (ni.id == "_baidu_cut_start" || ni.id == "_baidu_cut_end") { - domUtils.remove(ni); - } - } - - if (browser.webkit) { - var brs = div.querySelectorAll("div br"); - for (var i = 0, bi; (bi = brs[i++]); ) { - var pN = bi.parentNode; - if (pN.tagName == "DIV" && pN.childNodes.length == 1) { - pN.innerHTML = "


    "; - domUtils.remove(pN); - } - } - var divs = div.querySelectorAll("#baidu_pastebin"); - for (var i = 0, di; (di = divs[i++]); ) { - var tmpP = me.document.createElement("p"); - di.parentNode.insertBefore(tmpP, di); - while (di.firstChild) { - tmpP.appendChild(di.firstChild); - } - domUtils.remove(di); - } - - var metas = div.querySelectorAll("meta"); - for (var i = 0, ci; (ci = metas[i++]); ) { - domUtils.remove(ci); - } - - var brs = div.querySelectorAll("br"); - for (i = 0; (ci = brs[i++]); ) { - if (/^apple-/i.test(ci.className)) { - domUtils.remove(ci); - } - } - } - if (browser.gecko) { - var dirtyNodes = div.querySelectorAll("[_moz_dirty]"); - for (i = 0; (ci = dirtyNodes[i++]); ) { - ci.removeAttribute("_moz_dirty"); - } - } - if (!browser.ie) { - var spans = div.querySelectorAll("span.Apple-style-span"); - for (var i = 0, ci; (ci = spans[i++]); ) { - domUtils.remove(ci, true); - } - } - - //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 - html = div.innerHTML; //.replace(/>(?:(\s| )*?)<'); - - //过滤word粘贴过来的冗余属性 - html = UE.filterWord(html); - //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 - var root = UE.htmlparser(html); - //如果给了过滤规则就先进行过滤 - if (me.options.filterRules) { - UE.filterNode(root, me.options.filterRules); - } - //执行默认的处理 - me.filterInputRule(root); - //针对chrome的处理 - if (browser.webkit) { - var br = root.lastChild(); - if (br && br.type == "element" && br.tagName == "br") { - root.removeChild(br); - } - utils.each(me.body.querySelectorAll("div"), function(node) { - if (domUtils.isEmptyBlock(node)) { - domUtils.remove(node, true); - } - }); - } - html = { html: root.toHtml() }; - me.fireEvent("beforepaste", html, root); - //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 - if (!html.html) { - return; - } - root = UE.htmlparser(html.html, true); - //如果开启了纯文本模式 - if (me.queryCommandState("pasteplain") === 1) { - me.execCommand( - "insertHtml", - UE.filterNode(root, me.options.filterTxtRules).toHtml(), - true + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement("div"); + pastebin.id = "baidu_pastebin"; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && + pastebin.appendChild( + doc.createTextNode(domUtils.fillChar + domUtils.fillChar) ); - } else { - //文本模式 - UE.filterNode(root, me.options.filterTxtRules); - txtContent = root.toHtml(); - //完全模式 - htmlContent = html.html; + doc.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ""; + pastebin.style.cssText = + "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + domUtils.getXY(bk.start).y + + "px"; - address = me.selection.getRange().createAddress(true); - me.execCommand( - "insertHtml", - me.getOpt("retainOnlyLabelPasted") === true - ? getPureHtml(htmlContent) - : htmlContent, - true - ); - } - me.fireEvent("afterpaste", html); + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for ( + var i = 0, pastebins = doc.querySelectorAll("#baidu_pastebin"), pi; + (pi = pastebins[i++]); + ) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); } - } - me.addListener("pasteTransfer", function(cmd, plainType) { - if (address && txtContent && htmlContent && txtContent != htmlContent) { - var range = me.selection.getRange(); - range.moveToAddress(address, true); + var me = this; - if (!range.collapsed) { - while (!domUtils.isBody(range.startContainer)) { - var start = range.startContainer; - if (start.nodeType == 1) { - start = start.childNodes[range.startOffset]; - if (!start) { - range.setStartBefore(range.startContainer); - continue; - } - var pre = start.previousSibling; - - if ( - pre && - pre.nodeType == 3 && - new RegExp("^[\n\r\t " + domUtils.fillChar + "]*$").test( - pre.nodeValue - ) - ) { - range.setStartBefore(pre); - } - } - if (range.startOffset == 0) { - range.setStartBefore(range.startContainer); - } else { - break; - } - } - while (!domUtils.isBody(range.endContainer)) { - var end = range.endContainer; - if (end.nodeType == 1) { - end = end.childNodes[range.endOffset]; - if (!end) { - range.setEndAfter(range.endContainer); - continue; - } - var next = end.nextSibling; - if ( - next && - next.nodeType == 3 && - new RegExp("^[\n\r\t" + domUtils.fillChar + "]*$").test( - next.nodeValue - ) - ) { - range.setEndAfter(next); - } - } - if ( - range.endOffset == - range.endContainer[ - range.endContainer.nodeType == 3 ? "nodeValue" : "childNodes" - ].length - ) { - range.setEndAfter(range.endContainer); - } else { - break; - } - } - } - - range.deleteContents(); - range.select(true); - me.__hasEnterExecCommand = true; - var html = htmlContent; - if (plainType === 2) { - html = getPureHtml(html); - } else if (plainType) { - html = txtContent; - } - me.execCommand("inserthtml", html, true); - me.__hasEnterExecCommand = false; - var rng = me.selection.getRange(); - while ( - !domUtils.isBody(rng.startContainer) && - !rng.startOffset && - rng.startContainer[ - rng.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" - ].length - ) { - rng.setStartBefore(rng.startContainer); - } - var tmpAddress = rng.createAddress(true); - address.endAddress = tmpAddress.startAddress; - } - }); - - me.addListener("ready", function() { - domUtils.on(me.body, "cut", function() { - var range = me.selection.getRange(); - if (!range.collapsed && me.undoManger) { - me.undoManger.save(); - } + me.setOpt({ + retainOnlyLabelPasted: false }); - //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 - domUtils.on( - me.body, - browser.ie || browser.opera ? "keydown" : "paste", - function(e) { - if ( - (browser.ie || browser.opera) && - ((!e.ctrlKey && !e.metaKey) || e.keyCode != "86") - ) { - return; - } - getClipboardData.call(me, function(div) { - filter(div); - }); - } - ); - }); + var txtContent, htmlContent, address; - me.commands["paste"] = { - execCommand: function(cmd) { - if (browser.ie) { - getClipboardData.call(me, function(div) { - filter(div); + function getPureHtml(html) { + return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function ( + a, + b, + tagName, + attrs + ) { + tagName = tagName.toLowerCase(); + if ({img: 1}[tagName]) { + return a; + } + attrs = attrs.replace( + /([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, + function (str, atr, val) { + if ( + { + src: 1, + href: 1, + name: 1 + }[atr.toLowerCase()] + ) { + return atr + "=" + val + " "; + } + return ""; + } + ); + if ( + { + span: 1, + div: 1 + }[tagName] + ) { + return ""; + } else { + return "<" + b + tagName + " " + utils.trim(attrs) + ">"; + } }); - me.document.execCommand("paste"); - } else { - alert(me.getLang("pastemsg")); - } } - }; + + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, "span"); + for (var i = 0, ni; (ni = nodes[i++]);) { + if (ni.id == "_baidu_cut_start" || ni.id == "_baidu_cut_end") { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + var brs = div.querySelectorAll("div br"); + for (var i = 0, bi; (bi = brs[i++]);) { + var pN = bi.parentNode; + if (pN.tagName == "DIV" && pN.childNodes.length == 1) { + pN.innerHTML = "


    "; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll("#baidu_pastebin"); + for (var i = 0, di; (di = divs[i++]);) { + var tmpP = me.document.createElement("p"); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll("meta"); + for (var i = 0, ci; (ci = metas[i++]);) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll("br"); + for (i = 0; (ci = brs[i++]);) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll("[_moz_dirty]"); + for (i = 0; (ci = dirtyNodes[i++]);) { + ci.removeAttribute("_moz_dirty"); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll("span.Apple-style-span"); + for (var i = 0, ci; (ci = spans[i++]);) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML; //.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UE.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == "element" && br.tagName == "br") { + root.removeChild(br); + } + utils.each(me.body.querySelectorAll("div"), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node, true); + } + }); + } + html = {html: root.toHtml()}; + me.fireEvent("beforepaste", html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if (!html.html) { + return; + } + root = UE.htmlparser(html.html, true); + //如果开启了纯文本模式 + if (me.queryCommandState("pasteplain") === 1) { + me.execCommand( + "insertHtml", + UE.filterNode(root, me.options.filterTxtRules).toHtml(), + true + ); + } else { + //文本模式 + UE.filterNode(root, me.options.filterTxtRules); + txtContent = root.toHtml(); + //完全模式 + htmlContent = html.html; + + address = me.selection.getRange().createAddress(true); + me.execCommand( + "insertHtml", + me.getOpt("retainOnlyLabelPasted") === true + ? getPureHtml(htmlContent) + : htmlContent, + true + ); + } + me.fireEvent("afterpaste", html); + } + } + + me.addListener("pasteTransfer", function (cmd, plainType) { + if (address && txtContent && htmlContent && txtContent != htmlContent) { + var range = me.selection.getRange(); + range.moveToAddress(address, true); + + if (!range.collapsed) { + while (!domUtils.isBody(range.startContainer)) { + var start = range.startContainer; + if (start.nodeType == 1) { + start = start.childNodes[range.startOffset]; + if (!start) { + range.setStartBefore(range.startContainer); + continue; + } + var pre = start.previousSibling; + + if ( + pre && + pre.nodeType == 3 && + new RegExp("^[\n\r\t " + domUtils.fillChar + "]*$").test( + pre.nodeValue + ) + ) { + range.setStartBefore(pre); + } + } + if (range.startOffset == 0) { + range.setStartBefore(range.startContainer); + } else { + break; + } + } + while (!domUtils.isBody(range.endContainer)) { + var end = range.endContainer; + if (end.nodeType == 1) { + end = end.childNodes[range.endOffset]; + if (!end) { + range.setEndAfter(range.endContainer); + continue; + } + var next = end.nextSibling; + if ( + next && + next.nodeType == 3 && + new RegExp("^[\n\r\t" + domUtils.fillChar + "]*$").test( + next.nodeValue + ) + ) { + range.setEndAfter(next); + } + } + if ( + range.endOffset == + range.endContainer[ + range.endContainer.nodeType == 3 ? "nodeValue" : "childNodes" + ].length + ) { + range.setEndAfter(range.endContainer); + } else { + break; + } + } + } + + range.deleteContents(); + range.select(true); + me.__hasEnterExecCommand = true; + var html = htmlContent; + if (plainType === 2) { + html = getPureHtml(html); + } else if (plainType) { + html = txtContent; + } + me.execCommand("inserthtml", html, true); + me.__hasEnterExecCommand = false; + var rng = me.selection.getRange(); + while ( + !domUtils.isBody(rng.startContainer) && + !rng.startOffset && + rng.startContainer[ + rng.startContainer.nodeType == 3 ? "nodeValue" : "childNodes" + ].length + ) { + rng.setStartBefore(rng.startContainer); + } + var tmpAddress = rng.createAddress(true); + address.endAddress = tmpAddress.startAddress; + } + }); + + me.addListener("ready", function () { + domUtils.on(me.body, "cut", function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }); + + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + domUtils.on( + me.body, + browser.ie || browser.opera ? "keydown" : "paste", + function (e) { + if ( + (browser.ie || browser.opera) && + ((!e.ctrlKey && !e.metaKey) || e.keyCode != "86") + ) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + } + ); + }); + + me.commands["paste"] = { + execCommand: function (cmd) { + if (browser.ie) { + getClipboardData.call(me, function (div) { + filter(div); + }); + me.document.execCommand("paste"); + } else { + alert(me.getLang("pastemsg")); + } + } + }; }; @@ -16405,76 +19890,78 @@ UE.plugins["paste"] = function() { * @since 1.2.6.1 */ -UE.plugins["pasteplain"] = function() { - var me = this; - me.setOpt({ - pasteplain: false, - filterTxtRules: (function() { - function transP(node) { - node.tagName = "p"; - node.setStyle(); - } - function removeNode(node) { - node.parentNode.removeChild(node, true); - } - return { - //直接删除及其字节点内容 - "-": "script style object iframe embed input select", - p: { $: {} }, - br: { $: {} }, - div: function(node) { - var tmpNode, - p = UE.uNode.createElement("p"); - while ((tmpNode = node.firstChild())) { - if (tmpNode.type == "text" || !UE.dom.dtd.$block[tmpNode.tagName]) { - p.appendChild(tmpNode); - } else { - if (p.firstChild()) { - node.parentNode.insertBefore(p, node); - p = UE.uNode.createElement("p"); - } else { - node.parentNode.insertBefore(tmpNode, node); - } +UE.plugins["pasteplain"] = function () { + var me = this; + me.setOpt({ + pasteplain: false, + filterTxtRules: (function () { + function transP(node) { + node.tagName = "p"; + node.setStyle(); } - } - if (p.firstChild()) { - node.parentNode.insertBefore(p, node); - } - node.parentNode.removeChild(node); - }, - ol: removeNode, - ul: removeNode, - dl: removeNode, - dt: removeNode, - dd: removeNode, - li: removeNode, - caption: transP, - th: transP, - tr: transP, - h1: transP, - h2: transP, - h3: transP, - h4: transP, - h5: transP, - h6: transP, - td: function(node) { - //没有内容的td直接删掉 - var txt = !!node.innerText(); - if (txt) { - node.parentNode.insertAfter( - UE.uNode.createText("    "), - node - ); - } - node.parentNode.removeChild(node, node.innerText()); - } - }; - })() - }); - //暂时这里支持一下老版本的属性 - var pasteplain = me.options.pasteplain; - /** + function removeNode(node) { + node.parentNode.removeChild(node, true); + } + + return { + //直接删除及其字节点内容 + "-": "script style object iframe embed input select", + p: {$: {}}, + br: {$: {}}, + div: function (node) { + var tmpNode, + p = UE.uNode.createElement("p"); + while ((tmpNode = node.firstChild())) { + if (tmpNode.type == "text" || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement("p"); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + }, + ol: removeNode, + ul: removeNode, + dl: removeNode, + dt: removeNode, + dd: removeNode, + li: removeNode, + caption: transP, + th: transP, + tr: transP, + h1: transP, + h2: transP, + h3: transP, + h4: transP, + h5: transP, + h6: transP, + td: function (node) { + //没有内容的td直接删掉 + var txt = !!node.innerText(); + if (txt) { + node.parentNode.insertAfter( + UE.uNode.createText("    "), + node + ); + } + node.parentNode.removeChild(node, node.innerText()); + } + }; + })() + }); + //暂时这里支持一下老版本的属性 + var pasteplain = me.options.pasteplain; + + /** * 启用或取消纯文本粘贴模式 * @command pasteplain * @method execCommand @@ -16485,7 +19972,7 @@ UE.plugins["pasteplain"] = function() { * ``` */ - /** + /** * 查询当前是否处于纯文本粘贴模式 * @command pasteplain * @method queryCommandState @@ -16496,15 +19983,15 @@ UE.plugins["pasteplain"] = function() { * editor.queryCommandState( 'pasteplain' ); * ``` */ - me.commands["pasteplain"] = { - queryCommandState: function() { - return pasteplain ? 1 : 0; - }, - execCommand: function() { - pasteplain = !pasteplain | 0; - }, - notNeedUndo: 1 - }; + me.commands["pasteplain"] = { + queryCommandState: function () { + return pasteplain ? 1 : 0; + }, + execCommand: function () { + pasteplain = !pasteplain | 0; + }, + notNeedUndo: 1 + }; }; @@ -16515,1056 +20002,1067 @@ UE.plugins["pasteplain"] = function() { * @since 1.2.6.1 */ -UE.plugins["list"] = function() { - var me = this, - notExchange = { - TD: 1, - PRE: 1, - BLOCKQUOTE: 1 - }; - var customStyle = { - cn: "cn-1-", - cn1: "cn-2-", - cn2: "cn-3-", - num: "num-1-", - num1: "num-2-", - num2: "num-3-", - dash: "dash", - dot: "dot" - }; - - me.setOpt({ - autoTransWordToList: false, - insertorderedlist: { - num: "", - num1: "", - num2: "", - cn: "", - cn1: "", - cn2: "", - decimal: "", - "lower-alpha": "", - "lower-roman": "", - "upper-alpha": "", - "upper-roman": "" - }, - insertunorderedlist: { - circle: "", - disc: "", - square: "", - dash: "", - dot: "" - }, - listDefaultPaddingLeft: "30", - listiconpath: "http://bs.baidu.com/listicon/", - maxListLevel: -1, //-1不限制 - disablePInList: false - }); - function listToArray(list) { - var arr = []; - for (var p in list) { - arr.push(p); - } - return arr; - } - var listStyle = { - OL: listToArray(me.options.insertorderedlist), - UL: listToArray(me.options.insertunorderedlist) - }; - var liiconpath = me.options.listiconpath; - - //根据用户配置,调整customStyle - for (var s in customStyle) { - if ( - !me.options.insertorderedlist.hasOwnProperty(s) && - !me.options.insertunorderedlist.hasOwnProperty(s) - ) { - delete customStyle[s]; - } - } - - me.ready(function() { - var customCss = []; - for (var p in customStyle) { - if (p == "dash" || p == "dot") { - customCss.push( - "li.list-" + - customStyle[p] + - "{background-image:url(" + - liiconpath + - customStyle[p] + - ".gif)}" - ); - customCss.push( - "ul.custom_" + - p + - "{list-style:none;}ul.custom_" + - p + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } else { - for (var i = 0; i < 99; i++) { - customCss.push( - "li.list-" + - customStyle[p] + - i + - "{background-image:url(" + - liiconpath + - "list-" + - customStyle[p] + - i + - ".gif)}" - ); - } - customCss.push( - "ol.custom_" + - p + - "{list-style:none;}ol.custom_" + - p + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } - switch (p) { - case "cn": - customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}"); - customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); - customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}"); - break; - case "cn1": - customCss.push("li.list-" + p + "-paddingleft-1{padding-left:30px}"); - customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); - customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}"); - break; - case "cn2": - customCss.push("li.list-" + p + "-paddingleft-1{padding-left:40px}"); - customCss.push("li.list-" + p + "-paddingleft-2{padding-left:55px}"); - customCss.push("li.list-" + p + "-paddingleft-3{padding-left:68px}"); - break; - case "num": - case "num1": - customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}"); - break; - case "num2": - customCss.push("li.list-" + p + "-paddingleft-1{padding-left:35px}"); - customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); - break; - case "dash": - customCss.push("li.list-" + p + "-paddingleft{padding-left:35px}"); - break; - case "dot": - customCss.push("li.list-" + p + "-paddingleft{padding-left:20px}"); - } - } - customCss.push(".list-paddingleft-1{padding-left:0}"); - customCss.push( - ".list-paddingleft-2{padding-left:" + - me.options.listDefaultPaddingLeft + - "px}" - ); - customCss.push( - ".list-paddingleft-3{padding-left:" + - me.options.listDefaultPaddingLeft * 2 + - "px}" - ); - //如果不给宽度会在自定应样式里出现滚动条 - utils.cssRule( - "list", - "ol,ul{margin:0;pading:0;" + - (browser.ie ? "" : "width:95%") + - "}li{clear:both;}" + - customCss.join("\n"), - me.document - ); - }); - //单独处理剪切的问题 - me.ready(function() { - domUtils.on(me.body, "cut", function() { - setTimeout(function() { - var rng = me.selection.getRange(), - li; - //trace:3416 - if (!rng.collapsed) { - if ( - (li = domUtils.findParentByTagName(rng.startContainer, "li", true)) - ) { - if (!li.nextSibling && domUtils.isEmptyBlock(li)) { - var pn = li.parentNode, - node; - if ((node = pn.previousSibling)) { - domUtils.remove(pn); - rng.setStartAtLast(node).collapse(true); - rng.select(true); - } else if ((node = pn.nextSibling)) { - domUtils.remove(pn); - rng.setStartAtFirst(node).collapse(true); - rng.select(true); - } else { - var tmpNode = me.document.createElement("p"); - domUtils.fillNode(me.document, tmpNode); - pn.parentNode.insertBefore(tmpNode, pn); - domUtils.remove(pn); - rng.setStart(tmpNode, 0).collapse(true); - rng.select(true); - } - } - } - } - }); - }); - }); - - function getStyle(node) { - var cls = node.className; - if (domUtils.hasClass(node, /custom_/)) { - return cls.match(/custom_(\w+)/)[1]; - } - return domUtils.getStyle(node, "list-style-type"); - } - - me.addListener("beforepaste", function(type, html) { +UE.plugins["list"] = function () { var me = this, - rng = me.selection.getRange(), - li; - var root = UE.htmlparser(html.html, true); - if ((li = domUtils.findParentByTagName(rng.startContainer, "li", true))) { - var list = li.parentNode, - tagName = list.tagName == "OL" ? "ul" : "ol"; - utils.each(root.getNodesByTagName(tagName), function(n) { - n.tagName = list.tagName; - n.setAttr(); - if (n.parentNode === root) { - type = getStyle(list) || (list.tagName == "OL" ? "decimal" : "disc"); - } else { - var className = n.parentNode.getAttr("class"); - if (className && /custom_/.test(className)) { - type = className.match(/custom_(\w+)/)[1]; - } else { - type = n.parentNode.getStyle("list-style-type"); - } - if (!type) { - type = list.tagName == "OL" ? "decimal" : "disc"; - } - } - var index = utils.indexOf(listStyle[list.tagName], type); - if (n.parentNode !== root) - index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; - var currentStyle = listStyle[list.tagName][index]; - if (customStyle[currentStyle]) { - n.setAttr("class", "custom_" + currentStyle); - } else { - n.setStyle("list-style-type", currentStyle); - } - }); - } - - html.html = root.toHtml(); - }); - //导出时,去掉p标签 - me.getOpt("disablePInList") === true && - me.addOutputRule(function(root) { - utils.each(root.getNodesByTagName("li"), function(li) { - var newChildrens = [], - index = 0; - utils.each(li.children, function(n) { - if (n.tagName == "p") { - var tmpNode; - while ((tmpNode = n.children.pop())) { - newChildrens.splice(index, 0, tmpNode); - tmpNode.parentNode = li; - lastNode = tmpNode; - } - tmpNode = newChildrens[newChildrens.length - 1]; - if ( - !tmpNode || - tmpNode.type != "element" || - tmpNode.tagName != "br" - ) { - var br = UE.uNode.createElement("br"); - br.parentNode = li; - newChildrens.push(br); - } - - index = newChildrens.length; - } - }); - if (newChildrens.length) { - li.children = newChildrens; - } - }); - }); - //进入编辑器的li要套p标签 - me.addInputRule(function(root) { - utils.each(root.getNodesByTagName("li"), function(li) { - var tmpP = UE.uNode.createElement("p"); - for (var i = 0, ci; (ci = li.children[i]); ) { - if (ci.type == "text" || dtd.p[ci.tagName]) { - tmpP.appendChild(ci); - } else { - if (tmpP.firstChild()) { - li.insertBefore(tmpP, ci); - tmpP = UE.uNode.createElement("p"); - i = i + 2; - } else { - i++; - } - } - } - if ((tmpP.firstChild() && !tmpP.parentNode) || !li.firstChild()) { - li.appendChild(tmpP); - } - //trace:3357 - //p不能为空 - if (!tmpP.firstChild()) { - tmpP.innerHTML(browser.ie ? " " : "
    "); - } - //去掉末尾的空白 - var p = li.firstChild(); - var lastChild = p.lastChild(); - if ( - lastChild && - lastChild.type == "text" && - /^\s*$/.test(lastChild.data) - ) { - p.removeChild(lastChild); - } - }); - if (me.options.autoTransWordToList) { - var orderlisttype = { - num1: /^\d+\)/, - decimal: /^\d+\./, - "lower-alpha": /^[a-z]+\)/, - "upper-alpha": /^[A-Z]+\./, - cn: /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, - cn2: /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ - }, - unorderlisttype = { - square: "n" + notExchange = { + TD: 1, + PRE: 1, + BLOCKQUOTE: 1 }; - function checkListType(content, container) { - var span = container.firstChild(); - if ( - span && - span.type == "element" && - span.tagName == "span" && - /Wingdings|Symbol/.test(span.getStyle("font-family")) - ) { - for (var p in unorderlisttype) { - if (unorderlisttype[p] == span.data) { - return p; - } - } - return "disc"; - } - for (var p in orderlisttype) { - if (orderlisttype[p].test(content)) { - return p; - } - } - } - utils.each(root.getNodesByTagName("p"), function(node) { - if (node.getAttr("class") != "MsoListParagraph") { - return; - } + // var customStyle = { + // cn: "cn-1-", + // cn1: "cn-2-", + // cn2: "cn-3-", + // num: "num-1-", + // num1: "num-2-", + // num2: "num-3-", + // dash: "dash", + // dot: "dot" + // }; - //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 - node.setStyle("margin", ""); - node.setStyle("margin-left", ""); - node.setAttr("class", ""); + me.setOpt({ + autoTransWordToList: false, + insertorderedlist: { + // num: "", + // num1: "", + // num2: "", + // cn: "", + // cn1: "", + // cn2: "", + decimal: "", + "lower-alpha": "", + "lower-roman": "", + "upper-alpha": "", + "upper-roman": "" + }, + insertunorderedlist: { + circle: "", + disc: "", + square: "", + // dash: "", + // dot: "" + }, + listDefaultPaddingLeft: "30", + listiconpath: "http://bs.baidu.com/listicon/", + maxListLevel: -1, //-1不限制 + disablePInList: false + }); - function appendLi(list, p, type) { - if (list.tagName == "ol") { - if (browser.ie) { - var first = p.firstChild(); - if ( - first.type == "element" && - first.tagName == "span" && - orderlisttype[type].test(first.innerText()) - ) { - p.removeChild(first); - } - } else { - p.innerHTML(p.innerHTML().replace(orderlisttype[type], "")); - } - } else { - p.removeChild(p.firstChild()); - } - - var li = UE.uNode.createElement("li"); - li.appendChild(p); - list.appendChild(li); + function listToArray(list) { + var arr = []; + for (var p in list) { + arr.push(p); } - var tmp = node, - type, - cacheNode = node; - - if ( - node.parentNode.tagName != "li" && - (type = checkListType(node.innerText(), node)) - ) { - var list = UE.uNode.createElement( - me.options.insertorderedlist.hasOwnProperty(type) ? "ol" : "ul" - ); - if (customStyle[type]) { - list.setAttr("class", "custom_" + type); - } else { - list.setStyle("list-style-type", type); - } - while ( - node && - node.parentNode.tagName != "li" && - checkListType(node.innerText(), node) - ) { - tmp = node.nextSibling(); - if (!tmp) { - node.parentNode.insertBefore(list, node); - } - appendLi(list, node, type); - node = tmp; - } - if (!list.parentNode && node && node.parentNode) { - node.parentNode.insertBefore(list, node); - } - } - var span = cacheNode.firstChild(); - if ( - span && - span.type == "element" && - span.tagName == "span" && - /^\s*( )+\s*$/.test(span.innerText()) - ) { - span.parentNode.removeChild(span); - } - }); + return arr; } - }); - //调整索引标签 - me.addListener("contentchange", function() { - adjustListStyle(me.document); - }); + var listStyle = { + OL: listToArray(me.options.insertorderedlist), + UL: listToArray(me.options.insertunorderedlist) + }; + var liiconpath = me.options.listiconpath; - function adjustListStyle(doc, ignore) { - utils.each(domUtils.getElementsByTagName(doc, "ol ul"), function(node) { - if (!domUtils.inDoc(node, doc)) return; + //根据用户配置,调整customStyle + // for (var s in customStyle) { + // if ( + // !me.options.insertorderedlist.hasOwnProperty(s) && + // !me.options.insertunorderedlist.hasOwnProperty(s) + // ) { + // delete customStyle[s]; + // } + // } - var parent = node.parentNode; - if (parent.tagName == node.tagName) { - var nodeStyleType = - getStyle(node) || (node.tagName == "OL" ? "decimal" : "disc"), - parentStyleType = - getStyle(parent) || (parent.tagName == "OL" ? "decimal" : "disc"); - if (nodeStyleType == parentStyleType) { - var styleIndex = utils.indexOf( - listStyle[node.tagName], - nodeStyleType - ); - styleIndex = styleIndex + 1 == listStyle[node.tagName].length - ? 0 - : styleIndex + 1; - setListStyle(node, listStyle[node.tagName][styleIndex]); - } - } - var index = 0, - type = 2; - if (domUtils.hasClass(node, /custom_/)) { - if ( - !( - /[ou]l/i.test(parent.tagName) && - domUtils.hasClass(parent, /custom_/) - ) - ) { - type = 1; - } - } else { - if ( - /[ou]l/i.test(parent.tagName) && - domUtils.hasClass(parent, /custom_/) - ) { - type = 3; - } - } - - var style = domUtils.getStyle(node, "list-style-type"); - style && (node.style.cssText = "list-style-type:" + style); - node.className = - utils.trim(node.className.replace(/list-paddingleft-\w+/, "")) + - " list-paddingleft-" + - type; - utils.each(domUtils.getElementsByTagName(node, "li"), function(li) { - li.style.cssText && (li.style.cssText = ""); - if (!li.firstChild) { - domUtils.remove(li); - return; - } - if (li.parentNode !== node) { - return; - } - index++; - if (domUtils.hasClass(node, /custom_/)) { - var paddingLeft = 1, - currentStyle = getStyle(node); - if (node.tagName == "OL") { - if (currentStyle) { - switch (currentStyle) { - case "cn": - case "cn1": - case "cn2": - if ( - index > 10 && - (index % 10 == 0 || (index > 10 && index < 20)) - ) { - paddingLeft = 2; - } else if (index > 20) { - paddingLeft = 3; - } - break; - case "num2": - if (index > 9) { - paddingLeft = 2; - } - } - } - li.className = - "list-" + - customStyle[currentStyle] + - index + - " " + - "list-" + - currentStyle + - "-paddingleft-" + - paddingLeft; - } else { - li.className = - "list-" + - customStyle[currentStyle] + - " " + - "list-" + - currentStyle + - "-paddingleft"; - } - } else { - li.className = li.className.replace(/list-[\w\-]+/gi, ""); - } - var className = li.getAttribute("class"); - if (className !== null && !className.replace(/\s/g, "")) { - domUtils.removeAttributes(li, "class"); - } - }); - !ignore && - adjustList( - node, - node.tagName.toLowerCase(), - getStyle(node) || domUtils.getStyle(node, "list-style-type"), - true + me.ready(function () { + var customCss = []; + // for (var p in customStyle) { + // if (p == "dash" || p == "dot") { + // customCss.push( + // "li.list-" + + // customStyle[p] + + // "{background-image:url(" + + // liiconpath + + // customStyle[p] + + // ".gif)}" + // ); + // customCss.push( + // "ul.custom_" + + // p + + // "{list-style:none;}ul.custom_" + + // p + + // " li{background-position:0 3px;background-repeat:no-repeat}" + // ); + // } else { + // for (var i = 0; i < 99; i++) { + // customCss.push( + // "li.list-" + + // customStyle[p] + + // i + + // "{background-image:url(" + + // liiconpath + + // "list-" + + // customStyle[p] + + // i + + // ".gif)}" + // ); + // } + // customCss.push( + // "ol.custom_" + + // p + + // "{list-style:none;}ol.custom_" + + // p + + // " li{background-position:0 3px;background-repeat:no-repeat}" + // ); + // } + // switch (p) { + // case "cn": + // customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}"); + // customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); + // customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}"); + // break; + // case "cn1": + // customCss.push("li.list-" + p + "-paddingleft-1{padding-left:30px}"); + // customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); + // customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}"); + // break; + // case "cn2": + // customCss.push("li.list-" + p + "-paddingleft-1{padding-left:40px}"); + // customCss.push("li.list-" + p + "-paddingleft-2{padding-left:55px}"); + // customCss.push("li.list-" + p + "-paddingleft-3{padding-left:68px}"); + // break; + // case "num": + // case "num1": + // customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}"); + // break; + // case "num2": + // customCss.push("li.list-" + p + "-paddingleft-1{padding-left:35px}"); + // customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}"); + // break; + // case "dash": + // customCss.push("li.list-" + p + "-paddingleft{padding-left:35px}"); + // break; + // case "dot": + // customCss.push("li.list-" + p + "-paddingleft{padding-left:20px}"); + // } + // } + customCss.push(".list-paddingleft-1{padding-left:0}"); + customCss.push( + ".list-paddingleft-2{padding-left:" + + me.options.listDefaultPaddingLeft + + "px}" + ); + customCss.push( + ".list-paddingleft-3{padding-left:" + + me.options.listDefaultPaddingLeft * 2 + + "px}" + ); + //如果不给宽度会在自定应样式里出现滚动条 + utils.cssRule( + "list", + "ol,ul{margin:0;pading:0;" + + (browser.ie ? "" : "width:95%") + + "}li{clear:both;}" + + customCss.join("\n"), + me.document ); }); - } - function adjustList(list, tag, style, ignoreEmpty) { - var nextList = list.nextSibling; - if ( - nextList && - nextList.nodeType == 1 && - nextList.tagName.toLowerCase() == tag && - (getStyle(nextList) || - domUtils.getStyle(nextList, "list-style-type") || - (tag == "ol" ? "decimal" : "disc")) == style - ) { - domUtils.moveChild(nextList, list); - if (nextList.childNodes.length == 0) { - domUtils.remove(nextList); - } - } - if (nextList && domUtils.isFillChar(nextList)) { - domUtils.remove(nextList); - } - var preList = list.previousSibling; - if ( - preList && - preList.nodeType == 1 && - preList.tagName.toLowerCase() == tag && - (getStyle(preList) || - domUtils.getStyle(preList, "list-style-type") || - (tag == "ol" ? "decimal" : "disc")) == style - ) { - domUtils.moveChild(list, preList); - } - if (preList && domUtils.isFillChar(preList)) { - domUtils.remove(preList); - } - !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); - if (getStyle(list)) { - adjustListStyle(list.ownerDocument, true); - } - } - - function setListStyle(list, style) { - if (customStyle[style]) { - list.className = "custom_" + style; - } - try { - domUtils.setStyle(list, "list-style-type", style); - } catch (e) {} - } - function clearEmptySibling(node) { - var tmpNode = node.previousSibling; - if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { - domUtils.remove(tmpNode); - } - tmpNode = node.nextSibling; - if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { - domUtils.remove(tmpNode); - } - } - - me.addListener("keydown", function(type, evt) { - function preventAndSave() { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - me.fireEvent("contentchange"); - me.undoManger && me.undoManger.save(); - } - function findList(node, filterFn) { - while (node && !domUtils.isBody(node)) { - if (filterFn(node)) { - return null; - } - if (node.nodeType == 1 && /[ou]l/i.test(node.tagName)) { - return node; - } - node = node.parentNode; - } - return null; - } - var keyCode = evt.keyCode || evt.which; - if (keyCode == 13 && !evt.shiftKey) { - //回车 - var rng = me.selection.getRange(), - parent = domUtils.findParent( - rng.startContainer, - function(node) { - return domUtils.isBlockElm(node); - }, - true - ), - li = domUtils.findParentByTagName(rng.startContainer, "li", true); - if (parent && parent.tagName != "PRE" && !li) { - var html = parent.innerHTML.replace( - new RegExp(domUtils.fillChar, "g"), - "" - ); - if (/^\s*1\s*\.[^\d]/.test(html)) { - parent.innerHTML = html.replace(/^\s*1\s*\./, ""); - rng.setStartAtLast(parent).collapse(true).select(); - me.__hasEnterExecCommand = true; - me.execCommand("insertorderedlist"); - me.__hasEnterExecCommand = false; - } - } - var range = me.selection.getRange(), - start = findList(range.startContainer, function(node) { - return node.tagName == "TABLE"; - }), - end = range.collapsed - ? start - : findList(range.endContainer, function(node) { - return node.tagName == "TABLE"; - }); - - if (start && end && start === end) { - if (!range.collapsed) { - start = domUtils.findParentByTagName( - range.startContainer, - "li", - true - ); - end = domUtils.findParentByTagName(range.endContainer, "li", true); - if (start && end && start === end) { - range.deleteContents(); - li = domUtils.findParentByTagName(range.startContainer, "li", true); - if (li && domUtils.isEmptyBlock(li)) { - pre = li.previousSibling; - next = li.nextSibling; - p = me.document.createElement("p"); - - domUtils.fillNode(me.document, p); - parentList = li.parentNode; - if (pre && next) { - range.setStart(next, 0).collapse(true).select(true); - domUtils.remove(li); - } else { - if ((!pre && !next) || !pre) { - parentList.parentNode.insertBefore(p, parentList); - } else { - li.parentNode.parentNode.insertBefore( - p, - parentList.nextSibling - ); - } - domUtils.remove(li); - if (!parentList.firstChild) { - domUtils.remove(parentList); - } - range.setStart(p, 0).setCursor(); - } - preventAndSave(); - return; - } - } else { - var tmpRange = range.cloneRange(), - bk = tmpRange.collapse(false).createBookmark(); - - range.deleteContents(); - tmpRange.moveToBookmark(bk); - var li = domUtils.findParentByTagName( - tmpRange.startContainer, - "li", - true - ); - - clearEmptySibling(li); - tmpRange.select(); - preventAndSave(); - return; - } - } - - li = domUtils.findParentByTagName(range.startContainer, "li", true); - - if (li) { - if (domUtils.isEmptyBlock(li)) { - bk = range.createBookmark(); - var parentList = li.parentNode; - if (li !== parentList.lastChild) { - domUtils.breakParent(li, parentList); - clearEmptySibling(li); - } else { - parentList.parentNode.insertBefore(li, parentList.nextSibling); - if (domUtils.isEmptyNode(parentList)) { - domUtils.remove(parentList); - } - } - //嵌套不处理 - if (!dtd.$list[li.parentNode.tagName]) { - if (!domUtils.isBlockElm(li.firstChild)) { - p = me.document.createElement("p"); - li.parentNode.insertBefore(p, li); - while (li.firstChild) { - p.appendChild(li.firstChild); - } - domUtils.remove(li); - } else { - domUtils.remove(li, true); - } - } - range.moveToBookmark(bk).select(); - } else { - var first = li.firstChild; - if (!first || !domUtils.isBlockElm(first)) { - var p = me.document.createElement("p"); - - !li.firstChild && domUtils.fillNode(me.document, p); - while (li.firstChild) { - p.appendChild(li.firstChild); - } - li.appendChild(p); - first = p; - } - - var span = me.document.createElement("span"); - - range.insertNode(span); - domUtils.breakParent(span, li); - - var nextLi = span.nextSibling; - first = nextLi.firstChild; - - if (!first) { - p = me.document.createElement("p"); - - domUtils.fillNode(me.document, p); - nextLi.appendChild(p); - first = p; - } - if (domUtils.isEmptyNode(first)) { - first.innerHTML = ""; - domUtils.fillNode(me.document, first); - } - - range.setStart(first, 0).collapse(true).shrinkBoundary().select(); - domUtils.remove(span); - var pre = nextLi.previousSibling; - if (pre && domUtils.isEmptyBlock(pre)) { - pre.innerHTML = "

    "; - domUtils.fillNode(me.document, pre.firstChild); - } - } - // } - preventAndSave(); - } - } - } - if (keyCode == 8) { - //修中ie中li下的问题 - range = me.selection.getRange(); - if (range.collapsed && domUtils.isStartInblock(range)) { - tmpRange = range.cloneRange().trimBoundary(); - li = domUtils.findParentByTagName(range.startContainer, "li", true); - //要在li的最左边,才能处理 - if (li && domUtils.isStartInblock(tmpRange)) { - start = domUtils.findParentByTagName(range.startContainer, "p", true); - if (start && start !== li.firstChild) { - var parentList = domUtils.findParentByTagName(start, ["ol", "ul"]); - domUtils.breakParent(start, parentList); - clearEmptySibling(start); - me.fireEvent("contentchange"); - range.setStart(start, 0).setCursor(false, true); - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - return; - } - - if (li && (pre = li.previousSibling)) { - if (keyCode == 46 && li.childNodes.length) { - return; - } - //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li - if (dtd.$list[pre.tagName]) { - pre = pre.lastChild; - } - me.undoManger && me.undoManger.save(); - first = li.firstChild; - if (domUtils.isBlockElm(first)) { - if (domUtils.isEmptyNode(first)) { - // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); - pre.appendChild(first); - range.setStart(first, 0).setCursor(false, true); - //first不是唯一的节点 - while (li.firstChild) { - pre.appendChild(li.firstChild); - } - } else { - span = me.document.createElement("span"); - range.insertNode(span); - //判断pre是否是空的节点,如果是


    类型的空节点,干掉p标签防止它占位 - if (domUtils.isEmptyBlock(pre)) { - pre.innerHTML = ""; - } - domUtils.moveChild(li, pre); - range.setStartBefore(span).collapse(true).select(true); - - domUtils.remove(span); - } - } else { - if (domUtils.isEmptyNode(li)) { - var p = me.document.createElement("p"); - pre.appendChild(p); - range.setStart(p, 0).setCursor(); - // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); - } else { - range - .setEnd(pre, pre.childNodes.length) - .collapse() - .select(true); - while (li.firstChild) { - pre.appendChild(li.firstChild); - } - } - } - domUtils.remove(li); - me.fireEvent("contentchange"); - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - return; - } - //trace:980 - - if (li && !li.previousSibling) { - var parentList = li.parentNode; - var bk = range.createBookmark(); - if (domUtils.isTagNode(parentList.parentNode, "ol ul")) { - parentList.parentNode.insertBefore(li, parentList); - if (domUtils.isEmptyNode(parentList)) { - domUtils.remove(parentList); - } - } else { - while (li.firstChild) { - parentList.parentNode.insertBefore(li.firstChild, parentList); - } - - domUtils.remove(li); - if (domUtils.isEmptyNode(parentList)) { - domUtils.remove(parentList); - } - } - range.moveToBookmark(bk).setCursor(false, true); - me.fireEvent("contentchange"); - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - return; - } - } - } - } - }); - - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - if (keyCode == 8) { - var rng = me.selection.getRange(), - list; - if ( - (list = domUtils.findParentByTagName( - rng.startContainer, - ["ol", "ul"], - true - )) - ) { - adjustList( - list, - list.tagName.toLowerCase(), - getStyle(list) || domUtils.getComputedStyle(list, "list-style-type"), - true - ); - } - } - }); - //处理tab键 - me.addListener("tabkeydown", function() { - var range = me.selection.getRange(); - - //控制级数 - function checkLevel(li) { - if (me.options.maxListLevel != -1) { - var level = li.parentNode, - levelNum = 0; - while (/[ou]l/i.test(level.tagName)) { - levelNum++; - level = level.parentNode; - } - if (levelNum >= me.options.maxListLevel) { - return true; - } - } - } - //只以开始为准 - //todo 后续改进 - var li = domUtils.findParentByTagName(range.startContainer, "li", true); - if (li) { - var bk; - if (range.collapsed) { - if (checkLevel(li)) return true; - var parentLi = li.parentNode, - list = me.document.createElement(parentLi.tagName), - index = utils.indexOf( - listStyle[list.tagName], - getStyle(parentLi) || - domUtils.getComputedStyle(parentLi, "list-style-type") - ); - index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; - var currentStyle = listStyle[list.tagName][index]; - setListStyle(list, currentStyle); - if (domUtils.isStartInblock(range)) { - me.fireEvent("saveScene"); - bk = range.createBookmark(); - parentLi.insertBefore(list, li); - list.appendChild(li); - adjustList(list, list.tagName.toLowerCase(), currentStyle); - me.fireEvent("contentchange"); - range.moveToBookmark(bk).select(true); - return true; - } - } else { - me.fireEvent("saveScene"); - bk = range.createBookmark(); - for ( - var i = 0, closeList, parents = domUtils.findParents(li), ci; - (ci = parents[i++]); - - ) { - if (domUtils.isTagNode(ci, "ol ul")) { - closeList = ci; - break; - } - } - var current = li; - if (bk.end) { - while ( - current && - !( - domUtils.getPosition(current, bk.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - if (checkLevel(current)) { - current = domUtils.getNextDomNode(current, false, null, function( - node - ) { - return node !== closeList; - }); - continue; - } - var parentLi = current.parentNode, - list = me.document.createElement(parentLi.tagName), - index = utils.indexOf( - listStyle[list.tagName], - getStyle(parentLi) || - domUtils.getComputedStyle(parentLi, "list-style-type") - ); - var currentIndex = index + 1 == listStyle[list.tagName].length - ? 0 - : index + 1; - var currentStyle = listStyle[list.tagName][currentIndex]; - setListStyle(list, currentStyle); - parentLi.insertBefore(list, current); - while ( - current && - !( - domUtils.getPosition(current, bk.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - li = current.nextSibling; - list.appendChild(current); - if (!li || domUtils.isTagNode(li, "ol ul")) { - if (li) { - while ((li = li.firstChild)) { - if (li.tagName == "LI") { - break; + //单独处理剪切的问题 + me.ready(function () { + domUtils.on(me.body, "cut", function () { + setTimeout(function () { + var rng = me.selection.getRange(), + li; + //trace:3416 + if (!rng.collapsed) { + if ( + (li = domUtils.findParentByTagName(rng.startContainer, "li", true)) + ) { + if (!li.nextSibling && domUtils.isEmptyBlock(li)) { + var pn = li.parentNode, + node; + if ((node = pn.previousSibling)) { + domUtils.remove(pn); + rng.setStartAtLast(node).collapse(true); + rng.select(true); + } else if ((node = pn.nextSibling)) { + domUtils.remove(pn); + rng.setStartAtFirst(node).collapse(true); + rng.select(true); + } else { + var tmpNode = me.document.createElement("p"); + domUtils.fillNode(me.document, tmpNode); + pn.parentNode.insertBefore(tmpNode, pn); + domUtils.remove(pn); + rng.setStart(tmpNode, 0).collapse(true); + rng.select(true); + } + } } - } - } else { - li = domUtils.getNextDomNode(current, false, null, function( - node - ) { - return node !== closeList; - }); } - break; - } - current = li; - } - adjustList(list, list.tagName.toLowerCase(), currentStyle); - current = li; - } - } - me.fireEvent("contentchange"); - range.moveToBookmark(bk).select(); - return true; - } - } - }); - function getLi(start) { - while (start && !domUtils.isBody(start)) { - if (start.nodeName == "TABLE") { - return null; - } - if (start.nodeName == "LI") { - return start; - } - start = start.parentNode; - } - } + }); + }); + }); - /** + function getStyle(node) { + var cls = node.className; + if (domUtils.hasClass(node, /custom_/)) { + return cls.match(/custom_(\w+)/)[1]; + } + return domUtils.getStyle(node, "list-style-type"); + } + + me.addListener("beforepaste", function (type, html) { + var me = this, + rng = me.selection.getRange(), + li; + var root = UE.htmlparser(html.html, true); + if ((li = domUtils.findParentByTagName(rng.startContainer, "li", true))) { + var list = li.parentNode, + tagName = list.tagName === "OL" ? "ul" : "ol"; + utils.each(root.getNodesByTagName(tagName), function (n) { + n.tagName = list.tagName; + n.setAttr(); + if (n.parentNode === root) { + type = getStyle(list) || (list.tagName == "OL" ? "decimal" : "disc"); + } else { + var className = n.parentNode.getAttr("class"); + if (className && /custom_/.test(className)) { + type = className.match(/custom_(\w+)/)[1]; + } else { + type = n.parentNode.getStyle("list-style-type"); + } + if (!type) { + type = list.tagName === "OL" ? "decimal" : "disc"; + } + } + var index = utils.indexOf(listStyle[list.tagName], type); + if (n.parentNode !== root) + index = index + 1 === listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + // if (customStyle[currentStyle]) { + // n.setAttr("class", "custom_" + currentStyle); + // } else { + n.setStyle("list-style-type", currentStyle); + // } + }); + } + + html.html = root.toHtml(); + }); + //导出时,去掉p标签 + me.getOpt("disablePInList") === true && + me.addOutputRule(function (root) { + utils.each(root.getNodesByTagName("li"), function (li) { + var newChildrens = [], + index = 0; + utils.each(li.children, function (n) { + if (n.tagName == "p") { + var tmpNode; + while ((tmpNode = n.children.pop())) { + newChildrens.splice(index, 0, tmpNode); + tmpNode.parentNode = li; + lastNode = tmpNode; + } + tmpNode = newChildrens[newChildrens.length - 1]; + if ( + !tmpNode || + tmpNode.type !== "element" || + tmpNode.tagName !== "br" + ) { + var br = UE.uNode.createElement("br"); + br.parentNode = li; + newChildrens.push(br); + } + + index = newChildrens.length; + } + }); + if (newChildrens.length) { + li.children = newChildrens; + } + }); + }); + //进入编辑器的li要套p标签 + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName("li"), function (li) { + var tmpP = UE.uNode.createElement("p"); + for (var i = 0, ci; (ci = li.children[i]);) { + if (ci.type === "text" || dtd.p[ci.tagName]) { + tmpP.appendChild(ci); + } else { + if (tmpP.firstChild()) { + li.insertBefore(tmpP, ci); + tmpP = UE.uNode.createElement("p"); + i = i + 2; + } else { + i++; + } + } + } + if ((tmpP.firstChild() && !tmpP.parentNode) || !li.firstChild()) { + li.appendChild(tmpP); + } + //trace:3357 + //p不能为空 + if (!tmpP.firstChild()) { + tmpP.innerHTML(browser.ie ? " " : "
    "); + } + //去掉末尾的空白 + var p = li.firstChild(); + var lastChild = p.lastChild(); + if ( + lastChild && + lastChild.type === "text" && + /^\s*$/.test(lastChild.data) + ) { + p.removeChild(lastChild); + } + }); + if (me.options.autoTransWordToList) { + var orderlisttype = { + num1: /^\d+\)/, + decimal: /^\d+\./, + "lower-alpha": /^[a-z]+\)/, + "upper-alpha": /^[A-Z]+\./, + cn: /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, + cn2: /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ + }, + unorderlisttype = { + square: "n" + }; + + function checkListType(content, container) { + var span = container.firstChild(); + if ( + span && + span.type === "element" && + span.tagName === "span" && + /Wingdings|Symbol/.test(span.getStyle("font-family")) + ) { + for (var p in unorderlisttype) { + if (unorderlisttype[p] == span.data) { + return p; + } + } + return "disc"; + } + for (var p in orderlisttype) { + if (orderlisttype[p].test(content)) { + return p; + } + } + } + + utils.each(root.getNodesByTagName("p"), function (node) { + if (node.getAttr("class") !== "MsoListParagraph") { + return; + } + + //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 + node.setStyle("margin", ""); + node.setStyle("margin-left", ""); + node.setAttr("class", ""); + + function appendLi(list, p, type) { + if (list.tagName === "ol") { + if (browser.ie) { + var first = p.firstChild(); + if ( + first.type === "element" && + first.tagName === "span" && + orderlisttype[type].test(first.innerText()) + ) { + p.removeChild(first); + } + } else { + p.innerHTML(p.innerHTML().replace(orderlisttype[type], "")); + } + } else { + p.removeChild(p.firstChild()); + } + + var li = UE.uNode.createElement("li"); + li.appendChild(p); + list.appendChild(li); + } + + var tmp = node, + type, + cacheNode = node; + + if ( + node.parentNode.tagName !== "li" && + (type = checkListType(node.innerText(), node)) + ) { + var list = UE.uNode.createElement( + me.options.insertorderedlist.hasOwnProperty(type) ? "ol" : "ul" + ); + // if (customStyle[type]) { + // list.setAttr("class", "custom_" + type); + // } else { + list.setStyle("list-style-type", type); + // } + while ( + node && + node.parentNode.tagName !== "li" && + checkListType(node.innerText(), node) + ) { + tmp = node.nextSibling(); + if (!tmp) { + node.parentNode.insertBefore(list, node); + } + appendLi(list, node, type); + node = tmp; + } + if (!list.parentNode && node && node.parentNode) { + node.parentNode.insertBefore(list, node); + } + } + var span = cacheNode.firstChild(); + if ( + span && + span.type == "element" && + span.tagName == "span" && + /^\s*( )+\s*$/.test(span.innerText()) + ) { + span.parentNode.removeChild(span); + } + }); + } + }); + + //调整索引标签 + me.addListener("contentchange", function () { + adjustListStyle(me.document); + }); + + function adjustListStyle(doc, ignore) { + utils.each(domUtils.getElementsByTagName(doc, "ol ul"), function (node) { + if (!domUtils.inDoc(node, doc)) return; + + var parent = node.parentNode; + if (parent.tagName === node.tagName) { + var nodeStyleType = + getStyle(node) || (node.tagName === "OL" ? "decimal" : "disc"), + parentStyleType = + getStyle(parent) || (parent.tagName === "OL" ? "decimal" : "disc"); + if (nodeStyleType === parentStyleType) { + var styleIndex = utils.indexOf( + listStyle[node.tagName], + nodeStyleType + ); + styleIndex = styleIndex + 1 === listStyle[node.tagName].length + ? 0 + : styleIndex + 1; + setListStyle(node, listStyle[node.tagName][styleIndex]); + } + } + var index = 0, + type = 2; + if (domUtils.hasClass(node, /custom_/)) { + if ( + !( + /[ou]l/i.test(parent.tagName) && + domUtils.hasClass(parent, /custom_/) + ) + ) { + type = 1; + } + } else { + if ( + /[ou]l/i.test(parent.tagName) && + domUtils.hasClass(parent, /custom_/) + ) { + type = 3; + } + } + + var style = domUtils.getStyle(node, "list-style-type"); + style && (node.style.cssText = "list-style-type:" + style); + node.className = + utils.trim(node.className.replace(/list-paddingleft-\w+/, "")) + + " list-paddingleft-" + + type; + utils.each(domUtils.getElementsByTagName(node, "li"), function (li) { + li.style.cssText && (li.style.cssText = ""); + if (!li.firstChild) { + domUtils.remove(li); + return; + } + if (li.parentNode !== node) { + return; + } + index++; + if (domUtils.hasClass(node, /custom_/)) { + var paddingLeft = 1, + currentStyle = getStyle(node); + if (node.tagName === "OL") { + if (currentStyle) { + switch (currentStyle) { + case "cn": + case "cn1": + case "cn2": + if ( + index > 10 && + (index % 10 === 0 || (index > 10 && index < 20)) + ) { + paddingLeft = 2; + } else if (index > 20) { + paddingLeft = 3; + } + break; + case "num2": + if (index > 9) { + paddingLeft = 2; + } + } + } + li.className = + // "list-" + + // customStyle[currentStyle] + + // index + + // " " + + "list-" + + currentStyle + + "-paddingleft-" + + paddingLeft; + } else { + li.className = + // "list-" + + // customStyle[currentStyle] + + // " " + + "list-" + + currentStyle + + "-paddingleft"; + } + } else { + li.className = li.className.replace(/list-[\w\-]+/gi, ""); + } + var className = li.getAttribute("class"); + if (className !== null && !className.replace(/\s/g, "")) { + domUtils.removeAttributes(li, "class"); + } + }); + !ignore && + adjustList( + node, + node.tagName.toLowerCase(), + getStyle(node) || domUtils.getStyle(node, "list-style-type"), + true + ); + }); + } + + function adjustList(list, tag, style, ignoreEmpty) { + var nextList = list.nextSibling; + if ( + nextList && + nextList.nodeType === 1 && + nextList.tagName.toLowerCase() === tag && + (getStyle(nextList) || + domUtils.getStyle(nextList, "list-style-type") || + (tag == "ol" ? "decimal" : "disc")) == style + ) { + domUtils.moveChild(nextList, list); + if (nextList.childNodes.length === 0) { + domUtils.remove(nextList); + } + } + if (nextList && domUtils.isFillChar(nextList)) { + domUtils.remove(nextList); + } + var preList = list.previousSibling; + if ( + preList && + preList.nodeType === 1 && + preList.tagName.toLowerCase() == tag && + (getStyle(preList) || + domUtils.getStyle(preList, "list-style-type") || + (tag == "ol" ? "decimal" : "disc")) === style + ) { + domUtils.moveChild(list, preList); + } + if (preList && domUtils.isFillChar(preList)) { + domUtils.remove(preList); + } + !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); + if (getStyle(list)) { + adjustListStyle(list.ownerDocument, true); + } + } + + function setListStyle(list, style) { + // if (customStyle[style]) { + // list.className = "custom_" + style; + // } + try { + domUtils.setStyle(list, "list-style-type", style); + } catch (e) { + } + } + + function clearEmptySibling(node) { + var tmpNode = node.previousSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + tmpNode = node.nextSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + } + + me.addListener("keydown", function (type, evt) { + function preventAndSave() { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + me.fireEvent("contentchange"); + me.undoManger && me.undoManger.save(); + } + + function findList(node, filterFn) { + while (node && !domUtils.isBody(node)) { + if (filterFn(node)) { + return null; + } + if (node.nodeType === 1 && /[ou]l/i.test(node.tagName)) { + return node; + } + node = node.parentNode; + } + return null; + } + + var keyCode = evt.keyCode || evt.which; + if (keyCode === 13 && !evt.shiftKey) { + //回车 + var rng = me.selection.getRange(), + parent = domUtils.findParent( + rng.startContainer, + function (node) { + return domUtils.isBlockElm(node); + }, + true + ), + li = domUtils.findParentByTagName(rng.startContainer, "li", true); + if (parent && parent.tagName !== "PRE" && !li) { + var html = parent.innerHTML.replace( + new RegExp(domUtils.fillChar, "g"), + "" + ); + if (/^\s*1\s*\.[^\d]/.test(html)) { + parent.innerHTML = html.replace(/^\s*1\s*\./, ""); + rng.setStartAtLast(parent).collapse(true).select(); + me.__hasEnterExecCommand = true; + me.execCommand("insertorderedlist"); + me.__hasEnterExecCommand = false; + } + } + var range = me.selection.getRange(), + start = findList(range.startContainer, function (node) { + return node.tagName === "TABLE"; + }), + end = range.collapsed + ? start + : findList(range.endContainer, function (node) { + return node.tagName === "TABLE"; + }); + + if (start && end && start === end) { + if (!range.collapsed) { + start = domUtils.findParentByTagName( + range.startContainer, + "li", + true + ); + end = domUtils.findParentByTagName(range.endContainer, "li", true); + if (start && end && start === end) { + range.deleteContents(); + li = domUtils.findParentByTagName(range.startContainer, "li", true); + if (li && domUtils.isEmptyBlock(li)) { + pre = li.previousSibling; + next = li.nextSibling; + p = me.document.createElement("p"); + + domUtils.fillNode(me.document, p); + parentList = li.parentNode; + if (pre && next) { + range.setStart(next, 0).collapse(true).select(true); + domUtils.remove(li); + } else { + if ((!pre && !next) || !pre) { + parentList.parentNode.insertBefore(p, parentList); + } else { + li.parentNode.parentNode.insertBefore( + p, + parentList.nextSibling + ); + } + domUtils.remove(li); + if (!parentList.firstChild) { + domUtils.remove(parentList); + } + range.setStart(p, 0).setCursor(); + } + preventAndSave(); + return; + } + } else { + var tmpRange = range.cloneRange(), + bk = tmpRange.collapse(false).createBookmark(); + + range.deleteContents(); + tmpRange.moveToBookmark(bk); + var li = domUtils.findParentByTagName( + tmpRange.startContainer, + "li", + true + ); + + clearEmptySibling(li); + tmpRange.select(); + preventAndSave(); + return; + } + } + + li = domUtils.findParentByTagName(range.startContainer, "li", true); + + if (li) { + if (domUtils.isEmptyBlock(li)) { + bk = range.createBookmark(); + var parentList = li.parentNode; + if (li !== parentList.lastChild) { + domUtils.breakParent(li, parentList); + clearEmptySibling(li); + } else { + parentList.parentNode.insertBefore(li, parentList.nextSibling); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + //嵌套不处理 + if (!dtd.$list[li.parentNode.tagName]) { + if (!domUtils.isBlockElm(li.firstChild)) { + p = me.document.createElement("p"); + li.parentNode.insertBefore(p, li); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + domUtils.remove(li); + } else { + domUtils.remove(li, true); + } + } + range.moveToBookmark(bk).select(); + } else { + var first = li.firstChild; + if (!first || !domUtils.isBlockElm(first)) { + var p = me.document.createElement("p"); + + !li.firstChild && domUtils.fillNode(me.document, p); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + li.appendChild(p); + first = p; + } + + var span = me.document.createElement("span"); + + range.insertNode(span); + domUtils.breakParent(span, li); + + var nextLi = span.nextSibling; + first = nextLi.firstChild; + + if (!first) { + p = me.document.createElement("p"); + + domUtils.fillNode(me.document, p); + nextLi.appendChild(p); + first = p; + } + if (domUtils.isEmptyNode(first)) { + first.innerHTML = ""; + domUtils.fillNode(me.document, first); + } + + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + domUtils.remove(span); + var pre = nextLi.previousSibling; + if (pre && domUtils.isEmptyBlock(pre)) { + pre.innerHTML = "

    "; + domUtils.fillNode(me.document, pre.firstChild); + } + } + // } + preventAndSave(); + } + } + } + if (keyCode === 8) { + //修中ie中li下的问题 + range = me.selection.getRange(); + if (range.collapsed && domUtils.isStartInblock(range)) { + tmpRange = range.cloneRange().trimBoundary(); + li = domUtils.findParentByTagName(range.startContainer, "li", true); + //要在li的最左边,才能处理 + if (li && domUtils.isStartInblock(tmpRange)) { + start = domUtils.findParentByTagName(range.startContainer, "p", true); + if (start && start !== li.firstChild) { + var parentList = domUtils.findParentByTagName(start, ["ol", "ul"]); + domUtils.breakParent(start, parentList); + clearEmptySibling(start); + me.fireEvent("contentchange"); + range.setStart(start, 0).setCursor(false, true); + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + return; + } + + if (li && (pre = li.previousSibling)) { + if (keyCode === 46 && li.childNodes.length) { + return; + } + //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li + if (dtd.$list[pre.tagName]) { + pre = pre.lastChild; + } + me.undoManger && me.undoManger.save(); + first = li.firstChild; + if (domUtils.isBlockElm(first)) { + if (domUtils.isEmptyNode(first)) { + // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + pre.appendChild(first); + range.setStart(first, 0).setCursor(false, true); + //first不是唯一的节点 + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } else { + span = me.document.createElement("span"); + range.insertNode(span); + //判断pre是否是空的节点,如果是


    类型的空节点,干掉p标签防止它占位 + if (domUtils.isEmptyBlock(pre)) { + pre.innerHTML = ""; + } + domUtils.moveChild(li, pre); + range.setStartBefore(span).collapse(true).select(true); + + domUtils.remove(span); + } + } else { + if (domUtils.isEmptyNode(li)) { + var p = me.document.createElement("p"); + pre.appendChild(p); + range.setStart(p, 0).setCursor(); + // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + } else { + range + .setEnd(pre, pre.childNodes.length) + .collapse() + .select(true); + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } + } + domUtils.remove(li); + me.fireEvent("contentchange"); + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + return; + } + //trace:980 + + if (li && !li.previousSibling) { + var parentList = li.parentNode; + var bk = range.createBookmark(); + if (domUtils.isTagNode(parentList.parentNode, "ol ul")) { + parentList.parentNode.insertBefore(li, parentList); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } else { + while (li.firstChild) { + parentList.parentNode.insertBefore(li.firstChild, parentList); + } + + domUtils.remove(li); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + range.moveToBookmark(bk).setCursor(false, true); + me.fireEvent("contentchange"); + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + return; + } + } + } + } + }); + + me.addListener("keyup", function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8) { + var rng = me.selection.getRange(), + list; + if ( + (list = domUtils.findParentByTagName( + rng.startContainer, + ["ol", "ul"], + true + )) + ) { + adjustList( + list, + list.tagName.toLowerCase(), + getStyle(list) || domUtils.getComputedStyle(list, "list-style-type"), + true + ); + } + } + }); + //处理tab键 + me.addListener("tabkeydown", function () { + var range = me.selection.getRange(); + + //控制级数 + function checkLevel(li) { + if (me.options.maxListLevel != -1) { + var level = li.parentNode, + levelNum = 0; + while (/[ou]l/i.test(level.tagName)) { + levelNum++; + level = level.parentNode; + } + if (levelNum >= me.options.maxListLevel) { + return true; + } + } + } + + //只以开始为准 + //todo 后续改进 + var li = domUtils.findParentByTagName(range.startContainer, "li", true); + if (li) { + var bk; + if (range.collapsed) { + if (checkLevel(li)) return true; + var parentLi = li.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf( + listStyle[list.tagName], + getStyle(parentLi) || + domUtils.getComputedStyle(parentLi, "list-style-type") + ); + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + setListStyle(list, currentStyle); + if (domUtils.isStartInblock(range)) { + me.fireEvent("saveScene"); + bk = range.createBookmark(); + parentLi.insertBefore(list, li); + list.appendChild(li); + adjustList(list, list.tagName.toLowerCase(), currentStyle); + me.fireEvent("contentchange"); + range.moveToBookmark(bk).select(true); + return true; + } + } else { + me.fireEvent("saveScene"); + bk = range.createBookmark(); + for ( + var i = 0, closeList, parents = domUtils.findParents(li), ci; + (ci = parents[i++]); + ) { + if (domUtils.isTagNode(ci, "ol ul")) { + closeList = ci; + break; + } + } + var current = li; + if (bk.end) { + while ( + current && + !( + domUtils.getPosition(current, bk.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + if (checkLevel(current)) { + current = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return node !== closeList; + }); + continue; + } + var parentLi = current.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf( + listStyle[list.tagName], + getStyle(parentLi) || + domUtils.getComputedStyle(parentLi, "list-style-type") + ); + var currentIndex = index + 1 == listStyle[list.tagName].length + ? 0 + : index + 1; + var currentStyle = listStyle[list.tagName][currentIndex]; + setListStyle(list, currentStyle); + parentLi.insertBefore(list, current); + while ( + current && + !( + domUtils.getPosition(current, bk.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + li = current.nextSibling; + list.appendChild(current); + if (!li || domUtils.isTagNode(li, "ol ul")) { + if (li) { + while ((li = li.firstChild)) { + if (li.tagName == "LI") { + break; + } + } + } else { + li = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return node !== closeList; + }); + } + break; + } + current = li; + } + adjustList(list, list.tagName.toLowerCase(), currentStyle); + current = li; + } + } + me.fireEvent("contentchange"); + range.moveToBookmark(bk).select(); + return true; + } + } + }); + + function getLi(start) { + while (start && !domUtils.isBody(start)) { + if (start.nodeName == "TABLE") { + return null; + } + if (start.nodeName == "LI") { + return start; + } + start = start.parentNode; + } + } + + /** * 有序列表,与“insertunorderedlist”命令互斥 * @command insertorderedlist * @method execCommand @@ -17575,7 +21073,7 @@ UE.plugins["list"] = function() { * editor.execCommand( 'insertorderedlist','decimal'); * ``` */ - /** + /** * 查询当前选区内容是否有序列表 * @command insertorderedlist * @method queryCommandState @@ -17586,7 +21084,7 @@ UE.plugins["list"] = function() { * editor.queryCommandState( 'insertorderedlist' ); * ``` */ - /** + /** * 查询当前选区内容是否有序列表 * @command insertorderedlist * @method queryCommandValue @@ -17598,7 +21096,7 @@ UE.plugins["list"] = function() { * ``` */ - /** + /** * 无序列表,与“insertorderedlist”命令互斥 * @command insertunorderedlist * @method execCommand @@ -17609,7 +21107,7 @@ UE.plugins["list"] = function() { * editor.execCommand( 'insertunorderedlist','circle'); * ``` */ - /** + /** * 查询当前是否有word文档粘贴进来的图片 * @command insertunorderedlist * @method insertunorderedlist @@ -17620,7 +21118,7 @@ UE.plugins["list"] = function() { * editor.queryCommandState( 'insertunorderedlist' ); * ``` */ - /** + /** * 查询当前选区内容是否有序列表 * @command insertunorderedlist * @method queryCommandValue @@ -17632,318 +21130,316 @@ UE.plugins["list"] = function() { * ``` */ - me.commands["insertorderedlist"] = me.commands["insertunorderedlist"] = { - execCommand: function(command, style) { - if (!style) { - style = command.toLowerCase() == "insertorderedlist" - ? "decimal" - : "disc"; - } - var me = this, - range = this.selection.getRange(), - filterFn = function(node) { - return node.nodeType == 1 - ? node.tagName.toLowerCase() != "br" - : !domUtils.isWhitespace(node); - }, - tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul", - frag = me.document.createDocumentFragment(); - //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 - //range.shrinkBoundary();//.adjustmentBoundary(); - range.adjustmentBoundary().shrinkBoundary(); - var bko = range.createBookmark(true), - start = getLi(me.document.getElementById(bko.start)), - modifyStart = 0, - end = getLi(me.document.getElementById(bko.end)), - modifyEnd = 0, - startParent, - endParent, - list, - tmp; - - if (start || end) { - start && (startParent = start.parentNode); - if (!bko.end) { - end = start; - } - end && (endParent = end.parentNode); - - if (startParent === endParent) { - while (start !== end) { - tmp = start; - start = start.nextSibling; - if (!domUtils.isBlockElm(tmp.firstChild)) { - var p = me.document.createElement("p"); - while (tmp.firstChild) { - p.appendChild(tmp.firstChild); - } - tmp.appendChild(p); + me.commands["insertorderedlist"] = me.commands["insertunorderedlist"] = { + execCommand: function (command, style) { + if (!style) { + style = command.toLowerCase() == "insertorderedlist" + ? "decimal" + : "disc"; } - frag.appendChild(tmp); - } - tmp = me.document.createElement("span"); - startParent.insertBefore(tmp, end); - if (!domUtils.isBlockElm(end.firstChild)) { - p = me.document.createElement("p"); - while (end.firstChild) { - p.appendChild(end.firstChild); - } - end.appendChild(p); - } - frag.appendChild(end); - domUtils.breakParent(tmp, startParent); - if (domUtils.isEmptyNode(tmp.previousSibling)) { - domUtils.remove(tmp.previousSibling); - } - if (domUtils.isEmptyNode(tmp.nextSibling)) { - domUtils.remove(tmp.nextSibling); - } - var nodeStyle = - getStyle(startParent) || - domUtils.getComputedStyle(startParent, "list-style-type") || - (command.toLowerCase() == "insertorderedlist" ? "decimal" : "disc"); - if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { - for ( - var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); - (ci = frag.firstChild); + var me = this, + range = this.selection.getRange(), + filterFn = function (node) { + return node.nodeType == 1 + ? node.tagName.toLowerCase() != "br" + : !domUtils.isWhitespace(node); + }, + tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul", + frag = me.document.createDocumentFragment(); + //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 + //range.shrinkBoundary();//.adjustmentBoundary(); + range.adjustmentBoundary().shrinkBoundary(); + var bko = range.createBookmark(true), + start = getLi(me.document.getElementById(bko.start)), + modifyStart = 0, + end = getLi(me.document.getElementById(bko.end)), + modifyEnd = 0, + startParent, + endParent, + list, + tmp; - ) { - if (domUtils.isTagNode(ci, "ol ul")) { - // 删除时,子列表不处理 - // utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ - // while(li.firstChild){ - // tmpFrag.appendChild(li.firstChild); - // } - // - // }); - tmpFrag.appendChild(ci); - } else { - while (ci.firstChild) { - tmpFrag.appendChild(ci.firstChild); - domUtils.remove(ci); + if (start || end) { + start && (startParent = start.parentNode); + if (!bko.end) { + end = start; + } + end && (endParent = end.parentNode); + + if (startParent === endParent) { + while (start !== end) { + tmp = start; + start = start.nextSibling; + if (!domUtils.isBlockElm(tmp.firstChild)) { + var p = me.document.createElement("p"); + while (tmp.firstChild) { + p.appendChild(tmp.firstChild); + } + tmp.appendChild(p); + } + frag.appendChild(tmp); + } + tmp = me.document.createElement("span"); + startParent.insertBefore(tmp, end); + if (!domUtils.isBlockElm(end.firstChild)) { + p = me.document.createElement("p"); + while (end.firstChild) { + p.appendChild(end.firstChild); + } + end.appendChild(p); + } + frag.appendChild(end); + domUtils.breakParent(tmp, startParent); + if (domUtils.isEmptyNode(tmp.previousSibling)) { + domUtils.remove(tmp.previousSibling); + } + if (domUtils.isEmptyNode(tmp.nextSibling)) { + domUtils.remove(tmp.nextSibling); + } + var nodeStyle = + getStyle(startParent) || + domUtils.getComputedStyle(startParent, "list-style-type") || + (command.toLowerCase() == "insertorderedlist" ? "decimal" : "disc"); + if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { + for ( + var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); + (ci = frag.firstChild); + ) { + if (domUtils.isTagNode(ci, "ol ul")) { + // 删除时,子列表不处理 + // utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ + // while(li.firstChild){ + // tmpFrag.appendChild(li.firstChild); + // } + // + // }); + tmpFrag.appendChild(ci); + } else { + while (ci.firstChild) { + tmpFrag.appendChild(ci.firstChild); + domUtils.remove(ci); + } + } + } + tmp.parentNode.insertBefore(tmpFrag, tmp); + } else { + list = me.document.createElement(tag); + setListStyle(list, style); + list.appendChild(frag); + tmp.parentNode.insertBefore(list, tmp); + } + + domUtils.remove(tmp); + list && adjustList(list, tag, style); + range.moveToBookmark(bko).select(); + return; + } + //开始 + if (start) { + while (start) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, "ol ul")) { + frag.appendChild(start); + } else { + var tmpfrag = me.document.createDocumentFragment(), + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + var tmpP = me.document.createElement("p"); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + + start = tmp; + } + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + if (domUtils.isEmptyNode(startParent)) { + range.setStartBefore(startParent); + domUtils.remove(startParent); + } else { + range.setStartAfter(startParent); + } + modifyStart = 1; + } + + if (end && domUtils.inDoc(endParent, me.document)) { + //结束 + start = endParent.firstChild; + while (start && start !== end) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, "ol ul")) { + frag.appendChild(start); + } else { + tmpfrag = me.document.createDocumentFragment(); + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + tmpP = me.document.createElement("p"); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + start = tmp; + } + var tmpDiv = domUtils.createElement(me.document, "div", { + tmpDiv: 1 + }); + domUtils.moveChild(end, tmpDiv); + + frag.appendChild(tmpDiv); + domUtils.remove(end); + endParent.parentNode.insertBefore(frag, endParent); + range.setEndBefore(endParent); + if (domUtils.isEmptyNode(endParent)) { + domUtils.remove(endParent); + } + + modifyEnd = 1; } - } } - tmp.parentNode.insertBefore(tmpFrag, tmp); - } else { + + if (!modifyStart) { + range.setStartBefore(me.document.getElementById(bko.start)); + } + if (bko.end && !modifyEnd) { + range.setEndAfter(me.document.getElementById(bko.end)); + } + range.enlarge(true, function (node) { + return notExchange[node.tagName]; + }); + + frag = me.document.createDocumentFragment(); + + var bk = range.createBookmark(), + current = domUtils.getNextDomNode(bk.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode, + block = domUtils.isBlockElm; + + while ( + current && + current !== bk.end && + domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING + ) { + if (current.nodeType == 3 || dtd.li[current.tagName]) { + if (current.nodeType == 1 && dtd.$list[current.tagName]) { + while (current.firstChild) { + frag.appendChild(current.firstChild); + } + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + domUtils.remove(current); + current = tmpNode; + continue; + } + tmpNode = current; + tmpRange.setStartBefore(current); + + while ( + current && + current !== bk.end && + (!block(current) || domUtils.isBookmarkNode(current)) + ) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function ( + node + ) { + return !notExchange[node.tagName]; + }); + } + + if (current && block(current)) { + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + if (tmp && domUtils.isBookmarkNode(tmp)) { + current = domUtils.getNextDomNode(tmp, false, filterFn); + tmpNode = tmp; + } + } + tmpRange.setEndAfter(tmpNode); + + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + + var li = range.document.createElement("li"); + + li.appendChild(tmpRange.extractContents()); + if (domUtils.isEmptyNode(li)) { + var tmpNode = range.document.createElement("p"); + while (li.firstChild) { + tmpNode.appendChild(li.firstChild); + } + li.appendChild(tmpNode); + } + frag.appendChild(li); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + range.moveToBookmark(bk).collapse(true); list = me.document.createElement(tag); setListStyle(list, style); list.appendChild(frag); - tmp.parentNode.insertBefore(list, tmp); - } - - domUtils.remove(tmp); - list && adjustList(list, tag, style); - range.moveToBookmark(bko).select(); - return; - } - //开始 - if (start) { - while (start) { - tmp = start.nextSibling; - if (domUtils.isTagNode(start, "ol ul")) { - frag.appendChild(start); - } else { - var tmpfrag = me.document.createDocumentFragment(), - hasBlock = 0; - while (start.firstChild) { - if (domUtils.isBlockElm(start.firstChild)) { - hasBlock = 1; - } - tmpfrag.appendChild(start.firstChild); - } - if (!hasBlock) { - var tmpP = me.document.createElement("p"); - tmpP.appendChild(tmpfrag); - frag.appendChild(tmpP); - } else { - frag.appendChild(tmpfrag); - } - domUtils.remove(start); - } - - start = tmp; - } - startParent.parentNode.insertBefore(frag, startParent.nextSibling); - if (domUtils.isEmptyNode(startParent)) { - range.setStartBefore(startParent); - domUtils.remove(startParent); - } else { - range.setStartAfter(startParent); - } - modifyStart = 1; - } - - if (end && domUtils.inDoc(endParent, me.document)) { - //结束 - start = endParent.firstChild; - while (start && start !== end) { - tmp = start.nextSibling; - if (domUtils.isTagNode(start, "ol ul")) { - frag.appendChild(start); - } else { - tmpfrag = me.document.createDocumentFragment(); - hasBlock = 0; - while (start.firstChild) { - if (domUtils.isBlockElm(start.firstChild)) { - hasBlock = 1; - } - tmpfrag.appendChild(start.firstChild); - } - if (!hasBlock) { - tmpP = me.document.createElement("p"); - tmpP.appendChild(tmpfrag); - frag.appendChild(tmpP); - } else { - frag.appendChild(tmpfrag); - } - domUtils.remove(start); - } - start = tmp; - } - var tmpDiv = domUtils.createElement(me.document, "div", { - tmpDiv: 1 - }); - domUtils.moveChild(end, tmpDiv); - - frag.appendChild(tmpDiv); - domUtils.remove(end); - endParent.parentNode.insertBefore(frag, endParent); - range.setEndBefore(endParent); - if (domUtils.isEmptyNode(endParent)) { - domUtils.remove(endParent); - } - - modifyEnd = 1; - } - } - - if (!modifyStart) { - range.setStartBefore(me.document.getElementById(bko.start)); - } - if (bko.end && !modifyEnd) { - range.setEndAfter(me.document.getElementById(bko.end)); - } - range.enlarge(true, function(node) { - return notExchange[node.tagName]; - }); - - frag = me.document.createDocumentFragment(); - - var bk = range.createBookmark(), - current = domUtils.getNextDomNode(bk.start, false, filterFn), - tmpRange = range.cloneRange(), - tmpNode, - block = domUtils.isBlockElm; - - while ( - current && - current !== bk.end && - domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING - ) { - if (current.nodeType == 3 || dtd.li[current.tagName]) { - if (current.nodeType == 1 && dtd.$list[current.tagName]) { - while (current.firstChild) { - frag.appendChild(current.firstChild); - } - tmpNode = domUtils.getNextDomNode(current, false, filterFn); - domUtils.remove(current); - current = tmpNode; - continue; - } - tmpNode = current; - tmpRange.setStartBefore(current); - - while ( - current && - current !== bk.end && - (!block(current) || domUtils.isBookmarkNode(current)) - ) { - tmpNode = current; - current = domUtils.getNextDomNode(current, false, null, function( - node + range.insertNode(list); + //当前list上下看能否合并 + adjustList(list, tag, style); + //去掉冗余的tmpDiv + for ( + var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, "div"); + (ci = tmpDivs[i++]); ) { - return !notExchange[node.tagName]; - }); - } - - if (current && block(current)) { - tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); - if (tmp && domUtils.isBookmarkNode(tmp)) { - current = domUtils.getNextDomNode(tmp, false, filterFn); - tmpNode = tmp; + if (ci.getAttribute("tmpDiv")) { + domUtils.remove(ci, true); + } } - } - tmpRange.setEndAfter(tmpNode); - - current = domUtils.getNextDomNode(tmpNode, false, filterFn); - - var li = range.document.createElement("li"); - - li.appendChild(tmpRange.extractContents()); - if (domUtils.isEmptyNode(li)) { - var tmpNode = range.document.createElement("p"); - while (li.firstChild) { - tmpNode.appendChild(li.firstChild); + range.moveToBookmark(bko).select(); + }, + queryCommandState: function (command) { + var tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul"; + var path = this.selection.getStartElementPath(); + for (var i = 0, ci; (ci = path[i++]);) { + if (ci.nodeName == "TABLE") { + return 0; + } + if (tag == ci.nodeName.toLowerCase()) { + return 1; + } } - li.appendChild(tmpNode); - } - frag.appendChild(li); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); + return 0; + }, + queryCommandValue: function (command) { + var tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul"; + var path = this.selection.getStartElementPath(), + node; + for (var i = 0, ci; (ci = path[i++]);) { + if (ci.nodeName == "TABLE") { + node = null; + break; + } + if (tag == ci.nodeName.toLowerCase()) { + node = ci; + break; + } + } + return node + ? getStyle(node) || domUtils.getComputedStyle(node, "list-style-type") + : null; } - } - range.moveToBookmark(bk).collapse(true); - list = me.document.createElement(tag); - setListStyle(list, style); - list.appendChild(frag); - range.insertNode(list); - //当前list上下看能否合并 - adjustList(list, tag, style); - //去掉冗余的tmpDiv - for ( - var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, "div"); - (ci = tmpDivs[i++]); - - ) { - if (ci.getAttribute("tmpDiv")) { - domUtils.remove(ci, true); - } - } - range.moveToBookmark(bko).select(); - }, - queryCommandState: function(command) { - var tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul"; - var path = this.selection.getStartElementPath(); - for (var i = 0, ci; (ci = path[i++]); ) { - if (ci.nodeName == "TABLE") { - return 0; - } - if (tag == ci.nodeName.toLowerCase()) { - return 1; - } - } - return 0; - }, - queryCommandValue: function(command) { - var tag = command.toLowerCase() == "insertorderedlist" ? "ol" : "ul"; - var path = this.selection.getStartElementPath(), - node; - for (var i = 0, ci; (ci = path[i++]); ) { - if (ci.nodeName == "TABLE") { - node = null; - break; - } - if (tag == ci.nodeName.toLowerCase()) { - node = ci; - break; - } - } - return node - ? getStyle(node) || domUtils.getComputedStyle(node, "list-style-type") - : null; - } - }; + }; }; @@ -17954,128 +21450,135 @@ UE.plugins["list"] = function() { * @since 1.2.6.1 */ -(function() { - var sourceEditors = { - textarea: function(editor, holder) { - var textarea = holder.ownerDocument.createElement("textarea"); - textarea.style.cssText = - "position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;"; - // todo: IE下只有onresize属性可用... 很纠结 - if (browser.ie && browser.version < 8) { - textarea.style.width = holder.offsetWidth + "px"; - textarea.style.height = holder.offsetHeight + "px"; - holder.onresize = function() { - textarea.style.width = holder.offsetWidth + "px"; - textarea.style.height = holder.offsetHeight + "px"; - }; - } - holder.appendChild(textarea); - return { - setContent: function(content) { - textarea.value = content; +(function () { + var sourceEditors = { + textarea: function (editor, holder) { + var textarea = holder.ownerDocument.createElement("textarea"); + textarea.style.cssText = + "position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;"; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + textarea.style.width = holder.offsetWidth + "px"; + textarea.style.height = holder.offsetHeight + "px"; + holder.onresize = function () { + textarea.style.width = holder.offsetWidth + "px"; + textarea.style.height = holder.offsetHeight + "px"; + }; + } + holder.appendChild(textarea); + return { + setContent: function (content) { + textarea.value = content; + }, + getContent: function () { + return textarea.value; + }, + select: function () { + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function () { + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + }, + focus: function () { + textarea.focus(); + }, + blur: function () { + textarea.blur(); + } + }; }, - getContent: function() { - return textarea.value; - }, - select: function() { - var range; - if (browser.ie) { - range = textarea.createTextRange(); - range.collapse(true); - range.select(); - } else { - //todo: chrome下无法设置焦点 - textarea.setSelectionRange(0, 0); - textarea.focus(); - } - }, - dispose: function() { - holder.removeChild(textarea); - // todo - holder.onresize = null; - textarea = null; - holder = null; - }, - focus: function (){ - textarea.focus(); - }, - blur: function (){ - textarea.blur(); + codemirror: function (editor, holder) { + var codeEditor = window.CodeMirror(holder, { + mode: "text/html", + tabMode: "indent", + lineNumbers: true, + lineWrapping: true, + onChange: function (v) { + editor.sync(); + editor.fireEvent("contentchange"); + // console.log('CodeMirror.onChange',v.getValue()); + } + }); + // console.log('sourceEditor',codeEditor); + var dom = codeEditor.getWrapperElement(); + dom.style.cssText = + 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; + codeEditor.getScrollerElement().style.cssText = + "position:absolute;left:0;top:0;width:100%;height:100%;"; + codeEditor.refresh(); + return { + getCodeMirror: function () { + return codeEditor; + }, + setContent: function (content) { + codeEditor.setValue(content); + }, + getContent: function () { + return codeEditor.getValue(); + }, + select: function () { + codeEditor.focus(); + }, + dispose: function () { + holder.removeChild(dom); + dom = null; + codeEditor = null; + }, + focus: function () { + codeEditor.focus(); + }, + blur: function () { + // codeEditor.blur(); + // since codemirror not support blur() + codeEditor.setOption('readOnly', true); + codeEditor.setOption('readOnly', false); + } + }; } - }; - }, - codemirror: function(editor, holder) { - var codeEditor = window.CodeMirror(holder, { - mode: "text/html", - tabMode: "indent", - lineNumbers: true, - lineWrapping: true - }); - var dom = codeEditor.getWrapperElement(); - dom.style.cssText = - 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; - codeEditor.getScrollerElement().style.cssText = - "position:absolute;left:0;top:0;width:100%;height:100%;"; - codeEditor.refresh(); - return { - getCodeMirror: function() { - return codeEditor; - }, - setContent: function(content) { - codeEditor.setValue(content); - }, - getContent: function() { - return codeEditor.getValue(); - }, - select: function() { - codeEditor.focus(); - }, - dispose: function() { - holder.removeChild(dom); - dom = null; - codeEditor = null; - }, - focus: function (){ - codeEditor.focus(); - }, - blur: function (){ - // codeEditor.blur(); - // since codemirror not support blur() - codeEditor.setOption('readOnly', true); - codeEditor.setOption('readOnly', false); + }; + + UE.plugins["source"] = function () { + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + var orgFocus; + var orgBlur; + opt.sourceEditor = browser.ie + ? "textarea" + : opt.sourceEditor || "codemirror"; + + me.setOpt({ + sourceEditorFirst: false + }); + + function createSourceEditor(holder) { + return sourceEditors[ + opt.sourceEditor == "codemirror" && window.CodeMirror + ? "codemirror" + : "textarea" + ](me, holder); } - }; - } - }; - UE.plugins["source"] = function() { - var me = this; - var opt = this.options; - var sourceMode = false; - var sourceEditor; - var orgSetContent; - var orgFocus; - var orgBlur; - opt.sourceEditor = browser.ie - ? "textarea" - : opt.sourceEditor || "codemirror"; + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, bakAddress; - me.setOpt({ - sourceEditorFirst: false - }); - function createSourceEditor(holder) { - return sourceEditors[ - opt.sourceEditor == "codemirror" && window.CodeMirror - ? "codemirror" - : "textarea" - ](me, holder); - } - - var bakCssText; - //解决在源码模式下getContent不能得到最新的内容问题 - var oldGetContent, bakAddress; - - /** + /** * 切换源码模式和编辑模式 * @command source * @method execCommand @@ -18086,7 +21589,7 @@ UE.plugins["list"] = function() { * ``` */ - /** + /** * 查询当前编辑区域的状态是源码模式还是可视化模式 * @command source * @method queryCommandState @@ -18098,204 +21601,206 @@ UE.plugins["list"] = function() { * ``` */ - me.commands["source"] = { - execCommand: function() { - sourceMode = !sourceMode; - if (sourceMode) { - bakAddress = me.selection.getRange().createAddress(false, true); - me.undoManger && me.undoManger.save(true); - if (browser.gecko) { - me.body.contentEditable = false; - } - - bakCssText = me.iframe.style.cssText; - me.iframe.style.cssText += - "position:absolute;left:-32768px;top:-32768px;"; - - me.fireEvent("beforegetcontent"); - var root = UE.htmlparser(me.body.innerHTML); - me.filterOutputRule(root); - root.traversal(function(node) { - if (node.type == "element") { - switch (node.tagName) { - case "td": - case "th": - case "caption": - if (node.children && node.children.length == 1) { - if (node.firstChild().tagName == "br") { - node.removeChild(node.firstChild()); + me.commands["source"] = { + execCommand: function () { + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false, true); + me.undoManger && me.undoManger.save(true); + if (browser.gecko) { + me.body.contentEditable = false; } - } - break; - case "pre": - node.innerText(node.innerText().replace(/ /g, " ")); - } + + bakCssText = me.iframe.style.cssText; + me.iframe.style.cssText += + "position:absolute;left:-32768px;top:-32768px;"; + + me.fireEvent("beforegetcontent"); + var root = UE.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == "element") { + switch (node.tagName) { + case "td": + case "th": + case "caption": + if (node.children && node.children.length == 1) { + if (node.firstChild().tagName == "br") { + node.removeChild(node.firstChild()); + } + } + break; + case "pre": + node.innerText(node.innerText().replace(/ /g, " ")); + } + } + }); + + me.fireEvent("aftergetcontent"); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.iframe.parentNode); + + sourceEditor.setContent(content); + + orgSetContent = me.setContent; + + me.setContent = function (html) { + //这里暂时不触发事件,防止报错 + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + sourceEditor.setContent(html); + }; + + setTimeout(function () { + sourceEditor.select(); + me.addListener("fullscreenchanged", function () { + try { + sourceEditor.getCodeMirror().refresh(); + } catch (e) { + } + }); + }); + + //重置getContent,源码模式下取值也能是最新的数据 + oldGetContent = me.getContent; + me.getContent = function () { + return ( + sourceEditor.getContent() || + "

    " + (browser.ie ? "" : "
    ") + "

    " + ); + }; + + orgFocus = me.focus; + orgBlur = me.blur; + + me.focus = function () { + sourceEditor.focus(); + }; + + me.blur = function () { + orgBlur.call(me); + sourceEditor.blur(); + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = + sourceEditor.getContent() || + "

    " + (browser.ie ? "" : "
    ") + "

    "; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace( + new RegExp("[\\r\\t\\n ]*]*)>", "g"), + function (a, b) { + if (b && !dtd.$inlineWithA[b.toLowerCase()]) { + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, ""); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, ""); + } + ); + + me.setContent = orgSetContent; + + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + + me.focus = orgFocus; + me.blur = orgBlur; + + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if (!first) { + me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; + first = me.body.firstChild; + } + + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + + if (browser.gecko) { + var input = document.createElement("input"); + input.style.cssText = "position:absolute;left:0;top:-32768px"; + + document.body.appendChild(input); + + me.body.contentEditable = false; + setTimeout(function () { + domUtils.setViewportOffset(input, {left: -32768, top: 0}); + input.focus(); + setTimeout(function () { + me.body.contentEditable = true; + me.selection.getRange().moveToAddress(bakAddress).select(true); + domUtils.remove(input); + }); + }); + } else { + //ie下有可能报错,比如在代码顶头的情况 + try { + me.selection.getRange().moveToAddress(bakAddress).select(true); + } catch (e) { + } + } + } + this.fireEvent("sourcemodechanged", sourceMode); + }, + queryCommandState: function () { + return sourceMode | 0; + }, + notNeedUndo: 1 + }; + var oldQueryCommandState = me.queryCommandState; + + me.queryCommandState = function (cmdName) { + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in + { + source: 1, + fullscreen: 1 + } + ? 1 + : -1; } - }); + return oldQueryCommandState.apply(this, arguments); + }; - me.fireEvent("aftergetcontent"); - - var content = root.toHtml(true); - - sourceEditor = createSourceEditor(me.iframe.parentNode); - - sourceEditor.setContent(content); - - orgSetContent = me.setContent; - - me.setContent = function(html) { - //这里暂时不触发事件,防止报错 - var root = UE.htmlparser(html); - me.filterInputRule(root); - html = root.toHtml(); - sourceEditor.setContent(html); - }; - - setTimeout(function() { - sourceEditor.select(); - me.addListener("fullscreenchanged", function() { - try { - sourceEditor.getCodeMirror().refresh(); - } catch (e) {} + if (opt.sourceEditor == "codemirror") { + me.addListener("ready", function () { + utils.loadFile( + document, + { + src: + opt.codeMirrorJsUrl || + opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function () { + if (opt.sourceEditorFirst) { + setTimeout(function () { + me.execCommand("source"); + }, 0); + } + } + ); + utils.loadFile(document, { + tag: "link", + rel: "stylesheet", + type: "text/css", + href: + opt.codeMirrorCssUrl || + opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css?221123" + }); }); - }); - - //重置getContent,源码模式下取值也能是最新的数据 - oldGetContent = me.getContent; - me.getContent = function() { - return ( - sourceEditor.getContent() || - "

    " + (browser.ie ? "" : "
    ") + "

    " - ); - }; - - orgFocus = me.focus; - orgBlur = me.blur; - - me.focus = function(){ - sourceEditor.focus(); - }; - - me.blur = function(){ - orgBlur.call(me); - sourceEditor.blur(); - }; - } else { - me.iframe.style.cssText = bakCssText; - var cont = - sourceEditor.getContent() || - "

    " + (browser.ie ? "" : "
    ") + "

    "; - //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 - cont = cont.replace( - new RegExp("[\\r\\t\\n ]*]*)>", "g"), - function(a, b) { - if (b && !dtd.$inlineWithA[b.toLowerCase()]) { - return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, ""); - } - return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, ""); - } - ); - - me.setContent = orgSetContent; - - me.setContent(cont); - sourceEditor.dispose(); - sourceEditor = null; - //还原getContent方法 - me.getContent = oldGetContent; - - me.focus = orgFocus; - me.blur = orgBlur; - - var first = me.body.firstChild; - //trace:1106 都删除空了,下边会报错,所以补充一个p占位 - if (!first) { - me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; - first = me.body.firstChild; - } - - //要在ifm为显示时ff才能取到selection,否则报错 - //这里不能比较位置了 - me.undoManger && me.undoManger.save(true); - - if (browser.gecko) { - var input = document.createElement("input"); - input.style.cssText = "position:absolute;left:0;top:-32768px"; - - document.body.appendChild(input); - - me.body.contentEditable = false; - setTimeout(function() { - domUtils.setViewportOffset(input, { left: -32768, top: 0 }); - input.focus(); - setTimeout(function() { - me.body.contentEditable = true; - me.selection.getRange().moveToAddress(bakAddress).select(true); - domUtils.remove(input); - }); - }); - } else { - //ie下有可能报错,比如在代码顶头的情况 - try { - me.selection.getRange().moveToAddress(bakAddress).select(true); - } catch (e) {} - } } - this.fireEvent("sourcemodechanged", sourceMode); - }, - queryCommandState: function() { - return sourceMode | 0; - }, - notNeedUndo: 1 }; - var oldQueryCommandState = me.queryCommandState; - - me.queryCommandState = function(cmdName) { - cmdName = cmdName.toLowerCase(); - if (sourceMode) { - //源码模式下可以开启的命令 - return cmdName in - { - source: 1, - fullscreen: 1 - } - ? 1 - : -1; - } - return oldQueryCommandState.apply(this, arguments); - }; - - if (opt.sourceEditor == "codemirror") { - me.addListener("ready", function() { - utils.loadFile( - document, - { - src: - opt.codeMirrorJsUrl || - opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - if (opt.sourceEditorFirst) { - setTimeout(function() { - me.execCommand("source"); - }, 0); - } - } - ); - utils.loadFile(document, { - tag: "link", - rel: "stylesheet", - type: "text/css", - href: - opt.codeMirrorCssUrl || - opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css?220922" - }); - }); - } - }; })(); @@ -18309,464 +21814,464 @@ UE.plugins["list"] = function() { * @description 处理回车 * @author zhanyi */ -UE.plugins["enterkey"] = function() { - var hTag, - me = this, - tag = me.options.enterTag; - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - if (keyCode == 13) { - var range = me.selection.getRange(), - start = range.startContainer, - doSave; +UE.plugins["enterkey"] = function () { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener("keyup", function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; - //修正在h1-h6里边回车后不能嵌套p的问题 - if (!browser.ie) { - if (/h\d/i.test(hTag)) { - if (browser.gecko) { - var h = domUtils.findParentByTagName( - start, - [ - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "blockquote", - "caption", - "table" - ], - true - ); - if (!h) { - me.document.execCommand("formatBlock", false, "

    "); - doSave = 1; - } - } else { - //chrome remove div - if (start.nodeType == 1) { - var tmp = me.document.createTextNode(""), - div; - range.insertNode(tmp); - div = domUtils.findParentByTagName(tmp, "div", true); - if (div) { - var p = me.document.createElement("p"); - while (div.firstChild) { - p.appendChild(div.firstChild); + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName( + start, + [ + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "blockquote", + "caption", + "table" + ], + true + ); + if (!h) { + me.document.execCommand("formatBlock", false, "

    "); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(""), + div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, "div", true); + if (div) { + var p = me.document.createElement("p"); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } } - div.parentNode.insertBefore(p, div); - domUtils.remove(div); - range.setStartBefore(tmp).setCursor(); - doSave = 1; - } - domUtils.remove(tmp); - } - } - - if (me.undoManger && doSave) { - me.undoManger.save(); - } - } - //没有站位符,会出现多行的问题 - browser.opera && range.select(); - } else { - me.fireEvent("saveScene", true, true); - } - } - }); - - me.addListener("keydown", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - if (keyCode == 13) { - //回车 - if (me.fireEvent("beforeenterkeydown")) { - domUtils.preventDefault(evt); - return; - } - me.fireEvent("saveScene", true, true); - hTag = ""; - - var range = me.selection.getRange(); - - if (!range.collapsed) { - //跨td不能删 - var start = range.startContainer, - end = range.endContainer, - startTd = domUtils.findParentByTagName(start, "td", true), - endTd = domUtils.findParentByTagName(end, "td", true); - if ( - (startTd && endTd && startTd !== endTd) || - (!startTd && endTd) || - (startTd && !endTd) - ) { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - return; - } - } - if (tag == "p") { - if (!browser.ie) { - start = domUtils.findParentByTagName( - range.startContainer, - [ - "ol", - "ul", - "p", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "blockquote", - "caption" - ], - true - ); - - //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command - //trace:2431 - if (!start && !browser.opera) { - me.document.execCommand("formatBlock", false, "

    "); - - if (browser.gecko) { - range = me.selection.getRange(); - start = domUtils.findParentByTagName( - range.startContainer, - "p", - true - ); - start && domUtils.removeDirtyAttr(start); - } - } else { - hTag = start.tagName; - start.tagName.toLowerCase() == "p" && - browser.gecko && - domUtils.removeDirtyAttr(start); - } - } - } else { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - - if (!range.collapsed) { - range.deleteContents(); - start = range.startContainer; - if ( - start.nodeType == 1 && - (start = start.childNodes[range.startOffset]) - ) { - while (start.nodeType == 1) { - if (dtd.$empty[start.tagName]) { - range.setStartBefore(start).setCursor(); - if (me.undoManger) { - me.undoManger.save(); - } - return false; - } - if (!start.firstChild) { - var br = range.document.createElement("br"); - start.appendChild(br); - range.setStart(start, 0).setCursor(); - if (me.undoManger) { - me.undoManger.save(); - } - return false; - } - start = start.firstChild; - } - if (start === range.startContainer.childNodes[range.startOffset]) { - br = range.document.createElement("br"); - range.insertNode(br).setCursor(); + //没有站位符,会出现多行的问题 + browser.opera && range.select(); } else { - range.setStart(start, 0).setCursor(); + me.fireEvent("saveScene", true, true); } - } else { - br = range.document.createElement("br"); - range.insertNode(br).setStartAfter(br).setCursor(); - } - } else { - br = range.document.createElement("br"); - range.insertNode(br); - var parent = br.parentNode; - if (parent.lastChild === br) { - br.parentNode.insertBefore(br.cloneNode(true), br); - range.setStartBefore(br); - } else { - range.setStartAfter(br); - } - range.setCursor(); } - } - } - }); + }); + + me.addListener("keydown", function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + //回车 + if (me.fireEvent("beforeenterkeydown")) { + domUtils.preventDefault(evt); + return; + } + me.fireEvent("saveScene", true, true); + hTag = ""; + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, "td", true), + endTd = domUtils.findParentByTagName(end, "td", true); + if ( + (startTd && endTd && startTd !== endTd) || + (!startTd && endTd) || + (startTd && !endTd) + ) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + return; + } + } + if (tag == "p") { + if (!browser.ie) { + start = domUtils.findParentByTagName( + range.startContainer, + [ + "ol", + "ul", + "p", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "blockquote", + "caption" + ], + true + ); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + me.document.execCommand("formatBlock", false, "

    "); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName( + range.startContainer, + "p", + true + ); + start && domUtils.removeDirtyAttr(start); + } + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == "p" && + browser.gecko && + domUtils.removeDirtyAttr(start); + } + } + } else { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + + if (!range.collapsed) { + range.deleteContents(); + start = range.startContainer; + if ( + start.nodeType == 1 && + (start = start.childNodes[range.startOffset]) + ) { + while (start.nodeType == 1) { + if (dtd.$empty[start.tagName]) { + range.setStartBefore(start).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + if (!start.firstChild) { + var br = range.document.createElement("br"); + start.appendChild(br); + range.setStart(start, 0).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + start = start.firstChild; + } + if (start === range.startContainer.childNodes[range.startOffset]) { + br = range.document.createElement("br"); + range.insertNode(br).setCursor(); + } else { + range.setStart(start, 0).setCursor(); + } + } else { + br = range.document.createElement("br"); + range.insertNode(br).setStartAfter(br).setCursor(); + } + } else { + br = range.document.createElement("br"); + range.insertNode(br); + var parent = br.parentNode; + if (parent.lastChild === br) { + br.parentNode.insertBefore(br.cloneNode(true), br); + range.setStartBefore(br); + } else { + range.setStartAfter(br); + } + range.setCursor(); + } + } + } + }); }; // plugins/keystrokes.js /* 处理特殊键的兼容性问题 */ -UE.plugins["keystrokes"] = function() { - var me = this; - var collapsed = true; - me.addListener("keydown", function(type, evt) { - var keyCode = evt.keyCode || evt.which, - rng = me.selection.getRange(); +UE.plugins["keystrokes"] = function () { + var me = this; + var collapsed = true; + me.addListener("keydown", function (type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); - //处理全选的情况 - if ( - !rng.collapsed && - !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && - ((keyCode >= 65 && keyCode <= 90) || - (keyCode >= 48 && keyCode <= 57) || - (keyCode >= 96 && keyCode <= 111) || - { - 13: 1, - 8: 1, - 46: 1 - }[keyCode]) - ) { - var tmpNode = rng.startContainer; - if (domUtils.isFillChar(tmpNode)) { - rng.setStartBefore(tmpNode); - } - tmpNode = rng.endContainer; - if (domUtils.isFillChar(tmpNode)) { - rng.setEndAfter(tmpNode); - } - rng.txtToElmBoundary(); - //结束边界可能放到了br的前边,要把br包含进来 - // x[xxx]
    - if (rng.endContainer && rng.endContainer.nodeType == 1) { - tmpNode = rng.endContainer.childNodes[rng.endOffset]; - if (tmpNode && domUtils.isBr(tmpNode)) { - rng.setEndAfter(tmpNode); - } - } - if (rng.startOffset == 0) { - tmpNode = rng.startContainer; - if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { - tmpNode = rng.endContainer; - if ( - rng.endOffset == - (tmpNode.nodeType == 3 - ? tmpNode.nodeValue.length - : tmpNode.childNodes.length) && - domUtils.isBoundaryNode(tmpNode, "lastChild") - ) { - me.fireEvent("saveScene"); - me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; - rng.setStart(me.body.firstChild, 0).setCursor(false, true); - me._selectionChange(); - return; - } - } - } - } - - //处理backspace - if (keyCode == keymap.Backspace) { - rng = me.selection.getRange(); - collapsed = rng.collapsed; - if (me.fireEvent("delkeydown", evt)) { - return; - } - var start, end; - //避免按两次删除才能生效的问题 - if (rng.collapsed && rng.inFillChar()) { - start = rng.startContainer; - - if (domUtils.isFillChar(start)) { - rng.setStartBefore(start).shrinkBoundary(true).collapse(true); - domUtils.remove(start); - } else { - start.nodeValue = start.nodeValue.replace( - new RegExp("^" + domUtils.fillChar), - "" - ); - rng.startOffset--; - rng.collapse(true).select(true); - } - } - - //解决选中control元素不能删除的问题 - if ((start = rng.getClosedNode())) { - me.fireEvent("saveScene"); - rng.setStartBefore(start); - domUtils.remove(start); - rng.setCursor(); - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - return; - } - //阻止在table上的删除 - if (!browser.ie) { - start = domUtils.findParentByTagName(rng.startContainer, "table", true); - end = domUtils.findParentByTagName(rng.endContainer, "table", true); - if ((start && !end) || (!start && end) || start !== end) { - evt.preventDefault(); - return; - } - } - } - //处理tab键的逻辑 - if (keyCode == keymap.Tab) { - //不处理以下标签 - var excludeTagNameForTabKey = { - ol: 1, - ul: 1, - table: 1 - }; - //处理组件里的tab按下事件 - if (me.fireEvent("tabkeydown", evt)) { - domUtils.preventDefault(evt); - return; - } - var range = me.selection.getRange(); - me.fireEvent("saveScene"); - for ( - var i = 0, - txt = "", - tabSize = me.options.tabSize || 4, - tabNode = me.options.tabNode || " "; - i < tabSize; - i++ - ) { - txt += tabNode; - } - var span = me.document.createElement("span"); - span.innerHTML = txt + domUtils.fillChar; - if (range.collapsed) { - range.insertNode(span.cloneNode(true).firstChild).setCursor(true); - } else { - var filterFn = function(node) { - return ( - domUtils.isBlockElm(node) && - !excludeTagNameForTabKey[node.tagName.toLowerCase()] - ); - }; - //普通的情况 - start = domUtils.findParent(range.startContainer, filterFn, true); - end = domUtils.findParent(range.endContainer, filterFn, true); - if (start && end && start === end) { - range.deleteContents(); - range.insertNode(span.cloneNode(true).firstChild).setCursor(true); - } else { - var bookmark = range.createBookmark(); - range.enlarge(true); - var bookmark2 = range.createBookmark(), - current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); - while ( - current && - !( - domUtils.getPosition(current, bookmark2.end) & - domUtils.POSITION_FOLLOWING - ) - ) { - current.insertBefore( - span.cloneNode(true).firstChild, - current.firstChild - ); - current = domUtils.getNextDomNode(current, false, filterFn); - } - range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); - } - } - domUtils.preventDefault(evt); - } - //trace:1634 - //ff的del键在容器空的时候,也会删除 - if (browser.gecko && keyCode == 46) { - range = me.selection.getRange(); - if (range.collapsed) { - start = range.startContainer; - if (domUtils.isEmptyBlock(start)) { - var parent = start.parentNode; - while ( - domUtils.getChildCount(parent) == 1 && - !domUtils.isBody(parent) - ) { - start = parent; - parent = parent.parentNode; - } - if (start === parent.lastChild) evt.preventDefault(); - return; - } - } - } - - /* 修复在编辑区域快捷键 (Mac:meta+alt+I; Win:ctrl+shift+I) 打不开 chrome 控制台的问题 */ - browser.chrome && - me.on("keydown", function(type, e) { - var keyCode = e.keyCode || e.which; + //处理全选的情况 if ( - ((e.metaKey && e.altKey) || (e.ctrlKey && e.shiftKey)) && - keyCode == 73 + !rng.collapsed && + !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && + ((keyCode >= 65 && keyCode <= 90) || + (keyCode >= 48 && keyCode <= 57) || + (keyCode >= 96 && keyCode <= 111) || + { + 13: 1, + 8: 1, + 46: 1 + }[keyCode]) ) { - return true; - } - }); - }); - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which, - rng, - me = this; - if (keyCode == keymap.Backspace) { - if (me.fireEvent("delkeyup")) { - return; - } - rng = me.selection.getRange(); - if (rng.collapsed) { - var tmpNode, - autoClearTagName = ["h1", "h2", "h3", "h4", "h5", "h6"]; - if ( - (tmpNode = domUtils.findParentByTagName( - rng.startContainer, - autoClearTagName, - true - )) - ) { - if (domUtils.isEmptyBlock(tmpNode)) { - var pre = tmpNode.previousSibling; - if (pre && pre.nodeName != "TABLE") { - domUtils.remove(tmpNode); - rng.setStartAtLast(pre).setCursor(false, true); - return; - } else { - var next = tmpNode.nextSibling; - if (next && next.nodeName != "TABLE") { - domUtils.remove(tmpNode); - rng.setStartAtFirst(next).setCursor(false, true); - return; - } + var tmpNode = rng.startContainer; + if (domUtils.isFillChar(tmpNode)) { + rng.setStartBefore(tmpNode); + } + tmpNode = rng.endContainer; + if (domUtils.isFillChar(tmpNode)) { + rng.setEndAfter(tmpNode); + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
    + if (rng.endContainer && rng.endContainer.nodeType == 1) { + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if (tmpNode && domUtils.isBr(tmpNode)) { + rng.setEndAfter(tmpNode); + } + } + if (rng.startOffset == 0) { + tmpNode = rng.startContainer; + if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { + tmpNode = rng.endContainer; + if ( + rng.endOffset == + (tmpNode.nodeType == 3 + ? tmpNode.nodeValue.length + : tmpNode.childNodes.length) && + domUtils.isBoundaryNode(tmpNode, "lastChild") + ) { + me.fireEvent("saveScene"); + me.body.innerHTML = "

    " + (browser.ie ? "" : "
    ") + "

    "; + rng.setStart(me.body.firstChild, 0).setCursor(false, true); + me._selectionChange(); + return; + } + } } - } } - //处理当删除到body时,要重新给p标签展位 - if (domUtils.isBody(rng.startContainer)) { - var tmpNode = domUtils.createElement(me.document, "p", { - innerHTML: browser.ie ? domUtils.fillChar : "
    " - }); - rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true); - } - } - //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 - if ( - !collapsed && - (rng.startContainer.nodeType == 3 || - (rng.startContainer.nodeType == 1 && - domUtils.isEmptyBlock(rng.startContainer))) - ) { - if (browser.ie) { - var span = rng.document.createElement("span"); - rng.insertNode(span).setStartBefore(span).collapse(true); - rng.select(); - domUtils.remove(span); - } else { - rng.select(); + //处理backspace + if (keyCode == keymap.Backspace) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if (me.fireEvent("delkeydown", evt)) { + return; + } + var start, end; + //避免按两次删除才能生效的问题 + if (rng.collapsed && rng.inFillChar()) { + start = rng.startContainer; + + if (domUtils.isFillChar(start)) { + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start); + } else { + start.nodeValue = start.nodeValue.replace( + new RegExp("^" + domUtils.fillChar), + "" + ); + rng.startOffset--; + rng.collapse(true).select(true); + } + } + + //解决选中control元素不能删除的问题 + if ((start = rng.getClosedNode())) { + me.fireEvent("saveScene"); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, "table", true); + end = domUtils.findParentByTagName(rng.endContainer, "table", true); + if ((start && !end) || (!start && end) || start !== end) { + evt.preventDefault(); + return; + } + } } - } - } - }); + //处理tab键的逻辑 + if (keyCode == keymap.Tab) { + //不处理以下标签 + var excludeTagNameForTabKey = { + ol: 1, + ul: 1, + table: 1 + }; + //处理组件里的tab按下事件 + if (me.fireEvent("tabkeydown", evt)) { + domUtils.preventDefault(evt); + return; + } + var range = me.selection.getRange(); + me.fireEvent("saveScene"); + for ( + var i = 0, + txt = "", + tabSize = me.options.tabSize || 4, + tabNode = me.options.tabNode || " "; + i < tabSize; + i++ + ) { + txt += tabNode; + } + var span = me.document.createElement("span"); + span.innerHTML = txt + domUtils.fillChar; + if (range.collapsed) { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var filterFn = function (node) { + return ( + domUtils.isBlockElm(node) && + !excludeTagNameForTabKey[node.tagName.toLowerCase()] + ); + }; + //普通的情况 + start = domUtils.findParent(range.startContainer, filterFn, true); + end = domUtils.findParent(range.endContainer, filterFn, true); + if (start && end && start === end) { + range.deleteContents(); + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + while ( + current && + !( + domUtils.getPosition(current, bookmark2.end) & + domUtils.POSITION_FOLLOWING + ) + ) { + current.insertBefore( + span.cloneNode(true).firstChild, + current.firstChild + ); + current = domUtils.getNextDomNode(current, false, filterFn); + } + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + domUtils.preventDefault(evt); + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if (browser.gecko && keyCode == 46) { + range = me.selection.getRange(); + if (range.collapsed) { + start = range.startContainer; + if (domUtils.isEmptyBlock(start)) { + var parent = start.parentNode; + while ( + domUtils.getChildCount(parent) == 1 && + !domUtils.isBody(parent) + ) { + start = parent; + parent = parent.parentNode; + } + if (start === parent.lastChild) evt.preventDefault(); + return; + } + } + } + + /* 修复在编辑区域快捷键 (Mac:meta+alt+I; Win:ctrl+shift+I) 打不开 chrome 控制台的问题 */ + browser.chrome && + me.on("keydown", function (type, e) { + var keyCode = e.keyCode || e.which; + if ( + ((e.metaKey && e.altKey) || (e.ctrlKey && e.shiftKey)) && + keyCode == 73 + ) { + return true; + } + }); + }); + me.addListener("keyup", function (type, evt) { + var keyCode = evt.keyCode || evt.which, + rng, + me = this; + if (keyCode == keymap.Backspace) { + if (me.fireEvent("delkeyup")) { + return; + } + rng = me.selection.getRange(); + if (rng.collapsed) { + var tmpNode, + autoClearTagName = ["h1", "h2", "h3", "h4", "h5", "h6"]; + if ( + (tmpNode = domUtils.findParentByTagName( + rng.startContainer, + autoClearTagName, + true + )) + ) { + if (domUtils.isEmptyBlock(tmpNode)) { + var pre = tmpNode.previousSibling; + if (pre && pre.nodeName != "TABLE") { + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false, true); + return; + } else { + var next = tmpNode.nextSibling; + if (next && next.nodeName != "TABLE") { + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false, true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if (domUtils.isBody(rng.startContainer)) { + var tmpNode = domUtils.createElement(me.document, "p", { + innerHTML: browser.ie ? domUtils.fillChar : "
    " + }); + rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true); + } + } + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if ( + !collapsed && + (rng.startContainer.nodeType == 3 || + (rng.startContainer.nodeType == 1 && + domUtils.isEmptyBlock(rng.startContainer))) + ) { + if (browser.ie) { + var span = rng.document.createElement("span"); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span); + } else { + rng.select(); + } + } + } + }); }; @@ -18777,387 +22282,389 @@ UE.plugins["keystrokes"] = function() { ///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 //修复chrome下图片不能点击的问题,出现八个角可改变大小 -UE.plugins["fiximgclick"] = (function() { - var elementUpdated = false; - function Scale() { - this.editor = null; - this.resizer = null; - this.cover = null; - this.doc = document; - this.prePos = { x: 0, y: 0 }; - this.startPos = { x: 0, y: 0 }; - } +UE.plugins["fiximgclick"] = (function () { + var elementUpdated = false; - (function() { - var rect = [ - //[left, top, width, height] - [0, 0, -1, -1], - [0, 0, 0, -1], - [0, 0, 1, -1], - [0, 0, -1, 0], - [0, 0, 1, 0], - [0, 0, -1, 1], - [0, 0, 0, 1], - [0, 0, 1, 1] - ]; + function Scale() { + this.editor = null; + this.resizer = null; + this.cover = null; + this.doc = document; + this.prePos = {x: 0, y: 0}; + this.startPos = {x: 0, y: 0}; + } - Scale.prototype = { - init: function(editor) { - var me = this; - me.editor = editor; - me.startPos = this.prePos = { x: 0, y: 0 }; - me.dragId = -1; + (function () { + var rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; - var hands = [], - cover = (me.cover = document.createElement("div")), - resizer = (me.resizer = document.createElement("div")); + Scale.prototype = { + init: function (editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = {x: 0, y: 0}; + me.dragId = -1; - cover.id = me.editor.ui.id + "_imagescale_cover"; - cover.style.cssText = - "position:absolute;display:none;z-index:" + - me.editor.options.zIndex + - ";filter:alpha(opacity=0); opacity:0;background:#CCC;"; - domUtils.on(cover, "mousedown click", function() { - me.hide(); - }); + var hands = [], + cover = (me.cover = document.createElement("div")), + resizer = (me.resizer = document.createElement("div")); - for (i = 0; i < 8; i++) { - hands.push( - '' - ); - } - resizer.id = me.editor.ui.id + "_imagescale"; - resizer.className = "edui-editor-imagescale"; - resizer.innerHTML = hands.join(""); - resizer.style.cssText += - ";display:none;border:1px solid #3b77ff;z-index:" + - me.editor.options.zIndex + - ";"; + cover.id = me.editor.ui.id + "_imagescale_cover"; + cover.style.cssText = + "position:absolute;display:none;z-index:" + + me.editor.options.zIndex + + ";filter:alpha(opacity=0); opacity:0;background:#CCC;"; + domUtils.on(cover, "mousedown", function (e) { + me.hide(); + }); - me.editor.ui.getDom().appendChild(cover); - me.editor.ui.getDom().appendChild(resizer); - - me.initStyle(); - me.initEvents(); - }, - initStyle: function() { - utils.cssRule( - "imagescale", - ".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}" + - ".edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}" + - ".edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}" - ); - }, - initEvents: function() { - var me = this; - - me.startPos.x = me.startPos.y = 0; - me.isDraging = false; - }, - _eventHandler: function(e) { - var me = this; - switch (e.type) { - case "mousedown": - var hand = e.target || e.srcElement, - hand; - if ( - hand.className.indexOf("edui-editor-imagescale-hand") != -1 && - me.dragId == -1 - ) { - me.dragId = hand.className.slice(-1); - me.startPos.x = me.prePos.x = e.clientX; - me.startPos.y = me.prePos.y = e.clientY; - domUtils.on(me.doc, "mousemove", me.proxy(me._eventHandler, me)); - } - break; - case "mousemove": - if (me.dragId != -1) { - me.updateContainerStyle(me.dragId, { - x: e.clientX - me.prePos.x, - y: e.clientY - me.prePos.y - }); - me.prePos.x = e.clientX; - me.prePos.y = e.clientY; - elementUpdated = true; - me.updateTargetElement(); - } - break; - case "mouseup": - if (me.dragId != -1) { - me.updateContainerStyle(me.dragId, { - x: e.clientX - me.prePos.x, - y: e.clientY - me.prePos.y - }); - me.updateTargetElement(); - if (me.target.parentNode) me.attachTo(me.target); - me.dragId = -1; - } - domUtils.un(me.doc, "mousemove", me.proxy(me._eventHandler, me)); - //修复只是点击挪动点,但没有改变大小,不应该触发contentchange - if (elementUpdated) { - elementUpdated = false; - me.editor.fireEvent("contentchange"); - } - - break; - default: - break; - } - }, - updateTargetElement: function() { - var me = this; - domUtils.setStyles(me.target, { - width: me.resizer.style.width, - height: me.resizer.style.height - }); - me.target.width = parseInt(me.resizer.style.width); - me.target.height = parseInt(me.resizer.style.height); - me.attachTo(me.target); - }, - updateContainerStyle: function(dir, offset) { - var me = this, - dom = me.resizer, - tmp; - - if (rect[dir][0] != 0) { - tmp = parseInt(dom.style.left) + offset.x; - dom.style.left = me._validScaledProp("left", tmp) + "px"; - } - if (rect[dir][1] != 0) { - tmp = parseInt(dom.style.top) + offset.y; - dom.style.top = me._validScaledProp("top", tmp) + "px"; - } - if (rect[dir][2] != 0) { - tmp = dom.clientWidth + rect[dir][2] * offset.x; - dom.style.width = me._validScaledProp("width", tmp) + "px"; - } - if (rect[dir][3] != 0) { - tmp = dom.clientHeight + rect[dir][3] * offset.y; - dom.style.height = me._validScaledProp("height", tmp) + "px"; - } - }, - _validScaledProp: function(prop, value) { - var ele = this.resizer, - wrap = document; - - value = isNaN(value) ? 0 : value; - switch (prop) { - case "left": - return value < 0 - ? 0 - : value + ele.clientWidth > wrap.clientWidth - ? wrap.clientWidth - ele.clientWidth - : value; - case "top": - return value < 0 - ? 0 - : value + ele.clientHeight > wrap.clientHeight - ? wrap.clientHeight - ele.clientHeight - : value; - case "width": - return value <= 0 - ? 1 - : value + ele.offsetLeft > wrap.clientWidth - ? wrap.clientWidth - ele.offsetLeft - : value; - case "height": - return value <= 0 - ? 1 - : value + ele.offsetTop > wrap.clientHeight - ? wrap.clientHeight - ele.offsetTop - : value; - } - }, - hideCover: function() { - this.cover.style.display = "none"; - }, - showCover: function() { - var me = this, - editorPos = domUtils.getXY(me.editor.ui.getDom()), - iframePos = domUtils.getXY(me.editor.iframe); - - domUtils.setStyles(me.cover, { - width: me.editor.iframe.offsetWidth + "px", - height: me.editor.iframe.offsetHeight + "px", - top: iframePos.y - editorPos.y + "px", - left: iframePos.x - editorPos.x + "px", - position: "absolute", - display: "" - }); - }, - show: function(targetObj) { - var me = this; - me.resizer.style.display = "block"; - if (targetObj) me.attachTo(targetObj); - - domUtils.on(this.resizer, "mousedown", me.proxy(me._eventHandler, me)); - domUtils.on(me.doc, "mouseup", me.proxy(me._eventHandler, me)); - - me.showCover(); - me.editor.fireEvent("afterscaleshow", me); - me.editor.fireEvent("saveScene"); - }, - hide: function() { - var me = this; - me.hideCover(); - me.resizer.style.display = "none"; - - domUtils.un(me.resizer, "mousedown", me.proxy(me._eventHandler, me)); - domUtils.un(me.doc, "mouseup", me.proxy(me._eventHandler, me)); - me.editor.fireEvent("afterscalehide", me); - }, - proxy: function(fn, context) { - return function(e) { - return fn.apply(context || this, arguments); - }; - }, - attachTo: function(targetObj) { - var me = this, - target = (me.target = targetObj), - resizer = this.resizer, - imgPos = domUtils.getXY(target), - iframePos = domUtils.getXY(me.editor.iframe), - editorPos = domUtils.getXY(resizer.parentNode); - - domUtils.setStyles(resizer, { - width: target.width + "px", - height: target.height + "px", - left: - iframePos.x + - imgPos.x - - me.editor.document.body.scrollLeft - - editorPos.x - - parseInt(resizer.style.borderLeftWidth) + - "px", - top: - iframePos.y + - imgPos.y - - me.editor.document.body.scrollTop - - editorPos.y - - parseInt(resizer.style.borderTopWidth) + - "px" - }); - } - }; - })(); - - return function() { - var me = this, - imageScale; - - me.setOpt("imageScaleEnabled", true); - - if (!browser.ie && me.options.imageScaleEnabled) { - me.addListener("click", function(type, e) { - if(e.target.tagName!=="IMG" && e.target.tagName !== "VIDEO"){ - return; - } - var range = me.selection.getRange(), - img = range.getClosedNode(); - if(img.tagName == 'SOURCE') { - try { - img = img.parentNode - } catch(e){ - console.error(e) - } - } - if (img && (img.tagName == "IMG" || img.tagName == "VIDEO") && me.body.contentEditable != "false") { - if ( - img.getAttribute("anchorname") || - domUtils.hasClass(img, "loadingclass") || - domUtils.hasClass(img, "loaderrorclass") - ) { - return; - } - - if (!imageScale) { - imageScale = new Scale(); - imageScale.init(me); - me.ui.getDom().appendChild(imageScale.resizer); - - var _keyDownHandler = function(e) { - imageScale.hide(); - if (imageScale.target) - me.selection.getRange().selectNode(imageScale.target).select(); - }, - _mouseDownHandler = function(e) { - var ele = e.target || e.srcElement; - if ( - ele && - (ele.className === undefined || - ele.className.indexOf("edui-editor-imagescale") == -1) - ) { - _keyDownHandler(e); + for (var i = 0; i < 8; i++) { + hands.push( + '' + ); } - }, - timer; + resizer.id = me.editor.ui.id + "_imagescale"; + resizer.className = "edui-editor-imagescale"; + resizer.innerHTML = hands.join(""); + resizer.style.cssText += + ";display:none;border:1px solid #3b77ff;z-index:" + + me.editor.options.zIndex + + ";"; - me.addListener("afterscaleshow", function(e) { - me.addListener("beforekeydown", _keyDownHandler); - me.addListener("beforemousedown", _mouseDownHandler); - domUtils.on(document, "keydown", _keyDownHandler); - domUtils.on(document, "mousedown", _mouseDownHandler); - me.selection.getNative().removeAllRanges(); - }); - me.addListener("afterscalehide", function(e) { - me.removeListener("beforekeydown", _keyDownHandler); - me.removeListener("beforemousedown", _mouseDownHandler); - domUtils.un(document, "keydown", _keyDownHandler); - domUtils.un(document, "mousedown", _mouseDownHandler); - var target = imageScale.target; - if (target.parentNode) { - me.selection.getRange().selectNode(target).select(); - } - }); - //TODO 有iframe的情况,mousedown不能往下传。。 - domUtils.on(imageScale.resizer, "mousedown", function(e) { - me.selection.getNative().removeAllRanges(); - var ele = e.target || e.srcElement; - if ( - ele && - ele.className.indexOf("edui-editor-imagescale-hand") == -1 - ) { - timer = setTimeout(function() { - imageScale.hide(); - if (imageScale.target) - me.selection.getRange().selectNode(ele).select(); - }, 200); - } - }); - domUtils.on(imageScale.resizer, "mouseup", function(e) { - var ele = e.target || e.srcElement; - if ( - ele && - ele.className.indexOf("edui-editor-imagescale-hand") == -1 - ) { - clearTimeout(timer); - } - }); - } - imageScale.show(img); - } else { - if (imageScale && imageScale.resizer.style.display != "none") - imageScale.hide(); - } - }); - } + me.editor.ui.getDom().appendChild(cover); + me.editor.ui.getDom().appendChild(resizer); - if (browser.webkit) { - me.addListener("click", function(type, e) { - if ((e.target.tagName == "IMG" || e.target.tagName == "VIDEO" ) && me.body.contentEditable != "false") { - var range = new dom.Range(me.document); - range.selectNode(e.target).select(); + me.initStyle(); + me.initEvents(); + }, + initStyle: function () { + utils.cssRule( + "imagescale", + ".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}" + + ".edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}" + + ".edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}" + ); + }, + initEvents: function () { + var me = this; + + me.startPos.x = me.startPos.y = 0; + me.isDraging = false; + }, + _eventHandler: function (e) { + var me = this; + switch (e.type) { + case "mousedown": + var hand = e.target || e.srcElement, + hand; + if ( + hand.className.indexOf("edui-editor-imagescale-hand") !== -1 && + me.dragId === -1 + ) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + domUtils.on(me.doc, "mousemove", me.proxy(me._eventHandler, me)); + } + break; + case "mousemove": + if (me.dragId !== -1) { + me.updateContainerStyle(me.dragId, { + x: e.clientX - me.prePos.x, + y: e.clientY - me.prePos.y + }); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + elementUpdated = true; + me.updateTargetElement(); + } + break; + case "mouseup": + if (me.dragId !== -1) { + me.updateContainerStyle(me.dragId, { + x: e.clientX - me.prePos.x, + y: e.clientY - me.prePos.y + }); + me.updateTargetElement(); + if (me.target.parentNode) { + me.attachTo(me.target); + } + me.dragId = -1; + } + domUtils.un(me.doc, "mousemove", me.proxy(me._eventHandler, me)); + //修复只是点击挪动点,但没有改变大小,不应该触发contentchange + if (elementUpdated) { + elementUpdated = false; + me.editor.fireEvent("contentchange"); + } + + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this; + domUtils.setStyles(me.target, { + width: me.resizer.style.width, + height: me.resizer.style.height + }); + me.target.width = parseInt(me.resizer.style.width); + me.target.height = parseInt(me.resizer.style.height); + me.attachTo(me.target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + dom = me.resizer, + tmp; + + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp("left", tmp) + "px"; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp("top", tmp) + "px"; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp("width", tmp) + "px"; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp("height", tmp) + "px"; + } + }, + _validScaledProp: function (prop, value) { + var ele = this.resizer, + wrap = document; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case "left": + return value < 0 + ? 0 + : value + ele.clientWidth > wrap.clientWidth + ? wrap.clientWidth - ele.clientWidth + : value; + case "top": + return value < 0 + ? 0 + : value + ele.clientHeight > wrap.clientHeight + ? wrap.clientHeight - ele.clientHeight + : value; + case "width": + return value <= 0 + ? 1 + : value + ele.offsetLeft > wrap.clientWidth + ? wrap.clientWidth - ele.offsetLeft + : value; + case "height": + return value <= 0 + ? 1 + : value + ele.offsetTop > wrap.clientHeight + ? wrap.clientHeight - ele.offsetTop + : value; + } + }, + hideCover: function () { + this.cover.style.display = "none"; + }, + showCover: function () { + var me = this, + editorPos = domUtils.getXY(me.editor.ui.getDom()), + iframePos = domUtils.getXY(me.editor.iframe); + + domUtils.setStyles(me.cover, { + width: me.editor.iframe.offsetWidth + "px", + height: me.editor.iframe.offsetHeight + "px", + top: iframePos.y - editorPos.y + "px", + left: iframePos.x - editorPos.x + "px", + position: "absolute", + display: "" + }); + }, + show: function (targetObj) { + var me = this; + me.resizer.style.display = "block"; + if (targetObj) { + me.attachTo(targetObj); + } + + domUtils.on(this.resizer, "mousedown", me.proxy(me._eventHandler, me)); + domUtils.on(me.doc, "mouseup", me.proxy(me._eventHandler, me)); + + me.showCover(); + me.editor.fireEvent("afterscaleshow", me); + me.editor.fireEvent("saveScene"); + }, + hide: function () { + var me = this; + me.hideCover(); + me.resizer.style.display = "none"; + + domUtils.un(me.resizer, "mousedown", me.proxy(me._eventHandler, me)); + domUtils.un(me.doc, "mouseup", me.proxy(me._eventHandler, me)); + me.editor.fireEvent("afterscalehide", me); + }, + proxy: function (fn, context) { + return function (e) { + return fn.apply(context || this, arguments); + }; + }, + attachTo: function (targetObj) { + var me = this, + target = (me.target = targetObj), + resizer = this.resizer, + imgPos = domUtils.getXY(target), + iframePos = domUtils.getXY(me.editor.iframe), + editorPos = domUtils.getXY(resizer.parentNode); + + domUtils.setStyles(resizer, { + width: target.width + "px", + height: target.height + "px", + left: + iframePos.x + + imgPos.x - + me.editor.getScrollLeft() - + editorPos.x - + parseInt(resizer.style.borderLeftWidth) + + "px", + top: + iframePos.y + + imgPos.y - + me.editor.getScrollTop() - + editorPos.y - + parseInt(resizer.style.borderTopWidth) + + "px" + }); + } + }; + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt("imageScaleEnabled", true); + + if (!browser.ie && me.options.imageScaleEnabled) { + me.addListener("click", function (type, e) { + var range = me.selection.getRange(), + img = range.getClosedNode(); + + if (img + && img.tagName === "IMG" + && me.body.contentEditable !== "false" + && img === e.target + ) { + if ( + img.getAttribute("anchorname") || + domUtils.hasClass(img, "uep-loading") || + domUtils.hasClass(img, "uep-loading-error") + ) { + return; + } + + if (!imageScale) { + imageScale = new Scale(); + imageScale.init(me); + me.ui.getDom().appendChild(imageScale.resizer); + + var _keyDownHandler = function (e) { + imageScale.hide(); + if (imageScale.target) { + me.selection.getRange().selectNode(imageScale.target).select(); + } + }, + _mouseDownHandler = function (e) { + var ele = e.target || e.srcElement; + if ( + ele && + (ele.className === undefined || + ele.className.indexOf("edui-editor-imagescale") === -1) + ) { + _keyDownHandler(e); + } + }, + timer; + + me.addListener("afterscaleshow", function (e) { + me.addListener("beforekeydown", _keyDownHandler); + me.addListener("beforemousedown", _mouseDownHandler); + domUtils.on(document, "keydown", _keyDownHandler); + domUtils.on(document, "mousedown", _mouseDownHandler); + me.selection.getNative().removeAllRanges(); + }); + me.addListener("afterscalehide", function (e) { + me.removeListener("beforekeydown", _keyDownHandler); + me.removeListener("beforemousedown", _mouseDownHandler); + domUtils.un(document, "keydown", _keyDownHandler); + domUtils.un(document, "mousedown", _mouseDownHandler); + var target = imageScale.target; + if (target.parentNode) { + me.selection.getRange().selectNode(target).select(); + } + }); + //TODO 有iframe的情况,mousedown不能往下传。。 + domUtils.on(imageScale.resizer, "mousedown", function (e) { + me.selection.getNative().removeAllRanges(); + var ele = e.target || e.srcElement; + if ( + ele && + ele.className.indexOf("edui-editor-imagescale-hand") === -1 + ) { + timer = setTimeout(function () { + imageScale.hide(); + if (imageScale.target) + me.selection.getRange().selectNode(ele).select(); + }, 200); + } + }); + domUtils.on(imageScale.resizer, "mouseup", function (e) { + var ele = e.target || e.srcElement; + if ( + ele && + ele.className.indexOf("edui-editor-imagescale-hand") === -1 + ) { + clearTimeout(timer); + } + }); + } + imageScale.show(img); + } else { + if (imageScale && imageScale.resizer.style.display !== "none") { + imageScale.hide(); + } + } + }); } - }); - } - }; + + if (browser.webkit) { + me.addListener("click", function (type, e) { + if (e.target.tagName === "IMG" && me.body.contentEditable !== "false") { + var range = new dom.Range(me.document); + range.selectNode(e.target).select(); + } + }); + } + }; })(); @@ -19172,213 +22679,215 @@ UE.plugins["fiximgclick"] = (function() { */ UE.plugin.register( - "autolink", - function() { - var cont = 0; + "autolink", + function () { + var cont = 0; - return !browser.ie - ? { - bindEvents: { - reset: function() { - cont = 0; - }, - keydown: function(type, evt) { - var me = this; - var keyCode = evt.keyCode || evt.which; + return !browser.ie + ? { + bindEvents: { + reset: function () { + cont = 0; + }, + keydown: function (type, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; - if (keyCode == 32 || keyCode == 13) { - var sel = me.selection.getNative(), - range = sel.getRangeAt(0).cloneRange(), - offset, - charCode; + if (keyCode == 32 || keyCode == 13) { + var sel = me.selection.getNative(), + range = sel.getRangeAt(0).cloneRange(), + offset, + charCode; - var start = range.startContainer; - while (start.nodeType == 1 && range.startOffset > 0) { - start = - range.startContainer.childNodes[range.startOffset - 1]; - if (!start) { - break; - } - range.setStart( - start, - start.nodeType == 1 - ? start.childNodes.length - : start.nodeValue.length - ); - range.collapse(true); - start = range.startContainer; - } + var start = range.startContainer; + while (start.nodeType == 1 && range.startOffset > 0) { + start = + range.startContainer.childNodes[range.startOffset - 1]; + if (!start) { + break; + } + range.setStart( + start, + start.nodeType == 1 + ? start.childNodes.length + : start.nodeValue.length + ); + range.collapse(true); + start = range.startContainer; + } - do { - if (range.startOffset == 0) { - start = range.startContainer.previousSibling; + do { + if (range.startOffset == 0) { + start = range.startContainer.previousSibling; - while (start && start.nodeType == 1) { - start = start.lastChild; - } - if (!start || domUtils.isFillChar(start)) { - break; - } - offset = start.nodeValue.length; - } else { - start = range.startContainer; - offset = range.startOffset; - } - range.setStart(start, offset - 1); - charCode = range.toString().charCodeAt(0); - } while (charCode != 160 && charCode != 32); + while (start && start.nodeType == 1) { + start = start.lastChild; + } + if (!start || domUtils.isFillChar(start)) { + break; + } + offset = start.nodeValue.length; + } else { + start = range.startContainer; + offset = range.startOffset; + } + range.setStart(start, offset - 1); + charCode = range.toString().charCodeAt(0); + } while (charCode != 160 && charCode != 32); - if ( - range - .toString() - .replace(new RegExp(domUtils.fillChar, "g"), "") - .match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i) - ) { - while (range.toString().length) { - if ( - /^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test( - range.toString() - ) - ) { - break; - } - try { - range.setStart( - range.startContainer, - range.startOffset + 1 - ); - } catch (e) { - //trace:2121 - var start = range.startContainer; - while (!(next = start.nextSibling)) { - if (domUtils.isBody(start)) { - return; + if ( + range + .toString() + .replace(new RegExp(domUtils.fillChar, "g"), "") + .match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i) + ) { + while (range.toString().length) { + if ( + /^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test( + range.toString() + ) + ) { + break; + } + try { + range.setStart( + range.startContainer, + range.startOffset + 1 + ); + } catch (e) { + //trace:2121 + var start = range.startContainer; + while (!(next = start.nextSibling)) { + if (domUtils.isBody(start)) { + return; + } + start = start.parentNode; + } + range.setStart(next, 0); + } + } + //range的开始边界已经在a标签里的不再处理 + if ( + domUtils.findParentByTagName( + range.startContainer, + "a", + true + ) + ) { + return; + } + var a = me.document.createElement("a"), + text = me.document.createTextNode(" "), + href; + + me.undoManger && me.undoManger.save(); + a.appendChild(range.extractContents()); + a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, ""); + href = a + .getAttribute("href") + .replace(new RegExp(domUtils.fillChar, "g"), ""); + href = /^(?:https?:\/\/)/gi.test(href) + ? href + : "http://" + href; + a.setAttribute("_src", utils.html(href)); + a.href = utils.html(href); + + range.insertNode(a); + a.parentNode.insertBefore(text, a.nextSibling); + range.setStart(text, 0); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + me.undoManger && me.undoManger.save(); + } } - start = start.parentNode; - } - range.setStart(next, 0); } - } - //range的开始边界已经在a标签里的不再处理 - if ( - domUtils.findParentByTagName( - range.startContainer, - "a", - true - ) - ) { - return; - } - var a = me.document.createElement("a"), - text = me.document.createTextNode(" "), - href; - - me.undoManger && me.undoManger.save(); - a.appendChild(range.extractContents()); - a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, ""); - href = a - .getAttribute("href") - .replace(new RegExp(domUtils.fillChar, "g"), ""); - href = /^(?:https?:\/\/)/gi.test(href) - ? href - : "http://" + href; - a.setAttribute("_src", utils.html(href)); - a.href = utils.html(href); - - range.insertNode(a); - a.parentNode.insertBefore(text, a.nextSibling); - range.setStart(text, 0); - range.collapse(true); - sel.removeAllRanges(); - sel.addRange(range); - me.undoManger && me.undoManger.save(); } - } } - } - } - : {}; - }, - function() { - var keyCodes = { - 37: 1, - 38: 1, - 39: 1, - 40: 1, - 13: 1, - 32: 1 - }; - function checkIsCludeLink(node) { - if (node.nodeType == 3) { - return null; - } - if (node.nodeName == "A") { - return node; - } - var lastChild = node.lastChild; + : {}; + }, + function () { + var keyCodes = { + 37: 1, + 38: 1, + 39: 1, + 40: 1, + 13: 1, + 32: 1 + }; - while (lastChild) { - if (lastChild.nodeName == "A") { - return lastChild; + function checkIsCludeLink(node) { + if (node.nodeType == 3) { + return null; + } + if (node.nodeName == "A") { + return node; + } + var lastChild = node.lastChild; + + while (lastChild) { + if (lastChild.nodeName == "A") { + return lastChild; + } + if (lastChild.nodeType == 3) { + if (domUtils.isWhitespace(lastChild)) { + lastChild = lastChild.previousSibling; + continue; + } + return null; + } + lastChild = lastChild.lastChild; + } } - if (lastChild.nodeType == 3) { - if (domUtils.isWhitespace(lastChild)) { - lastChild = lastChild.previousSibling; - continue; - } - return null; - } - lastChild = lastChild.lastChild; - } + + browser.ie && + this.addListener("keyup", function (cmd, evt) { + var me = this, + keyCode = evt.keyCode; + if (keyCodes[keyCode]) { + var rng = me.selection.getRange(); + var start = rng.startContainer; + + if (keyCode == 13) { + while ( + start && + !domUtils.isBody(start) && + !domUtils.isBlockElm(start) + ) { + start = start.parentNode; + } + if (start && !domUtils.isBody(start) && start.nodeName == "P") { + var pre = start.previousSibling; + if (pre && pre.nodeType == 1) { + var pre = checkIsCludeLink(pre); + if (pre && !pre.getAttribute("_href")) { + domUtils.remove(pre, true); + } + } + } + } else if (keyCode == 32) { + if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) { + start = start.previousSibling; + if ( + start && + start.nodeName == "A" && + !start.getAttribute("_href") + ) { + domUtils.remove(start, true); + } + } + } else { + start = domUtils.findParentByTagName(start, "a", true); + if (start && !start.getAttribute("_href")) { + var bk = rng.createBookmark(); + + domUtils.remove(start, true); + rng.moveToBookmark(bk).select(true); + } + } + } + }); } - browser.ie && - this.addListener("keyup", function(cmd, evt) { - var me = this, - keyCode = evt.keyCode; - if (keyCodes[keyCode]) { - var rng = me.selection.getRange(); - var start = rng.startContainer; - - if (keyCode == 13) { - while ( - start && - !domUtils.isBody(start) && - !domUtils.isBlockElm(start) - ) { - start = start.parentNode; - } - if (start && !domUtils.isBody(start) && start.nodeName == "P") { - var pre = start.previousSibling; - if (pre && pre.nodeType == 1) { - var pre = checkIsCludeLink(pre); - if (pre && !pre.getAttribute("_href")) { - domUtils.remove(pre, true); - } - } - } - } else if (keyCode == 32) { - if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) { - start = start.previousSibling; - if ( - start && - start.nodeName == "A" && - !start.getAttribute("_href") - ) { - domUtils.remove(start, true); - } - } - } else { - start = domUtils.findParentByTagName(start, "a", true); - if (start && !start.getAttribute("_href")) { - var bk = rng.createBookmark(); - - domUtils.remove(start, true); - rng.moveToBookmark(bk).select(true); - } - } - } - }); - } ); @@ -19391,122 +22900,124 @@ UE.plugin.register( * @description 自动伸展 * @author zhanyi */ -UE.plugins["autoheight"] = function() { - var me = this; - //提供开关,就算加载也可以关闭 - me.autoHeightEnabled = me.options.autoHeightEnabled !== false; - if (!me.autoHeightEnabled) { - return; - } - - var bakOverflow, - lastHeight = 0, - options = me.options, - currentHeight, - timer; - - function adjustHeight() { - var me = this; - clearTimeout(timer); - if (isFullscreen) return; - if ( - !me.queryCommandState || - (me.queryCommandState && me.queryCommandState("source") != 1) - ) { - timer = setTimeout(function() { - var node = me.body.lastChild; - while (node && node.nodeType != 1) { - node = node.previousSibling; - } - if (node && node.nodeType == 1) { - node.style.clear = "both"; - currentHeight = Math.max( - domUtils.getXY(node).y + node.offsetHeight + 25, - Math.max(options.minFrameHeight, options.initialFrameHeight) - ); - if (currentHeight != lastHeight) { - if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { - me.iframe.parentNode.style.height = currentHeight + "px"; - } - me.body.style.height = currentHeight + "px"; - lastHeight = currentHeight; - } - domUtils.removeStyle(node, "clear"); - } - }, 50); - } - } - var isFullscreen; - me.addListener("fullscreenchanged", function(cmd, f) { - isFullscreen = f; - }); - me.addListener("destroy", function() { - domUtils.un(me.window, "scroll", fixedScrollTop); - me.removeListener( - "contentchange afterinserthtml keyup mouseup", - adjustHeight - ); - }); - me.enableAutoHeight = function() { +UE.plugins["autoheight"] = function () { var me = this; + //提供开关,就算加载也可以关闭 + me.autoHeightEnabled = me.options.autoHeightEnabled !== false; if (!me.autoHeightEnabled) { - return; + return; } - var doc = me.document; - me.autoHeightEnabled = true; - bakOverflow = doc.body.style.overflowY; - doc.body.style.overflowY = "hidden"; - me.addListener("contentchange afterinserthtml keyup mouseup", adjustHeight); - //ff不给事件算得不对 - setTimeout(function() { - adjustHeight.call(me); - }, browser.gecko ? 100 : 0); - me.fireEvent("autoheightchanged", me.autoHeightEnabled); - }; - me.disableAutoHeight = function() { - me.body.style.overflowY = bakOverflow || ""; + var bakOverflow, + lastHeight = 0, + options = me.options, + currentHeight, + timer; - me.removeListener("contentchange", adjustHeight); - me.removeListener("keyup", adjustHeight); - me.removeListener("mouseup", adjustHeight); - me.autoHeightEnabled = false; - me.fireEvent("autoheightchanged", me.autoHeightEnabled); - }; - - me.on("setHeight", function() { - me.disableAutoHeight(); - }); - me.addListener("ready", function() { - me.enableAutoHeight(); - //trace:1764 - var timer; - domUtils.on( - browser.ie ? me.body : me.document, - browser.webkit ? "dragover" : "drop", - function() { + function adjustHeight() { + var me = this; clearTimeout(timer); - timer = setTimeout(function() { - //trace:3681 - adjustHeight.call(me); - }, 100); - } - ); - //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 - domUtils.on(me.window, "scroll", fixedScrollTop); - }); - - var lastScrollY; - - function fixedScrollTop() { - if (!me.window) return; - if (lastScrollY === null) { - lastScrollY = me.window.scrollY; - } else if (me.window.scrollY == 0 && lastScrollY != 0) { - me.window.scrollTo(0, 0); - lastScrollY = null; + if (isFullscreen) return; + if ( + !me.queryCommandState || + (me.queryCommandState && me.queryCommandState("source") != 1) + ) { + timer = setTimeout(function () { + var node = me.body.lastChild; + while (node && node.nodeType != 1) { + node = node.previousSibling; + } + if (node && node.nodeType == 1) { + node.style.clear = "both"; + currentHeight = Math.max( + domUtils.getXY(node).y + node.offsetHeight + 25, + Math.max(options.minFrameHeight, options.initialFrameHeight) + ); + if (currentHeight !== lastHeight) { + me.iframe.parentNode.style.transition = 'width 0.3s, height 0.3s, easy-in-out'; + if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { + me.iframe.parentNode.style.height = currentHeight + "px"; + } + me.body.style.height = currentHeight + "px"; + lastHeight = currentHeight; + } + domUtils.removeStyle(node, "clear"); + } + }, 50); + } + } + + var isFullscreen; + me.addListener("fullscreenchanged", function (cmd, f) { + isFullscreen = f; + }); + me.addListener("destroy", function () { + domUtils.un(me.window, "scroll", fixedScrollTop); + me.removeListener( + "contentchange afterinserthtml keyup mouseup", + adjustHeight + ); + }); + me.enableAutoHeight = function () { + var me = this; + if (!me.autoHeightEnabled) { + return; + } + var doc = me.document; + me.autoHeightEnabled = true; + bakOverflow = doc.body.style.overflowY; + doc.body.style.overflowY = "hidden"; + me.addListener("contentchange afterinserthtml keyup mouseup", adjustHeight); + //ff不给事件算得不对 + + setTimeout(function () { + adjustHeight.call(me); + }, browser.gecko ? 100 : 0); + me.fireEvent("autoheightchanged", me.autoHeightEnabled); + }; + me.disableAutoHeight = function () { + me.body.style.overflowY = bakOverflow || ""; + + me.removeListener("contentchange", adjustHeight); + me.removeListener("keyup", adjustHeight); + me.removeListener("mouseup", adjustHeight); + me.autoHeightEnabled = false; + me.fireEvent("autoheightchanged", me.autoHeightEnabled); + }; + + me.on("setHeight", function () { + me.disableAutoHeight(); + }); + me.addListener("ready", function () { + me.enableAutoHeight(); + //trace:1764 + var timer; + domUtils.on( + browser.ie ? me.body : me.document, + browser.webkit ? "dragover" : "drop", + function () { + clearTimeout(timer); + timer = setTimeout(function () { + //trace:3681 + adjustHeight.call(me); + }, 100); + } + ); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + domUtils.on(me.window, "scroll", fixedScrollTop); + }); + + var lastScrollY; + + function fixedScrollTop() { + if (!me.window) return; + if (lastScrollY === null) { + lastScrollY = me.window.scrollY; + } else if (me.window.scrollY == 0 && lastScrollY != 0) { + me.window.scrollTo(0, 0); + lastScrollY = null; + } } - } }; @@ -19519,147 +23030,151 @@ UE.plugins["autoheight"] = function() { * modified by chengchao01 * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! */ -UE.plugins["autofloat"] = function() { - var me = this, - lang = me.getLang(); - me.setOpt({ - topOffset: 0 - }); - var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, - topOffset = me.options.topOffset; +UE.plugins["autofloat"] = function () { + var me = this, + lang = me.getLang(); + me.setOpt({ + topOffset: 0 + }); + var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, + topOffset = me.options.topOffset; - //如果不固定toolbar的位置,则直接退出 - if (!optsAutoFloatEnabled) { - return; - } - var uiUtils = UE.ui.uiUtils, - LteIE6 = browser.ie && browser.version <= 6, - quirks = browser.quirks; - - function checkHasUI() { - if (!UE.ui) { - alert(lang.autofloatMsg); - return 0; - } - return 1; - } - function fixIE6FixedPos() { - var docStyle = document.body.style; - docStyle.backgroundImage = 'url("about:blank")'; - docStyle.backgroundAttachment = "fixed"; - } - var bakCssText, - placeHolder = document.createElement("div"), - toolbarBox, - orgTop, - getPosition, - flag = true; //ie7模式下需要偏移 - function setFloating() { - var toobarBoxPos = domUtils.getXY(toolbarBox), - origalFloat = domUtils.getComputedStyle(toolbarBox, "position"), - origalLeft = domUtils.getComputedStyle(toolbarBox, "left"); - toolbarBox.style.width = toolbarBox.offsetWidth + "px"; - toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; - toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); - if (LteIE6 || (quirks && browser.ie)) { - if (toolbarBox.style.position != "absolute") { - toolbarBox.style.position = "absolute"; - } - toolbarBox.style.top = - (document.body.scrollTop || document.documentElement.scrollTop) - - orgTop + - topOffset + - "px"; - } else { - if (browser.ie7Compat && flag) { - flag = false; - toolbarBox.style.left = - domUtils.getXY(toolbarBox).x - - document.documentElement.getBoundingClientRect().left + - 2 + - "px"; - } - if (toolbarBox.style.position != "fixed") { - toolbarBox.style.position = "fixed"; - toolbarBox.style.top = topOffset + "px"; - (origalFloat == "absolute" || origalFloat == "relative") && - parseFloat(origalLeft) && - (toolbarBox.style.left = toobarBoxPos.x + "px"); - } - } - } - function unsetFloating() { - flag = true; - if (placeHolder.parentNode) { - placeHolder.parentNode.removeChild(placeHolder); - } - - toolbarBox.style.cssText = bakCssText; - } - - me.unsetFloating = unsetFloating; - - function updateFloating() { - var rect3 = getPosition(me.container); - var offset = me.options.toolbarTopOffset || 0; - if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { - setFloating(); - } else { - unsetFloating(); - } - } - var defer_updateFloating = utils.defer( - function() { - updateFloating(); - }, - browser.ie ? 200 : 100, - true - ); - - me.addListener("destroy", function() { - domUtils.un(window, ["scroll", "resize"], updateFloating); - me.removeListener("keydown", defer_updateFloating); - }); - - me.addListener("ready", function() { - if (checkHasUI(me)) { - //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 - if (!me.ui) { + //如果不固定toolbar的位置,则直接退出 + if (!optsAutoFloatEnabled) { return; - } - getPosition = uiUtils.getClientRect; - toolbarBox = me.ui.getDom("toolbarbox"); - orgTop = getPosition(toolbarBox).top; - bakCssText = toolbarBox.style.cssText; - placeHolder.style.height = toolbarBox.offsetHeight + "px"; - if (LteIE6) { - fixIE6FixedPos(); - } - domUtils.on(window, ["scroll", "resize"], updateFloating); - me.addListener("keydown", defer_updateFloating); - - me.addListener("beforefullscreenchange", function(t, enabled) { - if (enabled) { - unsetFloating(); - } - }); - me.addListener("fullscreenchanged", function(t, enabled) { - if (!enabled) { - updateFloating(); - } - }); - me.addListener("sourcemodechanged", function(t, enabled) { - setTimeout(function() { - updateFloating(); - }, 0); - }); - me.addListener("clearDoc", function() { - setTimeout(function() { - updateFloating(); - }, 0); - }); } - }); + var uiUtils = UE.ui.uiUtils, + LteIE6 = browser.ie && browser.version <= 6, + quirks = browser.quirks; + + function checkHasUI() { + if (!UE.ui) { + alert(lang.autofloatMsg); + return 0; + } + return 1; + } + + function fixIE6FixedPos() { + var docStyle = document.body.style; + docStyle.backgroundImage = 'url("about:blank")'; + docStyle.backgroundAttachment = "fixed"; + } + + var bakCssText, + placeHolder = document.createElement("div"), + toolbarBox, + orgTop, + getPosition, + flag = true; //ie7模式下需要偏移 + function setFloating() { + var toobarBoxPos = domUtils.getXY(toolbarBox), + origalFloat = domUtils.getComputedStyle(toolbarBox, "position"), + origalLeft = domUtils.getComputedStyle(toolbarBox, "left"); + toolbarBox.style.width = toolbarBox.offsetWidth + "px"; + toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + if (LteIE6 || (quirks && browser.ie)) { + if (toolbarBox.style.position != "absolute") { + toolbarBox.style.position = "absolute"; + } + toolbarBox.style.top = + (document.body.scrollTop || document.documentElement.scrollTop) - + orgTop + + topOffset + + "px"; + } else { + if (browser.ie7Compat && flag) { + flag = false; + toolbarBox.style.left = + domUtils.getXY(toolbarBox).x - + document.documentElement.getBoundingClientRect().left + + 2 + + "px"; + } + if (toolbarBox.style.position != "fixed") { + toolbarBox.style.position = "fixed"; + toolbarBox.style.top = topOffset + "px"; + (origalFloat == "absolute" || origalFloat == "relative") && + parseFloat(origalLeft) && + (toolbarBox.style.left = toobarBoxPos.x + "px"); + } + } + } + + function unsetFloating() { + flag = true; + if (placeHolder.parentNode) { + placeHolder.parentNode.removeChild(placeHolder); + } + + toolbarBox.style.cssText = bakCssText; + } + + me.unsetFloating = unsetFloating; + + function updateFloating() { + var rect3 = getPosition(me.container); + var offset = me.options.toolbarTopOffset || 0; + if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { + setFloating(); + } else { + unsetFloating(); + } + } + + var defer_updateFloating = utils.defer( + function () { + updateFloating(); + }, + browser.ie ? 200 : 100, + true + ); + + me.addListener("destroy", function () { + domUtils.un(window, ["scroll", "resize"], updateFloating); + me.removeListener("keydown", defer_updateFloating); + }); + + me.addListener("ready", function () { + if (checkHasUI(me)) { + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if (!me.ui) { + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom("toolbarbox"); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + "px"; + if (LteIE6) { + fixIE6FixedPos(); + } + domUtils.on(window, ["scroll", "resize"], updateFloating); + me.addListener("keydown", defer_updateFloating); + + me.addListener("beforefullscreenchange", function (t, enabled) { + if (enabled) { + unsetFloating(); + } + }); + me.addListener("fullscreenchanged", function (t, enabled) { + if (!enabled) { + updateFloating(); + } + }); + me.addListener("sourcemodechanged", function (t, enabled) { + setTimeout(function () { + updateFloating(); + }, 0); + }); + me.addListener("clearDoc", function () { + setTimeout(function () { + updateFloating(); + }, 0); + }); + } + }); }; @@ -19670,10 +23185,10 @@ UE.plugins["autofloat"] = function() { * @since 1.2.6.1 */ -UE.plugins["video"] = function() { - var me = this; +UE.plugins["video"] = function () { + var me = this; - /** + /** * 创建插入视频字符窜 * @param url 视频地址 * @param width 视频宽度 @@ -19682,117 +23197,117 @@ UE.plugins["video"] = function() { * @param toEmbed 是否以flash代替显示 * @param addParagraph 是否需要添加P 标签 */ - function creatInsertStr(url, width, height, id, align, classname, type) { - var str; - switch (type) { - case 'iframe': - str = ''; - - wrapper.className = "edui-" + me.options.theme; - wrapper.id = me.ui.id + "_iframeupload"; - btnIframeBody.style.cssText = btnStyle; - btnIframeBody.style.width = w + "px"; - btnIframeBody.style.height = h + "px"; - btnIframeBody.appendChild(wrapper); - - if (btnIframeBody.parentNode) { - btnIframeBody.parentNode.style.width = w + "px"; - btnIframeBody.parentNode.style.height = w + "px"; - } - - var form = btnIframeDoc.getElementById("edui_form_" + timestrap); - var input = btnIframeDoc.getElementById("edui_input_" + timestrap); - var iframe = btnIframeDoc.getElementById("edui_iframe_" + timestrap); - - domUtils.on(input, "change", function() { - if (!input.value) return; - var loadingId = "loading_" + (+new Date()).toString(36); - var params = - utils.serializeParam(me.queryCommandValue("serverparam")) || ""; - - var imageActionUrl = me.getActionUrl(me.getOpt("imageActionName")); - var allowFiles = me.getOpt("imageAllowFiles"); - - me.focus(); - me.execCommand( - "inserthtml", - '' - ); - - function callback() { - try { - var link,loader; - var imageActionUrl = me.getActionUrl(me.getOpt("imageActionName")); - var imageUrlPrefix = me.getOpt("imageUrlPrefix"); var allowFiles = me.getOpt("imageAllowFiles"); - var formData = new FormData() - formData.append('upfile', input.files[0]); - // 替换你的URL - fetch(imageActionUrl,{ - method: "post", - body: formData - }).then(p=>p.json()).then(json=>{ - link = me.options.imageUrlPrefix + json.url; - if (json.state == "SUCCESS" && json.url) { - loader = me.document.getElementById(loadingId); - domUtils.removeClasses(loader, "loadingclass"); + var filename = input.value, fileext = filename ? filename.substr(filename.lastIndexOf(".")) : ""; + if ( + !fileext || + (allowFiles && + (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") === -1) + ) { + UE.dialog.removeLoadingPlaceholder(me, loadingId); + UE.dialog.tipError(me, me.getLang("autoupload.exceedTypeError")); + return; + } + + var successHandler = function (res) { + const loader = me.document.getElementById(loadingId); + domUtils.removeClasses(loader, "uep-loading"); + const link = me.options.imageUrlPrefix + res.url; loader.setAttribute("src", link); loader.setAttribute("_src", link); - loader.setAttribute("alt", json.original || ""); + loader.setAttribute("alt", res.original || ""); loader.removeAttribute("id"); me.fireEvent("contentchange"); - } else { - showErrorLoader && showErrorLoader(json.state); - } - }).catch(e=>{ - showErrorLoader && - showErrorLoader(me.getLang("simpleupload.loadError")); - }) - } catch (er) { - showErrorLoader && - showErrorLoader(me.getLang("simpleupload.loadError")); - } - form.reset(); - domUtils.un(iframe, "load", callback); - } - function showErrorLoader(title) { - if (loadingId) { - var loader = me.document.getElementById(loadingId); - loader && domUtils.remove(loader); - me.fireEvent("showmessage", { - id: loadingId, - content: title, - type: "error", - timeout: 4000 - }); - } - } + // 触发上传图片事件 + me.fireEvent("uploadsuccess", { + res: res, + type: 'image' + }); + }; - /* 判断后端配置是否没有加载成功 */ - if (!me.getOpt("imageActionName")) { - errorHandler(me.getLang("autoupload.errorLoadConfig")); - return; - } - // 判断文件格式是否错误 - var filename = input.value, - fileext = filename ? filename.substr(filename.lastIndexOf(".")) : ""; - if ( - !fileext || - (allowFiles && - (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") == - -1) - ) { - showErrorLoader(me.getLang("simpleupload.exceedTypeError")); - return; - } + var errorHandler = function (err) { + UE.dialog.removeLoadingPlaceholder(me, loadingId); + UE.dialog.tipError(me, err); + }; - domUtils.on(iframe, "load", callback); - form.action = utils.formatUrl( - imageActionUrl + - (imageActionUrl.indexOf("?") == -1 ? "?" : "&") + - params - ); - form.submit(); - }); + var upload = function (file) { + if(me.getOpt('uploadServiceEnable')){ + me.getOpt('uploadServiceUpload')('image', file, { + success: function( res ) { + successHandler( res ); + }, + error: function( err ) { + errorHandler(me.getLang("simpleupload.loadError") + ' : ' + err); + }, + progress: function( percent ) { - var stateTimer; - me.addListener("selectionchange", function() { - clearTimeout(stateTimer); - stateTimer = setTimeout(function() { - var state = me.queryCommandState("simpleupload"); - if (state == -1) { - input.disabled = "disabled"; - } else { - input.disabled = false; - } - }, 400); - }); - isLoaded = true; - }); + } + }, { + from: 'upload' + }); + return; + } + const formData = new FormData(); + formData.append(me.getOpt('imageFieldName'), file, file.name); + UE.api.requestAction(me, me.getOpt("imageActionName"), { + data: formData + }).then(function (res) { + res = me.getOpt('serverResponsePrepare')( res.data ) + if ('SUCCESS' === res.state && res.url) { + successHandler(res) + } else { + errorHandler(res.state); + } + input.value = ''; + }).catch(function (err) { + errorHandler(err) + input.value = ''; + }); + }; + var file = input.files[0]; + // console.log('file',file); + var imageCompressEnable = me.getOpt('imageCompressEnable'), + imageMaxSize = me.getOpt('imageMaxSize'), + imageCompressBorder = me.getOpt('imageCompressBorder'); + if (imageCompressEnable) { + UE.image.compress(file, { + maxSizeMB: imageMaxSize / 1024 / 1024, + maxWidthOrHeight: imageCompressBorder + }).then(function (compressedFile) { + if (me.options.debug) { + console.log('UEditorPlus.SimpleUpload.CompressImage', (compressedFile.size / file.size * 100).toFixed(2) + '%'); + } + upload(compressedFile); + }).catch(function (err) { + console.error('UEditorPlus.SimpleUpload.CompressImage.error', err); + upload(file); + }); + } else { + upload(file); + } + }); - btnIframe.style.cssText = btnStyle; - containerBtn.appendChild(btnIframe); - } - - return { - bindEvents: { - ready: function() { - //设置loading的样式 - utils.cssRule( - "loading", - ".loadingclass{display:inline-block;cursor:default;background: url('" + - this.options.themePath + - this.options.theme + - "/images/loading.gif') no-repeat center center transparent;border-radius:3px;outline:1px solid #EEE;margin-right:1px;height:22px;width:22px;}\n" + - ".loaderrorclass{display:inline-block;cursor:default;background: url('" + - this.options.themePath + - this.options.theme + - "/images/loaderror.png') no-repeat center center transparent;border-radius:3px;outline:1px solid #EEE;margin-right:1px;height:22px;width:22px;" + - "}", - this.document - ); - }, - /* 初始化简单上传按钮 */ - simpleuploadbtnready: function(type, container) { - containerBtn = container; - me.afterConfigReady(initUploadBtn); - } - }, - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(n) { - if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { - n.parentNode.removeChild(n); - } - }); - }, - commands: { - simpleupload: { - queryCommandState: function() { - return isLoaded ? 0 : -1; - } - } + var stateTimer; + me.addListener("selectionchange", function () { + clearTimeout(stateTimer); + stateTimer = setTimeout(function () { + var state = me.queryCommandState("simpleupload"); + if (state === -1) { + input.disabled = "disabled"; + } else { + input.disabled = false; + } + }, 400); + }); + isLoaded = true; } - }; + + return { + bindEvents: { + ready: function () { + //设置loading的样式 + utils.cssRule( + "loading", + ".uep-loading{display:inline-block;cursor:default;background: url('" + + this.options.themePath + + this.options.theme + + "/images/loading.gif') no-repeat center center transparent;border-radius:3px;outline:1px solid #EEE;margin-right:1px;height:22px;width:22px;}\n" + + ".uep-loading-error{display:inline-block;cursor:default;background: url('" + + this.options.themePath + + this.options.theme + + "/images/loaderror.png') no-repeat center center transparent;border-radius:3px;outline:1px solid #EEE;margin-right:1px;height:22px;width:22px;" + + "}", + this.document + ); + }, + /* 初始化简单上传按钮 */ + simpleuploadbtnready: function (type, container) { + containerBtn = container; + me.afterConfigReady(initUploadBtn); + } + }, + outputRule: function (root) { + utils.each(root.getNodesByTagName("img"), function (n) { + if (/\b(uep\-loading\-error)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { + n.parentNode.removeChild(n); + } + }); + }, + commands: { + simpleupload: { + queryCommandState: function () { + return isLoaded ? 0 : -1; + } + } + } + }; }); @@ -26994,13 +30650,13 @@ UE.plugin.register("simpleupload", function() { * @file * @since 1.2.6.1 */ -UE.plugin.register("serverparam", function() { - var me = this, - serverParam = {}; +UE.plugin.register("serverparam", function () { + var me = this, + serverParam = {}; - return { - commands: { - /** + return { + commands: { + /** * 修改服务器提交的额外参数列表,清除所有项 * @command serverparam * @method execCommand @@ -27011,7 +30667,7 @@ UE.plugin.register("serverparam", function() { * editor.queryCommandValue('serverparam'); //返回空 * ``` */ - /** + /** * 修改服务器提交的额外参数列表,删除指定项 * @command serverparam * @method execCommand @@ -27022,7 +30678,7 @@ UE.plugin.register("serverparam", function() { * editor.execCommand('serverparam', 'name'); //删除属性name * ``` */ - /** + /** * 修改服务器提交的额外参数列表,使用键值添加项 * @command serverparam * @method execCommand @@ -27035,7 +30691,7 @@ UE.plugin.register("serverparam", function() { * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} * ``` */ - /** + /** * 修改服务器提交的额外参数列表,传入键值对对象添加多项 * @command serverparam * @method execCommand @@ -27047,7 +30703,7 @@ UE.plugin.register("serverparam", function() { * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} * ``` */ - /** + /** * 修改服务器提交的额外参数列表,使用自定义函数添加多项 * @command serverparam * @method execCommand @@ -27062,7 +30718,7 @@ UE.plugin.register("serverparam", function() { * ``` */ - /** + /** * 获取服务器提交的额外参数列表 * @command serverparam * @method queryCommandValue @@ -27072,32 +30728,32 @@ UE.plugin.register("serverparam", function() { * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} * ``` */ - serverparam: { - execCommand: function(cmd, key, value) { - if (key === undefined || key === null) { - //不传参数,清空列表 - serverParam = {}; - } else if (utils.isString(key)) { - //传入键值 - if (value === undefined || value === null) { - delete serverParam[key]; - } else { - serverParam[key] = value; + serverparam: { + execCommand: function (cmd, key, value) { + if (key === undefined || key === null) { + //不传参数,清空列表 + serverParam = {}; + } else if (utils.isString(key)) { + //传入键值 + if (value === undefined || value === null) { + delete serverParam[key]; + } else { + serverParam[key] = value; + } + } else if (utils.isObject(key)) { + //传入对象,覆盖列表项 + utils.extend(serverParam, key, false); + } else if (utils.isFunction(key)) { + //传入函数,添加列表项 + utils.extend(serverParam, key(), false); + } + }, + queryCommandValue: function () { + return serverParam || {}; + } } - } else if (utils.isObject(key)) { - //传入对象,覆盖列表项 - utils.extend(serverParam, key, false); - } else if (utils.isFunction(key)) { - //传入函数,添加列表项 - utils.extend(serverParam, key(), false); - } - }, - queryCommandValue: function() { - return serverParam || {}; } - } - } - }; + }; }); @@ -27105,95 +30761,233 @@ UE.plugin.register("serverparam", function() { /** * 插入附件 */ -UE.plugin.register("insertfile", function() { - var me = this; +UE.plugin.register("insertfile", function () { + var me = this; - function getFileIcon(url) { - var ext = url.substr(url.lastIndexOf(".") + 1).toLowerCase(), - maps = { - rar: "icon_rar.gif", - zip: "icon_rar.gif", - tar: "icon_rar.gif", - gz: "icon_rar.gif", - bz2: "icon_rar.gif", - doc: "icon_doc.gif", - docx: "icon_doc.gif", - pdf: "icon_pdf.gif", - mp3: "icon_mp3.gif", - xls: "icon_xls.gif", - chm: "icon_chm.gif", - ppt: "icon_ppt.gif", - pptx: "icon_ppt.gif", - avi: "icon_mv.gif", - rmvb: "icon_mv.gif", - wmv: "icon_mv.gif", - flv: "icon_mv.gif", - swf: "icon_mv.gif", - rm: "icon_mv.gif", - exe: "icon_exe.gif", - psd: "icon_psd.gif", - txt: "icon_txt.gif", - jpg: "icon_jpg.gif", - png: "icon_jpg.gif", - jpeg: "icon_jpg.gif", - gif: "icon_jpg.gif", - ico: "icon_jpg.gif", - bmp: "icon_jpg.gif" - }; - return maps[ext] ? maps[ext] : maps["txt"]; - } - - return { - commands: { - insertfile: { - execCommand: function(command, filelist) { - filelist = utils.isArray(filelist) ? filelist : [filelist]; - - if (me.fireEvent("beforeinsertfile", filelist) === true) { - return; - } - - var i, - item, - icon, - title, - html = "", - URL = me.getOpt("UEDITOR_HOME_URL"), - iconDir = - URL + - (URL.substr(URL.length - 1) == "/" ? "" : "/") + - "dialogs/attachment/fileTypeImages/"; - for (i = 0; i < filelist.length; i++) { - item = filelist[i]; - icon = iconDir + getFileIcon(item.url); - title = - item.title || item.url.substr(item.url.lastIndexOf("/") + 1); - html += - '

    ' + - '' + - '' + - title + - "" + - "

    "; - } - me.execCommand("insertHtml", html); - - me.fireEvent("afterinsertfile", filelist); - } - } + function getFileIcon(url) { + var ext = url.substr(url.lastIndexOf(".") + 1).toLowerCase(), + maps = { + "ai": "ai.svg", + "apk": "apk.svg", + "chm": "chm.svg", + "css": "css.svg", + "doc": "doc.svg", + "docx": "docx.svg", + "dwg": "dwg.svg", + "gif": "gif.svg", + "html": "html.svg", + "jpeg": "jpeg.svg", + "jpg": "jpg.svg", + "log": "log.svg", + "mp3": "mp3.svg", + "mp4": "mp4.svg", + "pdf": "pdf.svg", + "png": "png.svg", + "ppt": "ppt.svg", + "pptx": "pptx.svg", + "psd": "psd.svg", + "rar": "rar.svg", + "svg": "svg.svg", + "torrent": "torrent.svg", + "txt": "txt.svg", + "unknown": "unknown.svg", + "xls": "xls.svg", + "xlsx": "xlsx.svg", + "zip": "zip.svg", + }; + return maps[ext] ? maps[ext] : maps["unknown"]; } - }; + + return { + commands: { + insertfile: { + execCommand: function (command, filelist) { + filelist = utils.isArray(filelist) ? filelist : [filelist]; + + if (me.fireEvent("beforeinsertfile", filelist) === true) { + return; + } + + + //console.log('themePath', ); + var i, + item, + icon, + title, + html = "", + URL = me.getOpt("UEDITOR_HOME_URL"), + iconDir = me.options.themePath + me.options.theme + "/exts/"; + for (i = 0; i < filelist.length; i++) { + item = filelist[i]; + icon = iconDir + getFileIcon(item.url); + title = + item.title || item.url.substr(item.url.lastIndexOf("/") + 1); + html += + '

    ' + + '' + + '' + + '' + + title + + "" + + "" + + "

    "; + } + me.execCommand("insertHtml", html); + + me.fireEvent("afterinsertfile", filelist); + } + } + } + }; }); +// plugins/markdown-shortcut.js +UE.plugins["markdown-shortcut"] = function () { + + if (!UE.browser.chrome) { + return; + } + + const me = this; + + const getCleanHtml = function (node) { + let html = node.innerHTML + html = html.replace(/[\u200b]*/g, '') + return html + } + + let shortCuts = []; + // 注册 H1-H6 快捷键 + for (let i = 1; i <= 6; i++) { + const regExp = new RegExp('^\\t?' + Array(i + 1).join('#') + '(\\s| )'); + (function (command) { + shortCuts.push({ + name: 'Head' + i, + tagName: ['P'], + key: [' '], + offset: [i + 1, i + 2], + match: [regExp], + callback: function (param) { + me.__hasEnterExecCommand = true; + me.execCommand('paragraph', command); + let range = me.selection.getRange(); + let node = range.startContainer; + let html = getCleanHtml(node) + html = html.replace(regExp, ''); + if (!html) { + html = domUtils.fillChar; + } + node.innerHTML = html; + me.__hasEnterExecCommand = false; + } + }) + })('h' + i); + } + + me.on("ready", function () { + + domUtils.on(me.body, 'keyup', function (e) { + let range = me.selection.getRange(); + if (range.endOffset !== range.startOffset) { + return; + } + let key = e.key; + let offset = range.startOffset; + const node = range.startContainer.parentNode; + let html = getCleanHtml(node); + let tagName = node.tagName; + // console.log('keyup', [node, range, tagName, key, offset, html]); + for (let s of shortCuts) { + if (!s.tagName.includes(tagName)) { + continue; + } + if (!s.key.includes(key)) { + continue; + } + if (!s.offset.includes(offset)) { + continue; + } + for (let m of s.match) { + let match = html.match(m); + // console.log('keyup', [html, m, match, s.name]); + if (match) { + s.callback({ + node: node, + }); + break; + } + } + } + }); + + }); + +}; + + +// plugins/quick-operate.js +UE.plugins["quick-operate"] = function () { + + if (!UE.browser.chrome) { + return; + } + return; + + let me = this; + const uiUtils = UE.ui.uiUtils; + + me.on("ready", function () { + let quickOperate = new UE.ui.QuickOperate({ + // items: contextItems, + className: "edui-quick-operate", + editor: me + }); + quickOperate.render(); + + let quickOperateNode = { + root: null, + target: null, + } + domUtils.on(quickOperate.el, 'mouseenter', function (evt) { + quickOperateNode.root && quickOperateNode.root.classList && quickOperateNode.root.classList.add('edui-quick-operate-active'); + }); + domUtils.on(quickOperate.el, 'mouseleave', function (evt) { + quickOperateNode.root && quickOperateNode.root.classList && quickOperateNode.root.classList.remove('edui-quick-operate-active'); + }); + domUtils.on(me.body, "mouseout", function (evt) { + // quickOperate.hide(); + }); + domUtils.on(me.body, "mouseover", function (evt) { + const node = evt.target + let rootNode = node; + for (; rootNode.parentNode && rootNode.parentNode.tagName !== 'BODY';) { + rootNode = rootNode.parentNode; + } + quickOperateNode.root = rootNode + quickOperateNode.target = node + // me.body.querySelectorAll('& > *').forEach(item => { + // item.classList.remove('edui-quick-operate-active'); + // }); + // rootNode.classList.add('edui-quick-operate-active'); + const rect = node.getBoundingClientRect(); + const offset = uiUtils.getClientRect(node) + offset.left = offset.left - 55 + // console.log('mouseover', rect, node, offset); + // let offset = uiUtils.getViewportOffsetByEvent(evt); + // console.log('quickOperate', quickOperate); + quickOperate.showAt(offset); + }); + + }); + +}; + + // ui/ui.js var baidu = baidu || {}; baidu.editor = baidu.editor || {}; @@ -27201,1030 +30995,1063 @@ UE.ui = baidu.editor.ui = {}; // ui/uiutils.js -(function() { - var browser = baidu.editor.browser, - domUtils = baidu.editor.dom.domUtils; +(function () { + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils; - var magic = "$EDITORUI"; - var root = (window[magic] = {}); - var uidMagic = "ID" + magic; - var uidCount = 0; + var magic = "$EDITORUI"; + var root = (window[magic] = {}); + var uidMagic = "ID" + magic; + var uidCount = 0; - var uiUtils = (baidu.editor.ui.uiUtils = { - uid: function(obj) { - return obj ? obj[uidMagic] || (obj[uidMagic] = ++uidCount) : ++uidCount; - }, - hook: function(fn, callback) { - var dg; - if (fn && fn._callbacks) { - dg = fn; - } else { - dg = function() { - var q; - if (fn) { - q = fn.apply(this, arguments); - } - var callbacks = dg._callbacks; - var k = callbacks.length; - while (k--) { - var r = callbacks[k].apply(this, arguments); - if (q === undefined) { - q = r; + var uiUtils = (baidu.editor.ui.uiUtils = { + uid: function (obj) { + return obj ? obj[uidMagic] || (obj[uidMagic] = ++uidCount) : ++uidCount; + }, + hook: function (fn, callback) { + var dg; + if (fn && fn._callbacks) { + dg = fn; + } else { + dg = function () { + var q; + if (fn) { + q = fn.apply(this, arguments); + } + var callbacks = dg._callbacks; + var k = callbacks.length; + while (k--) { + var r = callbacks[k].apply(this, arguments); + if (q === undefined) { + q = r; + } + } + return q; + }; + dg._callbacks = []; } - } - return q; - }; - dg._callbacks = []; - } - dg._callbacks.push(callback); - return dg; - }, - createElementByHtml: function(html) { - var el = document.createElement("div"); - el.innerHTML = html; - el = el.firstChild; - el.parentNode.removeChild(el); - return el; - }, - getViewportElement: function() { - return browser.ie && browser.quirks - ? document.body - : document.documentElement; - }, - getClientRect: function(element) { - var bcr; - //trace IE6下在控制编辑器显隐时可能会报错,catch一下 - try { - bcr = element.getBoundingClientRect(); - } catch (e) { - bcr = { left: 0, top: 0, height: 0, width: 0 }; - } - var rect = { - left: Math.round(bcr.left), - top: Math.round(bcr.top), - height: Math.round(bcr.bottom - bcr.top), - width: Math.round(bcr.right - bcr.left) - }; - var doc; - while ( - (doc = element.ownerDocument) !== document && - (element = domUtils.getWindow(doc).frameElement) - ) { - bcr = element.getBoundingClientRect(); - rect.left += bcr.left; - rect.top += bcr.top; - } - rect.bottom = rect.top + rect.height; - rect.right = rect.left + rect.width; - return rect; - }, - getViewportRect: function() { - var viewportEl = uiUtils.getViewportElement(); - var width = (window.innerWidth || viewportEl.clientWidth) | 0; - var height = (window.innerHeight || viewportEl.clientHeight) | 0; - return { - left: 0, - top: 0, - height: height, - width: width, - bottom: height, - right: width - }; - }, - setViewportOffset: function(element, offset) { - var rect; - var fixedLayer = uiUtils.getFixedLayer(); - if (element.parentNode === fixedLayer) { - element.style.left = offset.left + "px"; - element.style.top = offset.top + "px"; - } else { - domUtils.setViewportOffset(element, offset); - } - }, - getEventOffset: function(evt) { - var el = evt.target || evt.srcElement; - var rect = uiUtils.getClientRect(el); - var offset = uiUtils.getViewportOffsetByEvent(evt); - return { - left: offset.left - rect.left, - top: offset.top - rect.top - }; - }, - getViewportOffsetByEvent: function(evt) { - var el = evt.target || evt.srcElement; - var frameEl = domUtils.getWindow(el).frameElement; - var offset = { - left: evt.clientX, - top: evt.clientY - }; - if (frameEl && el.ownerDocument !== document) { - var rect = uiUtils.getClientRect(frameEl); - offset.left += rect.left; - offset.top += rect.top; - } - return offset; - }, - setGlobal: function(id, obj) { - root[id] = obj; - return magic + '["' + id + '"]'; - }, - unsetGlobal: function(id) { - delete root[id]; - }, - copyAttributes: function(tgt, src) { - var attributes = src.attributes; - var k = attributes.length; - while (k--) { - var attrNode = attributes[k]; - if ( - attrNode.nodeName != "style" && - attrNode.nodeName != "class" && - (!browser.ie || attrNode.specified) - ) { - tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); - } - } - if (src.className) { - domUtils.addClass(tgt, src.className); - } - if (src.style.cssText) { - tgt.style.cssText += ";" + src.style.cssText; - } - }, - removeStyle: function(el, styleName) { - if (el.style.removeProperty) { - el.style.removeProperty(styleName); - } else if (el.style.removeAttribute) { - el.style.removeAttribute(styleName); - } else throw ""; - }, - contains: function(elA, elB) { - return ( - elA && - elB && - (elA === elB - ? false - : elA.contains - ? elA.contains(elB) - : elA.compareDocumentPosition(elB) & 16) - ); - }, - startDrag: function(evt, callbacks, doc) { - var doc = doc || document; - var startX = evt.clientX; - var startY = evt.clientY; - function handleMouseMove(evt) { - var x = evt.clientX - startX; - var y = evt.clientY - startY; - callbacks.ondragmove(x, y, evt); - if (evt.stopPropagation) { - evt.stopPropagation(); - } else { - evt.cancelBubble = true; - } - } - if (doc.addEventListener) { - function handleMouseUp(evt) { - doc.removeEventListener("mousemove", handleMouseMove, true); - doc.removeEventListener("mouseup", handleMouseUp, true); - window.removeEventListener("mouseup", handleMouseUp, true); - callbacks.ondragstop(); - } - doc.addEventListener("mousemove", handleMouseMove, true); - doc.addEventListener("mouseup", handleMouseUp, true); - window.addEventListener("mouseup", handleMouseUp, true); - - evt.preventDefault(); - } else { - var elm = evt.srcElement; - elm.setCapture(); - function releaseCaptrue() { - elm.releaseCapture(); - elm.detachEvent("onmousemove", handleMouseMove); - elm.detachEvent("onmouseup", releaseCaptrue); - elm.detachEvent("onlosecaptrue", releaseCaptrue); - callbacks.ondragstop(); - } - elm.attachEvent("onmousemove", handleMouseMove); - elm.attachEvent("onmouseup", releaseCaptrue); - elm.attachEvent("onlosecaptrue", releaseCaptrue); - evt.returnValue = false; - } - callbacks.ondragstart(); - }, - getFixedLayer: function() { - var layer = document.getElementById("edui_fixedlayer"); - if (layer == null) { - layer = document.createElement("div"); - layer.id = "edui_fixedlayer"; - document.body.appendChild(layer); - if (browser.ie && browser.version <= 8) { - layer.style.position = "absolute"; - bindFixedLayer(); - setTimeout(updateFixedOffset); - } else { - layer.style.position = "fixed"; - } - layer.style.left = "0"; - layer.style.top = "0"; - layer.style.width = "0"; - layer.style.height = "0"; - layer.style.margin = "0"; - } - return layer; - }, - makeUnselectable: function(element) { - if (browser.opera || (browser.ie && browser.version < 9)) { - element.unselectable = "on"; - if (element.hasChildNodes()) { - for (var i = 0; i < element.childNodes.length; i++) { - if (element.childNodes[i].nodeType == 1) { - uiUtils.makeUnselectable(element.childNodes[i]); + dg._callbacks.push(callback); + return dg; + }, + createElementByHtml: function (html) { + var el = document.createElement("div"); + el.innerHTML = html; + el = el.firstChild; + el.parentNode.removeChild(el); + return el; + }, + getViewportElement: function () { + return browser.ie && browser.quirks + ? document.body + : document.documentElement; + }, + getClientRect: function (element) { + var bcr; + //trace IE6下在控制编辑器显隐时可能会报错,catch一下 + try { + bcr = element.getBoundingClientRect(); + } catch (e) { + bcr = {left: 0, top: 0, height: 0, width: 0}; + } + var rect = { + left: Math.round(bcr.left), + top: Math.round(bcr.top), + height: Math.round(bcr.bottom - bcr.top), + width: Math.round(bcr.right - bcr.left) + }; + var doc; + while ( + (doc = element.ownerDocument) !== document && + (element = domUtils.getWindow(doc).frameElement) + ) { + bcr = element.getBoundingClientRect(); + rect.left += bcr.left; + rect.top += bcr.top; + } + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + }, + getViewportRect: function () { + var viewportEl = uiUtils.getViewportElement(); + var width = (window.innerWidth || viewportEl.clientWidth) | 0; + var height = (window.innerHeight || viewportEl.clientHeight) | 0; + return { + left: 0, + top: 0, + height: height, + width: width, + bottom: height, + right: width + }; + }, + setViewportOffset: function (element, offset) { + var rect; + var fixedLayer = uiUtils.getFixedLayer(); + if (element.parentNode === fixedLayer) { + element.style.left = offset.left + "px"; + element.style.top = offset.top + "px"; + } else { + domUtils.setViewportOffset(element, offset); + } + }, + getEventOffset: function (evt) { + var el = evt.target || evt.srcElement; + var rect = uiUtils.getClientRect(el); + var offset = uiUtils.getViewportOffsetByEvent(evt); + return { + left: offset.left - rect.left, + top: offset.top - rect.top + }; + }, + getViewportOffsetByEvent: function (evt) { + var el = evt.target || evt.srcElement; + var frameEl = domUtils.getWindow(el).frameElement; + var offset = { + left: evt.clientX, + top: evt.clientY + }; + if (frameEl && el.ownerDocument !== document) { + var rect = uiUtils.getClientRect(frameEl); + offset.left += rect.left; + offset.top += rect.top; + } + return offset; + }, + setGlobal: function (id, obj) { + root[id] = obj; + return magic + '["' + id + '"]'; + }, + unsetGlobal: function (id) { + delete root[id]; + }, + copyAttributes: function (tgt, src) { + var attributes = src.attributes; + var k = attributes.length; + while (k--) { + var attrNode = attributes[k]; + if ( + attrNode.nodeName != "style" && + attrNode.nodeName != "class" && + (!browser.ie || attrNode.specified) + ) { + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } + } + if (src.className) { + domUtils.addClass(tgt, src.className); + } + if (src.style.cssText) { + tgt.style.cssText += ";" + src.style.cssText; + } + }, + removeStyle: function (el, styleName) { + if (el.style.removeProperty) { + el.style.removeProperty(styleName); + } else if (el.style.removeAttribute) { + el.style.removeAttribute(styleName); + } else throw ""; + }, + contains: function (elA, elB) { + return ( + elA && + elB && + (elA === elB + ? false + : elA.contains + ? elA.contains(elB) + : elA.compareDocumentPosition(elB) & 16) + ); + }, + startDrag: function (evt, callbacks, doc) { + var doc = doc || document; + var startX = evt.clientX; + var startY = evt.clientY; + + function handleMouseMove(evt) { + var x = evt.clientX - startX; + var y = evt.clientY - startY; + callbacks.ondragmove(x, y, evt); + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + + if (doc.addEventListener) { + function handleMouseUp(evt) { + doc.removeEventListener("mousemove", handleMouseMove, true); + doc.removeEventListener("mouseup", handleMouseUp, true); + window.removeEventListener("mouseup", handleMouseUp, true); + callbacks.ondragstop(); + } + + doc.addEventListener("mousemove", handleMouseMove, true); + doc.addEventListener("mouseup", handleMouseUp, true); + window.addEventListener("mouseup", handleMouseUp, true); + + evt.preventDefault(); + } else { + var elm = evt.srcElement; + elm.setCapture(); + + function releaseCaptrue() { + elm.releaseCapture(); + elm.detachEvent("onmousemove", handleMouseMove); + elm.detachEvent("onmouseup", releaseCaptrue); + elm.detachEvent("onlosecaptrue", releaseCaptrue); + callbacks.ondragstop(); + } + + elm.attachEvent("onmousemove", handleMouseMove); + elm.attachEvent("onmouseup", releaseCaptrue); + elm.attachEvent("onlosecaptrue", releaseCaptrue); + evt.returnValue = false; + } + callbacks.ondragstart(); + }, + getFixedLayer: function () { + var layer = document.getElementById("edui_fixedlayer"); + if (layer == null) { + layer = document.createElement("div"); + layer.id = "edui_fixedlayer"; + document.body.appendChild(layer); + if (browser.ie && browser.version <= 8) { + layer.style.position = "absolute"; + bindFixedLayer(); + setTimeout(updateFixedOffset); + } else { + layer.style.position = "fixed"; + } + layer.style.left = "0"; + layer.style.top = "0"; + layer.style.width = "0"; + layer.style.height = "0"; + layer.style.margin = "0"; + } + return layer; + }, + makeUnselectable: function (element) { + if (browser.opera || (browser.ie && browser.version < 9)) { + element.unselectable = "on"; + if (element.hasChildNodes()) { + for (var i = 0; i < element.childNodes.length; i++) { + if (element.childNodes[i].nodeType === 1) { + uiUtils.makeUnselectable(element.childNodes[i]); + } + } + } + } else { + if (element.style.MozUserSelect !== undefined) { + element.style.MozUserSelect = "none"; + } else if (element.style.WebkitUserSelect !== undefined) { + element.style.WebkitUserSelect = "none"; + } else if (element.style.KhtmlUserSelect !== undefined) { + element.style.KhtmlUserSelect = "none"; + } } - } } - } else { - if (element.style.MozUserSelect !== undefined) { - element.style.MozUserSelect = "none"; - } else if (element.style.WebkitUserSelect !== undefined) { - element.style.WebkitUserSelect = "none"; - } else if (element.style.KhtmlUserSelect !== undefined) { - element.style.KhtmlUserSelect = "none"; - } - } - } - }); - function updateFixedOffset() { - var layer = document.getElementById("edui_fixedlayer"); - uiUtils.setViewportOffset(layer, { - left: 0, - top: 0 }); - // layer.style.display = 'none'; - // layer.style.display = 'block'; - //#trace: 1354 - // setTimeout(updateFixedOffset); - } - function bindFixedLayer(adjOffset) { - domUtils.on(window, "scroll", updateFixedOffset); - domUtils.on( - window, - "resize", - baidu.editor.utils.defer(updateFixedOffset, 0, true) - ); - } + function updateFixedOffset() { + var layer = document.getElementById("edui_fixedlayer"); + uiUtils.setViewportOffset(layer, { + left: 0, + top: 0 + }); + // layer.style.display = 'none'; + // layer.style.display = 'block'; + + //#trace: 1354 + // setTimeout(updateFixedOffset); + } + + function bindFixedLayer(adjOffset) { + domUtils.on(window, "scroll", updateFixedOffset); + domUtils.on( + window, + "resize", + baidu.editor.utils.defer(updateFixedOffset, 0, true) + ); + } })(); // ui/uibase.js -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - EventBase = baidu.editor.EventBase, - UIBase = (baidu.editor.ui.UIBase = function() {}); +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + EventBase = baidu.editor.EventBase, + UIBase = (baidu.editor.ui.UIBase = function () { + }); - UIBase.prototype = { - className: "", - uiName: "", - initOptions: function(options) { - var me = this; - for (var k in options) { - me[k] = options[k]; - } - this.id = this.id || "edui" + uiUtils.uid(); - }, - initUIBase: function() { - this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this)); - }, - render: function(holder) { - var html = this.renderHtml(); - var el = uiUtils.createElementByHtml(html); + UIBase.prototype = { + el: null, + className: "", + uiName: "", + initOptions: function (options) { + var me = this; + for (var k in options) { + me[k] = options[k]; + } + this.id = this.id || "edui" + uiUtils.uid(); + }, + initUIBase: function () { + this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this)); + }, + render: function (holder) { + var html = this.renderHtml(); + var el = uiUtils.createElementByHtml(html); - //by xuheng 给每个node添加class - var list = domUtils.getElementsByTagName(el, "*"); - var theme = "edui-" + (this.theme || this.editor.options.theme); - var layer = document.getElementById("edui_fixedlayer"); - for (var i = 0, node; (node = list[i++]); ) { - domUtils.addClass(node, theme); - } - domUtils.addClass(el, theme); - if (layer) { - layer.className = ""; - domUtils.addClass(layer, theme); - } + //by xuheng 给每个node添加class + var list = domUtils.getElementsByTagName(el, "*"); + var theme = "edui-" + (this.theme || this.editor.options.theme); + var layer = document.getElementById("edui_fixedlayer"); + for (var i = 0, node; (node = list[i++]);) { + domUtils.addClass(node, theme); + } + domUtils.addClass(el, theme); + if (layer) { + layer.className = ""; + domUtils.addClass(layer, theme); + } - var seatEl = this.getDom(); - if (seatEl != null) { - seatEl.parentNode.replaceChild(el, seatEl); - uiUtils.copyAttributes(el, seatEl); - } else { - if (typeof holder == "string") { - holder = document.getElementById(holder); + var seatEl = this.getDom(); + if (seatEl != null) { + seatEl.parentNode.replaceChild(el, seatEl); + uiUtils.copyAttributes(el, seatEl); + } else { + if (typeof holder == "string") { + holder = document.getElementById(holder); + } + holder = holder || uiUtils.getFixedLayer(); + // console.log('Uibase.render',holder,el); + domUtils.addClass(holder, theme); + holder.appendChild(el); + } + this.el = el; + this.postRender(); + }, + getDom: function (name) { + if (!name) { + return document.getElementById(this.id); + } else { + return document.getElementById(this.id + "_" + name); + } + }, + postRender: function () { + this.fireEvent("postrender"); + }, + getHtmlTpl: function () { + return ""; + }, + formatHtml: function (tpl) { + var prefix = "edui-" + this.uiName; + return tpl + .replace(/##/g, this.id) + .replace(/%%-/g, this.uiName ? prefix + "-" : "") + .replace(/%%/g, (this.uiName ? prefix : "") + " " + this.className) + .replace(/\$\$/g, this._globalKey); + }, + renderHtml: function () { + return this.formatHtml(this.getHtmlTpl()); + }, + dispose: function () { + var box = this.getDom(); + if (box) baidu.editor.dom.domUtils.remove(box); + uiUtils.unsetGlobal(this.id); + }, + uiIsShow: true, + uiShowStyleBackupValue: null, + uiShow: function (enable) { + if (enable) { + if (this.uiIsShow) { + return; + } + this.getDom().style.display = this.uiShowStyleBackupValue; + this.uiIsShow = true; + } else { + if (!this.uiIsShow) { + return; + } + this.uiShowStyleBackupValue = this.getDom().style.display; + this.getDom().style.display = 'none'; + this.uiIsShow = false; + } } - holder = holder || uiUtils.getFixedLayer(); - // console.log('Uibase.render',holder,el); - domUtils.addClass(holder, theme); - holder.appendChild(el); - } - this.postRender(); - }, - getDom: function(name) { - if (!name) { - return document.getElementById(this.id); - } else { - return document.getElementById(this.id + "_" + name); - } - }, - postRender: function() { - this.fireEvent("postrender"); - }, - getHtmlTpl: function() { - return ""; - }, - formatHtml: function(tpl) { - var prefix = "edui-" + this.uiName; - return tpl - .replace(/##/g, this.id) - .replace(/%%-/g, this.uiName ? prefix + "-" : "") - .replace(/%%/g, (this.uiName ? prefix : "") + " " + this.className) - .replace(/\$\$/g, this._globalKey); - }, - renderHtml: function() { - return this.formatHtml(this.getHtmlTpl()); - }, - dispose: function() { - var box = this.getDom(); - if (box) baidu.editor.dom.domUtils.remove(box); - uiUtils.unsetGlobal(this.id); - } - }; - utils.inherits(UIBase, EventBase); + }; + utils.inherits(UIBase, EventBase); })(); // ui/separator.js -(function() { - var utils = baidu.editor.utils, - UIBase = baidu.editor.ui.UIBase, - Separator = (baidu.editor.ui.Separator = function(options) { - this.initOptions(options); - this.initSeparator(); - }); - Separator.prototype = { - uiName: "separator", - initSeparator: function() { - this.initUIBase(); - }, - getHtmlTpl: function() { - return '
    '; - } - }; - utils.inherits(Separator, UIBase); +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Separator = (baidu.editor.ui.Separator = function (options) { + this.initOptions(options); + this.initSeparator(); + }); + Separator.prototype = { + uiName: "separator", + initSeparator: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return '
    '; + } + }; + utils.inherits(Separator, UIBase); })(); // ui/mask.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - domUtils = baidu.editor.dom.domUtils, - UIBase = baidu.editor.ui.UIBase, - uiUtils = baidu.editor.ui.uiUtils; +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + uiUtils = baidu.editor.ui.uiUtils; - var Mask = (baidu.editor.ui.Mask = function(options) { - this.initOptions(options); - this.initUIBase(); - }); - Mask.prototype = { - getHtmlTpl: function() { - return '
    '; - }, - postRender: function() { - var me = this; - domUtils.on(window, "resize", function() { - setTimeout(function() { - if (!me.isHidden()) { - me._fill(); - } - }); - }); - }, - show: function(zIndex) { - this._fill(); - this.getDom().style.display = ""; - this.getDom().style.zIndex = zIndex; - }, - hide: function() { - this.getDom().style.display = "none"; - this.getDom().style.zIndex = ""; - }, - isHidden: function() { - return this.getDom().style.display == "none"; - }, - _onMouseDown: function() { - return false; - }, - _onClick: function(e, target) { - this.fireEvent("click", e, target); - }, - _fill: function() { - var el = this.getDom(); - var vpRect = uiUtils.getViewportRect(); - el.style.width = vpRect.width + "px"; - el.style.height = vpRect.height + "px"; - } - }; - utils.inherits(Mask, UIBase); + var Mask = (baidu.editor.ui.Mask = function (options) { + this.initOptions(options); + this.initUIBase(); + }); + Mask.prototype = { + getHtmlTpl: function () { + return '
    '; + }, + postRender: function () { + var me = this; + domUtils.on(window, "resize", function () { + setTimeout(function () { + if (!me.isHidden()) { + me._fill(); + } + }); + }); + }, + show: function (zIndex) { + this._fill(); + this.getDom().style.display = ""; + this.getDom().style.zIndex = zIndex; + }, + hide: function () { + this.getDom().style.display = "none"; + this.getDom().style.zIndex = ""; + }, + isHidden: function () { + return this.getDom().style.display == "none"; + }, + _onMouseDown: function () { + return false; + }, + _onClick: function (e, target) { + this.fireEvent("click", e, target); + }, + _fill: function () { + var el = this.getDom(); + var vpRect = uiUtils.getViewportRect(); + el.style.width = vpRect.width + "px"; + el.style.height = vpRect.height + "px"; + } + }; + utils.inherits(Mask, UIBase); })(); // ui/popup.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - domUtils = baidu.editor.dom.domUtils, - UIBase = baidu.editor.ui.UIBase, - Popup = (baidu.editor.ui.Popup = function(options) { - this.initOptions(options); - this.initPopup(); - }); +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = (baidu.editor.ui.Popup = function (options) { + this.initOptions(options); + this.initPopup(); + }); - var allPopups = []; - function closeAllPopup(evt, el) { - for (var i = 0; i < allPopups.length; i++) { - var pop = allPopups[i]; - if (!pop.isHidden()) { - if (pop.queryAutoHide(el) !== false) { - if ( - evt && - /scroll/gi.test(evt.type) && - pop.className == "edui-wordpastepop" - ) - return; - pop.hide(); - } - } - } + var allPopups = []; - if (allPopups.length) pop.editor.fireEvent("afterhidepop"); - } - - Popup.postHide = closeAllPopup; - - var ANCHOR_CLASSES = [ - "edui-anchor-topleft", - "edui-anchor-topright", - "edui-anchor-bottomleft", - "edui-anchor-bottomright" - ]; - Popup.prototype = { - SHADOW_RADIUS: 5, - content: null, - _hidden: false, - autoRender: true, - canSideLeft: true, - canSideUp: true, - initPopup: function() { - this.initUIBase(); - allPopups.push(this); - }, - getHtmlTpl: function() { - return ( - '
    ' + - '
    ' + - ' ' + - '
    ' + - '
    ' + - this.getContentHtmlTpl() + - "
    " + - "
    " + - "
    " - ); - }, - getContentHtmlTpl: function() { - if (this.content) { - if (typeof this.content == "string") { - return this.content; - } - return this.content.renderHtml(); - } else { - return ""; - } - }, - _UIBase_postRender: UIBase.prototype.postRender, - postRender: function() { - if (this.content instanceof UIBase) { - this.content.postRender(); - } - - //捕获鼠标滚轮 - if (this.captureWheel && !this.captured) { - this.captured = true; - - var winHeight = - (document.documentElement.clientHeight || - document.body.clientHeight) - 80, - _height = this.getDom().offsetHeight, - _top = uiUtils.getClientRect(this.combox.getDom()).top, - content = this.getDom("content"), - ifr = this.getDom("body").getElementsByTagName("iframe"), - me = this; - - ifr.length && (ifr = ifr[0]); - - while (_top + _height > winHeight) { - _height -= 30; - } - content.style.height = _height + "px"; - //同步更改iframe高度 - ifr && (ifr.style.height = _height + "px"); - - //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 - domUtils.on( - content, - "onmousewheel" in document.body ? "mousewheel" : "DOMMouseScroll", - function(e) { - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - - if (e.wheelDelta) { - content.scrollTop -= e.wheelDelta / 120 * 60; - } else { - content.scrollTop -= e.detail / -3 * 60; - } + function closeAllPopup(evt, el) { + for (var i = 0; i < allPopups.length; i++) { + var pop = allPopups[i]; + if (!pop.isHidden()) { + if (pop.queryAutoHide(el) !== false) { + if ( + evt && + /scroll/gi.test(evt.type) && + pop.className === "edui-wordpastepop" + ) + return; + pop.hide(); + } } - ); - } - this.fireEvent("postRenderAfter"); - this.hide(true); - this._UIBase_postRender(); - }, - _doAutoRender: function() { - if (!this.getDom() && this.autoRender) { - this.render(); - } - }, - mesureSize: function() { - var box = this.getDom("content"); - return uiUtils.getClientRect(box); - }, - fitSize: function() { - // console.log('fitSize.popup') - if (this.captureWheel && this.sized) { - return this.__size; - } - this.sized = true; - var popBodyEl = this.getDom("body"); - popBodyEl.style.width = ""; - popBodyEl.style.height = ""; - var size = this.mesureSize(); - if (this.captureWheel) { - popBodyEl.style.width = -(-20 - size.width) + "px"; - var height = parseInt(this.getDom("content").style.height, 10); - !window.isNaN(height) && (size.height = height); - } else { - popBodyEl.style.width = size.width + "px"; - } - popBodyEl.style.height = size.height + "px"; - this.__size = size; - this.captureWheel && (this.getDom("content").style.overflow = "auto"); - return size; - }, - showAnchor: function(element, hoz) { - this.showAnchorRect(uiUtils.getClientRect(element), hoz); - }, - showAnchorRect: function(rect, hoz, adj) { - this._doAutoRender(); - var vpRect = uiUtils.getViewportRect(); - this.getDom().style.visibility = "hidden"; - this._show(); - var popSize = this.fitSize(); - - var sideLeft, sideUp, left, top; - if (hoz) { - sideLeft = - this.canSideLeft && - (rect.right + popSize.width > vpRect.right && - rect.left > popSize.width); - sideUp = - this.canSideUp && - (rect.top + popSize.height > vpRect.bottom && - rect.bottom > popSize.height); - left = sideLeft ? rect.left - popSize.width : rect.right; - top = sideUp ? rect.bottom - popSize.height : rect.top; - } else { - sideLeft = - this.canSideLeft && - (rect.right + popSize.width > vpRect.right && - rect.left > popSize.width); - sideUp = - this.canSideUp && - (rect.top + popSize.height > vpRect.bottom && - rect.bottom > popSize.height); - left = sideLeft ? rect.right - popSize.width : rect.left; - top = sideUp ? rect.top - popSize.height : rect.bottom; - } - if(!sideUp){ - if(top + popSize.height > vpRect.bottom){ - top = vpRect.bottom - popSize.height } - } - // console.log('popup.showAnchorRect', vpRect, rect, hoz, sideUp, sideLeft, left, top); - var popEl = this.getDom(); - uiUtils.setViewportOffset(popEl, { - left: left, - top: top - }); - domUtils.removeClasses(popEl, ANCHOR_CLASSES); - popEl.className += - " " + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; - if (this.editor) { - popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; - baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = - popEl.style.zIndex - 1; - } - this.getDom().style.visibility = "visible"; - }, - showAt: function(offset) { - var left = offset.left; - var top = offset.top; - var rect = { - left: left, - top: top, - right: left, - bottom: top, - height: 0, - width: 0 - }; - this.showAnchorRect(rect, false, true); - }, - _show: function() { - if (this._hidden) { - var box = this.getDom(); - box.style.display = ""; - this._hidden = false; - // if (box.setActive) { - // box.setActive(); - // } - this.fireEvent("show"); - } - }, - isHidden: function() { - return this._hidden; - }, - show: function() { - this._doAutoRender(); - this._show(); - }, - hide: function(notNofity) { - if (!this._hidden && this.getDom()) { - this.getDom().style.display = "none"; - this._hidden = true; - if (!notNofity) { - this.fireEvent("hide"); - } - } - }, - queryAutoHide: function(el) { - return !el || !uiUtils.contains(this.getDom(), el); + if (allPopups.length) pop.editor.fireEvent("afterhidepop"); } - }; - utils.inherits(Popup, UIBase); - domUtils.on(document, "mousedown", function(evt) { - var el = evt.target || evt.srcElement; - closeAllPopup(evt, el); - }); - domUtils.on(window, "scroll", function(evt, el) { - closeAllPopup(evt, el); - }); + Popup.postHide = closeAllPopup; + + var ANCHOR_CLASSES = [ + "edui-anchor-topleft", + "edui-anchor-topright", + "edui-anchor-bottomleft", + "edui-anchor-bottomright" + ]; + Popup.prototype = { + SHADOW_RADIUS: 5, + content: null, + _hidden: false, + autoRender: true, + canSideLeft: true, + canSideUp: true, + initPopup: function () { + this.initUIBase(); + allPopups.push(this); + }, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + this.getContentHtmlTpl() + + "
    " + + "
    " + + "
    " + ); + }, + getContentHtmlTpl: function () { + if (this.content) { + if (typeof this.content == "string") { + return this.content; + } + return this.content.renderHtml(); + } else { + return ""; + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function () { + if (this.content instanceof UIBase) { + this.content.postRender(); + } + + //捕获鼠标滚轮 + if (this.captureWheel && !this.captured) { + this.captured = true; + + var winHeight = + (document.documentElement.clientHeight || + document.body.clientHeight) - 80, + _height = this.getDom().offsetHeight, + _top = uiUtils.getClientRect(this.combox.getDom()).top, + content = this.getDom("content"), + ifr = this.getDom("body").getElementsByTagName("iframe"), + me = this; + + ifr.length && (ifr = ifr[0]); + + while (_top + _height > winHeight) { + _height -= 30; + } + content.style.height = _height + "px"; + //同步更改iframe高度 + ifr && (ifr.style.height = _height + "px"); + + //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 + domUtils.on( + content, + "onmousewheel" in document.body ? "mousewheel" : "DOMMouseScroll", + function (e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + + if (e.wheelDelta) { + content.scrollTop -= e.wheelDelta / 120 * 60; + } else { + content.scrollTop -= e.detail / -3 * 60; + } + } + ); + } + this.fireEvent("postRenderAfter"); + this.hide(true); + this._UIBase_postRender(); + }, + _doAutoRender: function () { + if (!this.getDom() && this.autoRender) { + this.render(); + } + }, + mesureSize: function () { + var box = this.getDom("content"); + return uiUtils.getClientRect(box); + }, + fitSize: function () { + // console.log('fitSize.popup') + if (this.captureWheel && this.sized) { + return this.__size; + } + this.sized = true; + var popBodyEl = this.getDom("body"); + popBodyEl.style.width = ""; + popBodyEl.style.height = ""; + var size = this.mesureSize(); + if (this.captureWheel) { + popBodyEl.style.width = -(-20 - size.width) + "px"; + var height = parseInt(this.getDom("content").style.height, 10); + !window.isNaN(height) && (size.height = height); + } else { + popBodyEl.style.width = size.width + "px"; + } + popBodyEl.style.height = size.height + "px"; + this.__size = size; + this.captureWheel && (this.getDom("content").style.overflow = "auto"); + return size; + }, + showAnchor: function (element, hoz) { + this.showAnchorRect(uiUtils.getClientRect(element), hoz); + }, + showAnchorRect: function (rect, hoz, adj) { + this._doAutoRender(); + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.visibility = "hidden"; + this._show(); + var popSize = this.fitSize(); + + var sideLeft, sideUp, left, top; + if (hoz) { + sideLeft = + this.canSideLeft && + (rect.right + popSize.width > vpRect.right && + rect.left > popSize.width); + sideUp = + this.canSideUp && + (rect.top + popSize.height > vpRect.bottom && + rect.bottom > popSize.height); + left = sideLeft ? rect.left - popSize.width : rect.right; + top = sideUp ? rect.bottom - popSize.height : rect.top; + } else { + sideLeft = + this.canSideLeft && + (rect.right + popSize.width > vpRect.right && + rect.left > popSize.width); + sideUp = + this.canSideUp && + (rect.top + popSize.height > vpRect.bottom && + rect.bottom > popSize.height); + left = sideLeft ? rect.right - popSize.width : rect.left; + top = sideUp ? rect.top - popSize.height : rect.bottom; + } + if (!sideUp) { + if (top + popSize.height > vpRect.bottom) { + top = vpRect.bottom - popSize.height + } + } + // console.log('popup.showAnchorRect', vpRect, rect, hoz, sideUp, sideLeft, left, top); + + var popEl = this.getDom(); + uiUtils.setViewportOffset(popEl, { + left: left, + top: top + }); + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + popEl.className += + " " + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; + if (this.editor) { + popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = + popEl.style.zIndex - 1; + } + this.getDom().style.visibility = "visible"; + }, + showAt: function (offset) { + var left = offset.left; + var top = offset.top; + var rect = { + left: left, + top: top, + right: left, + bottom: top, + height: 0, + width: 0 + }; + this.showAnchorRect(rect, false, true); + }, + _show: function () { + if (this._hidden) { + var box = this.getDom(); + box.style.display = ""; + this._hidden = false; + // if (box.setActive) { + // box.setActive(); + // } + this.fireEvent("show"); + } + }, + isHidden: function () { + return this._hidden; + }, + show: function () { + this._doAutoRender(); + this._show(); + }, + hide: function (notNofity) { + if (!this._hidden && this.getDom()) { + this.getDom().style.display = "none"; + this._hidden = true; + if (!notNofity) { + this.fireEvent("hide"); + } + } + }, + queryAutoHide: function (el) { + return !el || !uiUtils.contains(this.getDom(), el); + } + }; + utils.inherits(Popup, UIBase); + + domUtils.on(document, "mousedown", function (evt) { + var el = evt.target || evt.srcElement; + closeAllPopup(evt, el); + }); + domUtils.on(window, "scroll", function (evt, el) { + closeAllPopup(evt, el); + }); })(); // ui/colorpicker.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - UIBase = baidu.editor.ui.UIBase, - ColorPicker = (baidu.editor.ui.ColorPicker = function(options) { - this.initOptions(options); - this.noColorText = this.noColorText || this.editor.getLang("clearColor"); - this.initUIBase(); - }); +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + ColorPicker = (baidu.editor.ui.ColorPicker = function (options) { + this.initOptions(options); + this.noColorText = this.noColorText || this.editor.getLang("clearColor"); + this.initUIBase(); + }); - ColorPicker.prototype = { - getHtmlTpl: function() { - return genColorPicker(this.noColorText, this.editor); - }, - _onTableClick: function(evt) { - var tgt = evt.target || evt.srcElement; - var color = tgt.getAttribute("data-color"); - if (color) { - this.fireEvent("pickcolor", color); - } - }, - _onTableOver: function(evt) { - var tgt = evt.target || evt.srcElement; - var color = tgt.getAttribute("data-color"); - if (color) { - this.getDom("preview").style.backgroundColor = color; - } - }, - _onTableOut: function() { - this.getDom("preview").style.backgroundColor = ""; - }, - _onPickNoColor: function() { - this.fireEvent("picknocolor"); + ColorPicker.prototype = { + getHtmlTpl: function () { + return genColorPicker(this.noColorText, this.editor); + }, + _onTableClick: function (evt) { + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute("data-color"); + if (color) { + this.fireEvent("pickcolor", color); + } + }, + _onTableOver: function (evt) { + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute("data-color"); + if (color) { + this.getDom("preview").style.backgroundColor = color; + } + }, + _onTableOut: function () { + this.getDom("preview").style.backgroundColor = ""; + }, + _onPickNoColor: function () { + this.fireEvent("picknocolor"); + }, + _onColorSelect: function (evt) { + var input = evt.target || evt.srcElement; + var color = input.value; + if (color) { + this.fireEvent("pickcolor", color); + } + } + }; + utils.inherits(ColorPicker, UIBase); + + var COLORS = ("ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646," + + "f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada," + + "d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5," + + "bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f," + + "a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09," + + "7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806," + + "c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,").split( + "," + ); + + function genColorPicker(noColorText, editor) { + var html = + '
    ' + + '
    ' + + // '
    ' + + '
    ' + + '
    ' + + noColorText + + "
    " + + "
    " + + '' + + '" + + ''; + for (var i = 0; i < COLORS.length; i++) { + if (i && i % 10 === 0) { + html += + "" + + (i == 60 + ? '" + : "") + + ""; + } + html += i < 70 + ? '" + : ""; + } + html += ""; + html += "
    ' + + editor.getLang("themeColor") + + "
    ' + + editor.getLang("standardColor") + + "
    "; + return html; } - }; - utils.inherits(ColorPicker, UIBase); - - var COLORS = ("ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646," + - "f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada," + - "d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5," + - "bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f," + - "a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09," + - "7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806," + - "c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,").split( - "," - ); - - function genColorPicker(noColorText, editor) { - var html = - '
    ' + - '
    ' + - '
    ' + - '
    ' + - noColorText + - "
    " + - "
    " + - '' + - '" + - ''; - for (var i = 0; i < COLORS.length; i++) { - if (i && i % 10 === 0) { - html += - "" + - (i == 60 - ? '" - : "") + - ""; - } - html += i < 70 - ? '" - : ""; - } - html += "
    ' + - editor.getLang("themeColor") + - "
    ' + - editor.getLang("standardColor") + - "
    = 60 - ? "border-width:1px;" - : i >= 10 && i < 20 - ? "border-width:1px 1px 0 1px;" - : "border-width:0 1px 0 1px;") + - '"' + - ">
    "; - return html; - } })(); // ui/tablepicker.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - UIBase = baidu.editor.ui.UIBase; +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; - var TablePicker = (baidu.editor.ui.TablePicker = function(options) { - this.initOptions(options); - this.initTablePicker(); - }); - TablePicker.prototype = { - defaultNumRows: 10, - defaultNumCols: 10, - maxNumRows: 20, - maxNumCols: 20, - numRows: 10, - numCols: 10, - lengthOfCellSide: 22, - initTablePicker: function() { - this.initUIBase(); - }, - getHtmlTpl: function() { - var me = this; - return ( - '
    ' + - '
    ' + - '
    ' + - '' + - "
    " + - '
    " + - '
    ' + - "
    " + - "
    " + - "
    " - ); - }, - _UIBase_render: UIBase.prototype.render, - render: function(holder) { - this._UIBase_render(holder); - this.getDom("label").innerHTML = - "0" + - this.editor.getLang("t_row") + - " x 0" + - this.editor.getLang("t_col"); - }, - _track: function(numCols, numRows) { - var style = this.getDom("overlay").style; - var sideLen = this.lengthOfCellSide; - style.width = numCols * sideLen + "px"; - style.height = numRows * sideLen + "px"; - var label = this.getDom("label"); - label.innerHTML = - numCols + - this.editor.getLang("t_col") + - " x " + - numRows + - this.editor.getLang("t_row"); - this.numCols = numCols; - this.numRows = numRows; - }, - _onMouseOver: function(evt, el) { - var rel = evt.relatedTarget || evt.fromElement; - if (!uiUtils.contains(el, rel) && el !== rel) { - this.getDom("label").innerHTML = - "0" + - this.editor.getLang("t_col") + - " x 0" + - this.editor.getLang("t_row"); - this.getDom("overlay").style.visibility = ""; - } - }, - _onMouseOut: function(evt, el) { - var rel = evt.relatedTarget || evt.toElement; - if (!uiUtils.contains(el, rel) && el !== rel) { - this.getDom("label").innerHTML = - "0" + - this.editor.getLang("t_col") + - " x 0" + - this.editor.getLang("t_row"); - this.getDom("overlay").style.visibility = "hidden"; - } - }, - _onMouseMove: function(evt, el) { - var style = this.getDom("overlay").style; - var offset = uiUtils.getEventOffset(evt); - var sideLen = this.lengthOfCellSide; - var numCols = Math.ceil(offset.left / sideLen); - var numRows = Math.ceil(offset.top / sideLen); - this._track(numCols, numRows); - }, - _onClick: function() { - this.fireEvent("picktable", this.numCols, this.numRows); - } - }; - utils.inherits(TablePicker, UIBase); + var TablePicker = (baidu.editor.ui.TablePicker = function (options) { + this.initOptions(options); + this.initTablePicker(); + }); + TablePicker.prototype = { + defaultNumRows: 10, + defaultNumCols: 10, + maxNumRows: 20, + maxNumCols: 20, + numRows: 10, + numCols: 10, + lengthOfCellSide: 22, + initTablePicker: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + var me = this; + return ( + '
    ' + + '
    ' + + '
    ' + + '' + + "
    " + + '
    " + + '
    ' + + "
    " + + "
    " + + "
    " + ); + }, + _UIBase_render: UIBase.prototype.render, + render: function (holder) { + this._UIBase_render(holder); + this.getDom("label").innerHTML = + "0" + + this.editor.getLang("t_row") + + " x 0" + + this.editor.getLang("t_col"); + }, + _track: function (numCols, numRows) { + var style = this.getDom("overlay").style; + var sideLen = this.lengthOfCellSide; + style.width = numCols * sideLen + "px"; + style.height = numRows * sideLen + "px"; + var label = this.getDom("label"); + label.innerHTML = + numCols + + this.editor.getLang("t_col") + + " x " + + numRows + + this.editor.getLang("t_row"); + this.numCols = numCols; + this.numRows = numRows; + }, + _onMouseOver: function (evt, el) { + var rel = evt.relatedTarget || evt.fromElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom("label").innerHTML = + "0" + + this.editor.getLang("t_col") + + " x 0" + + this.editor.getLang("t_row"); + this.getDom("overlay").style.visibility = ""; + } + }, + _onMouseOut: function (evt, el) { + var rel = evt.relatedTarget || evt.toElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom("label").innerHTML = + "0" + + this.editor.getLang("t_col") + + " x 0" + + this.editor.getLang("t_row"); + this.getDom("overlay").style.visibility = "hidden"; + } + }, + _onMouseMove: function (evt, el) { + var style = this.getDom("overlay").style; + var offset = uiUtils.getEventOffset(evt); + var sideLen = this.lengthOfCellSide; + var numCols = Math.ceil(offset.left / sideLen); + var numRows = Math.ceil(offset.top / sideLen); + this._track(numCols, numRows); + }, + _onClick: function () { + this.fireEvent("picktable", this.numCols, this.numRows); + } + }; + utils.inherits(TablePicker, UIBase); })(); // ui/stateful.js -(function() { - var browser = baidu.editor.browser, - domUtils = baidu.editor.dom.domUtils, - uiUtils = baidu.editor.ui.uiUtils; +(function () { + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils; - var TPL_STATEFUL = - 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + - ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + - (browser.ie - ? ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + - ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' - : ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + - ' onmouseout="$$.Stateful_onMouseOut(event, this);"'); + var TPL_STATEFUL = + 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + + (browser.ie + ? ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' + : ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + + ' onmouseout="$$.Stateful_onMouseOut(event, this);"'); - baidu.editor.ui.Stateful = { - alwalysHoverable: false, - target: null, //目标元素和this指向dom不一样 - Stateful_init: function() { - this._Stateful_dGetHtmlTpl = this.getHtmlTpl; - this.getHtmlTpl = this.Stateful_getHtmlTpl; - }, - Stateful_getHtmlTpl: function() { - var tpl = this._Stateful_dGetHtmlTpl(); - // 使用function避免$转义 - return tpl.replace(/stateful/g, function() { - return TPL_STATEFUL; - }); - }, - Stateful_onMouseEnter: function(evt, el) { - this.target = el; - if (!this.isDisabled() || this.alwalysHoverable) { - this.addState("hover"); - this.fireEvent("over"); - } - }, - Stateful_onMouseLeave: function(evt, el) { - if (!this.isDisabled() || this.alwalysHoverable) { - this.removeState("hover"); - this.removeState("active"); - this.fireEvent("out"); - } - }, - Stateful_onMouseOver: function(evt, el) { - var rel = evt.relatedTarget; - if (!uiUtils.contains(el, rel) && el !== rel) { - this.Stateful_onMouseEnter(evt, el); - } - }, - Stateful_onMouseOut: function(evt, el) { - var rel = evt.relatedTarget; - if (!uiUtils.contains(el, rel) && el !== rel) { - this.Stateful_onMouseLeave(evt, el); - } - }, - Stateful_onMouseDown: function(evt, el) { - if (!this.isDisabled()) { - this.addState("active"); - } - }, - Stateful_onMouseUp: function(evt, el) { - if (!this.isDisabled()) { - this.removeState("active"); - } - }, - Stateful_postRender: function() { - if (this.disabled && !this.hasState("disabled")) { - this.addState("disabled"); - } - }, - hasState: function(state) { - return domUtils.hasClass(this.getStateDom(), "edui-state-" + state); - }, - addState: function(state) { - if (!this.hasState(state)) { - this.getStateDom().className += " edui-state-" + state; - } - }, - removeState: function(state) { - if (this.hasState(state)) { - domUtils.removeClasses(this.getStateDom(), ["edui-state-" + state]); - } - }, - getStateDom: function() { - return this.getDom("state"); - }, - isChecked: function() { - return this.hasState("checked"); - }, - setChecked: function(checked) { - if (!this.isDisabled() && checked) { - this.addState("checked"); - } else { - this.removeState("checked"); - } - }, - isDisabled: function() { - return this.hasState("disabled"); - }, - setDisabled: function(disabled) { - if (disabled) { - this.removeState("hover"); - this.removeState("checked"); - this.removeState("active"); - this.addState("disabled"); - } else { - this.removeState("disabled"); - } - } - }; + baidu.editor.ui.Stateful = { + alwalysHoverable: false, + target: null, //目标元素和this指向dom不一样 + Stateful_init: function () { + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + this.getHtmlTpl = this.Stateful_getHtmlTpl; + }, + Stateful_getHtmlTpl: function () { + var tpl = this._Stateful_dGetHtmlTpl(); + // 使用function避免$转义 + return tpl.replace(/stateful/g, function () { + return TPL_STATEFUL; + }); + }, + Stateful_onMouseEnter: function (evt, el) { + this.target = el; + if (!this.isDisabled() || this.alwalysHoverable) { + this.addState("hover"); + this.fireEvent("over"); + } + }, + Stateful_onMouseLeave: function (evt, el) { + if (!this.isDisabled() || this.alwalysHoverable) { + this.removeState("hover"); + this.removeState("active"); + this.fireEvent("out"); + } + }, + Stateful_onMouseOver: function (evt, el) { + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseEnter(evt, el); + } + }, + Stateful_onMouseOut: function (evt, el) { + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseLeave(evt, el); + } + }, + Stateful_onMouseDown: function (evt, el) { + if (!this.isDisabled()) { + this.addState("active"); + } + }, + Stateful_onMouseUp: function (evt, el) { + if (!this.isDisabled()) { + this.removeState("active"); + } + }, + Stateful_postRender: function () { + if (this.disabled && !this.hasState("disabled")) { + this.addState("disabled"); + } + }, + hasState: function (state) { + return domUtils.hasClass(this.getStateDom(), "edui-state-" + state); + }, + addState: function (state) { + if (!this.hasState(state)) { + this.getStateDom().className += " edui-state-" + state; + } + }, + removeState: function (state) { + if (this.hasState(state)) { + domUtils.removeClasses(this.getStateDom(), ["edui-state-" + state]); + } + }, + getStateDom: function () { + return this.getDom("state"); + }, + isChecked: function () { + return this.hasState("checked"); + }, + setChecked: function (checked) { + if (!this.isDisabled() && checked) { + this.addState("checked"); + } else { + this.removeState("checked"); + } + }, + isDisabled: function () { + return this.hasState("disabled"); + }, + setDisabled: function (disabled) { + if (disabled) { + this.removeState("hover"); + this.removeState("checked"); + this.removeState("active"); + this.addState("disabled"); + } else { + this.removeState("disabled"); + } + } + }; })(); @@ -28232,82 +32059,82 @@ UE.ui = baidu.editor.ui = {}; ///import core ///import uicore ///import ui/stateful.js -(function() { - var utils = baidu.editor.utils, - UIBase = baidu.editor.ui.UIBase, - Stateful = baidu.editor.ui.Stateful, - Button = (baidu.editor.ui.Button = function(options) { - if (options.name) { - var btnName = options.name; - var cssRules = options.cssRules; - if (!options.className) { - options.className = "edui-for-" + btnName; +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + Button = (baidu.editor.ui.Button = function (options) { + if (options.name) { + var btnName = options.name; + var cssRules = options.cssRules; + if (!options.className) { + options.className = "edui-for-" + btnName; + } + options.cssRules = + ".edui-" + + (options.theme || "default") + + " .edui-toolbar .edui-button.edui-for-" + + btnName + + " .edui-icon {" + + cssRules + + "}"; + } + this.initOptions(options); + this.initButton(); + }); + Button.prototype = { + uiName: "button", + label: "", + title: "", + showIcon: true, + showText: true, + cssRules: "", + initButton: function () { + this.initUIBase(); + this.Stateful_init(); + if (this.cssRules) { + utils.cssRule("edui-customize-" + this.name + "-style", this.cssRules); + } + }, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ' + + '
    ' + + (this.showIcon ? '
    ' : "") + + (this.showText + ? '
    ' + this.label + "
    " + : "") + + "
    " + + "
    " + + "
    " + ); + }, + postRender: function () { + this.Stateful_postRender(); + this.setDisabled(this.disabled); + }, + _onMouseDown: function (e) { + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == "input" || tagName == "object" || tagName == "object") { + return false; + } + }, + _onClick: function () { + if (!this.isDisabled()) { + this.fireEvent("click"); + } + }, + setTitle: function (text) { + var label = this.getDom("label"); + label.innerHTML = text; } - options.cssRules = - ".edui-" + - (options.theme || "default") + - " .edui-toolbar .edui-button.edui-for-" + - btnName + - " .edui-icon {" + - cssRules + - "}"; - } - this.initOptions(options); - this.initButton(); - }); - Button.prototype = { - uiName: "button", - label: "", - title: "", - showIcon: true, - showText: true, - cssRules: "", - initButton: function() { - this.initUIBase(); - this.Stateful_init(); - if (this.cssRules) { - utils.cssRule("edui-customize-" + this.name + "-style", this.cssRules); - } - }, - getHtmlTpl: function() { - return ( - '
    ' + - '
    ' + - '
    ' + - (this.showIcon ? '
    ' : "") + - (this.showText - ? '
    ' + this.label + "
    " - : "") + - "
    " + - "
    " + - "
    " - ); - }, - postRender: function() { - this.Stateful_postRender(); - this.setDisabled(this.disabled); - }, - _onMouseDown: function(e) { - var target = e.target || e.srcElement, - tagName = target && target.tagName && target.tagName.toLowerCase(); - if (tagName == "input" || tagName == "object" || tagName == "object") { - return false; - } - }, - _onClick: function() { - if (!this.isDisabled()) { - this.fireEvent("click"); - } - }, - setTitle: function(text) { - var label = this.getDom("label"); - label.innerHTML = text; - } - }; - utils.inherits(Button, UIBase); - utils.extend(Button.prototype, Stateful); + }; + utils.inherits(Button, UIBase); + utils.extend(Button.prototype, Stateful); })(); @@ -28315,101 +32142,101 @@ UE.ui = baidu.editor.ui = {}; ///import core ///import uicore ///import ui/stateful.js -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - domUtils = baidu.editor.dom.domUtils, - UIBase = baidu.editor.ui.UIBase, - Stateful = baidu.editor.ui.Stateful, - SplitButton = (baidu.editor.ui.SplitButton = function(options) { - this.initOptions(options); - this.initSplitButton(); - }); - SplitButton.prototype = { - popup: null, - uiName: "splitbutton", - title: "", - initSplitButton: function() { - this.initUIBase(); - this.Stateful_init(); - var me = this; - if (this.popup != null) { - var popup = this.popup; - this.popup = null; - this.setPopup(popup); - } - }, - _UIBase_postRender: UIBase.prototype.postRender, - postRender: function() { - this.Stateful_postRender(); - this._UIBase_postRender(); - }, - setPopup: function(popup) { - if (this.popup === popup) return; - if (this.popup != null) { - this.popup.dispose(); - } - popup.addListener("show", utils.bind(this._onPopupShow, this)); - popup.addListener("hide", utils.bind(this._onPopupHide, this)); - popup.addListener( - "postrender", - utils.bind(function() { - popup - .getDom("body") - .appendChild( - uiUtils.createElementByHtml( - '
    ' - ) +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + SplitButton = (baidu.editor.ui.SplitButton = function (options) { + this.initOptions(options); + this.initSplitButton(); + }); + SplitButton.prototype = { + popup: null, + uiName: "splitbutton", + title: "", + initSplitButton: function () { + this.initUIBase(); + this.Stateful_init(); + var me = this; + if (this.popup != null) { + var popup = this.popup; + this.popup = null; + this.setPopup(popup); + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function () { + this.Stateful_postRender(); + this._UIBase_postRender(); + }, + setPopup: function (popup) { + if (this.popup === popup) return; + if (this.popup != null) { + this.popup.dispose(); + } + popup.addListener("show", utils.bind(this._onPopupShow, this)); + popup.addListener("hide", utils.bind(this._onPopupHide, this)); + popup.addListener( + "postrender", + utils.bind(function () { + popup + .getDom("body") + .appendChild( + uiUtils.createElementByHtml( + '
    ' + ) + ); + popup.getDom().className += " " + this.className; + }, this) ); - popup.getDom().className += " " + this.className; - }, this) - ); - this.popup = popup; - }, - _onPopupShow: function() { - this.addState("opened"); - }, - _onPopupHide: function() { - this.removeState("opened"); - }, - getHtmlTpl: function() { - return ( - '
    ' + - "
    ' + - '
    ' + - '
    ' + - "
    " + - '
    ' + - '
    ' + - "
    " - ); - }, - showPopup: function() { - // 当popup往上弹出的时候,做特殊处理 - var rect = uiUtils.getClientRect(this.getDom()); - rect.top -= this.popup.SHADOW_RADIUS; - rect.height += this.popup.SHADOW_RADIUS; - this.popup.showAnchorRect(rect); - }, - _onArrowClick: function(event, el) { - if (!this.isDisabled()) { - this.showPopup(); - } - }, - _onButtonClick: function() { - if (!this.isDisabled()) { - this.fireEvent("buttonclick"); - } - } - }; - utils.inherits(SplitButton, UIBase); - utils.extend(SplitButton.prototype, Stateful, true); + this.popup = popup; + }, + _onPopupShow: function () { + this.addState("opened"); + }, + _onPopupHide: function () { + this.removeState("opened"); + }, + getHtmlTpl: function () { + return ( + '
    ' + + "
    ' + + '
    ' + + '
    ' + + "
    " + + '
    ' + + '
    ' + + "
    " + ); + }, + showPopup: function () { + // 当popup往上弹出的时候,做特殊处理 + var rect = uiUtils.getClientRect(this.getDom()); + rect.top -= this.popup.SHADOW_RADIUS; + rect.height += this.popup.SHADOW_RADIUS; + this.popup.showAnchorRect(rect); + }, + _onArrowClick: function (event, el) { + if (!this.isDisabled()) { + this.showPopup(); + } + }, + _onButtonClick: function () { + if (!this.isDisabled()) { + this.fireEvent("buttonclick"); + } + } + }; + utils.inherits(SplitButton, UIBase); + utils.extend(SplitButton.prototype, Stateful, true); })(); @@ -28419,61 +32246,61 @@ UE.ui = baidu.editor.ui = {}; ///import ui/colorpicker.js ///import ui/popup.js ///import ui/splitbutton.js -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - ColorPicker = baidu.editor.ui.ColorPicker, - Popup = baidu.editor.ui.Popup, - SplitButton = baidu.editor.ui.SplitButton, - ColorButton = (baidu.editor.ui.ColorButton = function(options) { - this.initOptions(options); - this.initColorButton(); - }); - ColorButton.prototype = { - initColorButton: function() { - var me = this; - this.popup = new Popup({ - content: new ColorPicker({ - noColorText: me.editor.getLang("clearColor"), - editor: me.editor, - onpickcolor: function(t, color) { - me._onPickColor(color); - }, - onpicknocolor: function(t, color) { - me._onPickNoColor(color); - } - }), - editor: me.editor - }); - this.initSplitButton(); - }, - _SplitButton_postRender: SplitButton.prototype.postRender, - postRender: function() { - this._SplitButton_postRender(); - this.getDom("button_body").appendChild( - uiUtils.createElementByHtml( - '
    ' - ) - ); - this.getDom().className += " edui-colorbutton"; - }, - setColor: function(color) { - this.getDom("colorlump").style.backgroundColor = color; - this.color = color; - }, - _onPickColor: function(color) { - if (this.fireEvent("pickcolor", color) !== false) { - this.setColor(color); - this.popup.hide(); - } - }, - _onPickNoColor: function(color) { - if (this.fireEvent("picknocolor") !== false) { - this.popup.hide(); - } - } - }; - utils.inherits(ColorButton, SplitButton); +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + ColorPicker = baidu.editor.ui.ColorPicker, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + ColorButton = (baidu.editor.ui.ColorButton = function (options) { + this.initOptions(options); + this.initColorButton(); + }); + ColorButton.prototype = { + initColorButton: function () { + var me = this; + this.popup = new Popup({ + content: new ColorPicker({ + noColorText: me.editor.getLang("clearColor"), + editor: me.editor, + onpickcolor: function (t, color) { + me._onPickColor(color); + }, + onpicknocolor: function (t, color) { + me._onPickNoColor(color); + } + }), + editor: me.editor + }); + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function () { + this._SplitButton_postRender(); + this.getDom("button_body").appendChild( + uiUtils.createElementByHtml( + '
    ' + ) + ); + this.getDom().className += " edui-colorbutton"; + }, + setColor: function (color) { + this.getDom("colorlump").style.backgroundColor = color; + this.color = color; + }, + _onPickColor: function (color) { + if (this.fireEvent("pickcolor", color) !== false) { + this.setColor(color); + this.popup.hide(); + } + }, + _onPickNoColor: function (color) { + if (this.fireEvent("picknocolor") !== false) { + this.popup.hide(); + } + }, + }; + utils.inherits(ColorButton, SplitButton); })(); @@ -28483,209 +32310,209 @@ UE.ui = baidu.editor.ui = {}; ///import ui/popup.js ///import ui/tablepicker.js ///import ui/splitbutton.js -(function() { - var utils = baidu.editor.utils, - Popup = baidu.editor.ui.Popup, - TablePicker = baidu.editor.ui.TablePicker, - SplitButton = baidu.editor.ui.SplitButton, - TableButton = (baidu.editor.ui.TableButton = function(options) { - this.initOptions(options); - this.initTableButton(); - }); - TableButton.prototype = { - initTableButton: function() { - var me = this; - this.popup = new Popup({ - content: new TablePicker({ - editor: me.editor, - onpicktable: function(t, numCols, numRows) { - me._onPickTable(numCols, numRows); - } - }), - editor: me.editor - }); - this.initSplitButton(); - }, - _onPickTable: function(numCols, numRows) { - if (this.fireEvent("picktable", numCols, numRows) !== false) { - this.popup.hide(); - } - } - }; - utils.inherits(TableButton, SplitButton); +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + TablePicker = baidu.editor.ui.TablePicker, + SplitButton = baidu.editor.ui.SplitButton, + TableButton = (baidu.editor.ui.TableButton = function (options) { + this.initOptions(options); + this.initTableButton(); + }); + TableButton.prototype = { + initTableButton: function () { + var me = this; + this.popup = new Popup({ + content: new TablePicker({ + editor: me.editor, + onpicktable: function (t, numCols, numRows) { + me._onPickTable(numCols, numRows); + } + }), + editor: me.editor + }); + this.initSplitButton(); + }, + _onPickTable: function (numCols, numRows) { + if (this.fireEvent("picktable", numCols, numRows) !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(TableButton, SplitButton); })(); // ui/autotypesetpicker.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - UIBase = baidu.editor.ui.UIBase; +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase; - var AutoTypeSetPicker = (baidu.editor.ui.AutoTypeSetPicker = function( - options - ) { - this.initOptions(options); - this.initAutoTypeSetPicker(); - }); - AutoTypeSetPicker.prototype = { - initAutoTypeSetPicker: function() { - this.initUIBase(); - }, - getHtmlTpl: function() { - var me = this.editor, - opt = me.options.autotypeset, - lang = me.getLang("autoTypeSet"); + var AutoTypeSetPicker = (baidu.editor.ui.AutoTypeSetPicker = function ( + options + ) { + this.initOptions(options); + this.initAutoTypeSetPicker(); + }); + AutoTypeSetPicker.prototype = { + initAutoTypeSetPicker: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + var me = this.editor, + opt = me.options.autotypeset, + lang = me.getLang("autoTypeSet"); - var textAlignInputName = "textAlignValue" + me.uid, - imageBlockInputName = "imageBlockLineValue" + me.uid, - symbolConverInputName = "symbolConverValue" + me.uid; + var textAlignInputName = "textAlignValue" + me.uid, + imageBlockInputName = "imageBlockLineValue" + me.uid, + symbolConverInputName = "symbolConverValue" + me.uid; - return ( - '
    ' + - '
    ' + - "" + - '" + - '" + - "" + - '" + - '" + - "" + - "" + - '" + - '" + - "" + - '" + - '" + - '" + - "" + - '" + - '" + - '" + - "" + - "
    " + - lang.mergeLine + - '" + - lang.delLine + - "
    " + - lang.removeFormat + - '" + - lang.indent + - "
    " + - lang.alignment + - "' + - '" + - me.getLang("justifyleft") + - '" + - me.getLang("justifycenter") + - '" + - me.getLang("justifyright") + - "
    " + - lang.imageFloat + - "' + - '" + - me.getLang("default") + - '" + - me.getLang("justifyleft") + - '" + - me.getLang("justifycenter") + - '" + - me.getLang("justifyright") + - "
    " + - lang.removeFontsize + - '" + - lang.removeFontFamily + - "
    " + - lang.removeHtml + - "
    " + - lang.pasteFilter + - "
    " + - lang.symbol + - "' + - '" + - lang.bdc2sb + - '" + - lang.tobdc + - "" + - "
    " + - "
    " + - "
    " - ); - }, - _UIBase_render: UIBase.prototype.render - }; - utils.inherits(AutoTypeSetPicker, UIBase); + return ( + '
    ' + + '
    ' + + "" + + '" + + '" + + "" + + '" + + '" + + "" + + "" + + '" + + '" + + "" + + '" + + '" + + '" + + "" + + '" + + '" + + '" + + "" + + "
    " + + lang.mergeLine + + '" + + lang.delLine + + "
    " + + lang.removeFormat + + '" + + lang.indent + + "
    " + + lang.alignment + + "' + + '" + + me.getLang("justifyleft") + + '" + + me.getLang("justifycenter") + + '" + + me.getLang("justifyright") + + "
    " + + lang.imageFloat + + "' + + '" + + me.getLang("default") + + '" + + me.getLang("justifyleft") + + '" + + me.getLang("justifycenter") + + '" + + me.getLang("justifyright") + + "
    " + + lang.removeFontsize + + '" + + lang.removeFontFamily + + "
    " + + lang.removeHtml + + "
    " + + lang.pasteFilter + + "
    " + + lang.symbol + + "' + + '" + + lang.bdc2sb + + '" + + lang.tobdc + + "" + + "
    " + + "
    " + + "
    " + ); + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(AutoTypeSetPicker, UIBase); })(); @@ -28695,379 +32522,675 @@ UE.ui = baidu.editor.ui = {}; ///import ui/popup.js ///import ui/autotypesetpicker.js ///import ui/splitbutton.js -(function() { - var utils = baidu.editor.utils, - Popup = baidu.editor.ui.Popup, - AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, - SplitButton = baidu.editor.ui.SplitButton, - AutoTypeSetButton = (baidu.editor.ui.AutoTypeSetButton = function(options) { - this.initOptions(options); - this.initAutoTypeSetButton(); - }); - function getPara(me) { - var opt = {}, - cont = me.getDom(), - editorId = me.editor.uid, - inputType = null, - attrName = null, - ipts = domUtils.getElementsByTagName(cont, "input"); - for (var i = ipts.length - 1, ipt; (ipt = ipts[i--]); ) { - inputType = ipt.getAttribute("type"); - if (inputType == "checkbox") { - attrName = ipt.getAttribute("name"); - opt[attrName] && delete opt[attrName]; - if (ipt.checked) { - var attrValue = document.getElementById( - attrName + "Value" + editorId - ); - if (attrValue) { - if (/input/gi.test(attrValue.tagName)) { - opt[attrName] = attrValue.value; - } else { - var iptChilds = attrValue.getElementsByTagName("input"); - for ( - var j = iptChilds.length - 1, iptchild; - (iptchild = iptChilds[j--]); - - ) { - if (iptchild.checked) { - opt[attrName] = iptchild.value; - break; - } - } - } - } else { - opt[attrName] = true; - } - } else { - opt[attrName] = false; - } - } else { - opt[ipt.getAttribute("value")] = ipt.checked; - } - } - - var selects = domUtils.getElementsByTagName(cont, "select"); - for (var i = 0, si; (si = selects[i++]); ) { - var attr = si.getAttribute("name"); - opt[attr] = opt[attr] ? si.value : ""; - } - - utils.extend(me.editor.options.autotypeset, opt); - - me.editor.setPreferences("autotypeset", opt); - } - - AutoTypeSetButton.prototype = { - initAutoTypeSetButton: function() { - var me = this; - this.popup = new Popup({ - //传入配置参数 - content: new AutoTypeSetPicker({ editor: me.editor }), - editor: me.editor, - hide: function() { - if (!this._hidden && this.getDom()) { - getPara(this); - this.getDom().style.display = "none"; - this._hidden = true; - this.fireEvent("hide"); - } - } - }); - var flag = 0; - this.popup.addListener("postRenderAfter", function() { - var popupUI = this; - if (flag) return; - var cont = this.getDom(), - btn = cont.getElementsByTagName("button")[0]; - - btn.onclick = function() { - getPara(popupUI); - me.editor.execCommand("autotypeset"); - popupUI.hide(); - }; - - domUtils.on(cont, "click", function(e) { - var target = e.target || e.srcElement, - editorId = me.editor.uid; - if (target && target.tagName == "INPUT") { - // 点击图片浮动的checkbox,去除对应的radio - if ( - target.name == "imageBlockLine" || - target.name == "textAlign" || - target.name == "symbolConver" - ) { - var checked = target.checked, - radioTd = document.getElementById( - target.name + "Value" + editorId - ), - radios = radioTd.getElementsByTagName("input"), - defalutSelect = { - imageBlockLine: "none", - textAlign: "left", - symbolConver: "tobdc" - }; - - for (var i = 0; i < radios.length; i++) { - if (checked) { - if (radios[i].value == defalutSelect[target.name]) { - radios[i].checked = "checked"; - } - } else { - radios[i].checked = false; - } - } - } - // 点击radio,选中对应的checkbox - if ( - target.name == "imageBlockLineValue" + editorId || - target.name == "textAlignValue" + editorId || - target.name == "bdc" - ) { - var checkboxs = target.parentNode.previousSibling.getElementsByTagName( - "input" - ); - checkboxs && (checkboxs[0].checked = true); - } - - getPara(popupUI); - } +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, + SplitButton = baidu.editor.ui.SplitButton, + AutoTypeSetButton = (baidu.editor.ui.AutoTypeSetButton = function (options) { + this.initOptions(options); + this.initAutoTypeSetButton(); }); - flag = 1; - }); - this.initSplitButton(); + function getPara(me) { + var opt = {}, + cont = me.getDom(), + editorId = me.editor.uid, + inputType = null, + attrName = null, + ipts = domUtils.getElementsByTagName(cont, "input"); + for (var i = ipts.length - 1, ipt; (ipt = ipts[i--]);) { + inputType = ipt.getAttribute("type"); + if (inputType == "checkbox") { + attrName = ipt.getAttribute("name"); + opt[attrName] && delete opt[attrName]; + if (ipt.checked) { + var attrValue = document.getElementById( + attrName + "Value" + editorId + ); + if (attrValue) { + if (/input/gi.test(attrValue.tagName)) { + opt[attrName] = attrValue.value; + } else { + var iptChilds = attrValue.getElementsByTagName("input"); + for ( + var j = iptChilds.length - 1, iptchild; + (iptchild = iptChilds[j--]); + ) { + if (iptchild.checked) { + opt[attrName] = iptchild.value; + break; + } + } + } + } else { + opt[attrName] = true; + } + } else { + opt[attrName] = false; + } + } else { + opt[ipt.getAttribute("value")] = ipt.checked; + } + } + + var selects = domUtils.getElementsByTagName(cont, "select"); + for (var i = 0, si; (si = selects[i++]);) { + var attr = si.getAttribute("name"); + opt[attr] = opt[attr] ? si.value : ""; + } + + utils.extend(me.editor.options.autotypeset, opt); + + me.editor.setPreferences("autotypeset", opt); } - }; - utils.inherits(AutoTypeSetButton, SplitButton); + + AutoTypeSetButton.prototype = { + initAutoTypeSetButton: function () { + var me = this; + this.popup = new Popup({ + //传入配置参数 + content: new AutoTypeSetPicker({editor: me.editor}), + editor: me.editor, + hide: function () { + if (!this._hidden && this.getDom()) { + getPara(this); + this.getDom().style.display = "none"; + this._hidden = true; + this.fireEvent("hide"); + } + } + }); + var flag = 0; + this.popup.addListener("postRenderAfter", function () { + var popupUI = this; + if (flag) return; + var cont = this.getDom(), + btn = cont.getElementsByTagName("button")[0]; + + btn.onclick = function () { + getPara(popupUI); + me.editor.execCommand("autotypeset"); + popupUI.hide(); + }; + + domUtils.on(cont, "click", function (e) { + var target = e.target || e.srcElement, + editorId = me.editor.uid; + if (target && target.tagName == "INPUT") { + // 点击图片浮动的checkbox,去除对应的radio + if ( + target.name == "imageBlockLine" || + target.name == "textAlign" || + target.name == "symbolConver" + ) { + var checked = target.checked, + radioTd = document.getElementById( + target.name + "Value" + editorId + ), + radios = radioTd.getElementsByTagName("input"), + defalutSelect = { + imageBlockLine: "none", + textAlign: "left", + symbolConver: "tobdc" + }; + + for (var i = 0; i < radios.length; i++) { + if (checked) { + if (radios[i].value == defalutSelect[target.name]) { + radios[i].checked = "checked"; + } + } else { + radios[i].checked = false; + } + } + } + // 点击radio,选中对应的checkbox + if ( + target.name == "imageBlockLineValue" + editorId || + target.name == "textAlignValue" + editorId || + target.name == "bdc" + ) { + var checkboxs = target.parentNode.previousSibling.getElementsByTagName( + "input" + ); + checkboxs && (checkboxs[0].checked = true); + } + + getPara(popupUI); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); })(); // ui/cellalignpicker.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - Popup = baidu.editor.ui.Popup, - Stateful = baidu.editor.ui.Stateful, - UIBase = baidu.editor.ui.UIBase; +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + UIBase = baidu.editor.ui.UIBase; - /** + /** * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' * @update 2013/4/2 hancong03@baidu.com */ - var CellAlignPicker = (baidu.editor.ui.CellAlignPicker = function(options) { - this.initOptions(options); - this.initSelected(); - this.initCellAlignPicker(); - }); - CellAlignPicker.prototype = { - //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 - initSelected: function() { - var status = { - valign: { - top: 0, - middle: 1, - bottom: 2 + var CellAlignPicker = (baidu.editor.ui.CellAlignPicker = function (options) { + this.initOptions(options); + this.initSelected(); + this.initCellAlignPicker(); + }); + CellAlignPicker.prototype = { + //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 + initSelected: function () { + var status = { + valign: { + top: 0, + middle: 1, + bottom: 2 + }, + align: { + left: 0, + center: 1, + right: 2 + }, + count: 3 + }, + result = -1; + + if (this.selected) { + this.selectedIndex = + status.valign[this.selected.valign] * status.count + + status.align[this.selected.align]; + } }, - align: { - left: 0, - center: 1, - right: 2 + initCellAlignPicker: function () { + this.initUIBase(); + this.Stateful_init(); }, - count: 3 - }, - result = -1; + getHtmlTpl: function () { + var alignType = ["left", "center", "right"], + COUNT = 9, + tempClassName = null, + tempIndex = -1, + tmpl = []; - if (this.selected) { - this.selectedIndex = - status.valign[this.selected.valign] * status.count + - status.align[this.selected.align]; - } - }, - initCellAlignPicker: function() { - this.initUIBase(); - this.Stateful_init(); - }, - getHtmlTpl: function() { - var alignType = ["left", "center", "right"], - COUNT = 9, - tempClassName = null, - tempIndex = -1, - tmpl = []; + for (var i = 0; i < COUNT; i++) { + tempClassName = this.selectedIndex === i + ? ' class="edui-cellalign-selected" ' + : ""; + tempIndex = i % 3; - for (var i = 0; i < COUNT; i++) { - tempClassName = this.selectedIndex === i - ? ' class="edui-cellalign-selected" ' - : ""; - tempIndex = i % 3; + tempIndex === 0 && tmpl.push("
  • ' + - tmpl.join("") + - "
    " + - "
    " + - "
    " - ); - }, - getStateDom: function() { - return this.target; - }, - _onClick: function(evt) { - var target = evt.target || evt.srcElement; - if (/icon/.test(target.className)) { - this.items[target.parentNode.getAttribute("index")].onclick(); - Popup.postHide(evt); - } - }, - _UIBase_render: UIBase.prototype.render - }; - utils.inherits(CellAlignPicker, UIBase); - utils.extend(CellAlignPicker.prototype, Stateful, true); + return ( + '
    ' + + '
    ' + + '' + + tmpl.join("") + + "
    " + + "
    " + + "
    " + ); + }, + getStateDom: function () { + return this.target; + }, + _onClick: function (evt) { + var target = evt.target || evt.srcElement; + if (/icon/.test(target.className)) { + this.items[target.parentNode.getAttribute("index")].onclick(); + Popup.postHide(evt); + } + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(CellAlignPicker, UIBase); + utils.extend(CellAlignPicker.prototype, Stateful, true); })(); // ui/pastepicker.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - Stateful = baidu.editor.ui.Stateful, - uiUtils = baidu.editor.ui.uiUtils, - UIBase = baidu.editor.ui.UIBase; +(function () { + var utils = baidu.editor.utils, + Stateful = baidu.editor.ui.Stateful, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; - var PastePicker = (baidu.editor.ui.PastePicker = function(options) { - this.initOptions(options); - this.initPastePicker(); - }); - PastePicker.prototype = { - initPastePicker: function() { - this.initUIBase(); - this.Stateful_init(); - }, - getHtmlTpl: function() { - return ( - '
    ' + - '
    ' + - '
    ' + - this.editor.getLang("pasteOpt") + - "
    " + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - "
    " + - "
    " + - "
    " - ); - }, - getStateDom: function() { - return this.target; - }, - format: function(param) { - this.editor.ui._isTransfer = true; - this.editor.fireEvent("pasteTransfer", param); - }, - _onClick: function(cur) { - var node = domUtils.getNextDomNode(cur), - screenHt = uiUtils.getViewportRect().height, - subPop = uiUtils.getClientRect(node); + var PastePicker = (baidu.editor.ui.PastePicker = function (options) { + this.initOptions(options); + this.initPastePicker(); + }); + PastePicker.prototype = { + initPastePicker: function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ' + + '
    ' + + this.editor.getLang("pasteOpt") + + "
    " + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + "
    " + + "
    " + + "
    " + ); + }, + getStateDom: function () { + return this.target; + }, + format: function (param) { + this.editor.ui._isTransfer = true; + this.editor.fireEvent("pasteTransfer", param); + }, + _onClick: function (cur) { + var node = domUtils.getNextDomNode(cur), + screenHt = uiUtils.getViewportRect().height, + subPop = uiUtils.getClientRect(node); - if (subPop.top + subPop.height > screenHt) - node.style.top = -subPop.height - cur.offsetHeight + "px"; - else node.style.top = ""; + if (subPop.top + subPop.height > screenHt) + node.style.top = -subPop.height - cur.offsetHeight + "px"; + else node.style.top = ""; - if (/hidden/gi.test(domUtils.getComputedStyle(node, "visibility"))) { - node.style.visibility = "visible"; - domUtils.addClass(cur, "edui-state-opened"); - } else { - node.style.visibility = "hidden"; - domUtils.removeClasses(cur, "edui-state-opened"); - } - }, - _UIBase_render: UIBase.prototype.render - }; - utils.inherits(PastePicker, UIBase); - utils.extend(PastePicker.prototype, Stateful, true); + if (/hidden/gi.test(domUtils.getComputedStyle(node, "visibility"))) { + node.style.visibility = "visible"; + domUtils.addClass(cur, "edui-state-opened"); + } else { + node.style.visibility = "hidden"; + domUtils.removeClasses(cur, "edui-state-opened"); + } + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(PastePicker, UIBase); + utils.extend(PastePicker.prototype, Stateful, true); })(); // ui/toolbar.js -(function() { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - UIBase = baidu.editor.ui.UIBase, - Toolbar = (baidu.editor.ui.Toolbar = function(options) { - this.initOptions(options); - this.initToolbar(); - }); - Toolbar.prototype = { - items: null, - initToolbar: function() { - this.items = this.items || []; - this.initUIBase(); - }, - add: function(item, index) { - if (index === undefined) { - this.items.push(item); - } else { - this.items.splice(index, 0, item); - } - }, - getHtmlTpl: function() { - var buff = []; - for (var i = 0; i < this.items.length; i++) { - buff[i] = this.items[i].renderHtml(); - } - return ( - '
    ' + - buff.join("") + - "
    " - ); - }, - postRender: function() { - var box = this.getDom(); - for (var i = 0; i < this.items.length; i++) { - this.items[i].postRender(); - } - uiUtils.makeUnselectable(box); - }, - _onMouseDown: function(e) { - var target = e.target || e.srcElement, - tagName = target && target.tagName && target.tagName.toLowerCase(); - if (tagName == "input" || tagName == "object" || tagName == "object") { - return false; - } - } - }; - utils.inherits(Toolbar, UIBase); +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Toolbar = (baidu.editor.ui.Toolbar = function (options) { + this.initOptions(options); + this.initToolbar(); + }); + Toolbar.prototype = { + items: null, + initToolbar: function () { + this.items = this.items || []; + this.initUIBase(); + }, + add: function (item, index) { + if (index === undefined) { + this.items.push(item); + } else { + this.items.splice(index, 0, item); + } + }, + getHtmlTpl: function () { + var buff = []; + for (var i = 0; i < this.items.length; i++) { + buff[i] = this.items[i].renderHtml(); + } + return ( + '
    ' + + buff.join("") + + "
    " + ); + }, + postRender: function () { + var box = this.getDom(); + for (var i = 0; i < this.items.length; i++) { + this.items[i].postRender(); + } + uiUtils.makeUnselectable(box); + }, + _onMouseDown: function (e) { + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == "input" || tagName == "object" || tagName == "object") { + return false; + } + } + }; + utils.inherits(Toolbar, UIBase); +})(); + + +// ui/quick-operate.js +///import core +///import uicore +///import ui\popup.js +///import ui\stateful.js +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + CellAlignPicker = baidu.editor.ui.CellAlignPicker, + QuickOperate = (baidu.editor.ui.QuickOperate = function (options) { + this.initOptions(options); + // this.initMenu(); + }); + + // var menuSeparator = { + // renderHtml: function() { + // return '
    '; + // }, + // postRender: function() {}, + // queryAutoHide: function() { + // return true; + // } + // }; + QuickOperate.prototype = { + // items: null, + uiName: "quick-operate", + // initMenu: function() { + // this.items = this.items || []; + // this.initPopup(); + // this.initItems(); + // }, + // initItems: function() { + // for (var i = 0; i < this.items.length; i++) { + // var item = this.items[i]; + // if (item == "-") { + // this.items[i] = this.getSeparator(); + // } else if (!(item instanceof MenuItem)) { + // item.editor = this.editor; + // item.theme = this.editor.options.theme; + // this.items[i] = this.createItem(item); + // } + // } + // }, + // getSeparator: function() { + // return menuSeparator; + // }, + // createItem: function(item) { + // //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + // item.menu = this; + // return new MenuItem(item); + // }, + _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl: function () { + // if (this.items.length == 0) { + // return this._Popup_getContentHtmlTpl(); + // } + // var buff = []; + // for (var i = 0; i < this.items.length; i++) { + // var item = this.items[i]; + // buff[i] = item.renderHtml(); + // } + // return '
    ' + buff.join("") + "
    "; + return [ + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    删除
    ', + '
    左对齐
    ', + '
    右对齐
    ', + '
    ', + '
    ', + ].join('') + }, + // _Popup_postRender: Popup.prototype.postRender, + // postRender: function() { + // var me = this; + // for (var i = 0; i < this.items.length; i++) { + // var item = this.items[i]; + // item.ownerMenu = this; + // item.postRender(); + // } + // domUtils.on(this.getDom(), "mouseover", function(evt) { + // evt = evt || event; + // var rel = evt.relatedTarget || evt.fromElement; + // var el = me.getDom(); + // if (!uiUtils.contains(el, rel) && el !== rel) { + // me.fireEvent("over"); + // } + // }); + // this._Popup_postRender(); + // }, + // queryAutoHide: function(el) { + // if (el) { + // if (uiUtils.contains(this.getDom(), el)) { + // return false; + // } + // for (var i = 0; i < this.items.length; i++) { + // var item = this.items[i]; + // if (item.queryAutoHide(el) === false) { + // return false; + // } + // } + // } + // }, + // clearItems: function() { + // for (var i = 0; i < this.items.length; i++) { + // var item = this.items[i]; + // clearTimeout(item._showingTimer); + // clearTimeout(item._closingTimer); + // if (item.subMenu) { + // item.subMenu.destroy(); + // } + // } + // this.items = []; + // }, + destroy: function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + // this.clearItems(); + }, + dispose: function () { + this.destroy(); + } + }; + utils.inherits(QuickOperate, Popup); + // + // /** + // * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + // * @type {Function} + // */ + // var MenuItem = (baidu.editor.ui.MenuItem = function(options) { + // this.initOptions(options); + // this.initUIBase(); + // this.Stateful_init(); + // if (this.subMenu && !(this.subMenu instanceof QuickOperate)) { + // if (options.className && options.className.indexOf("aligntd") != -1) { + // var me = this; + // + // //获取单元格对齐初始状态 + // this.subMenu.selected = this.editor.queryCommandValue("cellalignment"); + // + // this.subMenu = new Popup({ + // content: new CellAlignPicker(this.subMenu), + // parentMenu: me, + // editor: me.editor, + // destroy: function() { + // if (this.getDom()) { + // domUtils.remove(this.getDom()); + // } + // } + // }); + // this.subMenu.addListener("postRenderAfter", function() { + // domUtils.on(this.getDom(), "mouseover", function() { + // me.addState("opened"); + // }); + // }); + // } else { + // this.subMenu = new QuickOperate(this.subMenu); + // } + // } + // }); + // MenuItem.prototype = { + // label: "", + // subMenu: null, + // ownerMenu: null, + // uiName: "menuitem", + // alwalysHoverable: true, + // getHtmlTpl: function() { + // return ( + // '
    ' + + // '
    ' + + // this.renderLabelHtml() + + // "
    " + + // "
    " + // ); + // }, + // postRender: function() { + // var me = this; + // this.addListener("over", function() { + // me.ownerMenu.fireEvent("submenuover", me); + // if (me.subMenu) { + // me.delayShowSubMenu(); + // } + // }); + // if (this.subMenu) { + // this.getDom().className += " edui-hassubmenu"; + // this.subMenu.render(); + // this.addListener("out", function() { + // me.delayHideSubMenu(); + // }); + // this.subMenu.addListener("over", function() { + // clearTimeout(me._closingTimer); + // me._closingTimer = null; + // me.addState("opened"); + // }); + // this.ownerMenu.addListener("hide", function() { + // me.hideSubMenu(); + // }); + // this.ownerMenu.addListener("submenuover", function(t, subMenu) { + // if (subMenu !== me) { + // me.delayHideSubMenu(); + // } + // }); + // this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + // this.subMenu.queryAutoHide = function(el) { + // if (el && uiUtils.contains(me.getDom(), el)) { + // return false; + // } + // return this._bakQueryAutoHide(el); + // }; + // } + // this.getDom().style.tabIndex = "-1"; + // uiUtils.makeUnselectable(this.getDom()); + // this.Stateful_postRender(); + // }, + // delayShowSubMenu: function() { + // var me = this; + // if (!me.isDisabled()) { + // me.addState("opened"); + // clearTimeout(me._showingTimer); + // clearTimeout(me._closingTimer); + // me._closingTimer = null; + // me._showingTimer = setTimeout(function() { + // me.showSubMenu(); + // }, 250); + // } + // }, + // delayHideSubMenu: function() { + // var me = this; + // if (!me.isDisabled()) { + // me.removeState("opened"); + // clearTimeout(me._showingTimer); + // if (!me._closingTimer) { + // me._closingTimer = setTimeout(function() { + // if (!me.hasState("opened")) { + // me.hideSubMenu(); + // } + // me._closingTimer = null; + // }, 400); + // } + // } + // }, + // renderLabelHtml: function() { + // return ( + // '
    ' + + // '
    ' + + // '
    ' + + // (this.label || "") + + // "
    " + // ); + // }, + // getStateDom: function() { + // return this.getDom(); + // }, + // queryAutoHide: function(el) { + // if (this.subMenu && this.hasState("opened")) { + // return this.subMenu.queryAutoHide(el); + // } + // }, + // _onClick: function(event, this_) { + // if (this.hasState("disabled")) return; + // if (this.fireEvent("click", event, this_) !== false) { + // if (this.subMenu) { + // this.showSubMenu(); + // } else { + // Popup.postHide(event); + // } + // } + // }, + // showSubMenu: function() { + // var rect = uiUtils.getClientRect(this.getDom()); + // rect.right -= 5; + // rect.left += 2; + // rect.width -= 7; + // rect.top -= 4; + // rect.bottom += 4; + // rect.height += 8; + // this.subMenu.showAnchorRect(rect, true, true); + // }, + // hideSubMenu: function() { + // this.subMenu.hide(); + // } + // }; + // utils.inherits(MenuItem, UIBase); + // utils.extend(MenuItem.prototype, Stateful, true); })(); @@ -29076,281 +33199,282 @@ UE.ui = baidu.editor.ui = {}; ///import uicore ///import ui\popup.js ///import ui\stateful.js -(function() { - var utils = baidu.editor.utils, - domUtils = baidu.editor.dom.domUtils, - uiUtils = baidu.editor.ui.uiUtils, - UIBase = baidu.editor.ui.UIBase, - Popup = baidu.editor.ui.Popup, - Stateful = baidu.editor.ui.Stateful, - CellAlignPicker = baidu.editor.ui.CellAlignPicker, - Menu = (baidu.editor.ui.Menu = function(options) { - this.initOptions(options); - this.initMenu(); - }); +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + CellAlignPicker = baidu.editor.ui.CellAlignPicker, + Menu = (baidu.editor.ui.Menu = function (options) { + this.initOptions(options); + this.initMenu(); + }); - var menuSeparator = { - renderHtml: function() { - return '
    '; - }, - postRender: function() {}, - queryAutoHide: function() { - return true; - } - }; - Menu.prototype = { - items: null, - uiName: "menu", - initMenu: function() { - this.items = this.items || []; - this.initPopup(); - this.initItems(); - }, - initItems: function() { - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - if (item == "-") { - this.items[i] = this.getSeparator(); - } else if (!(item instanceof MenuItem)) { - item.editor = this.editor; - item.theme = this.editor.options.theme; - this.items[i] = this.createItem(item); + var menuSeparator = { + renderHtml: function () { + return '
    '; + }, + postRender: function () { + }, + queryAutoHide: function () { + return true; } - } - }, - getSeparator: function() { - return menuSeparator; - }, - createItem: function(item) { - //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 - item.menu = this; - return new MenuItem(item); - }, - _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, - getContentHtmlTpl: function() { - if (this.items.length == 0) { - return this._Popup_getContentHtmlTpl(); - } - var buff = []; - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - buff[i] = item.renderHtml(); - } - return '
    ' + buff.join("") + "
    "; - }, - _Popup_postRender: Popup.prototype.postRender, - postRender: function() { - var me = this; - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - item.ownerMenu = this; - item.postRender(); - } - domUtils.on(this.getDom(), "mouseover", function(evt) { - evt = evt || event; - var rel = evt.relatedTarget || evt.fromElement; - var el = me.getDom(); - if (!uiUtils.contains(el, rel) && el !== rel) { - me.fireEvent("over"); + }; + Menu.prototype = { + items: null, + uiName: "menu", + initMenu: function () { + this.items = this.items || []; + this.initPopup(); + this.initItems(); + }, + initItems: function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item == "-") { + this.items[i] = this.getSeparator(); + } else if (!(item instanceof MenuItem)) { + item.editor = this.editor; + item.theme = this.editor.options.theme; + this.items[i] = this.createItem(item); + } + } + }, + getSeparator: function () { + return menuSeparator; + }, + createItem: function (item) { + //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + item.menu = this; + return new MenuItem(item); + }, + _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl: function () { + if (this.items.length == 0) { + return this._Popup_getContentHtmlTpl(); + } + var buff = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + buff[i] = item.renderHtml(); + } + return '
    ' + buff.join("") + "
    "; + }, + _Popup_postRender: Popup.prototype.postRender, + postRender: function () { + var me = this; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.ownerMenu = this; + item.postRender(); + } + domUtils.on(this.getDom(), "mouseover", function (evt) { + evt = evt || event; + var rel = evt.relatedTarget || evt.fromElement; + var el = me.getDom(); + if (!uiUtils.contains(el, rel) && el !== rel) { + me.fireEvent("over"); + } + }); + this._Popup_postRender(); + }, + queryAutoHide: function (el) { + if (el) { + if (uiUtils.contains(this.getDom(), el)) { + return false; + } + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.queryAutoHide(el) === false) { + return false; + } + } + } + }, + clearItems: function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + clearTimeout(item._showingTimer); + clearTimeout(item._closingTimer); + if (item.subMenu) { + item.subMenu.destroy(); + } + } + this.items = []; + }, + destroy: function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + this.clearItems(); + }, + dispose: function () { + this.destroy(); } - }); - this._Popup_postRender(); - }, - queryAutoHide: function(el) { - if (el) { - if (uiUtils.contains(this.getDom(), el)) { - return false; - } - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - if (item.queryAutoHide(el) === false) { - return false; - } - } - } - }, - clearItems: function() { - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - clearTimeout(item._showingTimer); - clearTimeout(item._closingTimer); - if (item.subMenu) { - item.subMenu.destroy(); - } - } - this.items = []; - }, - destroy: function() { - if (this.getDom()) { - domUtils.remove(this.getDom()); - } - this.clearItems(); - }, - dispose: function() { - this.destroy(); - } - }; - utils.inherits(Menu, Popup); + }; + utils.inherits(Menu, Popup); - /** + /** * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 * @type {Function} */ - var MenuItem = (baidu.editor.ui.MenuItem = function(options) { - this.initOptions(options); - this.initUIBase(); - this.Stateful_init(); - if (this.subMenu && !(this.subMenu instanceof Menu)) { - if (options.className && options.className.indexOf("aligntd") != -1) { - var me = this; + var MenuItem = (baidu.editor.ui.MenuItem = function (options) { + this.initOptions(options); + this.initUIBase(); + this.Stateful_init(); + if (this.subMenu && !(this.subMenu instanceof Menu)) { + if (options.className && options.className.indexOf("aligntd") != -1) { + var me = this; - //获取单元格对齐初始状态 - this.subMenu.selected = this.editor.queryCommandValue("cellalignment"); + //获取单元格对齐初始状态 + this.subMenu.selected = this.editor.queryCommandValue("cellalignment"); - this.subMenu = new Popup({ - content: new CellAlignPicker(this.subMenu), - parentMenu: me, - editor: me.editor, - destroy: function() { - if (this.getDom()) { - domUtils.remove(this.getDom()); + this.subMenu = new Popup({ + content: new CellAlignPicker(this.subMenu), + parentMenu: me, + editor: me.editor, + destroy: function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + } + }); + this.subMenu.addListener("postRenderAfter", function () { + domUtils.on(this.getDom(), "mouseover", function () { + me.addState("opened"); + }); + }); + } else { + this.subMenu = new Menu(this.subMenu); } - } - }); - this.subMenu.addListener("postRenderAfter", function() { - domUtils.on(this.getDom(), "mouseover", function() { - me.addState("opened"); - }); - }); - } else { - this.subMenu = new Menu(this.subMenu); - } - } - }); - MenuItem.prototype = { - label: "", - subMenu: null, - ownerMenu: null, - uiName: "menuitem", - alwalysHoverable: true, - getHtmlTpl: function() { - return ( - '
    ' + - '
    ' + - this.renderLabelHtml() + - "
    " + - "
    " - ); - }, - postRender: function() { - var me = this; - this.addListener("over", function() { - me.ownerMenu.fireEvent("submenuover", me); - if (me.subMenu) { - me.delayShowSubMenu(); } - }); - if (this.subMenu) { - this.getDom().className += " edui-hassubmenu"; - this.subMenu.render(); - this.addListener("out", function() { - me.delayHideSubMenu(); - }); - this.subMenu.addListener("over", function() { - clearTimeout(me._closingTimer); - me._closingTimer = null; - me.addState("opened"); - }); - this.ownerMenu.addListener("hide", function() { - me.hideSubMenu(); - }); - this.ownerMenu.addListener("submenuover", function(t, subMenu) { - if (subMenu !== me) { - me.delayHideSubMenu(); - } - }); - this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; - this.subMenu.queryAutoHide = function(el) { - if (el && uiUtils.contains(me.getDom(), el)) { - return false; - } - return this._bakQueryAutoHide(el); - }; - } - this.getDom().style.tabIndex = "-1"; - uiUtils.makeUnselectable(this.getDom()); - this.Stateful_postRender(); - }, - delayShowSubMenu: function() { - var me = this; - if (!me.isDisabled()) { - me.addState("opened"); - clearTimeout(me._showingTimer); - clearTimeout(me._closingTimer); - me._closingTimer = null; - me._showingTimer = setTimeout(function() { - me.showSubMenu(); - }, 250); - } - }, - delayHideSubMenu: function() { - var me = this; - if (!me.isDisabled()) { - me.removeState("opened"); - clearTimeout(me._showingTimer); - if (!me._closingTimer) { - me._closingTimer = setTimeout(function() { - if (!me.hasState("opened")) { - me.hideSubMenu(); + }); + MenuItem.prototype = { + label: "", + subMenu: null, + ownerMenu: null, + uiName: "menuitem", + alwalysHoverable: true, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ' + + this.renderLabelHtml() + + "
    " + + "
    " + ); + }, + postRender: function () { + var me = this; + this.addListener("over", function () { + me.ownerMenu.fireEvent("submenuover", me); + if (me.subMenu) { + me.delayShowSubMenu(); + } + }); + if (this.subMenu) { + this.getDom().className += " edui-hassubmenu"; + this.subMenu.render(); + this.addListener("out", function () { + me.delayHideSubMenu(); + }); + this.subMenu.addListener("over", function () { + clearTimeout(me._closingTimer); + me._closingTimer = null; + me.addState("opened"); + }); + this.ownerMenu.addListener("hide", function () { + me.hideSubMenu(); + }); + this.ownerMenu.addListener("submenuover", function (t, subMenu) { + if (subMenu !== me) { + me.delayHideSubMenu(); + } + }); + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + this.subMenu.queryAutoHide = function (el) { + if (el && uiUtils.contains(me.getDom(), el)) { + return false; + } + return this._bakQueryAutoHide(el); + }; } - me._closingTimer = null; - }, 400); + this.getDom().style.tabIndex = "-1"; + uiUtils.makeUnselectable(this.getDom()); + this.Stateful_postRender(); + }, + delayShowSubMenu: function () { + var me = this; + if (!me.isDisabled()) { + me.addState("opened"); + clearTimeout(me._showingTimer); + clearTimeout(me._closingTimer); + me._closingTimer = null; + me._showingTimer = setTimeout(function () { + me.showSubMenu(); + }, 250); + } + }, + delayHideSubMenu: function () { + var me = this; + if (!me.isDisabled()) { + me.removeState("opened"); + clearTimeout(me._showingTimer); + if (!me._closingTimer) { + me._closingTimer = setTimeout(function () { + if (!me.hasState("opened")) { + me.hideSubMenu(); + } + me._closingTimer = null; + }, 400); + } + } + }, + renderLabelHtml: function () { + return ( + '
    ' + + '
    ' + + '
    ' + + (this.label || "") + + "
    " + ); + }, + getStateDom: function () { + return this.getDom(); + }, + queryAutoHide: function (el) { + if (this.subMenu && this.hasState("opened")) { + return this.subMenu.queryAutoHide(el); + } + }, + _onClick: function (event, this_) { + if (this.hasState("disabled")) return; + if (this.fireEvent("click", event, this_) !== false) { + if (this.subMenu) { + this.showSubMenu(); + } else { + Popup.postHide(event); + } + } + }, + showSubMenu: function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.right -= 5; + rect.left += 2; + rect.width -= 7; + rect.top -= 4; + rect.bottom += 4; + rect.height += 8; + this.subMenu.showAnchorRect(rect, true, true); + }, + hideSubMenu: function () { + this.subMenu.hide(); } - } - }, - renderLabelHtml: function() { - return ( - '
    ' + - '
    ' + - '
    ' + - (this.label || "") + - "
    " - ); - }, - getStateDom: function() { - return this.getDom(); - }, - queryAutoHide: function(el) { - if (this.subMenu && this.hasState("opened")) { - return this.subMenu.queryAutoHide(el); - } - }, - _onClick: function(event, this_) { - if (this.hasState("disabled")) return; - if (this.fireEvent("click", event, this_) !== false) { - if (this.subMenu) { - this.showSubMenu(); - } else { - Popup.postHide(event); - } - } - }, - showSubMenu: function() { - var rect = uiUtils.getClientRect(this.getDom()); - rect.right -= 5; - rect.left += 2; - rect.width -= 7; - rect.top -= 4; - rect.bottom += 4; - rect.height += 8; - this.subMenu.showAnchorRect(rect, true, true); - }, - hideSubMenu: function() { - this.subMenu.hide(); - } - }; - utils.inherits(MenuItem, UIBase); - utils.extend(MenuItem.prototype, Stateful, true); + }; + utils.inherits(MenuItem, UIBase); + utils.extend(MenuItem.prototype, Stateful, true); })(); @@ -29359,100 +33483,100 @@ UE.ui = baidu.editor.ui = {}; ///import uicore ///import ui/menu.js ///import ui/splitbutton.js -(function() { - // todo: menu和item提成通用list - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - Menu = baidu.editor.ui.Menu, - SplitButton = baidu.editor.ui.SplitButton, - Combox = (baidu.editor.ui.Combox = function(options) { - this.initOptions(options); - this.initCombox(); - }); - Combox.prototype = { - uiName: "combox", - onbuttonclick: function() { - this.showPopup(); - }, - initCombox: function() { - var me = this; - this.items = this.items || []; - for (var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - item.uiName = "listitem"; - item.index = i; - item.onclick = function() { - me.selectByIndex(this.index); - }; - } - this.popup = new Menu({ - items: this.items, - uiName: "list", - editor: this.editor, - captureWheel: true, - combox: this - }); +(function () { + // todo: menu和item提成通用list + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + Combox = (baidu.editor.ui.Combox = function (options) { + this.initOptions(options); + this.initCombox(); + }); + Combox.prototype = { + uiName: "combox", + onbuttonclick: function () { + this.showPopup(); + }, + initCombox: function () { + var me = this; + this.items = this.items || []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.uiName = "listitem"; + item.index = i; + item.onclick = function () { + me.selectByIndex(this.index); + }; + } + this.popup = new Menu({ + items: this.items, + uiName: "list", + editor: this.editor, + captureWheel: true, + combox: this + }); - this.initSplitButton(); - }, - _SplitButton_postRender: SplitButton.prototype.postRender, - postRender: function() { - this._SplitButton_postRender(); - this.setLabel(this.label || ""); - this.setValue(this.initValue || ""); - }, - showPopup: function() { - var rect = uiUtils.getClientRect(this.getDom()); - rect.top += 1; - rect.bottom -= 1; - rect.height -= 2; - this.popup.showAnchorRect(rect); - }, - getValue: function() { - return this.value; - }, - setValue: function(value) { - var index = this.indexByValue(value); - if (index != -1) { - this.selectedIndex = index; - this.setLabel(this.items[index].label); - this.value = this.items[index].value; - } else { - this.selectedIndex = -1; - this.setLabel(this.getLabelForUnknowValue(value)); - this.value = value; - } - }, - setLabel: function(label) { - this.getDom("button_body").innerHTML = label; - this.label = label; - }, - getLabelForUnknowValue: function(value) { - return value; - }, - indexByValue: function(value) { - for (var i = 0; i < this.items.length; i++) { - if (value == this.items[i].value) { - return i; + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function () { + this._SplitButton_postRender(); + this.setLabel(this.label || ""); + this.setValue(this.initValue || ""); + }, + showPopup: function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.top += 1; + rect.bottom -= 1; + rect.height -= 2; + this.popup.showAnchorRect(rect); + }, + getValue: function () { + return this.value; + }, + setValue: function (value) { + var index = this.indexByValue(value); + if (index != -1) { + this.selectedIndex = index; + this.setLabel(this.items[index].label); + this.value = this.items[index].value; + } else { + this.selectedIndex = -1; + this.setLabel(this.getLabelForUnknowValue(value)); + this.value = value; + } + }, + setLabel: function (label) { + this.getDom("button_body").innerHTML = label; + this.label = label; + }, + getLabelForUnknowValue: function (value) { + return value; + }, + indexByValue: function (value) { + for (var i = 0; i < this.items.length; i++) { + if (value == this.items[i].value) { + return i; + } + } + return -1; + }, + getItem: function (index) { + return this.items[index]; + }, + selectByIndex: function (index) { + if ( + index < this.items.length && + this.fireEvent("select", index) !== false + ) { + this.selectedIndex = index; + this.value = this.items[index].value; + this.setLabel(this.items[index].label); + } } - } - return -1; - }, - getItem: function(index) { - return this.items[index]; - }, - selectByIndex: function(index) { - if ( - index < this.items.length && - this.fireEvent("select", index) !== false - ) { - this.selectedIndex = index; - this.value = this.items[index].value; - this.setLabel(this.items[index].label); - } - } - }; - utils.inherits(Combox, SplitButton); + }; + utils.inherits(Combox, SplitButton); })(); @@ -29461,487 +33585,489 @@ UE.ui = baidu.editor.ui = {}; ///import uicore ///import ui/mask.js ///import ui/button.js -(function() { - var utils = baidu.editor.utils, - domUtils = baidu.editor.dom.domUtils, - uiUtils = baidu.editor.ui.uiUtils, - Mask = baidu.editor.ui.Mask, - UIBase = baidu.editor.ui.UIBase, - Button = baidu.editor.ui.Button, - Dialog = (baidu.editor.ui.Dialog = function(options) { - if (options.name) { - var name = options.name; - var cssRules = options.cssRules; - if (!options.className) { - options.className = "edui-for-" + name; - } - if (cssRules) { - options.cssRules = - ".edui-for-" + name + " .edui-dialog-content {" + cssRules + "}"; - } - } - this.initOptions( - utils.extend( - { - autoReset: true, - draggable: true, - onok: function() {}, - oncancel: function() {}, - onclose: function(t, ok) { - return ok ? this.onok() : this.oncancel(); - }, - //是否控制dialog中的scroll事件, 默认为不阻止 - holdScroll: false - }, - options - ) - ); - this.initDialog(); - }); - var modalMask; - var dragMask; - var activeDialog; - Dialog.prototype = { - draggable: false, - uiName: "dialog", - initDialog: function() { - var me = this, - theme = this.editor.options.theme; - if (this.cssRules) { - this.cssRules = ".edui-" + theme + " " + this.cssRules; - utils.cssRule("edui-customize-" + this.name + "-style", this.cssRules); - } - this.initUIBase(); - this.modalMask = - modalMask || - (modalMask = new Mask({ - className: "edui-dialog-modalmask", - theme: theme, - onclick: function() { - activeDialog && activeDialog.close(false); - } - })); - this.dragMask = - dragMask || - (dragMask = new Mask({ - className: "edui-dialog-dragmask", - theme: theme - })); - this.closeButton = new Button({ - className: "edui-dialog-closebutton", - title: me.closeDialog, - theme: theme, - onclick: function() { - me.close(false); - } - }); - - this.fullscreen && this.initResizeEvent(); - - if (this.buttons) { - for (var i = 0; i < this.buttons.length; i++) { - if (!(this.buttons[i] instanceof Button)) { - this.buttons[i] = new Button( - utils.extend( - this.buttons[i], - { - editor: this.editor - }, - true - ) +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils, + Mask = baidu.editor.ui.Mask, + UIBase = baidu.editor.ui.UIBase, + Button = baidu.editor.ui.Button, + Dialog = (baidu.editor.ui.Dialog = function (options) { + if (options.name) { + var name = options.name; + var cssRules = options.cssRules; + if (!options.className) { + options.className = "edui-for-" + name; + } + if (cssRules) { + options.cssRules = + ".edui-for-" + name + " .edui-dialog-content {" + cssRules + "}"; + } + } + this.initOptions( + utils.extend( + { + autoReset: true, + draggable: true, + onok: function () { + }, + oncancel: function () { + }, + onclose: function (t, ok) { + return ok ? this.onok() : this.oncancel(); + }, + //是否控制dialog中的scroll事件, 默认为不阻止 + holdScroll: false + }, + options + ) ); - } - } - } - }, - initResizeEvent: function() { - var me = this; - - - - domUtils.on(window, "resize", function() { - - if (me._hidden || me._hidden === undefined) { - return; - } - - if (me.__resizeTimer) { - window.clearTimeout(me.__resizeTimer); - } - - me.__resizeTimer = window.setTimeout(function() { - me.__resizeTimer = null; - - - - var dialogWrapNode = me.getDom(), - contentNode = me.getDom("content"), - wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), - contentRect = UE.ui.uiUtils.getClientRect(contentNode), - vpRect = uiUtils.getViewportRect(); - - contentNode.style.width = - vpRect.width - wrapRect.width + contentRect.width + "px"; - contentNode.style.height = - vpRect.height - wrapRect.height + contentRect.height + "px"; - - dialogWrapNode.style.width = vpRect.width + "px"; - dialogWrapNode.style.height = vpRect.height + "px"; - - me.fireEvent("resize"); - }, 100); - }); - }, - fitSize: function() { - // console.log('fitSize.dialog') - var popBodyEl = this.getDom("body"); - var $foot = popBodyEl.querySelector('.edui-dialog-foot'); - var heightWithoutBody = 70; - if(!$foot){ - heightWithoutBody = 30; - } - var size = this.mesureSize(); - var winSize = uiUtils.getViewportRect(); - var width = size.width; - var height = size.height - heightWithoutBody; - var maxWidth = winSize.width - 2; - var maxHeight = winSize.height - heightWithoutBody - 2; - if(width > maxWidth){ - height = height * maxWidth / width; - width = maxWidth; - } - if(height > maxHeight){ - width = width * maxHeight / height; - height = maxHeight; - } - var scale = (width / size.width); - // console.log('size', {sizeWidth:size.width,sizeHeight:size.height,width,height,scale}); - // console.log('popBodyEl',popBodyEl, popBodyEl.querySelector('.edui-dialog-foot')); - // window._xxx = popBodyEl; - var $content = popBodyEl.querySelector('.edui-dialog-content'); - if(!$content.dataset.dialogScaled){ - $content.dataset.dialogScaled = true - $content.style.width = (width)+'px'; - $content.style.height = (height)+'px'; - var $iframe = popBodyEl.querySelector('.edui-dialog-content iframe'); - $iframe.style.width = (size.width) +'px'; - $iframe.style.height = (size.height) +'px'; - $iframe.style.transformOrigin = '0 0'; - $iframe.style.transform = 'scale('+scale+')'; - size.width = width - size.height = height + heightWithoutBody - } - popBodyEl.style.width = size.width + "px"; - popBodyEl.style.height = size.height + "px"; - return size; - }, - safeSetOffset: function(offset) { - var me = this; - var el = me.getDom(); - var vpRect = uiUtils.getViewportRect(); - var rect = uiUtils.getClientRect(el); - var left = offset.left; - if (left + rect.width > vpRect.right) { - left = vpRect.right - rect.width; - } - var top = offset.top; - if (top + rect.height > vpRect.bottom) { - top = vpRect.bottom - rect.height; - } - el.style.left = Math.max(left, 0) + "px"; - el.style.top = Math.max(top, 0) + "px"; - }, - showAtCenter: function() { - var vpRect = uiUtils.getViewportRect(); - - if (!this.fullscreen) { - this.getDom().style.display = ""; - var popSize = this.fitSize(); - var titleHeight = this.getDom("titlebar").offsetHeight | 0; - var left = vpRect.width / 2 - popSize.width / 2; - var top = - vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; - var popEl = this.getDom(); - this.safeSetOffset({ - left: Math.max(left | 0, 0), - top: Math.max(top | 0, 0) + this.initDialog(); }); - if (!domUtils.hasClass(popEl, "edui-state-centered")) { - popEl.className += " edui-state-centered"; - } - } else { - var dialogWrapNode = this.getDom(), - contentNode = this.getDom("content"); - - dialogWrapNode.style.display = "block"; - - var wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), - contentRect = UE.ui.uiUtils.getClientRect(contentNode); - dialogWrapNode.style.left = "-100000px"; - - contentNode.style.width = - vpRect.width - wrapRect.width + contentRect.width + "px"; - contentNode.style.height = - vpRect.height - wrapRect.height + contentRect.height + "px"; - - dialogWrapNode.style.width = vpRect.width + "px"; - dialogWrapNode.style.height = vpRect.height + "px"; - dialogWrapNode.style.left = 0; - - //保存环境的overflow值 - this._originalContext = { - html: { - overflowX: document.documentElement.style.overflowX, - overflowY: document.documentElement.style.overflowY - }, - body: { - overflowX: document.body.style.overflowX, - overflowY: document.body.style.overflowY - } - }; - - document.documentElement.style.overflowX = "hidden"; - document.documentElement.style.overflowY = "hidden"; - document.body.style.overflowX = "hidden"; - document.body.style.overflowY = "hidden"; - } - - this._show(); - }, - getContentHtml: function() { - var contentHtml = ""; - if (typeof this.content == "string") { - contentHtml = this.content; - } else if (this.iframeUrl) { - contentHtml = - ''; - } - return contentHtml; - }, - getHtmlTpl: function() { - var footHtml = ""; - - if (this.buttons) { - var buff = []; - for (var i = 0; i < this.buttons.length; i++) { - buff[i] = this.buttons[i].renderHtml(); - } - footHtml = - '
    ' + - '
    ' + - buff.join("") + - "
    " + - "
    "; - } - - return ( - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - (this.title || "") + - "" + - "
    " + - this.closeButton.renderHtml() + - "
    " + - '
    ' + - (this.autoReset ? "" : this.getContentHtml()) + - "
    " + - footHtml + - "
    " - ); - }, - postRender: function() { - // todo: 保持居中/记住上次关闭位置选项 - if (!this.modalMask.getDom()) { - this.modalMask.render(); - this.modalMask.hide(); - } - if (!this.dragMask.getDom()) { - this.dragMask.render(); - this.dragMask.hide(); - } - var me = this; - this.addListener("show", function() { - me.modalMask.show(this.getDom().style.zIndex - 2); - }); - this.addListener("hide", function() { - me.modalMask.hide(); - }); - if (this.buttons) { - for (var i = 0; i < this.buttons.length; i++) { - this.buttons[i].postRender(); - } - } - domUtils.on(window, "resize", function() { - setTimeout(function() { - if (!me.isHidden()) { - me.safeSetOffset(uiUtils.getClientRect(me.getDom())); - } - }); - }); - - //hold住scroll事件,防止dialog的滚动影响页面 - // if( this.holdScroll ) { - // - // if( !me.iframeUrl ) { - // domUtils.on( document.getElementById( me.id + "_iframe"), !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ - // domUtils.preventDefault(e); - // } ); - // } else { - // me.addListener('dialogafterreset', function(){ - // window.setTimeout(function(){ - // var iframeWindow = document.getElementById( me.id + "_iframe").contentWindow; - // - // if( browser.ie ) { - // - // var timer = window.setInterval(function(){ - // - // if( iframeWindow.document && iframeWindow.document.body ) { - // window.clearInterval( timer ); - // timer = null; - // domUtils.on( iframeWindow.document.body, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ - // domUtils.preventDefault(e); - // } ); - // } - // - // }, 100); - // - // } else { - // domUtils.on( iframeWindow, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ - // domUtils.preventDefault(e); - // } ); - // } - // - // }, 1); - // }); - // } - // - // } - this._hide(); - }, - mesureSize: function() { - var body = this.getDom("body"); - var width = uiUtils.getClientRect(this.getDom("content")).width; - var dialogBodyStyle = body.style; - dialogBodyStyle.width = width; - return uiUtils.getClientRect(body); - }, - _onTitlebarMouseDown: function(evt, el) { - if (this.draggable) { - var rect; - var vpRect = uiUtils.getViewportRect(); - var me = this; - uiUtils.startDrag(evt, { - ondragstart: function() { - rect = uiUtils.getClientRect(me.getDom()); - me.getDom("contmask").style.visibility = "visible"; - me.dragMask.show(me.getDom().style.zIndex - 1); - }, - ondragmove: function(x, y) { - var left = rect.left + x; - var top = rect.top + y; - me.safeSetOffset({ - left: left, - top: top + var modalMask; + var dragMask; + var activeDialog; + Dialog.prototype = { + draggable: false, + uiName: "dialog", + initDialog: function () { + var me = this, + theme = this.editor.options.theme; + if (this.cssRules) { + this.cssRules = ".edui-" + theme + " " + this.cssRules; + utils.cssRule("edui-customize-" + this.name + "-style", this.cssRules); + } + this.initUIBase(); + this.modalMask = + modalMask || + (modalMask = new Mask({ + className: "edui-dialog-modalmask", + theme: theme, + onclick: function () { + activeDialog && activeDialog.close(false); + } + })); + this.dragMask = + dragMask || + (dragMask = new Mask({ + className: "edui-dialog-dragmask", + theme: theme + })); + this.closeButton = new Button({ + className: "edui-dialog-closebutton", + title: me.closeDialog, + theme: theme, + onclick: function () { + me.close(false); + } }); - }, - ondragstop: function() { - me.getDom("contmask").style.visibility = "hidden"; - domUtils.removeClasses(me.getDom(), ["edui-state-centered"]); - me.dragMask.hide(); - } - }); - } - }, - reset: function() { - this.getDom("content").innerHTML = this.getContentHtml(); - this.fireEvent("dialogafterreset"); - }, - _show: function() { - if (this._hidden) { - this.getDom().style.display = ""; - //要高过编辑器的zindxe - this.editor.container.style.zIndex && - (this.getDom().style.zIndex = - this.editor.container.style.zIndex * 1 + 10); - this._hidden = false; - this.fireEvent("show"); - baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = - this.getDom().style.zIndex - 4; - } - }, - isHidden: function() { - return this._hidden; - }, - _hide: function() { - if (!this._hidden) { - var wrapNode = this.getDom(); - wrapNode.style.display = "none"; - wrapNode.style.zIndex = ""; - wrapNode.style.width = ""; - wrapNode.style.height = ""; - this._hidden = true; - this.fireEvent("hide"); - } - }, - open: function() { - if (this.autoReset) { - //有可能还没有渲染 - try { - this.reset(); - } catch (e) { - this.render(); - this.open(); - } - } - this.showAtCenter(); - if (this.iframeUrl) { - try { - this.getDom("iframe").focus(); - } catch (ex) {} - } - activeDialog = this; - }, - _onCloseButtonClick: function(evt, el) { - this.close(false); - }, - close: function(ok) { - if (this.fireEvent("close", ok) !== false) { - //还原环境 - if (this.fullscreen) { - document.documentElement.style.overflowX = this._originalContext.html.overflowX; - document.documentElement.style.overflowY = this._originalContext.html.overflowY; - document.body.style.overflowX = this._originalContext.body.overflowX; - document.body.style.overflowY = this._originalContext.body.overflowY; - delete this._originalContext; - } - this._hide(); + this.fullscreen && this.initResizeEvent(); - //销毁content - var content = this.getDom("content"); - var iframe = this.getDom("iframe"); - if (content && iframe) { - var doc = iframe.contentDocument || iframe.contentWindow.document; - doc && (doc.body.innerHTML = ""); - domUtils.remove(content); + if (this.buttons) { + for (var i = 0; i < this.buttons.length; i++) { + if (!(this.buttons[i] instanceof Button)) { + this.buttons[i] = new Button( + utils.extend( + this.buttons[i], + { + editor: this.editor + }, + true + ) + ); + } + } + } + }, + initResizeEvent: function () { + var me = this; + + + domUtils.on(window, "resize", function () { + + if (me._hidden || me._hidden === undefined) { + return; + } + + if (me.__resizeTimer) { + window.clearTimeout(me.__resizeTimer); + } + + me.__resizeTimer = window.setTimeout(function () { + me.__resizeTimer = null; + + + var dialogWrapNode = me.getDom(), + contentNode = me.getDom("content"), + wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), + contentRect = UE.ui.uiUtils.getClientRect(contentNode), + vpRect = uiUtils.getViewportRect(); + + contentNode.style.width = + vpRect.width - wrapRect.width + contentRect.width + "px"; + contentNode.style.height = + vpRect.height - wrapRect.height + contentRect.height + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + + me.fireEvent("resize"); + }, 100); + }); + }, + fitSize: function () { + // console.log('fitSize.dialog') + var popBodyEl = this.getDom("body"); + var $foot = popBodyEl.querySelector('.edui-dialog-foot'); + var heightWithoutBody = 70; + if (!$foot) { + heightWithoutBody = 30; + } + var size = this.mesureSize(); + var winSize = uiUtils.getViewportRect(); + var width = size.width; + var height = size.height - heightWithoutBody; + var maxWidth = winSize.width - 2; + var maxHeight = winSize.height - heightWithoutBody - 2; + if (width > maxWidth) { + height = height * maxWidth / width; + width = maxWidth; + } + if (height > maxHeight) { + width = width * maxHeight / height; + height = maxHeight; + } + var scale = (width / size.width); + // console.log('size', {sizeWidth: size.width, sizeHeight: size.height, width, height, scale}); + // console.log('popBodyEl',popBodyEl, popBodyEl.querySelector('.edui-dialog-foot')); + // window._xxx = popBodyEl; + var $content = popBodyEl.querySelector('.edui-dialog-content'); + if (!$content.dataset.dialogScaled) { + $content.dataset.dialogScaled = true + $content.style.width = (width) + 'px'; + $content.style.height = (height) + 'px'; + var $iframe = popBodyEl.querySelector('.edui-dialog-content iframe'); + $iframe.style.width = (size.width) + 'px'; + $iframe.style.height = (size.height - heightWithoutBody) + 'px'; + $iframe.style.transformOrigin = '0 0'; + $iframe.style.transform = 'scale(' + scale + ')'; + size.width = width + size.height = height + heightWithoutBody + } + popBodyEl.style.width = size.width + "px"; + popBodyEl.style.height = size.height + "px"; + return size; + }, + safeSetOffset: function (offset) { + var me = this; + var el = me.getDom(); + var vpRect = uiUtils.getViewportRect(); + var rect = uiUtils.getClientRect(el); + var left = offset.left; + if (left + rect.width > vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + el.style.left = Math.max(left, 0) + "px"; + el.style.top = Math.max(top, 0) + "px"; + }, + showAtCenter: function () { + var vpRect = uiUtils.getViewportRect(); + + if (!this.fullscreen) { + this.getDom().style.display = ""; + var popSize = this.fitSize(); + var titleHeight = this.getDom("titlebar").offsetHeight | 0; + var left = vpRect.width / 2 - popSize.width / 2; + var top = + vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; + var popEl = this.getDom(); + this.safeSetOffset({ + left: Math.max(left | 0, 0), + top: Math.max(top | 0, 0) + }); + if (!domUtils.hasClass(popEl, "edui-state-centered")) { + popEl.className += " edui-state-centered"; + } + } else { + var dialogWrapNode = this.getDom(), + contentNode = this.getDom("content"); + + dialogWrapNode.style.display = "block"; + + var wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), + contentRect = UE.ui.uiUtils.getClientRect(contentNode); + dialogWrapNode.style.left = "-100000px"; + + contentNode.style.width = + vpRect.width - wrapRect.width + contentRect.width + "px"; + contentNode.style.height = + vpRect.height - wrapRect.height + contentRect.height + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + dialogWrapNode.style.left = 0; + + //保存环境的overflow值 + this._originalContext = { + html: { + overflowX: document.documentElement.style.overflowX, + overflowY: document.documentElement.style.overflowY + }, + body: { + overflowX: document.body.style.overflowX, + overflowY: document.body.style.overflowY + } + }; + + document.documentElement.style.overflowX = "hidden"; + document.documentElement.style.overflowY = "hidden"; + document.body.style.overflowX = "hidden"; + document.body.style.overflowY = "hidden"; + } + + this._show(); + }, + getContentHtml: function () { + var contentHtml = ""; + if (typeof this.content == "string") { + contentHtml = this.content; + } else if (this.iframeUrl) { + contentHtml = + ''; + } + return contentHtml; + }, + getHtmlTpl: function () { + var footHtml = ""; + + if (this.buttons) { + var buff = []; + for (var i = 0; i < this.buttons.length; i++) { + buff[i] = this.buttons[i].renderHtml(); + } + footHtml = + '
    ' + + '
    ' + + buff.join("") + + "
    " + + "
    "; + } + + return ( + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + (this.title || "") + + "" + + "
    " + + this.closeButton.renderHtml() + + "
    " + + '
    ' + + (this.autoReset ? "" : this.getContentHtml()) + + "
    " + + footHtml + + "
    " + ); + }, + postRender: function () { + // todo: 保持居中/记住上次关闭位置选项 + if (!this.modalMask.getDom()) { + this.modalMask.render(); + this.modalMask.hide(); + } + if (!this.dragMask.getDom()) { + this.dragMask.render(); + this.dragMask.hide(); + } + var me = this; + this.addListener("show", function () { + me.modalMask.show(this.getDom().style.zIndex - 2); + }); + this.addListener("hide", function () { + me.modalMask.hide(); + }); + if (this.buttons) { + for (var i = 0; i < this.buttons.length; i++) { + this.buttons[i].postRender(); + } + } + domUtils.on(window, "resize", function () { + setTimeout(function () { + if (!me.isHidden()) { + me.safeSetOffset(uiUtils.getClientRect(me.getDom())); + } + }); + }); + + //hold住scroll事件,防止dialog的滚动影响页面 + // if( this.holdScroll ) { + // + // if( !me.iframeUrl ) { + // domUtils.on( document.getElementById( me.id + "_iframe"), !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ + // domUtils.preventDefault(e); + // } ); + // } else { + // me.addListener('dialogafterreset', function(){ + // window.setTimeout(function(){ + // var iframeWindow = document.getElementById( me.id + "_iframe").contentWindow; + // + // if( browser.ie ) { + // + // var timer = window.setInterval(function(){ + // + // if( iframeWindow.document && iframeWindow.document.body ) { + // window.clearInterval( timer ); + // timer = null; + // domUtils.on( iframeWindow.document.body, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ + // domUtils.preventDefault(e); + // } ); + // } + // + // }, 100); + // + // } else { + // domUtils.on( iframeWindow, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ + // domUtils.preventDefault(e); + // } ); + // } + // + // }, 1); + // }); + // } + // + // } + this._hide(); + }, + mesureSize: function () { + var body = this.getDom("body"); + var width = uiUtils.getClientRect(this.getDom("content")).width; + var dialogBodyStyle = body.style; + dialogBodyStyle.width = width; + // console.log('getClientRect', body) + return uiUtils.getClientRect(body); + }, + _onTitlebarMouseDown: function (evt, el) { + if (this.draggable) { + var rect; + var vpRect = uiUtils.getViewportRect(); + var me = this; + uiUtils.startDrag(evt, { + ondragstart: function () { + rect = uiUtils.getClientRect(me.getDom()); + me.getDom("contmask").style.visibility = "visible"; + me.dragMask.show(me.getDom().style.zIndex - 1); + }, + ondragmove: function (x, y) { + var left = rect.left + x; + var top = rect.top + y; + me.safeSetOffset({ + left: left, + top: top + }); + }, + ondragstop: function () { + me.getDom("contmask").style.visibility = "hidden"; + domUtils.removeClasses(me.getDom(), ["edui-state-centered"]); + me.dragMask.hide(); + } + }); + } + }, + reset: function () { + this.getDom("content").innerHTML = this.getContentHtml(); + this.fireEvent("dialogafterreset"); + }, + _show: function () { + if (this._hidden) { + this.getDom().style.display = ""; + + //要高过编辑器的zindxe + this.editor.container.style.zIndex && + (this.getDom().style.zIndex = + this.editor.container.style.zIndex * 1 + 10); + this._hidden = false; + this.fireEvent("show"); + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = + this.getDom().style.zIndex - 4; + } + }, + isHidden: function () { + return this._hidden; + }, + _hide: function () { + if (!this._hidden) { + var wrapNode = this.getDom(); + wrapNode.style.display = "none"; + wrapNode.style.zIndex = ""; + wrapNode.style.width = ""; + wrapNode.style.height = ""; + this._hidden = true; + this.fireEvent("hide"); + } + }, + open: function () { + if (this.autoReset) { + //有可能还没有渲染 + try { + this.reset(); + } catch (e) { + this.render(); + this.open(); + } + } + this.showAtCenter(); + if (this.iframeUrl) { + try { + this.getDom("iframe").focus(); + } catch (ex) { + } + } + activeDialog = this; + }, + _onCloseButtonClick: function (evt, el) { + this.close(false); + }, + close: function (ok) { + if (this.fireEvent("close", ok) !== false) { + //还原环境 + if (this.fullscreen) { + document.documentElement.style.overflowX = this._originalContext.html.overflowX; + document.documentElement.style.overflowY = this._originalContext.html.overflowY; + document.body.style.overflowX = this._originalContext.body.overflowX; + document.body.style.overflowY = this._originalContext.body.overflowY; + delete this._originalContext; + } + this._hide(); + + //销毁content + var content = this.getDom("content"); + var iframe = this.getDom("iframe"); + if (content && iframe) { + var doc = iframe.contentDocument || iframe.contentWindow.document; + doc && (doc.body.innerHTML = ""); + domUtils.remove(content); + } + } } - } - } - }; - utils.inherits(Dialog, UIBase); + }; + utils.inherits(Dialog, UIBase); })(); @@ -29950,40 +34076,40 @@ UE.ui = baidu.editor.ui = {}; ///import uicore ///import ui/menu.js ///import ui/splitbutton.js -(function() { - var utils = baidu.editor.utils, - Menu = baidu.editor.ui.Menu, - SplitButton = baidu.editor.ui.SplitButton, - MenuButton = (baidu.editor.ui.MenuButton = function(options) { - this.initOptions(options); - this.initMenuButton(); - }); - MenuButton.prototype = { - initMenuButton: function() { - var me = this; - this.uiName = "menubutton"; - this.popup = new Menu({ - items: me.items, - className: me.className, - editor: me.editor - }); - this.popup.addListener("show", function() { - var list = this; - for (var i = 0; i < list.items.length; i++) { - list.items[i].removeState("checked"); - if (list.items[i].value == me._value) { - list.items[i].addState("checked"); - this.value = me._value; - } +(function () { + var utils = baidu.editor.utils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + MenuButton = (baidu.editor.ui.MenuButton = function (options) { + this.initOptions(options); + this.initMenuButton(); + }); + MenuButton.prototype = { + initMenuButton: function () { + var me = this; + this.uiName = "menubutton"; + this.popup = new Menu({ + items: me.items, + className: me.className, + editor: me.editor + }); + this.popup.addListener("show", function () { + var list = this; + for (var i = 0; i < list.items.length; i++) { + list.items[i].removeState("checked"); + if (list.items[i].value == me._value) { + list.items[i].addState("checked"); + this.value = me._value; + } + } + }); + this.initSplitButton(); + }, + setValue: function (value) { + this._value = value; } - }); - this.initSplitButton(); - }, - setValue: function(value) { - this._value = value; - } - }; - utils.inherits(MenuButton, SplitButton); + }; + utils.inherits(MenuButton, SplitButton); })(); @@ -29991,405 +34117,414 @@ UE.ui = baidu.editor.ui = {}; ///import core ///import uicore ///commands 表情 -(function() { - var utils = baidu.editor.utils, - Popup = baidu.editor.ui.Popup, - SplitButton = baidu.editor.ui.SplitButton, - MultiMenuPop = (baidu.editor.ui.MultiMenuPop = function(options) { - this.initOptions(options); - this.initMultiMenu(); - }); +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + MultiMenuPop = (baidu.editor.ui.MultiMenuPop = function (options) { + this.initOptions(options); + this.initMultiMenu(); + }); - MultiMenuPop.prototype = { - initMultiMenu: function() { - var me = this; - this.popup = new Popup({ - content: "", - editor: me.editor, - iframe_rendered: false, - onshow: function() { - if (!this.iframe_rendered) { - this.iframe_rendered = true; - this.getDom("content").innerHTML = - ''; - me.editor.container.style.zIndex && - (this.getDom().style.zIndex = - me.editor.container.style.zIndex * 1 + 1); - } + MultiMenuPop.prototype = { + initMultiMenu: function () { + var me = this; + this.popup = new Popup({ + content: "", + editor: me.editor, + iframe_rendered: false, + onshow: function () { + if (!this.iframe_rendered) { + this.iframe_rendered = true; + this.getDom("content").innerHTML = + ''; + me.editor.container.style.zIndex && + (this.getDom().style.zIndex = + me.editor.container.style.zIndex * 1 + 1); + } + } + // canSideUp:false, + // canSideLeft:false + }); + this.onbuttonclick = function () { + this.showPopup(); + }; + this.initSplitButton(); } - // canSideUp:false, - // canSideLeft:false - }); - this.onbuttonclick = function() { - this.showPopup(); - }; - this.initSplitButton(); - } - }; + }; - utils.inherits(MultiMenuPop, SplitButton); + utils.inherits(MultiMenuPop, SplitButton); })(); // ui/shortcutmenu.js -(function() { - var UI = baidu.editor.ui, - UIBase = UI.UIBase, - uiUtils = UI.uiUtils, - utils = baidu.editor.utils, - domUtils = baidu.editor.dom.domUtils; +(function () { + var UI = baidu.editor.ui, + UIBase = UI.UIBase, + uiUtils = UI.uiUtils, + utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils; - var allMenus = [], //存储所有快捷菜单 - timeID, - isSubMenuShow = false; //是否有子pop显示 + var allMenus = [], //存储所有快捷菜单 + timeID, + isSubMenuShow = false; //是否有子pop显示 - var ShortCutMenu = (UI.ShortCutMenu = function(options) { - this.initOptions(options); - this.initShortCutMenu(); - }); + var ShortCutMenu = (UI.ShortCutMenu = function (options) { + this.initOptions(options); + this.initShortCutMenu(); + }); - ShortCutMenu.postHide = hideAllMenu; + ShortCutMenu.postHide = hideAllMenu; - ShortCutMenu.prototype = { - isHidden: true, - SPACE: 5, - initShortCutMenu: function() { - this.items = this.items || []; - this.initUIBase(); - this.initItems(); - this.initEvent(); - allMenus.push(this); - }, - initEvent: function() { - var me = this, - doc = me.editor.document; - - /* - domUtils.on(doc, "mousemove", function(e) { - if (me.isHidden === false) { - //有pop显示就不隐藏快捷菜单 - if (me.getSubMenuMark() || me.eventType == "contextmenu") return; - - var flag = true, - el = me.getDom(), - wt = el.offsetWidth, - ht = el.offsetHeight, - distanceX = wt / 2 + me.SPACE, //距离中心X标准 - distanceY = ht / 2, //距离中心Y标准 - x = Math.abs(e.screenX - me.left), //离中心距离横坐标 - y = Math.abs(e.screenY - me.top); //离中心距离纵坐标 - - clearTimeout(timeID); - timeID = setTimeout(function() { - if (y > 0 && y < distanceY) { - me.setOpacity(el, "1"); - } else if (y > distanceY && y < distanceY + 70) { - me.setOpacity(el, "0.5"); - flag = false; - } else if (y > distanceY + 70 && y < distanceY + 140) { - me.hide(); - } - - if (flag && x > 0 && x < distanceX) { - me.setOpacity(el, "1"); - } else if (x > distanceX && x < distanceX + 70) { - me.setOpacity(el, "0.5"); - } else if (x > distanceX + 70 && x < distanceX + 140) { - console.log('hide') - me.hide(); - } - }); - } - }); - */ - //ie\ff下 mouseout不准 - /* - if (browser.chrome) { - domUtils.on(doc, "mouseout", function(e) { - var relatedTgt = e.relatedTarget || e.toElement; - - if (relatedTgt == null || relatedTgt.tagName == "HTML") { - me.hide(); - } - }); - } - */ - - me.editor.addListener("afterhidepop", function() { - if (!me.isHidden) { - isSubMenuShow = true; - } - }); - }, - initItems: function() { - if (utils.isArray(this.items)) { - for (var i = 0, len = this.items.length; i < len; i++) { - var item = this.items[i].toLowerCase(); - - if (UI[item]) { - this.items[i] = new UI[item](this.editor); - this.items[i].className += " edui-shortcutsubmenu "; - } - } - } - }, - setOpacity: function(el, value) { - if (browser.ie && browser.version < 9) { - el.style.filter = "alpha(opacity = " + parseFloat(value) * 100 + ");"; - } else { - el.style.opacity = value; - } - }, - getSubMenuMark: function() { - isSubMenuShow = false; - var layerEle = uiUtils.getFixedLayer(); - var list = domUtils.getElementsByTagName(layerEle, "div", function(node) { - return domUtils.hasClass(node, "edui-shortcutsubmenu edui-popup"); - }); - - for (var i = 0, node; (node = list[i++]); ) { - if (node.style.display != "none") { - isSubMenuShow = true; - } - } - return isSubMenuShow; - }, - show: function(e, hasContextmenu) { - var me = this, - offset = {}, - el = this.getDom(), - fixedlayer = uiUtils.getFixedLayer(); - - function setPos(offset) { - if (offset.left < 0) { - offset.left = 0; - } - if (offset.top < 0) { - offset.top = 0; - } - el.style.cssText = - "position:absolute;left:" + - offset.left + - "px;top:" + - offset.top + - "px;"; - } - - function setPosByCxtMenu(menu) { - if (!menu.tagName) { - menu = menu.getDom(); - } - offset.left = parseInt(menu.style.left); - offset.top = parseInt(menu.style.top); - offset.top -= el.offsetHeight + 15; - setPos(offset); - } - - me.eventType = e.type; - el.style.cssText = "display:block;left:-9999px"; - - if (e.type == "contextmenu" && hasContextmenu) { - var menu = domUtils.getElementsByTagName( - fixedlayer, - "div", - "edui-contextmenu" - )[0]; - if (menu) { - setPosByCxtMenu(menu); - } else { - me.editor.addListener("aftershowcontextmenu", function(type, menu) { - setPosByCxtMenu(menu); - }); - } - } else { - offset = uiUtils.getViewportOffsetByEvent(e); - offset.top -= el.offsetHeight + me.SPACE; - offset.left += me.SPACE + 20; - setPos(offset); - me.setOpacity(el, 1); - } - - me.isHidden = false; - me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; - me.top = e.screenY - el.offsetHeight / 2 - me.SPACE; - - if (me.editor) { - el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; - fixedlayer.style.zIndex = el.style.zIndex - 1; - } - }, - hide: function() { - if (this.getDom()) { - this.getDom().style.display = "none"; - } - this.isHidden = true; - }, - postRender: function() { - if (utils.isArray(this.items)) { - for (var i = 0, item; (item = this.items[i++]); ) { - item.postRender(); - } - } - }, - getHtmlTpl: function() { - var buff; - if (utils.isArray(this.items)) { - buff = []; - for (var i = 0; i < this.items.length; i++) { - buff[i] = this.items[i].renderHtml(); - } - buff = buff.join(""); - } else { - buff = this.items; - } - - return ( - '
    ' + - buff + - "
    " - ); - } - }; - - utils.inherits(ShortCutMenu, UIBase); - - function hideAllMenu(e) { - var tgt = e.target || e.srcElement, - cur = domUtils.findParent( - tgt, - function(node) { - return ( - domUtils.hasClass(node, "edui-shortcutmenu") || - domUtils.hasClass(node, "edui-popup") - ); + ShortCutMenu.prototype = { + isHidden: true, + SPACE: 5, + initShortCutMenu: function () { + this.items = this.items || []; + this.initUIBase(); + this.initItems(); + this.initEvent(); + allMenus.push(this); }, - true - ); + initEvent: function () { + var me = this, + doc = me.editor.document; - if (!cur) { - for (var i = 0, menu; (menu = allMenus[i++]); ) { - menu.hide(); - } + /* + domUtils.on(doc, "mousemove", function(e) { + if (me.isHidden === false) { + //有pop显示就不隐藏快捷菜单 + if (me.getSubMenuMark() || me.eventType == "contextmenu") return; + + var flag = true, + el = me.getDom(), + wt = el.offsetWidth, + ht = el.offsetHeight, + distanceX = wt / 2 + me.SPACE, //距离中心X标准 + distanceY = ht / 2, //距离中心Y标准 + x = Math.abs(e.screenX - me.left), //离中心距离横坐标 + y = Math.abs(e.screenY - me.top); //离中心距离纵坐标 + + clearTimeout(timeID); + timeID = setTimeout(function() { + if (y > 0 && y < distanceY) { + me.setOpacity(el, "1"); + } else if (y > distanceY && y < distanceY + 70) { + me.setOpacity(el, "0.5"); + flag = false; + } else if (y > distanceY + 70 && y < distanceY + 140) { + me.hide(); + } + + if (flag && x > 0 && x < distanceX) { + me.setOpacity(el, "1"); + } else if (x > distanceX && x < distanceX + 70) { + me.setOpacity(el, "0.5"); + } else if (x > distanceX + 70 && x < distanceX + 140) { + console.log('hide') + me.hide(); + } + }); + } + }); + */ + //ie\ff下 mouseout不准 + /* + if (browser.chrome) { + domUtils.on(doc, "mouseout", function(e) { + var relatedTgt = e.relatedTarget || e.toElement; + + if (relatedTgt == null || relatedTgt.tagName == "HTML") { + me.hide(); + } + }); + } + */ + + me.editor.addListener("afterhidepop", function () { + if (!me.isHidden) { + isSubMenuShow = true; + } + }); + }, + initItems: function () { + if (utils.isArray(this.items)) { + for (var i = 0, len = this.items.length; i < len; i++) { + if ('string' !== typeof this.items[i]) { + continue; + } + var item = this.items[i].toLowerCase(); + + if (UI[item]) { + this.items[i] = new UI[item](this.editor); + this.items[i].className += " edui-short-cut-sub-menu "; + } + } + } + }, + setOpacity: function (el, value) { + if (browser.ie && browser.version < 9) { + el.style.filter = "alpha(opacity = " + parseFloat(value) * 100 + ");"; + } else { + el.style.opacity = value; + } + }, + getSubMenuMark: function () { + isSubMenuShow = false; + var layerEle = uiUtils.getFixedLayer(); + var list = domUtils.getElementsByTagName(layerEle, "div", function (node) { + return domUtils.hasClass(node, "edui-short-cut-sub-menu edui-popup"); + }); + + for (var i = 0, node; (node = list[i++]);) { + if (node.style.display !== "none") { + isSubMenuShow = true; + } + } + return isSubMenuShow; + }, + show: function (e, hasContextmenu) { + var me = this, + offset = {}, + el = this.getDom(), + fixedlayer = uiUtils.getFixedLayer(); + + for (let item of this.items) { + if ('shouldUiShow' in item) { + item.uiShow(item.shouldUiShow()); + } + } + + function setPos(offset) { + if (offset.left < 0) { + offset.left = 0; + } + if (offset.top < 0) { + offset.top = 0; + } + el.style.cssText = + "position:absolute;left:" + + offset.left + + "px;top:" + + offset.top + + "px;"; + } + + function setPosByCxtMenu(menu) { + if (!menu.tagName) { + menu = menu.getDom(); + } + offset.left = parseInt(menu.style.left); + offset.top = parseInt(menu.style.top); + offset.top -= el.offsetHeight + 15; + setPos(offset); + } + + me.eventType = e.type; + el.style.cssText = "display:block;left:-9999px"; + + // if (e.type === "contextmenu" && hasContextmenu) { + // var menu = domUtils.getElementsByTagName( + // fixedlayer, + // "div", + // "edui-contextmenu" + // )[0]; + // if (menu) { + // setPosByCxtMenu(menu); + // } else { + // me.editor.addListener("aftershowcontextmenu", function (type, menu) { + // setPosByCxtMenu(menu); + // }); + // } + // } else { + offset = uiUtils.getViewportOffsetByEvent(e); + offset.top -= el.offsetHeight + me.SPACE; + offset.left += me.SPACE + 20; + setPos(offset); + me.setOpacity(el, 1); + // } + + me.isHidden = false; + me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; + me.top = e.screenY - el.offsetHeight / 2 - me.SPACE; + + if (me.editor) { + el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; + fixedlayer.style.zIndex = el.style.zIndex - 1; + } + }, + hide: function () { + if (this.getDom()) { + this.getDom().style.display = "none"; + } + this.isHidden = true; + }, + postRender: function () { + if (utils.isArray(this.items)) { + for (var i = 0, item; (item = this.items[i++]);) { + item.postRender(); + } + } + }, + getHtmlTpl: function () { + var buff; + if (utils.isArray(this.items)) { + buff = []; + for (var i = 0; i < this.items.length; i++) { + buff[i] = this.items[i].renderHtml(); + } + buff = buff.join(""); + } else { + buff = this.items; + } + + return ( + '
    ' + + buff + + "
    " + ); + } + }; + + utils.inherits(ShortCutMenu, UIBase); + + function hideAllMenu(e) { + var tgt = e.target || e.srcElement, + cur = domUtils.findParent( + tgt, + function (node) { + return ( + domUtils.hasClass(node, "edui-shortcutmenu") || + domUtils.hasClass(node, "edui-popup") + ); + }, + true + ); + + if (!cur) { + for (var i = 0, menu; (menu = allMenus[i++]);) { + menu.hide(); + } + } } - } - domUtils.on(document, "mousedown", function(e) { - hideAllMenu(e); - }); + domUtils.on(document, "mousedown", function (e) { + hideAllMenu(e); + }); - domUtils.on(window, "scroll", function(e) { - hideAllMenu(e); - }); + domUtils.on(window, "scroll", function (e) { + hideAllMenu(e); + }); })(); // ui/breakline.js -(function() { - var utils = baidu.editor.utils, - UIBase = baidu.editor.ui.UIBase, - Breakline = (baidu.editor.ui.Breakline = function(options) { - this.initOptions(options); - this.initSeparator(); - }); - Breakline.prototype = { - uiName: "Breakline", - initSeparator: function() { - this.initUIBase(); - }, - getHtmlTpl: function() { - return "
    "; - } - }; - utils.inherits(Breakline, UIBase); +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Breakline = (baidu.editor.ui.Breakline = function (options) { + this.initOptions(options); + this.initSeparator(); + }); + Breakline.prototype = { + uiName: "Breakline", + initSeparator: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return "
    "; + } + }; + utils.inherits(Breakline, UIBase); })(); // ui/message.js ///import core ///import uicore -(function() { - var utils = baidu.editor.utils, - domUtils = baidu.editor.dom.domUtils, - UIBase = baidu.editor.ui.UIBase, - Message = (baidu.editor.ui.Message = function(options) { - this.initOptions(options); - this.initMessage(); - }); - - Message.prototype = { - initMessage: function() { - this.initUIBase(); - }, - getHtmlTpl: function() { - return ( - '
    ' + - '
    ×
    ' + - '
    ' + - ' ' + - '
    ' + - '
    ' + - "
    " + - "
    " + - "
    " - ); - }, - reset: function(opt) { - var me = this; - if (!opt.keepshow) { - clearTimeout(this.timer); - me.timer = setTimeout(function() { - me.hide(); - }, opt.timeout || 4000); - } - - opt.content !== undefined && me.setContent(opt.content); - opt.type !== undefined && me.setType(opt.type); - - me.show(); - }, - postRender: function() { - var me = this, - closer = this.getDom("closer"); - closer && - domUtils.on(closer, "click", function() { - me.hide(); +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Message = (baidu.editor.ui.Message = function (options) { + this.initOptions(options); + this.initMessage(); }); - }, - setContent: function(content) { - this.getDom("content").innerHTML = content; - }, - setType: function(type) { - type = type || "info"; - var body = this.getDom("body"); - body.className = body.className.replace( - /edui-message-type-[\w-]+/, - "edui-message-type-" + type - ); - }, - getContent: function() { - return this.getDom("content").innerHTML; - }, - getType: function() { - var arr = this.getDom("body").match(/edui-message-type-([\w-]+)/); - return arr ? arr[1] : ""; - }, - show: function() { - this.getDom().style.display = "block"; - }, - hide: function() { - var dom = this.getDom(); - if (dom) { - dom.style.display = "none"; - dom.parentNode && dom.parentNode.removeChild(dom); - } - } - }; - utils.inherits(Message, UIBase); + Message.prototype = { + initMessage: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ×
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + "
    " + + "
    " + + "
    " + ); + }, + reset: function (opt) { + var me = this; + if (!opt.keepshow) { + clearTimeout(this.timer); + me.timer = setTimeout(function () { + me.hide(); + }, opt.timeout || 4000); + } + + opt.content !== undefined && me.setContent(opt.content); + opt.type !== undefined && me.setType(opt.type); + + me.show(); + }, + postRender: function () { + var me = this, + closer = this.getDom("closer"); + closer && + domUtils.on(closer, "click", function () { + me.hide(); + }); + }, + setContent: function (content) { + this.getDom("content").innerHTML = content; + }, + setType: function (type) { + type = type || "info"; + var body = this.getDom("body"); + body.className = body.className.replace( + /edui-message-type-[\w-]+/, + "edui-message-type-" + type + ); + }, + getContent: function () { + return this.getDom("content").innerHTML; + }, + getType: function () { + var arr = this.getDom("body").match(/edui-message-type-([\w-]+)/); + return arr ? arr[1] : ""; + }, + show: function () { + this.getDom().style.display = "block"; + }, + hide: function () { + var dom = this.getDom(); + if (dom) { + dom.style.display = "none"; + dom.parentNode && dom.parentNode.removeChild(dom); + } + } + }; + + utils.inherits(Message, UIBase); })(); @@ -30397,948 +34532,1036 @@ UE.ui = baidu.editor.ui = {}; //ui跟编辑器的适配層 //那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 //自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 -(function() { - var utils = baidu.editor.utils; - var editorui = baidu.editor.ui; - var _Dialog = editorui.Dialog; - editorui.buttons = {}; +(function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; - editorui.Dialog = function(options) { - var dialog = new _Dialog(options); - dialog.addListener("hide", function() { - if (dialog.editor) { - var editor = dialog.editor; - try { - if (browser.gecko) { - var y = editor.window.scrollY, - x = editor.window.scrollX; - editor.body.focus(); - editor.window.scrollTo(x, y); - } else { - editor.focus(); - } - } catch (ex) {} - } - }); - return dialog; - }; - - var iframeUrlMap = { - anchor: "~/dialogs/anchor/anchor.html?20220503", - insertimage: "~/dialogs/image/image.html?20220503", - link: "~/dialogs/link/link.html?20220503", - spechars: "~/dialogs/spechars/spechars.html?20220503", - searchreplace: "~/dialogs/searchreplace/searchreplace.html?20220503", - insertvideo: "~/dialogs/video/video.html?20220503", - help: "~/dialogs/help/help.html?20220503", - preview: "~/dialogs/preview/preview.html?20220503", - emotion: "~/dialogs/emotion/emotion.html?20220503", - wordimage: "~/dialogs/wordimage/wordimage.html?20220902", - formula: "~/dialogs/formula/formula.html?20220902", - attachment: "~/dialogs/attachment/attachment.html?20220503", - insertframe: "~/dialogs/insertframe/insertframe.html?20220503", - edittip: "~/dialogs/table/edittip.html?20220503", - edittable: "~/dialogs/table/edittable.html?20220503", - edittd: "~/dialogs/table/edittd.html?20220503", - scrawl: "~/dialogs/scrawl/scrawl.html?20220503", - template: "~/dialogs/template/template.html?20220503", - background: "~/dialogs/background/background.html?20220503", - }; - //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 - var btnCmds = [ - "undo", - "redo", - "formatmatch", - "bold", - "italic", - "underline", - "fontborder", - "touppercase", - "tolowercase", - "strikethrough", - "subscript", - "superscript", - "source", - "indent", - "outdent", - "blockquote", - "pasteplain", - "pagebreak", - "selectall", - "print", - "horizontal", - "removeformat", - "time", - "date", - "unlink", - "insertparagraphbeforetable", - "insertrow", - "insertcol", - "mergeright", - "mergedown", - "deleterow", - "deletecol", - "splittorows", - "splittocols", - "splittocells", - "mergecells", - "deletetable", - ]; - - for (var i = 0, ci; (ci = btnCmds[i++]); ) { - ci = ci.toLowerCase(); - editorui[ci] = (function(cmd) { - return function(editor) { - var ui = new editorui.Button({ - className: "edui-for-" + cmd, - title: - editor.options.labelMap[cmd] || - editor.getLang("labelMap." + cmd) || - "", - onclick: function() { - editor.execCommand(cmd); - }, - theme: editor.options.theme, - showText: false - }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function( - type, - causeByUi, - uiReady - ) { - var state = editor.queryCommandState(cmd); - // console.log('selectionchange',cmd,uiReady,state); - if (state == -1) { - ui.setDisabled(true); - ui.setChecked(false); - } else { - if (!uiReady) { - ui.setDisabled(false); - ui.setChecked(state); + editorui.Dialog = function (options) { + var dialog = new _Dialog(options); + dialog.addListener("hide", function () { + if (dialog.editor) { + var editor = dialog.editor; + try { + if (browser.gecko) { + var y = editor.window.scrollY, + x = editor.window.scrollX; + editor.body.focus(); + editor.window.scrollTo(x, y); + } else { + editor.focus(); + } + } catch (ex) { + } } - } }); - return ui; - }; - })(ci); - } + return dialog; + }; - //清除文档 - editorui.cleardoc = function(editor) { - var ui = new editorui.Button({ - className: "edui-for-cleardoc", - title: - editor.options.labelMap.cleardoc || - editor.getLang("labelMap.cleardoc") || - "", - theme: editor.options.theme, - onclick: function() { - if (confirm(editor.getLang("confirmClear"))) { - editor.execCommand("cleardoc"); - } - } - }); - editorui.buttons["cleardoc"] = ui; - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState("cleardoc") == -1); - }); - return ui; - }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + var btnCmds = [ + "undo", + "redo", + "formatmatch", + "bold", + "italic", + "underline", + "fontborder", + "touppercase", + "tolowercase", + "strikethrough", + "subscript", + "superscript", + "source", + "indent", + "outdent", + "blockquote", + "pasteplain", + "pagebreak", + "selectall", + "print", + "horizontal", + "removeformat", + "time", + "date", + "unlink", + "insertparagraphbeforetable", + "insertrow", + "insertcol", + "mergeright", + "mergedown", + "deleterow", + "deletecol", + "splittorows", + "splittocols", + "splittocells", + "mergecells", + "deletetable", + ]; - //排版,图片排版,文字方向 - var typeset = { - justify: ["left", "right", "center", "justify"], - imagefloat: ["none", "left", "center", "right"], - directionality: ["ltr", "rtl"] - }; - - for (var p in typeset) { - (function(cmd, val) { - for (var i = 0, ci; (ci = val[i++]); ) { - (function(cmd2) { - editorui[cmd.replace("float", "") + cmd2] = function(editor) { - var ui = new editorui.Button({ - className: "edui-for-" + cmd.replace("float", "") + cmd2, - title: - editor.options.labelMap[cmd.replace("float", "") + cmd2] || - editor.getLang( - "labelMap." + cmd.replace("float", "") + cmd2 - ) || - "", - theme: editor.options.theme, - onclick: function() { - editor.execCommand(cmd, cmd2); - } - }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function( - type, - causeByUi, - uiReady - ) { - ui.setDisabled(editor.queryCommandState(cmd) == -1); - ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); - }); - return ui; - }; - })(ci); - } - })(p, typeset[p]); - } - - //字体颜色和背景颜色 - for (var i = 0, ci; (ci = ["backcolor", "forecolor"][i++]); ) { - editorui[ci] = (function(cmd) { - return function(editor) { - var ui = new editorui.ColorButton({ - className: "edui-for-" + cmd, - color: "default", - title: - editor.options.labelMap[cmd] || - editor.getLang("labelMap." + cmd) || - "", - editor: editor, - onpickcolor: function(t, color) { - editor.execCommand(cmd, color); - }, - onpicknocolor: function() { - editor.execCommand(cmd, "default"); - this.setColor("transparent"); - this.color = "default"; - }, - onbuttonclick: function() { - editor.execCommand(cmd, this.color); - } - }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState(cmd) == -1); - }); - return ui; - }; - })(ci); - } - - var dialogBtns = { - noOk: ["searchreplace", "help", "spechars", "preview"], - ok: [ - "attachment", - "anchor", - "link", - "insertimage", - "insertframe", - "wordimage", - "insertvideo", - "insertframe", - "edittip", - "edittable", - "edittd", - "scrawl", - "template", - "formula", - "background", - ] - }; - - for (var p in dialogBtns) { - (function(type, vals) { - for (var i = 0, ci; (ci = vals[i++]); ) { - //todo opera下存在问题 - if (browser.opera && ci === "searchreplace") { - continue; - } - (function(cmd) { - editorui[cmd] = function(editor, iframeUrl, title) { - iframeUrl = - iframeUrl || - (editor.options.iframeUrlMap || {})[cmd] || - iframeUrlMap[cmd]; - title = - editor.options.labelMap[cmd] || - editor.getLang("labelMap." + cmd) || - ""; - - var dialog; - //没有iframeUrl不创建dialog - if (iframeUrl) { - dialog = new editorui.Dialog( - utils.extend( - { - iframeUrl: editor.ui.mapUrl(iframeUrl), - editor: editor, + for (var i = 0, ci; (ci = btnCmds[i++]);) { + ci = ci.toLowerCase(); + editorui[ci] = (function (cmd) { + return function (editor) { + var ui = new editorui.Button({ className: "edui-for-" + cmd, - title: title, - holdScroll: cmd === "insertimage", - fullscreen: /preview/.test(cmd), - closeDialog: editor.getLang("closeDialog") - }, - type == "ok" - ? { - buttons: [ - { - className: "edui-okbutton", - label: editor.getLang("ok"), - editor: editor, - onclick: function() { - dialog.close(true); + title: + editor.options.labelMap[cmd] || + editor.getLang("labelMap." + cmd) || + "", + onclick: function () { + editor.execCommand(cmd); + }, + theme: editor.options.theme, + showText: false + }); + switch (cmd) { + case 'bold': + case 'italic': + case 'underline': + case 'strikethrough': + case 'fontborder': + ui.shouldUiShow = (function (cmdInternal) { + return function () { + if (!editor.selection.getText()) { + return false; + } + return editor.queryCommandState(cmdInternal) !== UE.constants.STATEFUL.DISABLED; } - }, - { - className: "edui-cancelbutton", - label: editor.getLang("cancel"), - editor: editor, - onclick: function() { - dialog.close(false); - } - } - ] - } - : {} - ) - ); + })(cmd); + break; + } + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function ( + type, + causeByUi, + uiReady + ) { + var state = editor.queryCommandState(cmd); + if (state === -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + })(ci); + } - editor.ui._dialogs[cmd + "Dialog"] = dialog; + //清除文档 + editorui.cleardoc = function (editor) { + var ui = new editorui.Button({ + className: "edui-for-cleardoc", + title: + editor.options.labelMap.cleardoc || + editor.getLang("labelMap.cleardoc") || + "", + theme: editor.options.theme, + onclick: function () { + if (confirm(editor.getLang("confirmClear"))) { + editor.execCommand("cleardoc"); + } } + }); + editorui.buttons["cleardoc"] = ui; + editor.addListener("selectionchange", function () { + ui.setDisabled(editor.queryCommandState("cleardoc") == -1); + }); + return ui; + }; - var ui = new editorui.Button({ - className: "edui-for-" + cmd, - title: title, - onclick: function() { - if(editor.options.toolbarCallback){ - if(true === editor.options.toolbarCallback(cmd,editor)){ - return; + var imageTypeSet = [ + 'none', 'left', 'center', 'right' + ]; + for (let value of imageTypeSet) { + (function (value) { + editorui['image' + value] = function (editor) { + var ui = new editorui.Button({ + className: "edui-for-" + 'image' + value, + title: + editor.options.labelMap['image' + value] || + editor.getLang( + "labelMap." + 'image' + value + ) || + "", + theme: editor.options.theme, + onclick: function () { + editor.execCommand('imagefloat', value); + }, + shouldUiShow: function () { + let closedNode = editor.selection.getRange().getClosedNode(); + if (!closedNode || closedNode.tagName !== "IMG") { + return false; + } + if (domUtils.hasClass(closedNode, "uep-loading") || domUtils.hasClass(closedNode, "uep-loading-error")) { + return false; + } + return editor.queryCommandState('imagefloat') !== UE.constants.STATEFUL.DISABLED; + } + }); + editorui.buttons['image' + value] = ui; + editor.addListener("selectionchange", function ( + type, + causeByUi, + uiReady + ) { + ui.setDisabled(editor.queryCommandState('imagefloat') === UE.constants.STATEFUL.DISABLED); + ui.setChecked(editor.queryCommandValue('imagefloat') === value && !uiReady); + }); + return ui; + }; + })(value); + } + + //排版,图片排版,文字方向 + var typeset = { + justify: ["left", "right", "center", "justify"], + directionality: ["ltr", "rtl"] + }; + for (var p in typeset) { + (function (cmd, val) { + for (var i = 0, ci; (ci = val[i++]);) { + (function (cmd2) { + editorui[cmd.replace("float", "") + cmd2] = function (editor) { + var ui = new editorui.Button({ + className: "edui-for-" + cmd.replace("float", "") + cmd2, + title: + editor.options.labelMap[cmd.replace("float", "") + cmd2] || + editor.getLang( + "labelMap." + cmd.replace("float", "") + cmd2 + ) || + "", + theme: editor.options.theme, + onclick: function () { + editor.execCommand(cmd, cmd2); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function ( + type, + causeByUi, + uiReady + ) { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); + }); + return ui; + }; + })(ci); + } + })(p, typeset[p]); + } + + //字体颜色和背景颜色 + for (var i = 0, ci; (ci = ["backcolor", "forecolor"][i++]);) { + editorui[ci] = (function (cmd) { + return function (editor) { + var ui = new editorui.ColorButton({ + className: "edui-for-" + cmd, + color: "default", + title: + editor.options.labelMap[cmd] || + editor.getLang("labelMap." + cmd) || + "", + editor: editor, + onpickcolor: function (t, color) { + editor.execCommand(cmd, color); + }, + onpicknocolor: function () { + editor.execCommand(cmd, "default"); + this.setColor("transparent"); + this.color = "default"; + }, + onbuttonclick: function () { + editor.execCommand(cmd, this.color); + }, + shouldUiShow: function () { + if (!editor.selection.getText()) { + return false; + } + return editor.queryCommandState(cmd) !== UE.constants.STATEFUL.DISABLED; + } + }); + + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; + })(ci); + } + + var dialogIframeUrlMap = { + anchor: "~/dialogs/anchor/anchor.html?2f10d082", + insertimage: "~/dialogs/image/image.html?4bce17a0", + link: "~/dialogs/link/link.html?ccbfcf18", + spechars: "~/dialogs/spechars/spechars.html?3bbeb696", + searchreplace: "~/dialogs/searchreplace/searchreplace.html?2cb782d2", + insertvideo: "~/dialogs/video/video.html?7fde01cd", + insertaudio: "~/dialogs/audio/audio.html?d264cea1", + help: "~/dialogs/help/help.html?05c0c8bf", + preview: "~/dialogs/preview/preview.html?5d9a0847", + emotion: "~/dialogs/emotion/emotion.html?a7bc0989", + wordimage: "~/dialogs/wordimage/wordimage.html?11da452e", + formula: "~/dialogs/formula/formula.html?9a5a1511", + attachment: "~/dialogs/attachment/attachment.html?d632fa7c", + insertframe: "~/dialogs/insertframe/insertframe.html?807119a5", + edittip: "~/dialogs/table/edittip.html?fa0ea189", + edittable: "~/dialogs/table/edittable.html?134e2f06", + edittd: "~/dialogs/table/edittd.html?9fe1a06e", + scrawl: "~/dialogs/scrawl/scrawl.html?c8323e43", + template: "~/dialogs/template/template.html?3c8090b7", + background: "~/dialogs/background/background.html?c2bb8b05", + contentimport: "~/dialogs/contentimport/contentimport.html?e298f77b", + }; + var dialogBtns = { + noOk: ["searchreplace", "help", "spechars", "preview"], + ok: [ + "attachment", + "anchor", + "link", + "insertimage", + "insertframe", + "wordimage", + "insertvideo", + "insertaudio", + "edittip", + "edittable", + "edittd", + "scrawl", + "template", + "formula", + "background", + "contentimport", + ] + }; + for (var p in dialogBtns) { + (function (type, vals) { + for (var i = 0, ci; (ci = vals[i++]);) { + //todo opera下存在问题 + if (browser.opera && ci === "searchreplace") { + continue; + } + (function (cmd) { + editorui[cmd] = function (editor, iframeUrl, title) { + iframeUrl = + iframeUrl || + (editor.options.dialogIframeUrlMap || {})[cmd] || + dialogIframeUrlMap[cmd]; + title = + editor.options.labelMap[cmd] || + editor.getLang("labelMap." + cmd) || + ""; + + var dialog; + //没有iframeUrl不创建dialog + if (iframeUrl) { + dialog = new editorui.Dialog( + utils.extend( + { + iframeUrl: editor.ui.mapUrl(iframeUrl), + editor: editor, + className: "edui-for-" + cmd, + title: title, + holdScroll: cmd === "insertimage", + fullscreen: /preview/.test(cmd), + closeDialog: editor.getLang("closeDialog") + }, + type === "ok" + ? { + buttons: [ + { + className: "edui-okbutton", + label: editor.getLang("ok"), + editor: editor, + onclick: function () { + dialog.close(true); + } + }, + { + className: "edui-cancelbutton", + label: editor.getLang("cancel"), + editor: editor, + onclick: function () { + dialog.close(false); + } + } + ] + } + : {} + ) + ); + + editor.ui._dialogs[cmd + "Dialog"] = dialog; + } + + var ui = new editorui.Button({ + className: "edui-for-" + cmd, + title: title, + onclick: function () { + if (editor.options.toolbarCallback) { + if (true === editor.options.toolbarCallback(cmd, editor)) { + return; + } + } + if (dialog) { + switch (cmd) { + case "wordimage": + var images = editor.execCommand("wordimage"); + if (images && images.length) { + dialog.render(); + dialog.open(); + } + break; + case "scrawl": + if (editor.queryCommandState("scrawl") !== -1) { + dialog.render(); + dialog.open(); + } + break; + default: + dialog.render(); + dialog.open(); + } + } + }, + theme: editor.options.theme, + disabled: (cmd === "scrawl" && editor.queryCommandState("scrawl") === -1) + }); + switch (cmd) { + case 'insertimage': + case 'formula': + ui.shouldUiShow = (function (cmd) { + return function () { + let closedNode = editor.selection.getRange().getClosedNode(); + if (!closedNode || closedNode.tagName !== "IMG") { + return false; + } + if ('formula' === cmd && closedNode.getAttribute('data-formula-image') !== null) { + return true; + } + if ('insertimage' === cmd) { + return true; + } + return false; + }; + })(cmd); + break; + } + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function () { + //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 + var unNeedCheckState = {edittable: 1}; + if (cmd in unNeedCheckState) return; + + var state = editor.queryCommandState(cmd); + if (ui.getDom()) { + ui.setDisabled(state === -1); + ui.setChecked(state); + } + }); + + return ui; + }; + })(ci.toLowerCase()); + } + })(p, dialogBtns[p]); + } + + editorui.insertcode = function (editor, list, title) { + list = editor.options["insertcode"] || []; + title = + editor.options.labelMap["insertcode"] || + editor.getLang("labelMap.insertcode") || + ""; + // if (!list.length) return; + var items = []; + utils.each(list, function (key, val) { + items.push({ + label: key, + value: val, + theme: editor.options.theme, + renderLabelHtml: function () { + return ( + '
    ' + (this.label || "") + "
    " + ); + } + }); + }); + + var ui = new editorui.Combox({ + editor: editor, + items: items, + onselect: function (t, index) { + editor.execCommand("insertcode", this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + title: title, + initValue: title, + className: "edui-for-insertcode", + indexByValue: function (value) { + if (value) { + for (var i = 0, ci; (ci = this.items[i]); i++) { + if (ci.value.indexOf(value) != -1) return i; } } - if (dialog) { - switch (cmd) { - case "wordimage": - var images = editor.execCommand("wordimage"); - if (images && images.length) { - dialog.render(); - dialog.open(); - } - break; - case "scrawl": - if (editor.queryCommandState("scrawl") != -1) { - dialog.render(); - dialog.open(); - } - break; - default: - dialog.render(); - dialog.open(); - } - } - }, - theme: editor.options.theme, - disabled: - (cmd == "scrawl" && editor.queryCommandState("scrawl") == -1) - }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function() { - //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 - var unNeedCheckState = { edittable: 1 }; - if (cmd in unNeedCheckState) return; - - var state = editor.queryCommandState(cmd); - if (ui.getDom()) { - ui.setDisabled(state == -1); - ui.setChecked(state); - } - }); - - return ui; - }; - })(ci.toLowerCase()); - } - })(p, dialogBtns[p]); - } - - editorui.insertcode = function(editor, list, title) { - list = editor.options["insertcode"] || []; - title = - editor.options.labelMap["insertcode"] || - editor.getLang("labelMap.insertcode") || - ""; - // if (!list.length) return; - var items = []; - utils.each(list, function(key, val) { - items.push({ - label: key, - value: val, - theme: editor.options.theme, - renderLabelHtml: function() { - return ( - '
    ' + (this.label || "") + "
    " - ); - } - }); - }); - - var ui = new editorui.Combox({ - editor: editor, - items: items, - onselect: function(t, index) { - editor.execCommand("insertcode", this.items[index].value); - }, - onbuttonclick: function() { - this.showPopup(); - }, - title: title, - initValue: title, - className: "edui-for-insertcode", - indexByValue: function(value) { - if (value) { - for (var i = 0, ci; (ci = this.items[i]); i++) { - if (ci.value.indexOf(value) != -1) return i; - } - } - - return -1; - } - }); - editorui.buttons["insertcode"] = ui; - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - if (!uiReady) { - var state = editor.queryCommandState("insertcode"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("insertcode"); - if (!value) { - ui.setValue(title); - return; - } - //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 - value && (value = value.replace(/['"]/g, "").split(",")[0]); - ui.setValue(value); - } - } - }); - return ui; - }; - editorui.fontfamily = function(editor, list, title) { - list = editor.options["fontfamily"] || []; - title = - editor.options.labelMap["fontfamily"] || - editor.getLang("labelMap.fontfamily") || - ""; - if (!list.length) return; - for (var i = 0, ci, items = []; (ci = list[i]); i++) { - var langLabel = editor.getLang("fontfamily")[ci.name] || ""; - (function(key, val) { - items.push({ - label: key, - value: val, - theme: editor.options.theme, - renderLabelHtml: function() { - return ( - '
    ' + - (this.label || "") + - "
    " - ); - } - }); - })(ci.label || langLabel, ci.val); - } - var ui = new editorui.Combox({ - editor: editor, - items: items, - onselect: function(t, index) { - editor.execCommand("FontFamily", this.items[index].value); - }, - onbuttonclick: function() { - this.showPopup(); - }, - title: title, - initValue: title, - className: "edui-for-fontfamily", - indexByValue: function(value) { - if (value) { - for (var i = 0, ci; (ci = this.items[i]); i++) { - if (ci.value.indexOf(value) != -1) return i; - } - } - - return -1; - } - }); - editorui.buttons["fontfamily"] = ui; - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - if (!uiReady) { - var state = editor.queryCommandState("FontFamily"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("FontFamily"); - //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 - value && (value = value.replace(/['"]/g, "").split(",")[0]); - ui.setValue(value); - } - } - }); - return ui; - }; - - editorui.fontsize = function(editor, list, title) { - title = - editor.options.labelMap["fontsize"] || - editor.getLang("labelMap.fontsize") || - ""; - list = list || editor.options["fontsize"] || []; - if (!list.length) return; - var items = []; - for (var i = 0; i < list.length; i++) { - var size = list[i] + "px"; - items.push({ - label: size, - value: size, - theme: editor.options.theme, - renderLabelHtml: function() { - return ( - '
    ' + - (this.label || "") + - "
    " - ); - } - }); - } - var ui = new editorui.Combox({ - editor: editor, - items: items, - title: title, - initValue: title, - onselect: function(t, index) { - editor.execCommand("FontSize", this.items[index].value); - }, - onbuttonclick: function() { - this.showPopup(); - }, - className: "edui-for-fontsize" - }); - editorui.buttons["fontsize"] = ui; - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - if (!uiReady) { - var state = editor.queryCommandState("FontSize"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - ui.setValue(editor.queryCommandValue("FontSize")); - } - } - }); - return ui; - }; - - editorui.paragraph = function(editor, list, title) { - title = - editor.options.labelMap["paragraph"] || - editor.getLang("labelMap.paragraph") || - ""; - list = editor.options["paragraph"] || []; - if (utils.isEmptyObject(list)) return; - var items = []; - for (var i in list) { - items.push({ - value: i, - label: list[i] || editor.getLang("paragraph")[i], - theme: editor.options.theme, - renderLabelHtml: function() { - return ( - '
    ' + - (this.label || "") + - "
    " - ); - } - }); - } - var ui = new editorui.Combox({ - editor: editor, - items: items, - title: title, - initValue: title, - className: "edui-for-paragraph", - onselect: function(t, index) { - editor.execCommand("Paragraph", this.items[index].value); - }, - onbuttonclick: function() { - this.showPopup(); - } - }); - editorui.buttons["paragraph"] = ui; - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - if (!uiReady) { - var state = editor.queryCommandState("Paragraph"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("Paragraph"); - var index = ui.indexByValue(value); - if (index != -1) { - ui.setValue(value); - } else { - ui.setValue(ui.initValue); - } - } - } - }); - return ui; - }; - - //自定义标题 - editorui.customstyle = function(editor) { - var list = editor.options["customstyle"] || [], - title = - editor.options.labelMap["customstyle"] || - editor.getLang("labelMap.customstyle") || - ""; - if (!list.length) return; - var langCs = editor.getLang("customstyle"); - for (var i = 0, items = [], t; (t = list[i++]); ) { - (function(t) { - var ck = {}; - ck.label = t.label ? t.label : langCs[t.name]; - ck.style = t.style; - ck.className = t.className; - ck.tag = t.tag; - items.push({ - label: ck.label, - value: ck, - theme: editor.options.theme, - renderLabelHtml: function() { - return ( - '
    ' + - "<" + - ck.tag + - " " + - (ck.className ? ' class="' + ck.className + '"' : "") + - (ck.style ? ' style="' + ck.style + '"' : "") + - ">" + - ck.label + - "" + - "
    " - ); - } - }); - })(t); - } - - var ui = new editorui.Combox({ - editor: editor, - items: items, - title: title, - initValue: title, - className: "edui-for-customstyle", - onselect: function(t, index) { - editor.execCommand("customstyle", this.items[index].value); - }, - onbuttonclick: function() { - this.showPopup(); - }, - indexByValue: function(value) { - for (var i = 0, ti; (ti = this.items[i++]); ) { - if (ti.label == value) { - return i - 1; - } - } - return -1; - } - }); - editorui.buttons["customstyle"] = ui; - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - if (!uiReady) { - var state = editor.queryCommandState("customstyle"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("customstyle"); - var index = ui.indexByValue(value); - if (index != -1) { - ui.setValue(value); - } else { - ui.setValue(ui.initValue); - } - } - } - }); - return ui; - }; - editorui.inserttable = function(editor, iframeUrl, title) { - title = - editor.options.labelMap["inserttable"] || - editor.getLang("labelMap.inserttable") || - ""; - var ui = new editorui.TableButton({ - editor: editor, - title: title, - className: "edui-for-inserttable", - onpicktable: function(t, numCols, numRows) { - editor.execCommand("InsertTable", { - numRows: numRows, - numCols: numCols, - border: 1 - }); - }, - onbuttonclick: function() { - this.showPopup(); - } - }); - editorui.buttons["inserttable"] = ui; - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState("inserttable") == -1); - }); - return ui; - }; - - editorui.lineheight = function(editor) { - var val = editor.options.lineheight || []; - if (!val.length) return; - for (var i = 0, ci, items = []; (ci = val[i++]); ) { - items.push({ - //todo:写死了 - label: ci, - value: ci, - theme: editor.options.theme, - onclick: function() { - editor.execCommand("lineheight", this.value); - } - }); - } - var ui = new editorui.MenuButton({ - editor: editor, - className: "edui-for-lineheight", - title: - editor.options.labelMap["lineheight"] || - editor.getLang("labelMap.lineheight") || - "", - items: items, - onbuttonclick: function() { - var value = editor.queryCommandValue("LineHeight") || this.value; - editor.execCommand("LineHeight", value); - } - }); - editorui.buttons["lineheight"] = ui; - editor.addListener("selectionchange", function() { - var state = editor.queryCommandState("LineHeight"); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("LineHeight"); - value && ui.setValue((value + "").replace(/cm/, "")); - ui.setChecked(state); - } - }); - return ui; - }; - - var rowspacings = ["top", "bottom"]; - for (var r = 0, ri; (ri = rowspacings[r++]); ) { - (function(cmd) { - editorui["rowspacing" + cmd] = function(editor) { - var val = editor.options["rowspacing" + cmd] || []; - if (!val.length) return null; - for (var i = 0, ci, items = []; (ci = val[i++]); ) { - items.push({ - label: ci, - value: ci, - theme: editor.options.theme, - onclick: function() { - editor.execCommand("rowspacing", this.value, cmd); + return -1; } - }); - } - var ui = new editorui.MenuButton({ - editor: editor, - className: "edui-for-rowspacing" + cmd, - title: - editor.options.labelMap["rowspacing" + cmd] || - editor.getLang("labelMap.rowspacing" + cmd) || - "", - items: items, - onbuttonclick: function() { - var value = - editor.queryCommandValue("rowspacing", cmd) || this.value; - editor.execCommand("rowspacing", value, cmd); - } }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function() { - var state = editor.queryCommandState("rowspacing", cmd); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue("rowspacing", cmd); - value && ui.setValue((value + "").replace(/%/, "")); - ui.setChecked(state); - } + editorui.buttons["insertcode"] = ui; + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState("insertcode"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("insertcode"); + if (!value) { + ui.setValue(title); + return; + } + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, "").split(",")[0]); + ui.setValue(value); + } + } }); return ui; - }; - })(ri); - } - //有序,无序列表 - var lists = ["insertorderedlist", "insertunorderedlist"]; - for (var l = 0, cl; (cl = lists[l++]); ) { - (function(cmd) { - editorui[cmd] = function(editor) { - var vals = editor.options[cmd], - _onMenuClick = function() { - editor.execCommand(cmd, this.value); - }, - items = []; - for (var i in vals) { - items.push({ - label: vals[i] || editor.getLang()[cmd][i] || "", - value: i, + }; + + editorui.fontfamily = function (editor, list, title) { + list = editor.options["fontfamily"] || []; + title = + editor.options.labelMap["fontfamily"] || + editor.getLang("labelMap.fontfamily") || + ""; + if (!list.length) return; + for (var i = 0, ci, items = []; (ci = list[i]); i++) { + var langLabel = editor.getLang("fontfamily")[ci.name] || ""; + (function (key, val) { + items.push({ + label: key, + value: val, + theme: editor.options.theme, + renderLabelHtml: function () { + return ( + '
    ' + + (this.label || "") + + "
    " + ); + } + }); + })(ci.label || langLabel, ci.val); + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + onselect: function (t, index) { + editor.execCommand("FontFamily", this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + title: title, + initValue: title, + className: "edui-for-fontfamily", + indexByValue: function (value) { + if (value) { + for (var i = 0, ci; (ci = this.items[i]); i++) { + if (ci.value.indexOf(value) != -1) return i; + } + } + return -1; + } + }); + editorui.buttons["fontfamily"] = ui; + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState("FontFamily"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("FontFamily"); + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, "").split(",")[0]); + ui.setValue(value); + } + } + }); + return ui; + }; + + editorui.fontsize = function (editor, list, title) { + title = + editor.options.labelMap["fontsize"] || + editor.getLang("labelMap.fontsize") || + ""; + list = list || editor.options["fontsize"] || []; + if (!list.length) return; + var items = []; + for (var i = 0; i < list.length; i++) { + var size = list[i] + "px"; + items.push({ + label: size, + value: size, + theme: editor.options.theme, + renderLabelHtml: function () { + return ( + '
    ' + + (this.label || "") + + "
    " + ); + } + }); + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + onselect: function (t, index) { + editor.execCommand("FontSize", this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + className: "edui-for-fontsize" + }); + editorui.buttons["fontsize"] = ui; + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState("FontSize"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + ui.setValue(editor.queryCommandValue("FontSize")); + } + } + }); + return ui; + }; + + editorui.paragraph = function (editor, list, title) { + title = + editor.options.labelMap["paragraph"] || + editor.getLang("labelMap.paragraph") || + ""; + list = editor.options["paragraph"] || []; + if (utils.isEmptyObject(list)) return; + var items = []; + for (var i in list) { + items.push({ + value: i, + label: list[i] || editor.getLang("paragraph")[i], + theme: editor.options.theme, + renderLabelHtml: function () { + return ( + '
    ' + + (this.label || "") + + "
    " + ); + } + }); + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + className: "edui-for-paragraph", + onselect: function (t, index) { + editor.execCommand("Paragraph", this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + } + }); + editorui.buttons["paragraph"] = ui; + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState("Paragraph"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("Paragraph"); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + }); + return ui; + }; + + //自定义标题 + editorui.customstyle = function (editor) { + var list = editor.options["customstyle"] || [], + title = + editor.options.labelMap["customstyle"] || + editor.getLang("labelMap.customstyle") || + ""; + if (!list.length) return; + var langCs = editor.getLang("customstyle"); + for (var i = 0, items = [], t; (t = list[i++]);) { + (function (t) { + var ck = {}; + ck.label = t.label ? t.label : langCs[t.name]; + ck.style = t.style; + ck.className = t.className; + ck.tag = t.tag; + items.push({ + label: ck.label, + value: ck, + theme: editor.options.theme, + renderLabelHtml: function () { + return ( + '
    ' + + "<" + + ck.tag + + " " + + (ck.className ? ' class="' + ck.className + '"' : "") + + (ck.style ? ' style="' + ck.style + '"' : "") + + ">" + + ck.label + + "" + + "
    " + ); + } + }); + })(t); + } + + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + className: "edui-for-customstyle", + onselect: function (t, index) { + editor.execCommand("customstyle", this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + indexByValue: function (value) { + for (var i = 0, ti; (ti = this.items[i++]);) { + if (ti.label == value) { + return i - 1; + } + } + return -1; + } + }); + editorui.buttons["customstyle"] = ui; + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState("customstyle"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("customstyle"); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + }); + return ui; + }; + + editorui.inserttable = function (editor, iframeUrl, title) { + title = + editor.options.labelMap["inserttable"] || + editor.getLang("labelMap.inserttable") || + ""; + var ui = new editorui.TableButton({ + editor: editor, + title: title, + className: "edui-for-inserttable", + onpicktable: function (t, numCols, numRows) { + editor.execCommand("InsertTable", { + numRows: numRows, + numCols: numCols, + border: 1 + }); + }, + onbuttonclick: function () { + this.showPopup(); + } + }); + editorui.buttons["inserttable"] = ui; + editor.addListener("selectionchange", function () { + ui.setDisabled(editor.queryCommandState("inserttable") == -1); + }); + return ui; + }; + + editorui.lineheight = function (editor) { + var val = editor.options.lineheight || []; + if (!val.length) return; + for (var i = 0, ci, items = []; (ci = val[i++]);) { + items.push({ + //todo:写死了 + label: ci, + value: ci, + theme: editor.options.theme, + onclick: function () { + editor.execCommand("lineheight", this.value); + } + }); + } + var ui = new editorui.MenuButton({ + editor: editor, + className: "edui-for-lineheight", + title: + editor.options.labelMap["lineheight"] || + editor.getLang("labelMap.lineheight") || + "", + items: items, + onbuttonclick: function () { + var value = editor.queryCommandValue("LineHeight") || this.value; + editor.execCommand("LineHeight", value); + } + }); + editorui.buttons["lineheight"] = ui; + editor.addListener("selectionchange", function () { + var state = editor.queryCommandState("LineHeight"); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("LineHeight"); + value && ui.setValue((value + "").replace(/cm/, "")); + ui.setChecked(state); + } + }); + return ui; + }; + + var rowspacings = ["top", "bottom"]; + for (var r = 0, ri; (ri = rowspacings[r++]);) { + (function (cmd) { + editorui["rowspacing" + cmd] = function (editor) { + var val = editor.options["rowspacing" + cmd] || []; + if (!val.length) return null; + for (var i = 0, ci, items = []; (ci = val[i++]);) { + items.push({ + label: ci, + value: ci, + theme: editor.options.theme, + onclick: function () { + editor.execCommand("rowspacing", this.value, cmd); + } + }); + } + var ui = new editorui.MenuButton({ + editor: editor, + className: "edui-for-rowspacing" + cmd, + title: + editor.options.labelMap["rowspacing" + cmd] || + editor.getLang("labelMap.rowspacing" + cmd) || + "", + items: items, + onbuttonclick: function () { + var value = + editor.queryCommandValue("rowspacing", cmd) || this.value; + editor.execCommand("rowspacing", value, cmd); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function () { + var state = editor.queryCommandState("rowspacing", cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue("rowspacing", cmd); + value && ui.setValue((value + "").replace(/%/, "")); + ui.setChecked(state); + } + }); + return ui; + }; + })(ri); + } + + //有序,无序列表 + var lists = ["insertorderedlist", "insertunorderedlist"]; + for (var l = 0, cl; (cl = lists[l++]);) { + (function (cmd) { + editorui[cmd] = function (editor) { + var vals = editor.options[cmd], + _onMenuClick = function () { + editor.execCommand(cmd, this.value); + }, + items = []; + for (var i in vals) { + items.push({ + label: vals[i] || editor.getLang()[cmd][i] || "", + value: i, + theme: editor.options.theme, + onclick: _onMenuClick + }); + } + var ui = new editorui.MenuButton({ + editor: editor, + className: "edui-for-" + cmd, + title: editor.getLang("labelMap." + cmd) || "", + items: items, + onbuttonclick: function () { + var value = editor.queryCommandValue(cmd) || this.value; + editor.execCommand(cmd, value); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function () { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue(cmd); + ui.setValue(value); + ui.setChecked(state); + } + }); + return ui; + }; + })(cl); + } + + editorui.fullscreen = function (editor, title) { + title = + editor.options.labelMap["fullscreen"] || + editor.getLang("labelMap.fullscreen") || + ""; + var ui = new editorui.Button({ + className: "edui-for-fullscreen", + title: title, theme: editor.options.theme, - onclick: _onMenuClick - }); - } - var ui = new editorui.MenuButton({ - editor: editor, - className: "edui-for-" + cmd, - title: editor.getLang("labelMap." + cmd) || "", - items: items, - onbuttonclick: function() { - var value = editor.queryCommandValue(cmd) || this.value; - editor.execCommand(cmd, value); - } + onclick: function () { + if (editor.ui) { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + } + this.setChecked(editor.ui.isFullScreen()); + } }); - editorui.buttons[cmd] = ui; - editor.addListener("selectionchange", function() { - var state = editor.queryCommandState(cmd); - if (state == -1) { - ui.setDisabled(true); - } else { - ui.setDisabled(false); - var value = editor.queryCommandValue(cmd); - ui.setValue(value); - ui.setChecked(state); - } + editorui.buttons["fullscreen"] = ui; + editor.addListener("selectionchange", function () { + var state = editor.queryCommandState("fullscreen"); + ui.setDisabled(state == -1); + ui.setChecked(editor.ui.isFullScreen()); }); return ui; - }; - })(cl); - } + }; - editorui.fullscreen = function(editor, title) { - title = - editor.options.labelMap["fullscreen"] || - editor.getLang("labelMap.fullscreen") || - ""; - var ui = new editorui.Button({ - className: "edui-for-fullscreen", - title: title, - theme: editor.options.theme, - onclick: function() { - if (editor.ui) { - editor.ui.setFullScreen(!editor.ui.isFullScreen()); - } - this.setChecked(editor.ui.isFullScreen()); - } - }); - editorui.buttons["fullscreen"] = ui; - editor.addListener("selectionchange", function() { - var state = editor.queryCommandState("fullscreen"); - ui.setDisabled(state == -1); - ui.setChecked(editor.ui.isFullScreen()); - }); - return ui; - }; + // 表情 + editorui['emotion'] = function (editor, iframeUrl) { + var cmd = "emotion"; + var ui = new editorui.MultiMenuPop({ + title: + editor.options.labelMap[cmd] || + editor.getLang("labelMap." + cmd + "") || + "", + editor: editor, + className: "edui-for-" + cmd, + iframeUrl: editor.ui.mapUrl( + iframeUrl || + (editor.options.dialogIframeUrlMap || {})[cmd] || + dialogIframeUrlMap[cmd] + ) + }); + editorui.buttons[cmd] = ui; - // 表情 - editorui["emotion"] = function(editor, iframeUrl) { - var cmd = "emotion"; - var ui = new editorui.MultiMenuPop({ - title: - editor.options.labelMap[cmd] || - editor.getLang("labelMap." + cmd + "") || - "", - editor: editor, - className: "edui-for-" + cmd, - iframeUrl: editor.ui.mapUrl( - iframeUrl || - (editor.options.iframeUrlMap || {})[cmd] || - iframeUrlMap[cmd] - ) - }); - editorui.buttons[cmd] = ui; + editor.addListener("selectionchange", function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState(cmd) == -1); - }); - return ui; - }; + editorui['autotypeset'] = function (editor) { + var ui = new editorui.AutoTypeSetButton({ + editor: editor, + title: + editor.options.labelMap["autotypeset"] || + editor.getLang("labelMap.autotypeset") || + "", + className: "edui-for-autotypeset", + onbuttonclick: function () { + editor.execCommand("autotypeset"); + } + }); + editorui.buttons["autotypeset"] = ui; + editor.addListener("selectionchange", function () { + ui.setDisabled(editor.queryCommandState("autotypeset") == -1); + }); + return ui; + }; - editorui.autotypeset = function(editor) { - var ui = new editorui.AutoTypeSetButton({ - editor: editor, - title: - editor.options.labelMap["autotypeset"] || - editor.getLang("labelMap.autotypeset") || - "", - className: "edui-for-autotypeset", - onbuttonclick: function() { - editor.execCommand("autotypeset"); - } - }); - editorui.buttons["autotypeset"] = ui; - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState("autotypeset") == -1); - }); - return ui; - }; + /* 简单上传插件 */ + editorui['simpleupload'] = function (editor) { + var name = "simpleupload", + ui = new editorui.Button({ + className: "edui-for-" + name, + title: + editor.options.labelMap[name] || + editor.getLang("labelMap." + name) || + "", + onclick: function () { + }, + theme: editor.options.theme, + showText: false + }); + editorui.buttons[name] = ui; + editor.addListener("ready", function () { + var b = ui.getDom("body"), + iconSpan = b.children[0]; + editor.fireEvent("simpleuploadbtnready", iconSpan); + }); + editor.addListener("selectionchange", function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(name); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; - /* 简单上传插件 */ - editorui["simpleupload"] = function(editor) { - var name = "simpleupload", - ui = new editorui.Button({ - className: "edui-for-" + name, - title: - editor.options.labelMap[name] || - editor.getLang("labelMap." + name) || - "", - onclick: function() {}, - theme: editor.options.theme, - showText: false - }); - editorui.buttons[name] = ui; - editor.addListener("ready", function() { - var b = ui.getDom("body"), - iconSpan = b.children[0]; - editor.fireEvent("simpleuploadbtnready", iconSpan); - }); - editor.addListener("selectionchange", function(type, causeByUi, uiReady) { - var state = editor.queryCommandState(name); - if (state == -1) { - ui.setDisabled(true); - ui.setChecked(false); - } else { - if (!uiReady) { - ui.setDisabled(false); - ui.setChecked(state); - } - } - }); - return ui; - }; })(); @@ -31348,1068 +35571,1076 @@ UE.ui = baidu.editor.ui = {}; ///commandsName FullScreen ///commandsTitle 全屏 (function () { - var utils = baidu.editor.utils, - uiUtils = baidu.editor.ui.uiUtils, - UIBase = baidu.editor.ui.UIBase, - domUtils = baidu.editor.dom.domUtils; - var nodeStack = []; + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + domUtils = baidu.editor.dom.domUtils; + var nodeStack = []; - function EditorUI(options) { - this.initOptions(options); - this.initEditorUI(); - } + function EditorUI(options) { + this.initOptions(options); + this.initEditorUI(); + } - EditorUI.prototype = { - uiName: "editor", - initEditorUI: function () { - this.editor.ui = this; - this._dialogs = {}; - this.initUIBase(); - this._initToolbars(); - var editor = this.editor, - me = this; + EditorUI.prototype = { + uiName: "editor", + initEditorUI: function () { + this.editor.ui = this; + this._dialogs = {}; + this.initUIBase(); + this._initToolbars(); + var editor = this.editor, + me = this; - editor.addListener("ready", function () { - //提供getDialog方法 - editor.getDialog = function (name) { - return editor.ui._dialogs[name + "Dialog"]; - }; - domUtils.on(editor.window, "scroll", function (evt) { - baidu.editor.ui.Popup.postHide(evt); - }); - //提供编辑器实时宽高(全屏时宽高不变化) - editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + editor.addListener("ready", function () { + //提供getDialog方法 + editor.getDialog = function (name) { + return editor.ui._dialogs[name + "Dialog"]; + }; + domUtils.on(editor.window, "scroll", function (evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + //提供编辑器实时宽高(全屏时宽高不变化) + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; - UE.browser.ie && - UE.browser.version === 6 && - editor.container.ownerDocument.execCommand( - "BackgroundImageCache", - false, - true - ); + UE.browser.ie && + UE.browser.version === 6 && + editor.container.ownerDocument.execCommand( + "BackgroundImageCache", + false, + true + ); - //display bottom-bar label based on config - if (editor.options.elementPathEnabled) { - editor.ui.getDom("elementpath").innerHTML = - '
    ' + - editor.getLang("elementPathTip") + - ":
    "; - } - if (editor.options.wordCount) { - function countFn() { - setCount(editor, me); - domUtils.un(editor.document, "click", arguments.callee); - } - - domUtils.on(editor.document, "click", countFn); - editor.ui.getDom("wordcount").innerHTML = editor.getLang( - "wordCountTip" - ); - } - editor.ui._scale(); - if (editor.options.scaleEnabled) { - if (editor.autoHeightEnabled) { - editor.disableAutoHeight(); - } - me.enableScale(); - } else { - me.disableScale(); - } - if ( - !editor.options.elementPathEnabled && - !editor.options.wordCount && - !editor.options.scaleEnabled - ) { - editor.ui.getDom("elementpath").style.display = "none"; - editor.ui.getDom("wordcount").style.display = "none"; - editor.ui.getDom("scale").style.display = "none"; - } - - if (!editor.selection.isFocus()) return; - editor.fireEvent("selectionchange", false, true); - }); - - editor.addListener("mousedown", function (t, evt) { - var el = evt.target || evt.srcElement; - baidu.editor.ui.Popup.postHide(evt, el); - baidu.editor.ui.ShortCutMenu.postHide(evt); - }); - editor.addListener("delcells", function () { - if (UE.ui["edittip"]) { - new UE.ui["edittip"](editor); - } - editor.getDialog("edittip").open(); - }); - - var pastePop, - isPaste = false, - timer; - editor.addListener("afterpaste", function () { - if (editor.queryCommandState("pasteplain")) return; - if (baidu.editor.ui.PastePicker) { - pastePop = new baidu.editor.ui.Popup({ - content: new baidu.editor.ui.PastePicker({editor: editor}), - editor: editor, - className: "edui-wordpastepop" - }); - pastePop.render(); - } - isPaste = true; - }); - - editor.addListener("afterinserthtml", function () { - clearTimeout(timer); - timer = setTimeout(function () { - if (pastePop && (isPaste || editor.ui._isTransfer)) { - if (pastePop.isHidden()) { - var span = domUtils.createElement(editor.document, "span", { - style: "line-height:0px;", - innerHTML: "\ufeff" - }), - range = editor.selection.getRange(); - range.insertNode(span); - var tmp = getDomNode(span, "firstChild", "previousSibling"); - tmp && - pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); - domUtils.remove(span); - } else { - pastePop.show(); - } - delete editor.ui._isTransfer; - isPaste = false; - } - }, 200); - }); - editor.addListener("contextmenu", function (t, evt) { - baidu.editor.ui.Popup.postHide(evt); - }); - editor.addListener("keydown", function (t, evt) { - if (pastePop) pastePop.dispose(evt); - var keyCode = evt.keyCode || evt.which; - if (evt.altKey && keyCode == 90) { - UE.ui.buttons["fullscreen"].onclick(); - } - }); - editor.addListener("wordcount", function (type) { - setCount(this, me); - }); - - function setCount(editor, ui) { - editor.setOpt({ - wordCount: true, - maximumWords: 10000, - wordCountMsg: - editor.options.wordCountMsg || editor.getLang("wordCountMsg"), - wordOverFlowMsg: - editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") - }); - var opt = editor.options, - max = opt.maximumWords, - msg = opt.wordCountMsg, - errMsg = opt.wordOverFlowMsg, - countDom = ui.getDom("wordcount"); - if (!opt.wordCount) { - return; - } - var count = editor.getContentLength(true); - if (count > max) { - countDom.innerHTML = errMsg; - editor.fireEvent("wordcountoverflow"); - } else { - countDom.innerHTML = msg - .replace("{#leave}", max - count) - .replace("{#count}", count); - } - } - - editor.addListener("selectionchange", function () { - if (editor.options.elementPathEnabled) { - me[ - (editor.queryCommandState("elementpath") == -1 ? "dis" : "en") + - "ableElementPath" - ](); - } - if (editor.options.scaleEnabled) { - me[ - (editor.queryCommandState("scale") == -1 ? "dis" : "en") + - "ableScale" - ](); - } - }); - var popup = new baidu.editor.ui.Popup({ - editor: editor, - content: "", - className: "edui-bubble", - _onEditButtonClick: function () { - this.hide(); - editor.ui._dialogs.linkDialog.open(); - }, - _onImgEditButtonClick: function (name) { - this.hide(); - editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); - }, - _onImgSetFloat: function (value) { - this.hide(); - editor.execCommand("imagefloat", value); - }, - _setIframeAlign: function (value) { - var frame = popup.anchorEl; - var newFrame = frame.cloneNode(true); - switch (value) { - case -2: - newFrame.setAttribute("align", ""); - break; - case -1: - newFrame.setAttribute("align", "left"); - break; - case 1: - newFrame.setAttribute("align", "right"); - break; - } - frame.parentNode.insertBefore(newFrame, frame); - domUtils.remove(frame); - popup.anchorEl = newFrame; - popup.showAnchor(popup.anchorEl); - }, - _updateIframe: function () { - var frame = (editor._iframe = popup.anchorEl); - if (domUtils.hasClass(frame, "ueditor_baidumap")) { - editor.selection.getRange().selectNode(frame).select(); - editor.ui._dialogs.mapDialog.open(); - popup.hide(); - } else { - editor.ui._dialogs.insertframeDialog.open(); - popup.hide(); - } - }, - _onRemoveButtonClick: function (cmdName) { - editor.execCommand(cmdName); - this.hide(); - }, - queryAutoHide: function (el) { - if (el && el.ownerDocument == editor.document) { - if ( - el.tagName.toLowerCase() == "img" || - domUtils.findParentByTagName(el, "a", true) - ) { - return el !== popup.anchorEl; - } - } - return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); - } - }); - popup.render(); - if (editor.options.imagePopup) { - editor.addListener("mouseover", function (t, evt) { - evt = evt || window.event; - var el = evt.target || evt.srcElement; - if ( - editor.ui._dialogs.insertframeDialog && - /iframe/gi.test(el.tagName) - ) { - var html = popup.formatHtml( - "" + - '' + - editor.getLang("default") + - '  ' + - editor.getLang("justifyleft") + - '  ' + - editor.getLang("justifyright") + - "  " + - ' ' + - editor.getLang("modify") + - "" - ); - if (html) { - popup.getDom("content").innerHTML = html; - popup.anchorEl = el; - popup.showAnchor(popup.anchorEl); - } else { - popup.hide(); - } - } - }); - editor.addListener("selectionchange", function (t, causeByUi) { - if (!causeByUi) return; - var html = "", - str = "", - img = editor.selection.getRange().getClosedNode(), - dialogs = editor.ui._dialogs; - if (img && img.tagName == "IMG") { - var dialogName = "insertimageDialog"; - if ( - img.className.indexOf("edui-faked-video") != -1 || - img.className.indexOf("edui-upload-video") != -1 - ) { - dialogName = "insertvideoDialog"; - } - if (img.getAttribute("anchorname")) { - dialogName = "anchorDialog"; - html = popup.formatHtml( - "" + - '' + - editor.getLang("modify") + - "  " + - "" + - editor.getLang("delete") + - "" - ); - } - // if (img.getAttribute("data-word-image")) { - // //todo 放到dialog去做查询 - // editor['data-word-image'] = [img.getAttribute("data-word-image")]; - // dialogName = "wordimageDialog"; - // } - if ( - domUtils.hasClass(img, "loadingclass") || - domUtils.hasClass(img, "loaderrorclass") - ) { - dialogName = ""; - } - if (!dialogs[dialogName]) { - return; - } - - var actions = []; - actions.push(''); - actions.push('' + - editor.getLang("default") + - ""); - actions.push('' + - editor.getLang("default") + - ""); - actions.push('' + - editor.getLang("justifyleft") + - ""); - actions.push('' + - editor.getLang("justifyright") + - ""); - actions.push('' + - editor.getLang("justifycenter") + - ""); - if (img.getAttribute('data-formula-image') !== null) { - actions.push("" + - editor.getLang("formulaedit") + ""); - } - if (img.getAttribute("data-word-image")) { - actions.push("" + - editor.getLang("save") + - ""); - } else { - actions.push("' + - editor.getLang("modify") + - ""); - } - actions.push(""); - - !html && (html = popup.formatHtml(actions.join(""))); - } - if (editor.ui._dialogs.linkDialog) { - var link = editor.queryCommandValue("link"); - var url; - if ( - link && - (url = link.getAttribute("_href") || link.getAttribute("href", 2)) - ) { - var txt = url; - if (url.length > 30) { - txt = url.substring(0, 20) + "..."; - } - if (html) { - html += '
    '; - } - html += popup.formatHtml( - "" + - editor.getLang("anchorMsg") + - ': ' + - txt + - "" + - ' ' + - editor.getLang("modify") + - "" + - ' ' + - editor.getLang("clear") + - "" - ); - popup.showAnchor(link); - } - } - - if (html) { - popup.getDom("content").innerHTML = html; - popup.anchorEl = img || link; - popup.showAnchor(popup.anchorEl); - } else { - popup.hide(); - } - }); - } - }, - _initToolbars: function () { - var editor = this.editor; - var toolbars = this.toolbars || []; - var toolbarUis = []; - var extraUIs = []; - for (var i = 0; i < toolbars.length; i++) { - var toolbar = toolbars[i]; - var toolbarUi = new baidu.editor.ui.Toolbar({ - theme: editor.options.theme - }); - for (var j = 0; j < toolbar.length; j++) { - var toolbarItem = toolbar[j]; - var toolbarItemUi = null; - if (typeof toolbarItem == "string") { - toolbarItem = toolbarItem.toLowerCase(); - if (toolbarItem == "|") { - toolbarItem = "Separator"; - } - if (toolbarItem == "||") { - toolbarItem = "Breakline"; - } - var ui = baidu.editor.ui[toolbarItem]; - if (ui) { - if (utils.isFunction(ui)) { - toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); - } else { - if (ui.id && ui.id != editor.key) { - continue; + //display bottom-bar label based on config + if (editor.options.elementPathEnabled) { + editor.ui.getDom("elementpath").innerHTML = + '
    ' + + editor.getLang("elementPathTip") + + ":
    "; } - var itemUI = ui.execFn.call(editor, editor, toolbarItem); - if (itemUI) { - if (ui.index === undefined) { - toolbarUi.add(itemUI); - continue; - } else { - extraUIs.push({ - index: ui.index, - itemUI: itemUI + if (editor.options.wordCount) { + function countFn() { + setCount(editor, me); + domUtils.un(editor.document, "click", arguments.callee); + } + + domUtils.on(editor.document, "click", countFn); + editor.ui.getDom("wordcount").innerHTML = editor.getLang( + "wordCountTip" + ); + } + editor.ui._scale(); + if (editor.options.scaleEnabled) { + if (editor.autoHeightEnabled) { + editor.disableAutoHeight(); + } + me.enableScale(); + } else { + me.disableScale(); + } + if ( + !editor.options.elementPathEnabled && + !editor.options.wordCount && + !editor.options.scaleEnabled + ) { + editor.ui.getDom("elementpath").style.display = "none"; + editor.ui.getDom("wordcount").style.display = "none"; + editor.ui.getDom("scale").style.display = "none"; + } + + if (!editor.selection.isFocus()) return; + editor.fireEvent("selectionchange", false, true); + }); + + editor.addListener("mousedown", function (t, evt) { + var el = evt.target || evt.srcElement; + baidu.editor.ui.Popup.postHide(evt, el); + baidu.editor.ui.ShortCutMenu.postHide(evt); + }); + + editor.addListener("delcells", function () { + if (UE.ui["edittip"]) { + new UE.ui["edittip"](editor); + } + editor.getDialog("edittip").open(); + }); + + var pastePop, + isPaste = false, + timer; + editor.addListener("afterpaste", function () { + if (editor.queryCommandState("pasteplain")) return; + if (baidu.editor.ui.PastePicker) { + pastePop = new baidu.editor.ui.Popup({ + content: new baidu.editor.ui.PastePicker({editor: editor}), + editor: editor, + className: "edui-wordpastepop" }); - } + pastePop.render(); } - } - } - //fullscreen这里单独处理一下,放到首行去 - if (toolbarItem == "fullscreen") { - if (toolbarUis && toolbarUis[0]) { - toolbarUis[0].items.splice(0, 0, toolbarItemUi); - } else { - toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); - } - continue; - } - } else { - toolbarItemUi = toolbarItem; - } - if (toolbarItemUi && toolbarItemUi.id) { - toolbarUi.add(toolbarItemUi); - } - } - toolbarUis[i] = toolbarUi; - } + isPaste = true; + }); - //接受外部定制的UI + editor.addListener("afterinserthtml", function () { + clearTimeout(timer); + timer = setTimeout(function () { + if (pastePop && (isPaste || editor.ui._isTransfer)) { + if (pastePop.isHidden()) { + var span = domUtils.createElement(editor.document, "span", { + style: "line-height:0px;", + innerHTML: "\ufeff" + }), + range = editor.selection.getRange(); + range.insertNode(span); + var tmp = getDomNode(span, "firstChild", "previousSibling"); + tmp && + pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); + domUtils.remove(span); + } else { + pastePop.show(); + } + delete editor.ui._isTransfer; + isPaste = false; + } + }, 200); + }); + editor.addListener("contextmenu", function (t, evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + editor.addListener("keydown", function (t, evt) { + if (pastePop) pastePop.dispose(evt); + var keyCode = evt.keyCode || evt.which; + if (evt.altKey && keyCode == 90) { + UE.ui.buttons["fullscreen"].onclick(); + } + }); + editor.addListener("wordcount", function (type) { + setCount(this, me); + }); - utils.each(extraUIs, function (obj) { - toolbarUi.add(obj.itemUI, obj.index); - }); - this.toolbars = toolbarUis; - }, - getHtmlTpl: function () { - return ( - '
    ' + - '
    ' + - (this.toolbars.length - ? '
    ' + - this.renderToolbarBoxHtml() + - "
    " - : "") + - '" + - '
    ' + - "
    " + - '
    ' + - "
    " + - //modify wdcount by matao - '
    ' + - '' + - '' + - '' + - "
    " + - '
    ' + - "
    " - ); - }, - showWordImageDialog: function () { - this._dialogs["wordimageDialog"].open(); - }, - renderToolbarBoxHtml: function () { - var buff = []; - for (var i = 0; i < this.toolbars.length; i++) { - buff.push(this.toolbars[i].renderHtml()); - } - return buff.join(""); - }, - setFullScreen: function (fullscreen) { - var editor = this.editor, - container = editor.container.parentNode.parentNode; - if (this._fullscreen != fullscreen) { - this._fullscreen = fullscreen; - this.editor.fireEvent("beforefullscreenchange", fullscreen); - if (baidu.editor.browser.gecko) { - var bk = editor.selection.getRange().createBookmark(); - } - if (fullscreen) { - while (container.tagName != "BODY") { - var position = baidu.editor.dom.domUtils.getComputedStyle( - container, - "position" + function setCount(editor, ui) { + editor.setOpt({ + wordCount: true, + maximumWords: 10000, + wordCountMsg: + editor.options.wordCountMsg || editor.getLang("wordCountMsg"), + wordOverFlowMsg: + editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") + }); + var opt = editor.options, + max = opt.maximumWords, + msg = opt.wordCountMsg, + errMsg = opt.wordOverFlowMsg, + countDom = ui.getDom("wordcount"); + if (!opt.wordCount) { + return; + } + var count = editor.getContentLength(true); + if (count > max) { + countDom.innerHTML = errMsg; + editor.fireEvent("wordcountoverflow"); + } else { + countDom.innerHTML = msg + .replace("{#leave}", max - count) + .replace("{#count}", count); + } + } + + editor.addListener("selectionchange", function () { + if (editor.options.elementPathEnabled) { + me[ + (editor.queryCommandState("elementpath") == -1 ? "dis" : "en") + + "ableElementPath" + ](); + } + if (editor.options.scaleEnabled) { + me[ + (editor.queryCommandState("scale") == -1 ? "dis" : "en") + + "ableScale" + ](); + } + }); + var popup = new baidu.editor.ui.Popup({ + editor: editor, + content: "", + className: "edui-bubble", + _onEditButtonClick: function () { + this.hide(); + editor.ui._dialogs.linkDialog.open(); + }, + _onImgEditButtonClick: function (name) { + this.hide(); + editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); + }, + _onImgSetFloat: function (value) { + this.hide(); + editor.execCommand("imagefloat", value); + }, + _setIframeAlign: function (value) { + var frame = popup.anchorEl; + var newFrame = frame.cloneNode(true); + switch (value) { + case -2: + newFrame.setAttribute("align", ""); + break; + case -1: + newFrame.setAttribute("align", "left"); + break; + case 1: + newFrame.setAttribute("align", "right"); + break; + } + frame.parentNode.insertBefore(newFrame, frame); + domUtils.remove(frame); + popup.anchorEl = newFrame; + popup.showAnchor(popup.anchorEl); + }, + _updateIframe: function () { + var frame = (editor._iframe = popup.anchorEl); + if (domUtils.hasClass(frame, "ueditor_baidumap")) { + editor.selection.getRange().selectNode(frame).select(); + editor.ui._dialogs.mapDialog.open(); + popup.hide(); + } else { + editor.ui._dialogs.insertframeDialog.open(); + popup.hide(); + } + }, + _onRemoveButtonClick: function (cmdName) { + editor.execCommand(cmdName); + this.hide(); + }, + queryAutoHide: function (el) { + if (el && el.ownerDocument == editor.document) { + if ( + el.tagName.toLowerCase() == "img" || + domUtils.findParentByTagName(el, "a", true) + ) { + return el !== popup.anchorEl; + } + } + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); + } + }); + popup.render(); + if (editor.options.imagePopup) { + editor.addListener("mouseover", function (t, evt) { + evt = evt || window.event; + var el = evt.target || evt.srcElement; + if ( + editor.ui._dialogs.insertframeDialog && + /iframe/gi.test(el.tagName) + ) { + var html = popup.formatHtml( + "" + + '' + + editor.getLang("default") + + '  ' + + editor.getLang("justifyleft") + + '  ' + + editor.getLang("justifyright") + + "  " + + ' ' + + editor.getLang("modify") + + "" + ); + if (html) { + popup.getDom("content").innerHTML = html; + popup.anchorEl = el; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + } + }); + editor.addListener("selectionchange", function (t, causeByUi) { + if (!causeByUi) { + return; + } + var html = "", + str = "", + closedNode = editor.selection.getRange().getClosedNode(), + dialogs = editor.ui._dialogs; + // 图片选中处理 + if (closedNode && closedNode.tagName === "IMG") { + var dialogName = "insertimageDialog"; + if ( + closedNode.className.indexOf("edui-faked-video") !== -1 || + closedNode.className.indexOf("edui-upload-video") !== -1 + ) { + dialogName = "insertvideoDialog"; + } + if ( + closedNode.className.indexOf("edui-faked-audio") !== -1 || + closedNode.className.indexOf("edui-upload-audio") !== -1 + ) { + dialogName = "insertaudioDialog"; + } + if (closedNode.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + "" + + '' + + editor.getLang("modify") + + "  " + + "" + + editor.getLang("delete") + + "" + ); + } + // if (img.getAttribute("data-word-image")) { + // //todo 放到dialog去做查询 + // editor['data-word-image'] = [img.getAttribute("data-word-image")]; + // dialogName = "wordimageDialog"; + // } + if ( + domUtils.hasClass(closedNode, "uep-loading") || + domUtils.hasClass(closedNode, "uep-loading-error") + ) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + + var actions = []; + if (closedNode.getAttribute("data-word-image")) { + actions.push("" + + editor.getLang("save") + + ""); + } else { + // actions.push("' + + // editor.getLang("modify") + + // ""); + } + + if (actions.length > 0) { + // wrap with + actions.unshift(''); + actions.push(''); + } + + !html && (html = popup.formatHtml(actions.join(""))); + } + // 链接选中处理 + if (editor.ui._dialogs.linkDialog) { + var link = editor.queryCommandValue("link"); + var url; + if ( + link && + (url = link.getAttribute("_href") || link.getAttribute("href", 2)) + ) { + var txt = url; + if (url.length > 30) { + txt = url.substring(0, 20) + "..."; + } + if (html) { + html += '
    '; + } + html += popup.formatHtml( + "" + + editor.getLang("anchorMsg") + + ': ' + + txt + + "" + + ' ' + + editor.getLang("modify") + + "" + + ' ' + + editor.getLang("clear") + + "" + ); + popup.showAnchor(link); + } + } + + if (html) { + popup.getDom("content").innerHTML = html; + popup.anchorEl = closedNode || link; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + }); + } + }, + _initToolbars: function () { + var editor = this.editor; + var toolbars = this.toolbars || []; + if (toolbars[0]) { + toolbars[0].unshift( + 'message' + ); + } + var toolbarUis = []; + var extraUIs = []; + for (var i = 0; i < toolbars.length; i++) { + var toolbar = toolbars[i]; + var toolbarUi = new baidu.editor.ui.Toolbar({ + theme: editor.options.theme + }); + for (var j = 0; j < toolbar.length; j++) { + var toolbarItem = toolbar[j]; + var toolbarItemUi = null; + if (typeof toolbarItem == "string") { + toolbarItem = toolbarItem.toLowerCase(); + if (toolbarItem === "|") { + toolbarItem = "Separator"; + } + if (toolbarItem === "||") { + toolbarItem = "Breakline"; + } + var ui = baidu.editor.ui[toolbarItem]; + if (ui) { + if (utils.isFunction(ui)) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } else { + if (ui.id && ui.id !== editor.key) { + continue; + } + var itemUI = ui.execFn.call(editor, editor, toolbarItem); + if (itemUI) { + if (ui.index === undefined) { + toolbarUi.add(itemUI); + continue; + } else { + extraUIs.push({ + index: ui.index, + itemUI: itemUI + }); + } + } + } + } + //fullscreen这里单独处理一下,放到首行去 + if (toolbarItem === "fullscreen") { + if (toolbarUis && toolbarUis[0]) { + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } else { + toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); + } + continue; + } + } else { + toolbarItemUi = toolbarItem; + } + if (toolbarItemUi && toolbarItemUi.id) { + toolbarUi.add(toolbarItemUi); + } + } + toolbarUis[i] = toolbarUi; + } + + //接受外部定制的UI + + utils.each(extraUIs, function (obj) { + toolbarUi.add(obj.itemUI, obj.index); + }); + this.toolbars = toolbarUis; + }, + getHtmlTpl: function () { + return ( + '
    ' + + '
    ' + + (this.toolbars.length + ? '
    ' + + this.renderToolbarBoxHtml() + + "
    " + : "") + + '" + + '
    ' + + "
    " + + '
    ' + + "
    " + + //modify wdcount by matao + '
    ' + + '' + + '' + + '' + + "
    " + + '
    ' + + "
    " ); - nodeStack.push(position); - container.style.position = "static"; - container = container.parentNode; - } - this._bakHtmlOverflow = document.documentElement.style.overflow; - this._bakBodyOverflow = document.body.style.overflow; - this._bakAutoHeight = this.editor.autoHeightEnabled; - this._bakScrollTop = Math.max( - document.documentElement.scrollTop, - document.body.scrollTop - ); - - this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; - if (this._bakAutoHeight) { - //当全屏时不能执行自动长高 - editor.autoHeightEnabled = false; - this.editor.disableAutoHeight(); - } - - document.documentElement.style.overflow = "hidden"; - //修复,滚动条不收起的问题 - - window.scrollTo(0, window.scrollY); - this._bakCssText = this.getDom().style.cssText; - this._bakCssText1 = this.getDom("iframeholder").style.cssText; - editor.iframe.parentNode.style.width = ""; - this._updateFullScreen(); - } else { - while (container.tagName != "BODY") { - container.style.position = nodeStack.shift(); - container = container.parentNode; - } - this.getDom().style.cssText = this._bakCssText; - this.getDom("iframeholder").style.cssText = this._bakCssText1; - if (this._bakAutoHeight) { - editor.autoHeightEnabled = true; - this.editor.enableAutoHeight(); - } - - document.documentElement.style.overflow = this._bakHtmlOverflow; - document.body.style.overflow = this._bakBodyOverflow; - editor.iframe.parentNode.style.width = - this._bakEditorContaninerWidth + "px"; - window.scrollTo(0, this._bakScrollTop); - } - if (browser.gecko && editor.body.contentEditable === "true") { - var input = document.createElement("input"); - document.body.appendChild(input); - editor.body.contentEditable = false; - setTimeout(function () { - input.focus(); - setTimeout(function () { - editor.body.contentEditable = true; - editor.fireEvent("fullscreenchanged", fullscreen); - editor.selection.getRange().moveToBookmark(bk).select(true); - baidu.editor.dom.domUtils.remove(input); - fullscreen && window.scroll(0, 0); - }, 0); - }, 0); - } - - if (editor.body.contentEditable === "true") { - this.editor.fireEvent("fullscreenchanged", fullscreen); - this.triggerLayout(); - } - } - }, - _updateFullScreen: function () { - if (this._fullscreen) { - var vpRect = uiUtils.getViewportRect(); - this.getDom().style.cssText = - "border:0;position:absolute;left:0;top:" + - (this.editor.options.topOffset || 0) + - "px;width:" + - vpRect.width + - "px;height:" + - vpRect.height + - "px;z-index:" + - (this.getDom().style.zIndex * 1 + 100); - uiUtils.setViewportOffset(this.getDom(), { - left: 0, - top: this.editor.options.topOffset || 0 - }); - this.editor.setHeight( - vpRect.height - - this.getDom("toolbarbox").offsetHeight - - this.getDom("bottombar").offsetHeight - - (this.editor.options.topOffset || 0), - true - ); - //不手动调一下,会导致全屏失效 - if (browser.gecko) { - try { - window.onresize(); - } catch (e) { - } - } - } - }, - _updateElementPath: function () { - var bottom = this.getDom("elementpath"), - list; - if ( - this.elementPathEnabled && - (list = this.editor.queryCommandValue("elementpath")) - ) { - var buff = []; - for (var i = 0, ci; (ci = list[i]); i++) { - buff[i] = this.formatHtml( - '' + - ci + - "" - ); - } - bottom.innerHTML = - '
    ' + - this.editor.getLang("elementPathTip") + - ": " + - buff.join(" > ") + - "
    "; - } else { - bottom.style.display = "none"; - } - }, - disableElementPath: function () { - var bottom = this.getDom("elementpath"); - bottom.innerHTML = ""; - bottom.style.display = "none"; - this.elementPathEnabled = false; - }, - enableElementPath: function () { - var bottom = this.getDom("elementpath"); - bottom.style.display = ""; - this.elementPathEnabled = true; - this._updateElementPath(); - }, - _scale: function () { - var doc = document, - editor = this.editor, - editorHolder = editor.container, - editorDocument = editor.document, - toolbarBox = this.getDom("toolbarbox"), - bottombar = this.getDom("bottombar"), - scale = this.getDom("scale"), - scalelayer = this.getDom("scalelayer"); - - var isMouseMove = false, - position = null, - minEditorHeight = 0, - minEditorWidth = editor.options.minFrameWidth, - pageX = 0, - pageY = 0, - scaleWidth = 0, - scaleHeight = 0; - - function down() { - position = domUtils.getXY(editorHolder); - - if (!minEditorHeight) { - minEditorHeight = - editor.options.minFrameHeight + - toolbarBox.offsetHeight + - bottombar.offsetHeight; - } - - scalelayer.style.cssText = - "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + - editorHolder.offsetWidth + - "px;height:" + - editorHolder.offsetHeight + - "px;z-index:" + - (editor.options.zIndex + 1); - - domUtils.on(doc, "mousemove", move); - domUtils.on(editorDocument, "mouseup", up); - domUtils.on(doc, "mouseup", up); - } - - var me = this; - //by xuheng 全屏时关掉缩放 - this.editor.addListener("fullscreenchanged", function (e, fullScreen) { - if (fullScreen) { - me.disableScale(); - } else { - if (me.editor.options.scaleEnabled) { - me.enableScale(); - var tmpNode = me.editor.document.createElement("span"); - me.editor.body.appendChild(tmpNode); - me.editor.body.style.height = - Math.max( - domUtils.getXY(tmpNode).y, - me.editor.iframe.offsetHeight - 20 - ) + "px"; - domUtils.remove(tmpNode); - } - } - }); - - function move(event) { - clearSelection(); - var e = event || window.event; - pageX = e.pageX || doc.documentElement.scrollLeft + e.clientX; - pageY = e.pageY || doc.documentElement.scrollTop + e.clientY; - scaleWidth = pageX - position.x; - scaleHeight = pageY - position.y; - - if (scaleWidth >= minEditorWidth) { - isMouseMove = true; - scalelayer.style.width = scaleWidth + "px"; - } - if (scaleHeight >= minEditorHeight) { - isMouseMove = true; - scalelayer.style.height = scaleHeight + "px"; - } - } - - function up() { - if (isMouseMove) { - isMouseMove = false; - editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; - editorHolder.style.width = editor.ui._actualFrameWidth + "px"; - - editor.setHeight( - scalelayer.offsetHeight - - bottombar.offsetHeight - - toolbarBox.offsetHeight - - 2, - true - ); - } - if (scalelayer) { - scalelayer.style.display = "none"; - } - clearSelection(); - domUtils.un(doc, "mousemove", move); - domUtils.un(editorDocument, "mouseup", up); - domUtils.un(doc, "mouseup", up); - } - - function clearSelection() { - if (browser.ie) doc.selection.clear(); - else window.getSelection().removeAllRanges(); - } - - this.enableScale = function () { - //trace:2868 - if (editor.queryCommandState("source") == 1) return; - scale.style.display = ""; - this.scaleEnabled = true; - domUtils.on(scale, "mousedown", down); - }; - this.disableScale = function () { - scale.style.display = "none"; - this.scaleEnabled = false; - domUtils.un(scale, "mousedown", down); - }; - }, - isFullScreen: function () { - return this._fullscreen; - }, - postRender: function () { - UIBase.prototype.postRender.call(this); - for (var i = 0; i < this.toolbars.length; i++) { - this.toolbars[i].postRender(); - } - var me = this; - var timerId, - domUtils = baidu.editor.dom.domUtils, - updateFullScreenTime = function () { - clearTimeout(timerId); - timerId = setTimeout(function () { - me._updateFullScreen(); - }); - }; - domUtils.on(window, "resize", updateFullScreenTime); - - me.addListener("destroy", function () { - domUtils.un(window, "resize", updateFullScreenTime); - clearTimeout(timerId); - }); - }, - showToolbarMsg: function (msg, flag) { - this.getDom("toolbarmsg_label").innerHTML = msg; - this.getDom("toolbarmsg").style.display = ""; - // - if (!flag) { - var w = this.getDom("upload_dialog"); - w.style.display = "none"; - } - }, - hideToolbarMsg: function () { - this.getDom("toolbarmsg").style.display = "none"; - }, - mapUrl: function (url) { - return url - ? url.replace("~/", this.editor.options.UEDITOR_HOME_URL || "") - : ""; - }, - triggerLayout: function () { - var dom = this.getDom(); - if (dom.style.zoom == "1") { - dom.style.zoom = "100%"; - } else { - dom.style.zoom = "1"; - } - } - }; - utils.inherits(EditorUI, baidu.editor.ui.UIBase); - - var instances = {}; - - UE.ui.Editor = function (options) { - var editor = new UE.Editor(options); - editor.options.editor = editor; - utils.loadFile(document, { - href: - editor.options.themePath + editor.options.theme + "/css/ueditor.css?20220907", - tag: "link", - type: "text/css", - rel: "stylesheet" - }); - - var oldRender = editor.render; - editor.render = function (holder) { - if (holder.constructor === String) { - editor.key = holder; - instances[holder] = editor; - } - utils.domReady(function () { - editor.langIsReady - ? renderUI() - : editor.addListener("langReady", renderUI); - - function renderUI() { - editor.setOpt({ - labelMap: editor.options.labelMap || editor.getLang("labelMap") - }); - new EditorUI(editor.options); - if (holder) { - if (holder.constructor === String) { - holder = document.getElementById(holder); + }, + showWordImageDialog: function () { + this._dialogs["wordimageDialog"].open(); + }, + renderToolbarBoxHtml: function () { + var buff = []; + for (var i = 0; i < this.toolbars.length; i++) { + buff.push(this.toolbars[i].renderHtml()); } - holder && - holder.getAttribute("name") && - (editor.options.textarea = holder.getAttribute("name")); - if (holder && /script|textarea/gi.test(holder.tagName)) { - var newDiv = document.createElement("div"); - holder.parentNode.insertBefore(newDiv, holder); - var cont = holder.value || holder.innerHTML; - editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) - ? editor.options.initialContent - : cont - .replace(/>[\n\r\t]+([ ]{4})+/g, ">") - .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"); - holder.className && (newDiv.className = holder.className); - holder.style.cssText && - (newDiv.style.cssText = holder.style.cssText); - if (/textarea/i.test(holder.tagName)) { - editor.textarea = holder; - editor.textarea.style.display = "none"; - } else { - holder.parentNode.removeChild(holder); - } - if (holder.id) { - newDiv.id = holder.id; - domUtils.removeAttributes(holder, "id"); - } - holder = newDiv; - holder.innerHTML = ""; + return buff.join(""); + }, + setFullScreen: function (fullscreen) { + var editor = this.editor, + container = editor.container.parentNode.parentNode; + if (this._fullscreen != fullscreen) { + this._fullscreen = fullscreen; + this.editor.fireEvent("beforefullscreenchange", fullscreen); + if (baidu.editor.browser.gecko) { + var bk = editor.selection.getRange().createBookmark(); + } + if (fullscreen) { + + // add https://gitee.com/modstart-lib/ueditor-plus/issues/I85R7X + this._bakEditorContaninerWidth = editor.iframe.parentNode.style.width; + + while (container.tagName !== "BODY") { + var position = baidu.editor.dom.domUtils.getComputedStyle( + container, + "position" + ); + nodeStack.push(position); + container.style.position = "static"; + container = container.parentNode; + } + this._bakHtmlOverflow = document.documentElement.style.overflow; + this._bakBodyOverflow = document.body.style.overflow; + this._bakAutoHeight = this.editor.autoHeightEnabled; + this._bakScrollTop = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ); + + // delete https://gitee.com/modstart-lib/ueditor-plus/issues/I85R7X + // this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + + if (this._bakAutoHeight) { + //当全屏时不能执行自动长高 + editor.autoHeightEnabled = false; + this.editor.disableAutoHeight(); + } + + document.documentElement.style.overflow = "hidden"; + //修复,滚动条不收起的问题 + + window.scrollTo(0, window.scrollY); + this._bakCssText = this.getDom().style.cssText; + this._bakCssText1 = this.getDom("iframeholder").style.cssText; + editor.iframe.parentNode.style.width = ""; + this._updateFullScreen(); + } else { + while (container.tagName !== "BODY") { + container.style.position = nodeStack.shift(); + container = container.parentNode; + } + this.getDom().style.cssText = this._bakCssText; + this.getDom("iframeholder").style.cssText = this._bakCssText1; + if (this._bakAutoHeight) { + editor.autoHeightEnabled = true; + this.editor.enableAutoHeight(); + } + + document.documentElement.style.overflow = this._bakHtmlOverflow; + document.body.style.overflow = this._bakBodyOverflow; + // modify https://gitee.com/modstart-lib/ueditor-plus/issues/I85R7X + editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + // editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + "px"; + window.scrollTo(0, this._bakScrollTop); + } + if (browser.gecko && editor.body.contentEditable === "true") { + var input = document.createElement("input"); + document.body.appendChild(input); + editor.body.contentEditable = false; + setTimeout(function () { + input.focus(); + setTimeout(function () { + editor.body.contentEditable = true; + editor.fireEvent("fullscreenchanged", fullscreen); + editor.selection.getRange().moveToBookmark(bk).select(true); + baidu.editor.dom.domUtils.remove(input); + fullscreen && window.scroll(0, 0); + }, 0); + }, 0); + } + + if (editor.body.contentEditable === "true") { + this.editor.fireEvent("fullscreenchanged", fullscreen); + this.triggerLayout(); + } } - } - domUtils.addClass(holder, "edui-" + editor.options.theme); - editor.ui.render(holder); - var opt = editor.options; - //给实例添加一个编辑器的容器引用 - editor.container = editor.ui.getDom(); - var parents = domUtils.findParents(holder, true); - var displays = []; - for (var i = 0, ci; (ci = parents[i]); i++) { - displays[i] = ci.style.display; - ci.style.display = "block"; - } - if (opt.initialFrameWidth) { - opt.minFrameWidth = opt.initialFrameWidth; - } else { - opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; - var styleWidth = holder.style.width; - if (/%$/.test(styleWidth)) { - opt.initialFrameWidth = styleWidth; + }, + _updateFullScreen: function () { + if (this._fullscreen) { + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.cssText = + "border:0;position:absolute;left:0;top:var(--ueditor-top-offset," + + (this.editor.options.topOffset || 0) + + "px);width:" + + vpRect.width + + "px;height:" + + vpRect.height + + "px;z-index:" + + (this.getDom().style.zIndex * 1 + 100); + uiUtils.setViewportOffset(this.getDom(), { + left: 0, + // top: this.editor.options.topOffset || 0 + }); + this.editor.setHeight( + vpRect.height - + this.getDom("toolbarbox").offsetHeight - + this.getDom("bottombar").offsetHeight - + (this.editor.options.topOffset || 0), + true + ); + //不手动调一下,会导致全屏失效 + if (browser.gecko) { + try { + window.onresize(); + } catch (e) { + } + } + } + }, + _updateElementPath: function () { + var bottom = this.getDom("elementpath"), + list; + if ( + this.elementPathEnabled && + (list = this.editor.queryCommandValue("elementpath")) + ) { + var buff = []; + for (var i = 0, ci; (ci = list[i]); i++) { + buff[i] = this.formatHtml( + '' + + ci + + "" + ); + } + bottom.innerHTML = + '
    ' + + this.editor.getLang("elementPathTip") + + ": " + + buff.join(" > ") + + "
    "; + } else { + bottom.style.display = "none"; + } + }, + disableElementPath: function () { + var bottom = this.getDom("elementpath"); + bottom.innerHTML = ""; + bottom.style.display = "none"; + this.elementPathEnabled = false; + }, + enableElementPath: function () { + var bottom = this.getDom("elementpath"); + bottom.style.display = ""; + this.elementPathEnabled = true; + this._updateElementPath(); + }, + _scale: function () { + var doc = document, + editor = this.editor, + editorHolder = editor.container, + editorDocument = editor.document, + toolbarBox = this.getDom("toolbarbox"), + bottombar = this.getDom("bottombar"), + scale = this.getDom("scale"), + scalelayer = this.getDom("scalelayer"); + + var isMouseMove = false, + position = null, + minEditorHeight = 0, + minEditorWidth = editor.options.minFrameWidth, + pageX = 0, + pageY = 0, + scaleWidth = 0, + scaleHeight = 0; + + function down() { + position = domUtils.getXY(editorHolder); + + if (!minEditorHeight) { + minEditorHeight = + editor.options.minFrameHeight + + toolbarBox.offsetHeight + + bottombar.offsetHeight; + } + + scalelayer.style.cssText = + "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + + editorHolder.offsetWidth + + "px;height:" + + editorHolder.offsetHeight + + "px;z-index:" + + (editor.options.zIndex + 1); + + domUtils.on(doc, "mousemove", move); + domUtils.on(editorDocument, "mouseup", up); + domUtils.on(doc, "mouseup", up); + } + + var me = this; + //by xuheng 全屏时关掉缩放 + this.editor.addListener("fullscreenchanged", function (e, fullScreen) { + if (fullScreen) { + me.disableScale(); + } else { + if (me.editor.options.scaleEnabled) { + me.enableScale(); + var tmpNode = me.editor.document.createElement("span"); + me.editor.body.appendChild(tmpNode); + me.editor.body.style.height = + Math.max( + domUtils.getXY(tmpNode).y, + me.editor.iframe.offsetHeight - 20 + ) + "px"; + domUtils.remove(tmpNode); + } + } + }); + + function move(event) { + clearSelection(); + var e = event || window.event; + pageX = e.pageX || doc.documentElement.scrollLeft + e.clientX; + pageY = e.pageY || doc.documentElement.scrollTop + e.clientY; + scaleWidth = pageX - position.x; + scaleHeight = pageY - position.y; + + if (scaleWidth >= minEditorWidth) { + isMouseMove = true; + scalelayer.style.width = scaleWidth + "px"; + } + if (scaleHeight >= minEditorHeight) { + isMouseMove = true; + scalelayer.style.height = scaleHeight + "px"; + } + } + + function up() { + if (isMouseMove) { + isMouseMove = false; + editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; + editorHolder.style.width = editor.ui._actualFrameWidth + "px"; + + editor.setHeight( + scalelayer.offsetHeight - + bottombar.offsetHeight - + toolbarBox.offsetHeight - + 2, + true + ); + } + if (scalelayer) { + scalelayer.style.display = "none"; + } + clearSelection(); + domUtils.un(doc, "mousemove", move); + domUtils.un(editorDocument, "mouseup", up); + domUtils.un(doc, "mouseup", up); + } + + function clearSelection() { + if (browser.ie) doc.selection.clear(); + else window.getSelection().removeAllRanges(); + } + + this.enableScale = function () { + //trace:2868 + if (editor.queryCommandState("source") == 1) return; + scale.style.display = ""; + this.scaleEnabled = true; + domUtils.on(scale, "mousedown", down); + }; + this.disableScale = function () { + scale.style.display = "none"; + this.scaleEnabled = false; + domUtils.un(scale, "mousedown", down); + }; + }, + isFullScreen: function () { + return this._fullscreen; + }, + postRender: function () { + UIBase.prototype.postRender.call(this); + for (var i = 0; i < this.toolbars.length; i++) { + this.toolbars[i].postRender(); + } + var me = this; + var timerId, + domUtils = baidu.editor.dom.domUtils, + updateFullScreenTime = function () { + clearTimeout(timerId); + timerId = setTimeout(function () { + me._updateFullScreen(); + }); + }; + domUtils.on(window, "resize", updateFullScreenTime); + + me.addListener("destroy", function () { + domUtils.un(window, "resize", updateFullScreenTime); + clearTimeout(timerId); + }); + }, + showToolbarMsg: function (msg, flag) { + this.getDom("toolbarmsg_label").innerHTML = msg; + this.getDom("toolbarmsg").style.display = ""; + // + if (!flag) { + var w = this.getDom("upload_dialog"); + w.style.display = "none"; + } + }, + hideToolbarMsg: function () { + this.getDom("toolbarmsg").style.display = "none"; + }, + mapUrl: function (url) { + return url + ? url.replace("~/", this.editor.options.UEDITOR_CORS_URL || "") + : ""; + }, + triggerLayout: function () { + var dom = this.getDom(); + if (dom.style.zoom == "1") { + dom.style.zoom = "100%"; + } else { + dom.style.zoom = "1"; } - } - if (opt.initialFrameHeight) { - opt.minFrameHeight = opt.initialFrameHeight; - } else { - opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; - } - for (var i = 0, ci; (ci = parents[i]); i++) { - ci.style.display = displays[i]; - } - //编辑器最外容器设置了高度,会导致,编辑器不占位 - //todo 先去掉,没有找到原因 - if (holder.style.height) { - holder.style.height = ""; - } - editor.container.style.width = - opt.initialFrameWidth + - (/%$/.test(opt.initialFrameWidth) ? "" : "px"); - editor.container.style.zIndex = opt.zIndex; - oldRender.call(editor, editor.ui.getDom("iframeholder")); - editor.fireEvent("afteruiready"); } - }); }; - return editor; - }; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); - /** - * @file - * @name UE - * @short UE - * @desc UEditor的顶部命名空间 - */ - /** - * @name getEditor - * @since 1.2.4+ - * @grammar UE.getEditor(id,[opt]) => Editor实例 - * @desc 提供一个全局的方法得到编辑器实例 - * - * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 - * * ''opt'' 编辑器的可选参数 - * @example - * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 - * this.setContent('hello') - * }}); - * UE.getEditor('containerId'); //返回刚创建的实例 - * - */ - UE.getEditor = function (id, opt) { - var editor = instances[id]; - if (!editor) { - editor = instances[id] = new UE.ui.Editor(opt); - editor.render(id); - } - return editor; - }; + var instances = {}; - UE.delEditor = function (id) { - var editor; - if ((editor = instances[id])) { - editor.key && editor.destroy(); - delete instances[id]; - } - }; + UE.ui.Editor = function (options) { + var editor = new UE.Editor(options); + editor.options.editor = editor; + utils.loadFile(document, { + href: + editor.options.themePath + editor.options.theme + "/css/ueditor.css?69e258a4", + tag: "link", + type: "text/css", + rel: "stylesheet" + }); - UE.registerUI = function (uiName, fn, index, editorId) { - utils.each(uiName.split(/\s+/), function (name) { - baidu.editor.ui[name] = { - id: editorId, - execFn: fn, - index: index - }; - }); - }; + var oldRender = editor.render; + editor.render = function (holder) { + if (holder.constructor === String) { + editor.key = holder; + instances[holder] = editor; + } + utils.domReady(function () { + editor.langIsReady + ? renderUI() + : editor.addListener("langReady", renderUI); + + function renderUI() { + editor.setOpt({ + labelMap: editor.options.labelMap || editor.getLang("labelMap") + }); + new EditorUI(editor.options); + if (holder) { + if (holder.constructor === String) { + holder = document.getElementById(holder); + } + holder && + holder.getAttribute("name") && + (editor.options.textarea = holder.getAttribute("name")); + if (holder && /script|textarea/gi.test(holder.tagName)) { + var newDiv = document.createElement("div"); + holder.parentNode.insertBefore(newDiv, holder); + var cont = holder.value || holder.innerHTML; + editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) + ? editor.options.initialContent + : cont + .replace(/>[\n\r\t]+([ ]{4})+/g, ">") + .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"); + holder.className && (newDiv.className = holder.className); + holder.style.cssText && + (newDiv.style.cssText = holder.style.cssText); + if (/textarea/i.test(holder.tagName)) { + editor.textarea = holder; + editor.textarea.style.display = "none"; + } else { + holder.parentNode.removeChild(holder); + } + if (holder.id) { + newDiv.id = holder.id; + domUtils.removeAttributes(holder, "id"); + } + holder = newDiv; + holder.innerHTML = ""; + } + } + domUtils.addClass(holder, "edui-" + editor.options.theme); + editor.ui.render(holder); + var opt = editor.options; + //给实例添加一个编辑器的容器引用 + editor.container = editor.ui.getDom(); + var parents = domUtils.findParents(holder, true); + var displays = []; + for (var i = 0, ci; (ci = parents[i]); i++) { + displays[i] = ci.style.display; + ci.style.display = "block"; + } + if (opt.initialFrameWidth) { + opt.minFrameWidth = opt.initialFrameWidth; + } else { + opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; + var styleWidth = holder.style.width; + if (/%$/.test(styleWidth)) { + opt.initialFrameWidth = styleWidth; + } + } + if (opt.initialFrameHeight) { + opt.minFrameHeight = opt.initialFrameHeight; + } else { + opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; + } + for (var i = 0, ci; (ci = parents[i]); i++) { + ci.style.display = displays[i]; + } + //编辑器最外容器设置了高度,会导致,编辑器不占位 + //todo 先去掉,没有找到原因 + if (holder.style.height) { + holder.style.height = ""; + } + editor.container.style.width = + opt.initialFrameWidth + + (/%$/.test(opt.initialFrameWidth) ? "" : "px"); + editor.container.style.zIndex = opt.zIndex; + oldRender.call(editor, editor.ui.getDom("iframeholder")); + editor.fireEvent("afteruiready"); + } + }); + }; + return editor; + }; + + /** + * @file + * @name UE + * @short UE + * @desc UEditor的顶部命名空间 + */ + /** + * @name getEditor + * @since 1.2.4+ + * @grammar UE.getEditor(id,[opt]) => Editor实例 + * @desc 提供一个全局的方法得到编辑器实例 + * + * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 + * * ''opt'' 编辑器的可选参数 + * @example + * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 + * this.setContent('hello') + * }}); + * UE.getEditor('containerId'); //返回刚创建的实例 + * + */ + UE.getEditor = function (id, opt) { + var editor = instances[id]; + if (!editor) { + editor = instances[id] = new UE.ui.Editor(opt); + editor.render(id); + } + return editor; + }; + + UE.delEditor = function (id) { + var editor; + if ((editor = instances[id])) { + editor.key && editor.destroy(); + delete instances[id]; + } + }; + + UE.registerUI = function (uiName, fn, index, editorId) { + utils.each(uiName.split(/\s+/), function (name) { + baidu.editor.ui[name] = { + id: editorId, + execFn: fn, + index: index + }; + }); + }; })(); // adapter/message.js -UE.registerUI("message", function(editor) { - var editorui = baidu.editor.ui; - var Message = editorui.Message; - var holder; - var _messageItems = []; - var me = editor; +UE.registerUI("message", function (editor) { + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; - me.setOpt("enableMessageShow", true); - if (me.getOpt("enableMessageShow") === false) { - return; - } - - me.addListener("ready", function() { - holder = document.getElementById(me.ui.id + "_message_holder"); - updateHolderPos(); - setTimeout(function() { - updateHolderPos(); - }, 500); - }); - - me.addListener("showmessage", function(type, opt) { - opt = utils.isString(opt) - ? { - content: opt - } - : opt; - var message = new Message({ - timeout: opt.timeout, - type: opt.type, - content: opt.content, - keepshow: opt.keepshow, - editor: me - }), - mid = opt.id || "msg_" + (+new Date()).toString(36); - message.render(holder); - _messageItems[mid] = message; - message.reset(opt); - updateHolderPos(); - return mid; - }); - - me.addListener("updatemessage", function(type, id, opt) { - opt = utils.isString(opt) - ? { - content: opt - } - : opt; - var message = _messageItems[id]; - message.render(holder); - message && message.reset(opt); - }); - - me.addListener("hidemessage", function(type, id) { - var message = _messageItems[id]; - message && message.hide(); - }); - - function updateHolderPos() { - if (!holder || !me.ui) return; - var toolbarbox = me.ui.getDom("toolbarbox"); - if (toolbarbox) { - holder.style.top = toolbarbox.offsetHeight + 3 + "px"; + me.setOpt("enableMessageShow", true); + if (me.getOpt("enableMessageShow") === false) { + return; + } + + me.addListener("ready", function () { + holder = document.getElementById(me.ui.id + "_message_holder"); + updateHolderPos(); + setTimeout(function () { + updateHolderPos(); + }, 500); + }); + + me.addListener("showmessage", function (type, opt) { + opt = utils.isString(opt) + ? { + content: opt + } + : opt; + var message = new Message({ + timeout: opt.timeout, + type: opt.type, + content: opt.content, + keepshow: opt.keepshow, + editor: me + }), + mid = opt.id || "msg_" + (+new Date()).toString(36); + message.render(holder); + _messageItems[mid] = message; + message.reset(opt); + updateHolderPos(); + return mid; + }); + + me.addListener("updatemessage", function (type, id, opt) { + opt = utils.isString(opt) + ? { + content: opt + } + : opt; + var message = _messageItems[id]; + message.render(holder); + message && message.reset(opt); + }); + + me.addListener("hidemessage", function (type, id) { + var message = _messageItems[id]; + message && message.hide(); + }); + + function updateHolderPos() { + if (!holder || !me.ui) return; + var toolbarbox = me.ui.getDom("toolbarbox"); + if (toolbarbox) { + holder.style.top = toolbarbox.offsetHeight + 3 + "px"; + } + holder.style.zIndex = + Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; } - holder.style.zIndex = - Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; - } }); diff --git a/public/js/ueditor/ueditor.config.js b/public/js/ueditor/ueditor.config.js index 434056d..47db17c 100644 --- a/public/js/ueditor/ueditor.config.js +++ b/public/js/ueditor/ueditor.config.js @@ -10,596 +10,684 @@ **************************提示********************************/ (function () { - /** - * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 - * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 - * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 - * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 - * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 - * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; - */ - var URL, CORS_URL; - if (window.UEDITOR_HOME_URL) { - URL = window.UEDITOR_HOME_URL; - } else if (window.__msCDN) { - URL = window.__msCDN + 'asset/vendor/ueditor/'; - } else if (window.__msRoot) { - URL = window.__msRoot + 'asset/vendor/ueditor/'; - } else { - URL = getUEBasePath(); - } - if (window.__msRoot) { - CORS_URL = window.__msRoot + 'asset/vendor/ueditor/'; - } else { - CORS_URL = getUEBasePath(); - } - - /** - * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 - */ - window.UEDITOR_CONFIG = { - - //为编辑器实例添加一个路径,这个不能被注释 - UEDITOR_HOME_URL: URL, - UEDITOR_CORS_URL: CORS_URL, - - // 服务器统一请求接口路径 - serverUrl: "/ueditor-plus/_demo_server/handle.php", - - //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 - toolbars: [ - [ - "fullscreen", // 全屏 - "source", // 源代码 - "|", - "undo", // 撤销 - "redo", // 重做 - "|", - "bold", // 加粗 - "italic", // 斜体 - "underline", // 下划线 - "fontborder", // 字符边框 - "strikethrough",// 删除线 - "superscript", // 上标 - "subscript", // 下标 - "removeformat", // 清除格式 - "formatmatch", // 格式刷 - "autotypeset", // 自动排版 - "blockquote", // 引用 - "pasteplain", // 纯文本粘贴模式 - "|", - "forecolor", // 字体颜色 - "backcolor", // 背景色 - "insertorderedlist", // 有序列表 - "insertunorderedlist", // 无序列表 - "selectall", // 全选 - "cleardoc", // 清空文档 - "|", - "rowspacingtop",// 段前距 - "rowspacingbottom", // 段后距 - "lineheight", // 行间距 - "|", - "customstyle", // 自定义标题 - "paragraph", // 段落格式 - "fontfamily", // 字体 - "fontsize", // 字号 - "|", - "directionalityltr", // 从左向右输入 - "directionalityrtl", // 从右向左输入 - "indent", // 首行缩进 - "|", - "justifyleft", // 居左对齐 - "justifycenter", // 居中对齐 - "justifyright", - "justifyjustify", // 两端对齐 - "|", - "touppercase", // 字母大写 - "tolowercase", // 字母小写 - "|", - "link", // 超链接 - "unlink", // 取消链接 - "anchor", // 锚点 - "|", - "imagenone", // 图片默认 - "imageleft", // 图片左浮动 - "imageright", // 图片右浮动 - "imagecenter", // 图片居中 - "|", - "simpleupload", // 单图上传 - "insertimage", // 多图上传 - "emotion", // 表情 - "scrawl", // 涂鸦 - "insertvideo", // 视频 - "attachment", // 附件 - "insertframe", // 插入Iframe - "insertcode", // 插入代码 - "pagebreak", // 分页 - "template", // 模板 - "background", // 背景 - "formula", // 公式 - "|", - "horizontal", // 分隔线 - "date", // 日期 - "time", // 时间 - "spechars", // 特殊字符 - "wordimage", // Word图片转存 - "|", - "inserttable", // 插入表格 - "deletetable", // 删除表格 - "insertparagraphbeforetable", // 表格前插入行 - "insertrow", // 前插入行 - "deleterow", // 删除行 - "insertcol", // 前插入列 - "deletecol", // 删除列 - "mergecells", // 合并多个单元格 - "mergeright", // 右合并单元格 - "mergedown", // 下合并单元格 - "splittocells", // 完全拆分单元格 - "splittorows", // 拆分成行 - "splittocols", // 拆分成列 - "|", - "print", // 打印 - "preview", // 预览 - "searchreplace", // 查询替换 - "help", // 帮助 - ] - ] - - // 自定义工具栏按钮点击,返回 true 表示已经处理点击,会阻止默认事件 - , toolbarCallback: function (cmd, editor) { - // switch(cmd){ - // case 'insertimage': - // editor.execCommand('insertHtml', '

    '); - // console.log('toolbarCallback',cmd, editor) - // return true; - // case 'insertvideo': - // editor.execCommand('insertHtml', '

    '); - // console.log('toolbarCallback',cmd, editor) - // return true; - // } + // 资源文件根路径,如果你的页面不是放在根目录下,请注意修改这个路径 + // 通常情况下这个可以配置成静态资源CDN的地址 + var URL, CORS_URL; + if (window.UEDITOR_HOME_URL) { + URL = window.UEDITOR_HOME_URL; + } else if (window.__msCDN) { + URL = window.__msCDN + 'asset/vendor/ueditor/'; + } else if (window.__msRoot) { + URL = window.__msRoot + 'asset/vendor/ueditor/'; + } else { + URL = getUEBasePath(); + } + // 需要能跨域的静态资源请求,主要用户弹窗页面等静态资源 + // 通常情况下这个可以配置成静态资源CDN的地址 + if (window.UEDITOR_CORS_URL) { + CORS_URL = window.UEDITOR_CORS_URL; + } else if (window.__msRoot) { + CORS_URL = window.__msRoot + 'asset/vendor/ueditor/'; + } else if (window.UEDITOR_HOME_URL) { + CORS_URL = window.UEDITOR_HOME_URL; + } else { + CORS_URL = getUEBasePath(); } - // 插入图片自定义配置 - , imageConfig: { - // 禁止本地上传 - disableUpload: false, - // 禁止在线管理 - disableOnline: false, - // 自定义选择按钮 - selectCallback: null, - // selectCallback: function(editor,cb){ - // console.log('selectCallback',cb); - // setTimeout(function(){ - // cb({ - // path:'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png', - // name:'测试图片' - // }); - // },1000); - // } + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + + // 为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL, + // 需要能跨域的静态资源请求,主要用户弹窗页面等静态资源 + UEDITOR_CORS_URL: CORS_URL, + + // 是否开启Debug模式 + debug: false, + + // 服务器统一请求接口路径 + serverUrl: "/ueditor-plus/_demo_server/handle.php", + + // 从服务器获取配置 + loadConfigFromServer: true, + + // 服务器统一请求头信息,会在所有请求中带上该信息 + serverHeaders: { + // 'Authorization': 'Bearer xxx' + }, + // 服务器返回参数统一转换方法,可以在这里统一处理返回参数 + serverResponsePrepare: function (res) { + // console.log('serverResponsePrepare', res); + return res; + }, + + //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 + toolbars: [ + [ + "fullscreen", // 全屏 + "source", // 源代码 + "|", + "undo", // 撤销 + "redo", // 重做 + "|", + "bold", // 加粗 + "italic", // 斜体 + "underline", // 下划线 + "fontborder", // 字符边框 + "strikethrough",// 删除线 + "superscript", // 上标 + "subscript", // 下标 + "removeformat", // 清除格式 + "formatmatch", // 格式刷 + "autotypeset", // 自动排版 + "blockquote", // 引用 + "pasteplain", // 纯文本粘贴模式 + "|", + "forecolor", // 字体颜色 + "backcolor", // 背景色 + "insertorderedlist", // 有序列表 + "insertunorderedlist", // 无序列表 + "selectall", // 全选 + "cleardoc", // 清空文档 + "|", + "rowspacingtop",// 段前距 + "rowspacingbottom", // 段后距 + "lineheight", // 行间距 + "|", + "customstyle", // 自定义标题 + "paragraph", // 段落格式 + "fontfamily", // 字体 + "fontsize", // 字号 + "|", + "directionalityltr", // 从左向右输入 + "directionalityrtl", // 从右向左输入 + "indent", // 首行缩进 + "|", + "justifyleft", // 居左对齐 + "justifycenter", // 居中对齐 + "justifyright", + "justifyjustify", // 两端对齐 + "|", + "touppercase", // 字母大写 + "tolowercase", // 字母小写 + "|", + "link", // 超链接 + "unlink", // 取消链接 + "anchor", // 锚点 + "|", + "imagenone", // 图片默认 + "imageleft", // 图片左浮动 + "imagecenter", // 图片居中 + "imageright", // 图片右浮动 + "|", + "simpleupload", // 单图上传 + "insertimage", // 多图上传 + "emotion", // 表情 + "scrawl", // 涂鸦 + "insertvideo", // 视频 + "insertaudio", // 音频 + "attachment", // 附件 + "insertframe", // 插入Iframe + "insertcode", // 插入代码 + "pagebreak", // 分页 + "template", // 模板 + "background", // 背景 + "formula", // 公式 + "|", + "horizontal", // 分隔线 + "date", // 日期 + "time", // 时间 + "spechars", // 特殊字符 + "wordimage", // Word图片转存 + "|", + "inserttable", // 插入表格 + "deletetable", // 删除表格 + "insertparagraphbeforetable", // 表格前插入行 + "insertrow", // 前插入行 + "deleterow", // 删除行 + "insertcol", // 前插入列 + "deletecol", // 删除列 + "mergecells", // 合并多个单元格 + "mergeright", // 右合并单元格 + "mergedown", // 下合并单元格 + "splittocells", // 完全拆分单元格 + "splittorows", // 拆分成行 + "splittocols", // 拆分成列 + "|", + "print", // 打印 + "preview", // 预览 + "searchreplace", // 查询替换 + "|", + "contentimport", + "help", // 帮助 + ] + ] + + // 自定义工具栏按钮点击,返回 true 表示已经处理点击,会阻止默认事件 + , toolbarCallback: function (cmd, editor) { + // console.log('toolbarCallback',cmd, editor); + // switch(cmd){ + // case 'insertimage': + // editor.execCommand('insertHtml', '

    '); + // console.log('toolbarCallback',cmd, editor) + // return true; + // case 'insertvideo': + // editor.execCommand('insertHtml', '