From 04b410409bf50990a12d030210edd2ca3d4271d5 Mon Sep 17 00:00:00 2001 From: jeesun Date: Thu, 23 May 2019 14:18:43 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=88=A0=E9=99=A4t=5Fveri=5Fcode=E8=A1=A8?= =?UTF-8?q?=EF=BC=9B=E6=96=B0=E5=A2=9E=E5=AF=B9=E8=85=BE=E8=AE=AF=E4=BA=91?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E6=9C=8D=E5=8A=A1=E7=9A=84=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schema-mysql-20190512.sql" | 5 +- .../schema-oracle-20190509.sql" | 5 +- .../schema-postgresql-20190521.sql" | 5 +- api/pom.xml | 6 + .../simon/controller/OauthUserController.java | 36 +- ...CodeController.java => SmsController.java} | 40 +- common/pom.xml | 13 + .../com/simon/common/config/AppConfig.java | 4 +- .../java/com/simon/mapper/VeriCodeMapper.java | 12 - .../main/java/com/simon/model/VeriCode.java | 74 - .../simon/repository/VeriCodeRepository.java | 17 - .../com/simon/service/OauthUserService.java | 6 +- .../java/com/simon/service/SmsService.java | 3 +- .../com/simon/service/VeriCodeService.java | 16 - .../simon/service/impl/AliSmsServiceImpl.java | 20 +- .../service/impl/OauthUserServiceImpl.java | 106 +- .../simon/service/impl/TxSmsServiceImpl.java | 80 +- .../service/impl/VeriCodeServiceImpl.java | 141 - .../simon/service/impl/YzxSmsServiceImpl.java | 19 +- .../resources/application-common.properties | 12 +- .../main/resources/mapping/VeriCodeMapper.xml | 21 - tutorial/screenshots/role_authority.png | Bin 0 -> 21638 bytes .../com/simon/common/config/WebMvcConfig.java | 2 + ...CodeController.java => SmsController.java} | 44 +- .../plug-in/neditor/2.1.17/.editorconfig | 16 + .../neditor/2.1.17/.github/ISSUE_TEMPLATE.md | 24 + .../static/plug-in/neditor/2.1.17/.gitignore | 199 + .../static/plug-in/neditor/2.1.17/.travis.yml | 35 + .../plug-in/neditor/2.1.17/CHANGELOG.md | 45 + .../plug-in/neditor/2.1.17/Gruntfile.js | 274 + .../static/plug-in/neditor/2.1.17/LICENSE | 21 + .../static/plug-in/neditor/2.1.17/README.md | 168 + .../2.1.17/_examples/addCustomizeButton.js | 72 + .../2.1.17/_examples/addCustomizeCombox.js | 69 + .../2.1.17/_examples/addCustomizeDialog.js | 49 + .../neditor/2.1.17/_examples/charts.html | 71 + .../2.1.17/_examples/completeDemo.html | 179 + .../2.1.17/_examples/customPluginDemo.html | 54 + .../2.1.17/_examples/customToolbarDemo.html | 105 + .../2.1.17/_examples/customizeDialogPage.html | 25 + .../_examples/customizeToolbarUIDemo.html | 43 + .../neditor/2.1.17/_examples/editor_api.js | 131 + .../2.1.17/_examples/filterRuleDemo.html | 151 + .../2.1.17/_examples/highlightDemo.html | 39 + .../neditor/2.1.17/_examples/index.html | 118 + .../2.1.17/_examples/jqueryCompleteDemo.html | 43 + .../2.1.17/_examples/jqueryValidation.html | 63 + .../neditor/2.1.17/_examples/multiDemo.html | 43 + .../_examples/multiEditorWithOneInstance.html | 60 + .../2.1.17/_examples/renderInTable.html | 26 + .../neditor/2.1.17/_examples/resetDemo.html | 52 + .../neditor/2.1.17/_examples/sectiondemo.html | 181 + .../2.1.17/_examples/server/getContent.ashx | 44 + .../2.1.17/_examples/server/getContent.asp | 15 + .../2.1.17/_examples/server/getContent.jsp | 19 + .../2.1.17/_examples/setWidthHeightDemo.html | 43 + .../neditor/2.1.17/_examples/simpleDemo.html | 36 + .../2.1.17/_examples/sortableDemo.html | 86 + .../2.1.17/_examples/submitFormDemo.html | 54 + .../2.1.17/_examples/textareaDemo.html | 34 + .../neditor/2.1.17/_examples/uparsedemo.html | 204 + .../neditor/2.1.17/_parse/background.js | 21 + .../plug-in/neditor/2.1.17/_parse/charts.js | 288 + .../neditor/2.1.17/_parse/insertcode.js | 49 + .../plug-in/neditor/2.1.17/_parse/list.js | 235 + .../plug-in/neditor/2.1.17/_parse/parse.js | 365 + .../plug-in/neditor/2.1.17/_parse/table.js | 217 + .../plug-in/neditor/2.1.17/_parse/video.js | 38 + .../neditor/2.1.17/_src/adapter/autosave.js | 17 + .../neditor/2.1.17/_src/adapter/editor.js | 998 + .../neditor/2.1.17/_src/adapter/editorui.js | 1002 + .../neditor/2.1.17/_src/adapter/message.js | 67 + .../static/plug-in/neditor/2.1.17/_src/api.js | 62 + .../2.1.17/_src/core/Editor.defaultoptions.js | 30 + .../neditor/2.1.17/_src/core/Editor.js | 1703 ++ .../neditor/2.1.17/_src/core/EventBase.js | 170 + .../plug-in/neditor/2.1.17/_src/core/Range.js | 1982 ++ .../neditor/2.1.17/_src/core/Selection.js | 417 + .../plug-in/neditor/2.1.17/_src/core/ajax.js | 278 + .../neditor/2.1.17/_src/core/browser.js | 263 + .../neditor/2.1.17/_src/core/domUtils.js | 2542 +++ .../plug-in/neditor/2.1.17/_src/core/dtd.js | 434 + .../neditor/2.1.17/_src/core/filternode.js | 126 + .../neditor/2.1.17/_src/core/filterword.js | 226 + .../neditor/2.1.17/_src/core/htmlparser.js | 249 + .../neditor/2.1.17/_src/core/keymap.js | 48 + .../neditor/2.1.17/_src/core/loadconfig.js | 72 + .../neditor/2.1.17/_src/core/localstorage.js | 117 + .../plug-in/neditor/2.1.17/_src/core/node.js | 772 + .../neditor/2.1.17/_src/core/plugin.js | 79 + .../plug-in/neditor/2.1.17/_src/core/utils.js | 1279 ++ .../plug-in/neditor/2.1.17/_src/editor.js | 15 + .../neditor/2.1.17/_src/plugins/anchor.js | 91 + .../neditor/2.1.17/_src/plugins/autofloat.js | 157 + .../neditor/2.1.17/_src/plugins/autoheight.js | 125 + .../neditor/2.1.17/_src/plugins/autolink.js | 218 + .../neditor/2.1.17/_src/plugins/autosave.js | 128 + .../neditor/2.1.17/_src/plugins/autosubmit.js | 39 + .../2.1.17/_src/plugins/autotypeset.js | 354 + .../neditor/2.1.17/_src/plugins/autoupload.js | 229 + .../neditor/2.1.17/_src/plugins/background.js | 130 + .../neditor/2.1.17/_src/plugins/basestyle.js | 152 + .../neditor/2.1.17/_src/plugins/blockquote.js | 188 + .../2.1.17/_src/plugins/catchremoteimage.js | 177 + .../neditor/2.1.17/_src/plugins/charts.js | 127 + .../neditor/2.1.17/_src/plugins/cleardoc.js | 35 + .../2.1.17/_src/plugins/contextmenu.js | 534 + .../2.1.17/_src/plugins/convertcase.js | 57 + .../neditor/2.1.17/_src/plugins/copy.js | 80 + .../2.1.17/_src/plugins/customstyle.js | 181 + .../2.1.17/_src/plugins/defaultfilter.js | 276 + .../2.1.17/_src/plugins/directionality.js | 132 + .../neditor/2.1.17/_src/plugins/dragdrop.js | 65 + .../2.1.17/_src/plugins/elementpath.js | 42 + .../neditor/2.1.17/_src/plugins/enterkey.js | 200 + .../2.1.17/_src/plugins/fiximgclick.js | 382 + .../neditor/2.1.17/_src/plugins/font.js | 556 + .../2.1.17/_src/plugins/formatmatch.js | 124 + .../neditor/2.1.17/_src/plugins/horizontal.js | 102 + .../neditor/2.1.17/_src/plugins/iframe.js | 17 + .../neditor/2.1.17/_src/plugins/image.js | 303 + .../neditor/2.1.17/_src/plugins/indent.js | 32 + .../neditor/2.1.17/_src/plugins/insertcode.js | 612 + .../neditor/2.1.17/_src/plugins/insertfile.js | 90 + .../neditor/2.1.17/_src/plugins/inserthtml.js | 276 + .../2.1.17/_src/plugins/insertparagraph.js | 43 + .../neditor/2.1.17/_src/plugins/justify.js | 131 + .../neditor/2.1.17/_src/plugins/keystrokes.js | 265 + .../neditor/2.1.17/_src/plugins/lineheight.js | 53 + .../neditor/2.1.17/_src/plugins/link.js | 194 + .../neditor/2.1.17/_src/plugins/list.js | 1436 ++ .../neditor/2.1.17/_src/plugins/music.js | 113 + .../neditor/2.1.17/_src/plugins/pagebreak.js | 177 + .../neditor/2.1.17/_src/plugins/paragraph.js | 219 + .../neditor/2.1.17/_src/plugins/paste.js | 354 + .../neditor/2.1.17/_src/plugins/preview.js | 36 + .../neditor/2.1.17/_src/plugins/print.js | 22 + .../2.1.17/_src/plugins/puretxtpaste.js | 107 + .../2.1.17/_src/plugins/removeformat.js | 207 + .../neditor/2.1.17/_src/plugins/rowspacing.js | 51 + .../neditor/2.1.17/_src/plugins/scrawl.js | 10 + .../2.1.17/_src/plugins/searchreplace.js | 238 + .../neditor/2.1.17/_src/plugins/section.js | 305 + .../neditor/2.1.17/_src/plugins/selectall.js | 42 + .../2.1.17/_src/plugins/serverparam.js | 110 + .../2.1.17/_src/plugins/shortcutmenu.js | 73 + .../2.1.17/_src/plugins/simpleupload.js | 224 + .../neditor/2.1.17/_src/plugins/snapscreen.js | 106 + .../neditor/2.1.17/_src/plugins/source.js | 347 + .../2.1.17/_src/plugins/table.action.js | 2023 ++ .../neditor/2.1.17/_src/plugins/table.cmds.js | 1045 + .../neditor/2.1.17/_src/plugins/table.core.js | 1354 ++ .../neditor/2.1.17/_src/plugins/table.sort.js | 201 + .../neditor/2.1.17/_src/plugins/template.js | 47 + .../neditor/2.1.17/_src/plugins/time.js | 57 + .../neditor/2.1.17/_src/plugins/undo.js | 332 + .../neditor/2.1.17/_src/plugins/video.js | 239 + .../neditor/2.1.17/_src/plugins/webapp.js | 193 + .../neditor/2.1.17/_src/plugins/wordcount.js | 41 + .../neditor/2.1.17/_src/plugins/wordimage.js | 58 + .../neditor/2.1.17/_src/plugins/xssFilter.js | 79 + .../2.1.17/_src/ui/autotypesetbutton.js | 151 + .../2.1.17/_src/ui/autotypesetpicker.js | 170 + .../neditor/2.1.17/_src/ui/breakline.js | 18 + .../plug-in/neditor/2.1.17/_src/ui/button.js | 80 + .../neditor/2.1.17/_src/ui/cellalignpicker.js | 99 + .../neditor/2.1.17/_src/ui/colorbutton.js | 61 + .../neditor/2.1.17/_src/ui/colorpicker.js | 98 + .../plug-in/neditor/2.1.17/_src/ui/combox.js | 99 + .../plug-in/neditor/2.1.17/_src/ui/dialog.js | 449 + .../neditor/2.1.17/_src/ui/iconfont.js | 1 + .../plug-in/neditor/2.1.17/_src/ui/mask.js | 53 + .../plug-in/neditor/2.1.17/_src/ui/menu.js | 280 + .../neditor/2.1.17/_src/ui/menubutton.js | 39 + .../plug-in/neditor/2.1.17/_src/ui/message.js | 82 + .../neditor/2.1.17/_src/ui/multiMenu.js | 45 + .../neditor/2.1.17/_src/ui/pastepicker.js | 71 + .../plug-in/neditor/2.1.17/_src/ui/popup.js | 268 + .../neditor/2.1.17/_src/ui/separator.js | 18 + .../neditor/2.1.17/_src/ui/shortcutmenu.js | 245 + .../neditor/2.1.17/_src/ui/splitbutton.js | 99 + .../neditor/2.1.17/_src/ui/stateful.js | 110 + .../neditor/2.1.17/_src/ui/tablebutton.js | 36 + .../neditor/2.1.17/_src/ui/tablepicker.js | 102 + .../plug-in/neditor/2.1.17/_src/ui/toolbar.js | 49 + .../plug-in/neditor/2.1.17/_src/ui/ui.js | 3 + .../plug-in/neditor/2.1.17/_src/ui/uibase.js | 82 + .../plug-in/neditor/2.1.17/_src/ui/uiutils.js | 273 + .../neditor/2.1.17/dialogs/anchor/anchor.html | 40 + .../2.1.17/dialogs/attachment/attachment.css | 682 + .../2.1.17/dialogs/attachment/attachment.html | 60 + .../2.1.17/dialogs/attachment/attachment.js | 775 + .../attachment/fileTypeImages/icon_chm.gif | Bin 0 -> 923 bytes .../fileTypeImages/icon_default.png | Bin 0 -> 841 bytes .../attachment/fileTypeImages/icon_doc.gif | Bin 0 -> 1012 bytes .../attachment/fileTypeImages/icon_exe.gif | Bin 0 -> 949 bytes .../attachment/fileTypeImages/icon_jpg.gif | Bin 0 -> 950 bytes .../attachment/fileTypeImages/icon_mp3.gif | Bin 0 -> 986 bytes .../attachment/fileTypeImages/icon_mv.gif | Bin 0 -> 1001 bytes .../attachment/fileTypeImages/icon_pdf.gif | Bin 0 -> 996 bytes .../attachment/fileTypeImages/icon_ppt.gif | Bin 0 -> 1001 bytes .../attachment/fileTypeImages/icon_psd.gif | Bin 0 -> 1009 bytes .../attachment/fileTypeImages/icon_rar.gif | Bin 0 -> 1007 bytes .../attachment/fileTypeImages/icon_txt.gif | Bin 0 -> 970 bytes .../attachment/fileTypeImages/icon_xls.gif | Bin 0 -> 1005 bytes .../dialogs/attachment/images/alignicon.gif | Bin 0 -> 1051 bytes .../dialogs/attachment/images/alignicon.png | Bin 0 -> 3714 bytes .../2.1.17/dialogs/attachment/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/attachment/images/file-icons.gif | Bin 0 -> 20097 bytes .../dialogs/attachment/images/file-icons.png | Bin 0 -> 44070 bytes .../dialogs/attachment/images/icons.gif | Bin 0 -> 453 bytes .../dialogs/attachment/images/icons.png | Bin 0 -> 2678 bytes .../dialogs/attachment/images/image.png | Bin 0 -> 1672 bytes .../dialogs/attachment/images/progress.png | Bin 0 -> 1269 bytes .../dialogs/attachment/images/success.gif | Bin 0 -> 445 bytes .../dialogs/attachment/images/success.png | Bin 0 -> 1621 bytes .../2.1.17/dialogs/background/background.css | 97 + .../2.1.17/dialogs/background/background.html | 56 + .../2.1.17/dialogs/background/background.js | 376 + .../2.1.17/dialogs/background/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/background/images/success.png | Bin 0 -> 1621 bytes .../2.1.17/dialogs/charts/chart.config.js | 65 + .../neditor/2.1.17/dialogs/charts/charts.css | 165 + .../neditor/2.1.17/dialogs/charts/charts.html | 89 + .../neditor/2.1.17/dialogs/charts/charts.js | 519 + .../2.1.17/dialogs/charts/images/charts0.png | Bin 0 -> 25306 bytes .../2.1.17/dialogs/charts/images/charts1.png | Bin 0 -> 19263 bytes .../2.1.17/dialogs/charts/images/charts2.png | Bin 0 -> 23016 bytes .../2.1.17/dialogs/charts/images/charts3.png | Bin 0 -> 7823 bytes .../2.1.17/dialogs/charts/images/charts4.png | Bin 0 -> 8344 bytes .../2.1.17/dialogs/charts/images/charts5.png | Bin 0 -> 47084 bytes .../2.1.17/dialogs/emotion/emotion.css | 43 + .../2.1.17/dialogs/emotion/emotion.html | 54 + .../neditor/2.1.17/dialogs/emotion/emotion.js | 186 + .../2.1.17/dialogs/emotion/images/0.gif | Bin 0 -> 43 bytes .../2.1.17/dialogs/emotion/images/bface.gif | Bin 0 -> 27167 bytes .../2.1.17/dialogs/emotion/images/cface.gif | Bin 0 -> 8603 bytes .../2.1.17/dialogs/emotion/images/fface.gif | Bin 0 -> 18479 bytes .../2.1.17/dialogs/emotion/images/jxface2.gif | Bin 0 -> 40706 bytes .../emotion/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes .../2.1.17/dialogs/emotion/images/tface.gif | Bin 0 -> 19805 bytes .../2.1.17/dialogs/emotion/images/wface.gif | Bin 0 -> 49850 bytes .../2.1.17/dialogs/emotion/images/yface.gif | Bin 0 -> 28409 bytes .../2.1.17/dialogs/fonts/buttoniconex.css | 272 + .../neditor/2.1.17/dialogs/fonts/iconfont.eot | Bin 0 -> 25672 bytes .../neditor/2.1.17/dialogs/fonts/iconfont.svg | 398 + .../neditor/2.1.17/dialogs/fonts/iconfont.ttf | Bin 0 -> 25492 bytes .../2.1.17/dialogs/fonts/iconfont.woff | Bin 0 -> 12860 bytes .../2.1.17/dialogs/fonts/images/addfile.svg | 1 + .../2.1.17/dialogs/fonts/images/selected.svg | 1 + .../neditor/2.1.17/dialogs/gmap/gmap.html | 106 + .../neditor/2.1.17/dialogs/help/help.css | 7 + .../neditor/2.1.17/dialogs/help/help.html | 82 + .../neditor/2.1.17/dialogs/help/help.js | 56 + .../neditor/2.1.17/dialogs/image/image.css | 936 + .../neditor/2.1.17/dialogs/image/image.html | 127 + .../neditor/2.1.17/dialogs/image/image.js | 1131 + .../2.1.17/dialogs/image/images/alignicon.jpg | Bin 0 -> 16101 bytes .../2.1.17/dialogs/image/images/bg.png | Bin 0 -> 2810 bytes .../2.1.17/dialogs/image/images/icons.gif | Bin 0 -> 453 bytes .../2.1.17/dialogs/image/images/icons.png | Bin 0 -> 2678 bytes .../2.1.17/dialogs/image/images/image.png | Bin 0 -> 1672 bytes .../2.1.17/dialogs/image/images/progress.png | Bin 0 -> 1269 bytes .../2.1.17/dialogs/image/images/success.gif | Bin 0 -> 445 bytes .../2.1.17/dialogs/image/images/success.png | Bin 0 -> 1621 bytes .../dialogs/insertframe/insertframe.html | 115 + .../neditor/2.1.17/dialogs/internal.js | 81 + .../neditor/2.1.17/dialogs/link/link.html | 135 + .../neditor/2.1.17/dialogs/map/map.html | 159 + .../neditor/2.1.17/dialogs/map/show.html | 118 + .../neditor/2.1.17/dialogs/music/balls.svg | 21 + .../neditor/2.1.17/dialogs/music/music.css | 90 + .../neditor/2.1.17/dialogs/music/music.html | 32 + .../neditor/2.1.17/dialogs/music/music.js | 192 + .../2.1.17/dialogs/preview/preview.html | 40 + .../2.1.17/dialogs/scrawl/images/addimg.png | Bin 0 -> 628 bytes .../2.1.17/dialogs/scrawl/images/brush.png | Bin 0 -> 608 bytes .../2.1.17/dialogs/scrawl/images/delimg.png | Bin 0 -> 516 bytes .../2.1.17/dialogs/scrawl/images/delimgH.png | Bin 0 -> 578 bytes .../2.1.17/dialogs/scrawl/images/empty.png | Bin 0 -> 519 bytes .../2.1.17/dialogs/scrawl/images/emptyH.png | Bin 0 -> 657 bytes .../2.1.17/dialogs/scrawl/images/eraser.png | Bin 0 -> 43271 bytes .../2.1.17/dialogs/scrawl/images/redo.png | Bin 0 -> 454 bytes .../2.1.17/dialogs/scrawl/images/redoH.png | Bin 0 -> 536 bytes .../2.1.17/dialogs/scrawl/images/scale.png | Bin 0 -> 435 bytes .../2.1.17/dialogs/scrawl/images/scaleH.png | Bin 0 -> 330 bytes .../2.1.17/dialogs/scrawl/images/size.png | Bin 0 -> 775 bytes .../2.1.17/dialogs/scrawl/images/undo.png | Bin 0 -> 444 bytes .../2.1.17/dialogs/scrawl/images/undoH.png | Bin 0 -> 511 bytes .../neditor/2.1.17/dialogs/scrawl/scrawl.css | 372 + .../neditor/2.1.17/dialogs/scrawl/scrawl.html | 100 + .../neditor/2.1.17/dialogs/scrawl/scrawl.js | 683 + .../dialogs/searchreplace/searchreplace.html | 127 + .../dialogs/searchreplace/searchreplace.js | 170 + .../2.1.17/dialogs/snapscreen/snapscreen.html | 60 + .../2.1.17/dialogs/spechars/spechars.html | 21 + .../2.1.17/dialogs/spechars/spechars.js | 57 + .../neditor/2.1.17/dialogs/table/dragicon.png | Bin 0 -> 304 bytes .../2.1.17/dialogs/table/edittable.css | 84 + .../2.1.17/dialogs/table/edittable.html | 64 + .../neditor/2.1.17/dialogs/table/edittable.js | 237 + .../neditor/2.1.17/dialogs/table/edittd.html | 61 + .../neditor/2.1.17/dialogs/table/edittip.html | 33 + .../neditor/2.1.17/dialogs/template/config.js | 42 + .../2.1.17/dialogs/template/images/bg.gif | Bin 0 -> 84 bytes .../2.1.17/dialogs/template/images/pre0.png | Bin 0 -> 250 bytes .../2.1.17/dialogs/template/images/pre1.png | Bin 0 -> 291 bytes .../2.1.17/dialogs/template/images/pre2.png | Bin 0 -> 394 bytes .../2.1.17/dialogs/template/images/pre3.png | Bin 0 -> 485 bytes .../2.1.17/dialogs/template/images/pre4.png | Bin 0 -> 393 bytes .../2.1.17/dialogs/template/template.css | 18 + .../2.1.17/dialogs/template/template.html | 26 + .../2.1.17/dialogs/template/template.js | 53 + .../2.1.17/dialogs/video/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/video/images/center_focus.jpg | Bin 0 -> 3800 bytes .../dialogs/video/images/file-icons.gif | Bin 0 -> 20097 bytes .../dialogs/video/images/file-icons.png | Bin 0 -> 44070 bytes .../2.1.17/dialogs/video/images/icons.gif | Bin 0 -> 453 bytes .../2.1.17/dialogs/video/images/icons.png | Bin 0 -> 2678 bytes .../2.1.17/dialogs/video/images/image.png | Bin 0 -> 1672 bytes .../dialogs/video/images/left_focus.jpg | Bin 0 -> 3970 bytes .../dialogs/video/images/none_focus.jpg | Bin 0 -> 3862 bytes .../2.1.17/dialogs/video/images/progress.png | Bin 0 -> 1269 bytes .../dialogs/video/images/right_focus.jpg | Bin 0 -> 3971 bytes .../2.1.17/dialogs/video/images/success.gif | Bin 0 -> 445 bytes .../2.1.17/dialogs/video/images/success.png | Bin 0 -> 1621 bytes .../neditor/2.1.17/dialogs/video/video.css | 644 + .../neditor/2.1.17/dialogs/video/video.html | 85 + .../neditor/2.1.17/dialogs/video/video.js | 818 + .../neditor/2.1.17/dialogs/webapp/webapp.html | 53 + .../dialogs/wordimage/fClipboard_ueditor.swf | Bin 0 -> 1908 bytes .../dialogs/wordimage/imageUploader.swf | Bin 0 -> 62857 bytes .../2.1.17/dialogs/wordimage/tangram.js | 1495 ++ .../2.1.17/dialogs/wordimage/wordimage.html | 111 + .../2.1.17/dialogs/wordimage/wordimage.js | 157 + .../plug-in/neditor/2.1.17/i18n/en/en.js | 684 + .../2.1.17/i18n/en/images/addimage.png | Bin 0 -> 3373 bytes .../i18n/en/images/alldeletebtnhoverskin.png | Bin 0 -> 743 bytes .../i18n/en/images/alldeletebtnupskin.png | Bin 0 -> 743 bytes .../2.1.17/i18n/en/images/background.png | Bin 0 -> 3854 bytes .../neditor/2.1.17/i18n/en/images/button.png | Bin 0 -> 4929 bytes .../neditor/2.1.17/i18n/en/images/copy.png | Bin 0 -> 1222 bytes .../2.1.17/i18n/en/images/deletedisable.png | Bin 0 -> 649 bytes .../2.1.17/i18n/en/images/deleteenable.png | Bin 0 -> 664 bytes .../2.1.17/i18n/en/images/listbackground.png | Bin 0 -> 3750 bytes .../2.1.17/i18n/en/images/localimage.png | Bin 0 -> 3083 bytes .../neditor/2.1.17/i18n/en/images/music.png | Bin 0 -> 3599 bytes .../i18n/en/images/rotateleftdisable.png | Bin 0 -> 719 bytes .../i18n/en/images/rotateleftenable.png | Bin 0 -> 952 bytes .../i18n/en/images/rotaterightdisable.png | Bin 0 -> 754 bytes .../i18n/en/images/rotaterightenable.png | Bin 0 -> 1007 bytes .../neditor/2.1.17/i18n/en/images/upload.png | Bin 0 -> 3941 bytes .../neditor/2.1.17/i18n/ja-jp/images/copy.png | Bin 0 -> 1510 bytes .../2.1.17/i18n/ja-jp/images/localimage.png | Bin 0 -> 4860 bytes .../2.1.17/i18n/ja-jp/images/music.png | Bin 0 -> 23173 bytes .../2.1.17/i18n/ja-jp/images/upload.png | Bin 0 -> 1820 bytes .../neditor/2.1.17/i18n/ja-jp/ja-jp.js | 665 + .../neditor/2.1.17/i18n/zh-cn/images/copy.png | Bin 0 -> 4319 bytes .../2.1.17/i18n/zh-cn/images/localimage.png | Bin 0 -> 6979 bytes .../2.1.17/i18n/zh-cn/images/music.png | Bin 0 -> 3453 bytes .../2.1.17/i18n/zh-cn/images/upload.png | Bin 0 -> 6608 bytes .../neditor/2.1.17/i18n/zh-cn/zh-cn.js | 669 + .../plug-in/neditor/2.1.17/neditor.config.js | 601 + .../plug-in/neditor/2.1.17/neditor.parse.js | 64 + .../plug-in/neditor/2.1.17/neditor.service.js | 234 + .../plug-in/neditor/2.1.17/package.json | 44 + .../themes/default/_css/autotypesetpicker.css | 21 + .../2.1.17/themes/default/_css/button.css | 42 + .../2.1.17/themes/default/_css/buttonicon.css | 419 + .../themes/default/_css/cellalignpicker.css | 56 + .../themes/default/_css/colorbutton.css | 9 + .../themes/default/_css/colorpicker.css | 119 + .../2.1.17/themes/default/_css/combox.css | 62 + .../themes/default/_css/contextmenu.css | 29 + .../2.1.17/themes/default/_css/dialog.css | 294 + .../2.1.17/themes/default/_css/editor.css | 168 + .../2.1.17/themes/default/_css/menu.css | 46 + .../2.1.17/themes/default/_css/menubutton.css | 72 + .../2.1.17/themes/default/_css/message.css | 66 + .../2.1.17/themes/default/_css/multiMenu.css | 29 + .../themes/default/_css/paragraphpicker.css | 45 + .../themes/default/_css/pastepicker.css | 72 + .../2.1.17/themes/default/_css/popup.css | 75 + .../2.1.17/themes/default/_css/separtor.css | 8 + .../themes/default/_css/shortcutmenu.css | 9 + .../themes/default/_css/splitbutton.css | 84 + .../themes/default/_css/tablepicker.css | 40 + .../2.1.17/themes/default/_css/toolbar.css | 18 + .../2.1.17/themes/default/_css/ueditor.css | 59 + .../2.1.17/themes/default/_css/uibase.css | 115 + .../2.1.17/themes/default/dialogbase.css | 100 + .../2.1.17/themes/default/images/anchor.gif | Bin 0 -> 184 bytes .../2.1.17/themes/default/images/arrow.png | Bin 0 -> 1173 bytes .../themes/default/images/arrow_down.png | Bin 0 -> 1610 bytes .../2.1.17/themes/default/images/arrow_up.png | Bin 0 -> 1649 bytes .../themes/default/images/button-bg.gif | Bin 0 -> 1114 bytes .../themes/default/images/cancelbutton.gif | Bin 0 -> 1227 bytes .../2.1.17/themes/default/images/charts.png | Bin 0 -> 518 bytes .../2.1.17/themes/default/images/cursor_h.gif | Bin 0 -> 253 bytes .../2.1.17/themes/default/images/cursor_h.png | Bin 0 -> 175 bytes .../2.1.17/themes/default/images/cursor_v.gif | Bin 0 -> 370 bytes .../2.1.17/themes/default/images/cursor_v.png | Bin 0 -> 177 bytes .../themes/default/images/dialog-title-bg.png | Bin 0 -> 938 bytes .../2.1.17/themes/default/images/filescan.png | Bin 0 -> 4282 bytes .../themes/default/images/highlighted.gif | Bin 0 -> 111 bytes .../themes/default/images/icons-all.gif | Bin 0 -> 3750 bytes .../2.1.17/themes/default/images/icons.gif | Bin 0 -> 20947 bytes .../2.1.17/themes/default/images/icons.png | Bin 0 -> 19694 bytes .../themes/default/images/img-cracked.png | Bin 0 -> 1497 bytes .../themes/default/images/loaderror.png | Bin 0 -> 3209 bytes .../2.1.17/themes/default/images/loading.gif | Bin 0 -> 734 bytes .../2.1.17/themes/default/images/lock.gif | Bin 0 -> 1062 bytes .../default/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes .../themes/default/images/pagebreak.gif | Bin 0 -> 54 bytes .../2.1.17/themes/default/images/scale.png | Bin 0 -> 167 bytes .../2.1.17/themes/default/images/sortable.png | Bin 0 -> 2851 bytes .../2.1.17/themes/default/images/spacer.gif | Bin 0 -> 43 bytes .../themes/default/images/sparator_v.png | Bin 0 -> 122 bytes .../default/images/table-cell-align.png | Bin 0 -> 1847 bytes .../default/images/tangram-colorpicker.png | Bin 0 -> 17355 bytes .../themes/default/images/toolbar_bg.png | Bin 0 -> 170 bytes .../themes/default/images/unhighlighted.gif | Bin 0 -> 111 bytes .../2.1.17/themes/default/images/upload.png | Bin 0 -> 6608 bytes .../themes/default/images/videologo.gif | Bin 0 -> 1604 bytes .../2.1.17/themes/default/images/word.gif | Bin 0 -> 1019 bytes .../themes/default/images/wordpaste.png | Bin 0 -> 6467 bytes .../plug-in/neditor/2.1.17/themes/iframe.css | 5 + .../themes/notadd/_css/autotypesetpicker.css | 26 + .../2.1.17/themes/notadd/_css/button.css | 96 + .../2.1.17/themes/notadd/_css/buttonicon.css | 419 + .../themes/notadd/_css/buttoniconex.css | 272 + .../themes/notadd/_css/cellalignpicker.css | 68 + .../2.1.17/themes/notadd/_css/colorbutton.css | 9 + .../2.1.17/themes/notadd/_css/colorpicker.css | 120 + .../2.1.17/themes/notadd/_css/combox.css | 72 + .../2.1.17/themes/notadd/_css/contextmenu.css | 47 + .../2.1.17/themes/notadd/_css/dialog.css | 365 + .../2.1.17/themes/notadd/_css/editor.css | 161 + .../2.1.17/themes/notadd/_css/iconfont.css | 194 + .../2.1.17/themes/notadd/_css/menu.css | 49 + .../2.1.17/themes/notadd/_css/menubutton.css | 70 + .../2.1.17/themes/notadd/_css/message.css | 66 + .../2.1.17/themes/notadd/_css/multiMenu.css | 29 + .../2.1.17/themes/notadd/_css/neditor.css | 60 + .../themes/notadd/_css/paragraphpicker.css | 45 + .../2.1.17/themes/notadd/_css/pastepicker.css | 72 + .../2.1.17/themes/notadd/_css/popup.css | 78 + .../2.1.17/themes/notadd/_css/separtor.css | 4 + .../themes/notadd/_css/shortcutmenu.css | 9 + .../2.1.17/themes/notadd/_css/splitbutton.css | 94 + .../2.1.17/themes/notadd/_css/tablepicker.css | 41 + .../2.1.17/themes/notadd/_css/toolbar.css | 17 + .../2.1.17/themes/notadd/_css/uibase.css | 119 + .../2.1.17/themes/notadd/dialogbase.css | 104 + .../2.1.17/themes/notadd/fonts/iconfont.eot | Bin 0 -> 25672 bytes .../2.1.17/themes/notadd/fonts/iconfont.js | 1 + .../2.1.17/themes/notadd/fonts/iconfont.svg | 398 + .../2.1.17/themes/notadd/fonts/iconfont.ttf | Bin 0 -> 25492 bytes .../2.1.17/themes/notadd/fonts/iconfont.woff | Bin 0 -> 12860 bytes .../2.1.17/themes/notadd/images/anchor.gif | Bin 0 -> 975 bytes .../2.1.17/themes/notadd/images/arrow.png | Bin 0 -> 1173 bytes .../themes/notadd/images/arrow_down.png | Bin 0 -> 1610 bytes .../2.1.17/themes/notadd/images/arrow_up.png | Bin 0 -> 1649 bytes .../2.1.17/themes/notadd/images/button-bg.gif | Bin 0 -> 1114 bytes .../themes/notadd/images/cancelbutton.gif | Bin 0 -> 1227 bytes .../2.1.17/themes/notadd/images/charts.png | Bin 0 -> 518 bytes .../2.1.17/themes/notadd/images/cursor_h.gif | Bin 0 -> 253 bytes .../2.1.17/themes/notadd/images/cursor_h.png | Bin 0 -> 175 bytes .../2.1.17/themes/notadd/images/cursor_v.gif | Bin 0 -> 370 bytes .../2.1.17/themes/notadd/images/cursor_v.png | Bin 0 -> 177 bytes .../themes/notadd/images/dialog-title-bg.png | Bin 0 -> 938 bytes .../2.1.17/themes/notadd/images/filescan.png | Bin 0 -> 4282 bytes .../themes/notadd/images/highlighted.gif | Bin 0 -> 111 bytes .../2.1.17/themes/notadd/images/icons-all.gif | Bin 0 -> 3750 bytes .../2.1.17/themes/notadd/images/icons.gif | Bin 0 -> 20947 bytes .../2.1.17/themes/notadd/images/icons.png | Bin 0 -> 19694 bytes .../2.1.17/themes/notadd/images/loaderror.png | Bin 0 -> 3209 bytes .../2.1.17/themes/notadd/images/loading.gif | Bin 0 -> 734 bytes .../2.1.17/themes/notadd/images/lock.gif | Bin 0 -> 1062 bytes .../themes/notadd/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes .../2.1.17/themes/notadd/images/pagebreak.gif | Bin 0 -> 54 bytes .../2.1.17/themes/notadd/images/scale.png | Bin 0 -> 167 bytes .../2.1.17/themes/notadd/images/sortable.png | Bin 0 -> 2851 bytes .../2.1.17/themes/notadd/images/spacer.gif | Bin 0 -> 43 bytes .../themes/notadd/images/sparator_v.png | Bin 0 -> 122 bytes .../themes/notadd/images/table-cell-align.png | Bin 0 -> 1847 bytes .../notadd/images/tangram-colorpicker.png | Bin 0 -> 17355 bytes .../themes/notadd/images/toolbar_bg.png | Bin 0 -> 170 bytes .../themes/notadd/images/unhighlighted.gif | Bin 0 -> 111 bytes .../2.1.17/themes/notadd/images/upload.png | Bin 0 -> 6608 bytes .../2.1.17/themes/notadd/images/videologo.gif | Bin 0 -> 1530 bytes .../2.1.17/themes/notadd/images/word.gif | Bin 0 -> 1019 bytes .../2.1.17/themes/notadd/images/wordpaste.png | Bin 0 -> 6467 bytes .../2.1.17/themes/ueditor-list/dash.gif | Bin 0 -> 64 bytes .../2.1.17/themes/ueditor-list/dot.gif | Bin 0 -> 166 bytes .../themes/ueditor-list/list-cn-1-1.gif | Bin 0 -> 67 bytes .../themes/ueditor-list/list-cn-1-10.gif | Bin 0 -> 76 bytes .../themes/ueditor-list/list-cn-1-11.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-cn-1-12.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-cn-1-13.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-cn-1-14.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-15.gif | Bin 0 -> 93 bytes .../themes/ueditor-list/list-cn-1-16.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-1-17.gif | Bin 0 -> 94 bytes .../themes/ueditor-list/list-cn-1-18.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-cn-1-19.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-1-2.gif | Bin 0 -> 67 bytes .../themes/ueditor-list/list-cn-1-20.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-cn-1-21.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-1-22.gif | Bin 0 -> 94 bytes .../themes/ueditor-list/list-cn-1-23.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-cn-1-24.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-1-25.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-26.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-27.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-28.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-1-29.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-1-3.gif | Bin 0 -> 70 bytes .../themes/ueditor-list/list-cn-1-30.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-cn-1-31.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-1-32.gif | Bin 0 -> 94 bytes .../themes/ueditor-list/list-cn-1-33.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-1-34.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-1-35.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-36.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-1-37.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-38.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-1-39.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-1-4.gif | Bin 0 -> 90 bytes .../themes/ueditor-list/list-cn-1-40.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-41.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-1-42.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-1-43.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-1-44.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-1-45.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-1-46.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-1-47.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-1-48.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-1-49.gif | Bin 0 -> 124 bytes .../themes/ueditor-list/list-cn-1-5.gif | Bin 0 -> 77 bytes .../themes/ueditor-list/list-cn-1-50.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-1-51.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-52.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-53.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-54.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-1-55.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-1-56.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-1-57.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-1-58.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-1-59.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-1-6.gif | Bin 0 -> 78 bytes .../themes/ueditor-list/list-cn-1-60.gif | Bin 0 -> 94 bytes .../themes/ueditor-list/list-cn-1-61.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-1-62.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-63.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-1-64.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-1-65.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-1-66.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-1-67.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-1-68.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-1-69.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-1-7.gif | Bin 0 -> 76 bytes .../themes/ueditor-list/list-cn-1-70.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-1-71.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-cn-1-72.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-cn-1-73.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-1-74.gif | Bin 0 -> 120 bytes .../themes/ueditor-list/list-cn-1-75.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-1-76.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-1-77.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-1-78.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-1-79.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-1-8.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-cn-1-80.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-1-81.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-1-82.gif | Bin 0 -> 108 bytes .../themes/ueditor-list/list-cn-1-83.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-1-84.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-1-85.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-1-86.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-1-87.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-1-88.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-1-89.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-1-9.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-cn-1-90.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-1-91.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-1-92.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-1-93.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-1-94.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-1-95.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-1-96.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-1-97.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-1-98.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-1.gif | Bin 0 -> 72 bytes .../themes/ueditor-list/list-cn-2-10.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-cn-2-11.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-cn-2-12.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-cn-2-13.gif | Bin 0 -> 91 bytes .../themes/ueditor-list/list-cn-2-14.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-2-15.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-16.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-17.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-2-18.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-cn-2-19.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-cn-2-2.gif | Bin 0 -> 73 bytes .../themes/ueditor-list/list-cn-2-20.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-cn-2-21.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-cn-2-22.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-23.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-cn-2-24.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-25.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-2-26.gif | Bin 0 -> 108 bytes .../themes/ueditor-list/list-cn-2-27.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-2-28.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-2-29.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-2-3.gif | Bin 0 -> 75 bytes .../themes/ueditor-list/list-cn-2-30.gif | Bin 0 -> 90 bytes .../themes/ueditor-list/list-cn-2-31.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-cn-2-32.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-33.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-cn-2-34.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-35.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-2-36.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-2-37.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-2-38.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-2-39.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-2-4.gif | Bin 0 -> 91 bytes .../themes/ueditor-list/list-cn-2-40.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-2-41.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-2-42.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-2-43.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-44.gif | Bin 0 -> 131 bytes .../themes/ueditor-list/list-cn-2-45.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-2-46.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-2-47.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-2-48.gif | Bin 0 -> 124 bytes .../themes/ueditor-list/list-cn-2-49.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-2-5.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-cn-2-50.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-2-51.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-2-52.gif | Bin 0 -> 109 bytes .../themes/ueditor-list/list-cn-2-53.gif | Bin 0 -> 108 bytes .../themes/ueditor-list/list-cn-2-54.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-2-55.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-2-56.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-2-57.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-2-58.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-59.gif | Bin 0 -> 118 bytes .../themes/ueditor-list/list-cn-2-6.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-cn-2-60.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-2-61.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-2-62.gif | Bin 0 -> 108 bytes .../themes/ueditor-list/list-cn-2-63.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-2-64.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-2-65.gif | Bin 0 -> 116 bytes .../themes/ueditor-list/list-cn-2-66.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-2-67.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-2-68.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-2-69.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-7.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-cn-2-70.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-71.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-cn-2-72.gif | Bin 0 -> 107 bytes .../themes/ueditor-list/list-cn-2-73.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-2-74.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-2-75.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-2-76.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-2-77.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-2-78.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-79.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-8.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-cn-2-80.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-cn-2-81.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-2-82.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-2-83.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-2-84.gif | Bin 0 -> 127 bytes .../themes/ueditor-list/list-cn-2-85.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-86.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-87.gif | Bin 0 -> 117 bytes .../themes/ueditor-list/list-cn-2-88.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-2-89.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-2-9.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-cn-2-90.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-cn-2-91.gif | Bin 0 -> 110 bytes .../themes/ueditor-list/list-cn-2-92.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-2-93.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-2-94.gif | Bin 0 -> 129 bytes .../themes/ueditor-list/list-cn-2-95.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-96.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-2-97.gif | Bin 0 -> 115 bytes .../themes/ueditor-list/list-cn-2-98.gif | Bin 0 -> 120 bytes .../themes/ueditor-list/list-cn-3-1.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-cn-3-10.gif | Bin 0 -> 92 bytes .../themes/ueditor-list/list-cn-3-11.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-cn-3-12.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-cn-3-13.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-cn-3-14.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-3-15.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-16.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-17.gif | Bin 0 -> 108 bytes .../themes/ueditor-list/list-cn-3-18.gif | Bin 0 -> 114 bytes .../themes/ueditor-list/list-cn-3-19.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-2.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-cn-3-20.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-cn-3-21.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-22.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-23.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-24.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-25.gif | Bin 0 -> 121 bytes .../themes/ueditor-list/list-cn-3-26.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-3-27.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-28.gif | Bin 0 -> 124 bytes .../themes/ueditor-list/list-cn-3-29.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-3-3.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-cn-3-30.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-cn-3-31.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-32.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-33.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-34.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-35.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-3-36.gif | Bin 0 -> 124 bytes .../themes/ueditor-list/list-cn-3-37.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-38.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-3-39.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-3-4.gif | Bin 0 -> 106 bytes .../themes/ueditor-list/list-cn-3-40.gif | Bin 0 -> 120 bytes .../themes/ueditor-list/list-cn-3-41.gif | Bin 0 -> 127 bytes .../themes/ueditor-list/list-cn-3-42.gif | Bin 0 -> 129 bytes .../themes/ueditor-list/list-cn-3-43.gif | Bin 0 -> 133 bytes .../themes/ueditor-list/list-cn-3-44.gif | Bin 0 -> 146 bytes .../themes/ueditor-list/list-cn-3-45.gif | Bin 0 -> 137 bytes .../themes/ueditor-list/list-cn-3-46.gif | Bin 0 -> 140 bytes .../themes/ueditor-list/list-cn-3-47.gif | Bin 0 -> 139 bytes .../themes/ueditor-list/list-cn-3-48.gif | Bin 0 -> 141 bytes .../themes/ueditor-list/list-cn-3-49.gif | Bin 0 -> 140 bytes .../themes/ueditor-list/list-cn-3-5.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-3-50.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-51.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-52.gif | Bin 0 -> 121 bytes .../themes/ueditor-list/list-cn-3-53.gif | Bin 0 -> 121 bytes .../themes/ueditor-list/list-cn-3-54.gif | Bin 0 -> 139 bytes .../themes/ueditor-list/list-cn-3-55.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-3-56.gif | Bin 0 -> 129 bytes .../themes/ueditor-list/list-cn-3-57.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-3-58.gif | Bin 0 -> 131 bytes .../themes/ueditor-list/list-cn-3-59.gif | Bin 0 -> 131 bytes .../themes/ueditor-list/list-cn-3-6.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-cn-3-60.gif | Bin 0 -> 112 bytes .../themes/ueditor-list/list-cn-3-61.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-62.gif | Bin 0 -> 120 bytes .../themes/ueditor-list/list-cn-3-63.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-3-64.gif | Bin 0 -> 138 bytes .../themes/ueditor-list/list-cn-3-65.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-66.gif | Bin 0 -> 128 bytes .../themes/ueditor-list/list-cn-3-67.gif | Bin 0 -> 128 bytes .../themes/ueditor-list/list-cn-3-68.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-69.gif | Bin 0 -> 130 bytes .../themes/ueditor-list/list-cn-3-7.gif | Bin 0 -> 94 bytes .../themes/ueditor-list/list-cn-3-70.gif | Bin 0 -> 111 bytes .../themes/ueditor-list/list-cn-3-71.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-72.gif | Bin 0 -> 119 bytes .../themes/ueditor-list/list-cn-3-73.gif | Bin 0 -> 121 bytes .../themes/ueditor-list/list-cn-3-74.gif | Bin 0 -> 138 bytes .../themes/ueditor-list/list-cn-3-75.gif | Bin 0 -> 127 bytes .../themes/ueditor-list/list-cn-3-76.gif | Bin 0 -> 127 bytes .../themes/ueditor-list/list-cn-3-77.gif | Bin 0 -> 128 bytes .../themes/ueditor-list/list-cn-3-78.gif | Bin 0 -> 130 bytes .../themes/ueditor-list/list-cn-3-79.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-8.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-3-80.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-3-81.gif | Bin 0 -> 122 bytes .../themes/ueditor-list/list-cn-3-82.gif | Bin 0 -> 123 bytes .../themes/ueditor-list/list-cn-3-83.gif | Bin 0 -> 126 bytes .../themes/ueditor-list/list-cn-3-84.gif | Bin 0 -> 143 bytes .../themes/ueditor-list/list-cn-3-85.gif | Bin 0 -> 130 bytes .../themes/ueditor-list/list-cn-3-86.gif | Bin 0 -> 133 bytes .../themes/ueditor-list/list-cn-3-87.gif | Bin 0 -> 127 bytes .../themes/ueditor-list/list-cn-3-88.gif | Bin 0 -> 134 bytes .../themes/ueditor-list/list-cn-3-89.gif | Bin 0 -> 134 bytes .../themes/ueditor-list/list-cn-3-9.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-cn-3-90.gif | Bin 0 -> 113 bytes .../themes/ueditor-list/list-cn-3-91.gif | Bin 0 -> 121 bytes .../themes/ueditor-list/list-cn-3-92.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-3-93.gif | Bin 0 -> 125 bytes .../themes/ueditor-list/list-cn-3-94.gif | Bin 0 -> 141 bytes .../themes/ueditor-list/list-cn-3-95.gif | Bin 0 -> 132 bytes .../themes/ueditor-list/list-cn-3-96.gif | Bin 0 -> 131 bytes .../themes/ueditor-list/list-cn-3-97.gif | Bin 0 -> 131 bytes .../themes/ueditor-list/list-cn-3-98.gif | Bin 0 -> 135 bytes .../themes/ueditor-list/list-num-1-1.gif | Bin 0 -> 67 bytes .../themes/ueditor-list/list-num-1-10.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-11.gif | Bin 0 -> 78 bytes .../themes/ueditor-list/list-num-1-12.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-13.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-14.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-15.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-16.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-17.gif | Bin 0 -> 78 bytes .../themes/ueditor-list/list-num-1-18.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-19.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-2.gif | Bin 0 -> 69 bytes .../themes/ueditor-list/list-num-1-20.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-21.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-22.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-23.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-24.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-25.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-26.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-27.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-28.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-29.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-3.gif | Bin 0 -> 69 bytes .../themes/ueditor-list/list-num-1-30.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-31.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-32.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-33.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-34.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-35.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-36.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-37.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-38.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-39.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-4.gif | Bin 0 -> 71 bytes .../themes/ueditor-list/list-num-1-40.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-41.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-42.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-43.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-44.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-1-45.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-46.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-47.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-48.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-49.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-5.gif | Bin 0 -> 70 bytes .../themes/ueditor-list/list-num-1-50.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-51.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-52.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-53.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-54.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-55.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-56.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-57.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-58.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-59.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-6.gif | Bin 0 -> 70 bytes .../themes/ueditor-list/list-num-1-60.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-1-61.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-62.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-63.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-64.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-65.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-66.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-67.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-68.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-69.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-1-7.gif | Bin 0 -> 68 bytes .../themes/ueditor-list/list-num-1-70.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-71.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-72.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-73.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-74.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-75.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-76.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-77.gif | Bin 0 -> 79 bytes .../themes/ueditor-list/list-num-1-78.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-79.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-8.gif | Bin 0 -> 72 bytes .../themes/ueditor-list/list-num-1-80.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-81.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-1-82.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-83.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-84.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-85.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-86.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-87.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-88.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-89.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-1-9.gif | Bin 0 -> 72 bytes .../themes/ueditor-list/list-num-1-90.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-91.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-1-92.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-93.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-1-94.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-95.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-96.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-1-97.gif | Bin 0 -> 82 bytes .../themes/ueditor-list/list-num-1-98.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-1.gif | Bin 0 -> 72 bytes .../themes/ueditor-list/list-num-2-10.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-11.gif | Bin 0 -> 80 bytes .../themes/ueditor-list/list-num-2-12.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-13.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-14.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-15.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-16.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-17.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-2-18.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-19.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-2.gif | Bin 0 -> 74 bytes .../themes/ueditor-list/list-num-2-20.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-21.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-2-22.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-23.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-24.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-25.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-26.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-27.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-28.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-29.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-3.gif | Bin 0 -> 74 bytes .../themes/ueditor-list/list-num-2-30.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-31.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-32.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-33.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-34.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-35.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-36.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-37.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-38.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-39.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-4.gif | Bin 0 -> 75 bytes .../themes/ueditor-list/list-num-2-40.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-41.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-42.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-43.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-44.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-45.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-46.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-2-47.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-48.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-2-49.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-5.gif | Bin 0 -> 74 bytes .../themes/ueditor-list/list-num-2-50.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-51.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-2-52.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-53.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-54.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-55.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-56.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-57.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-58.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-59.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-6.gif | Bin 0 -> 76 bytes .../themes/ueditor-list/list-num-2-60.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-61.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-62.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-63.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-64.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-2-65.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-66.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-2-67.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-68.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-69.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-7.gif | Bin 0 -> 72 bytes .../themes/ueditor-list/list-num-2-70.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-71.gif | Bin 0 -> 81 bytes .../themes/ueditor-list/list-num-2-72.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-73.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-74.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-75.gif | Bin 0 -> 84 bytes .../themes/ueditor-list/list-num-2-76.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-77.gif | Bin 0 -> 83 bytes .../themes/ueditor-list/list-num-2-78.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-79.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-8.gif | Bin 0 -> 76 bytes .../themes/ueditor-list/list-num-2-80.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-81.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-82.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-83.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-84.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-85.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-86.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-87.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-2-88.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-89.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-9.gif | Bin 0 -> 75 bytes .../themes/ueditor-list/list-num-2-90.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-91.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-92.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-93.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-94.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-2-95.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-2-96.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-2-97.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-2-98.gif | Bin 0 -> 88 bytes .../themes/ueditor-list/list-num-3-1.gif | Bin 0 -> 86 bytes .../themes/ueditor-list/list-num-3-10.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-11.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-num-3-12.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-num-3-13.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-14.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-15.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-16.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-17.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-num-3-18.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-19.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-2.gif | Bin 0 -> 87 bytes .../themes/ueditor-list/list-num-3-20.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-21.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-22.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-23.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-24.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-25.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-26.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-27.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-28.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-29.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-3.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-3-30.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-31.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-32.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-33.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-34.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-35.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-36.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-37.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-38.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-39.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-4.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-3-40.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-41.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-42.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-43.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-44.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-45.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-46.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-num-3-47.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-48.gif | Bin 0 -> 105 bytes .../themes/ueditor-list/list-num-3-49.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-5.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-3-50.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-51.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-52.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-53.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-54.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-55.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-56.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-57.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-58.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-59.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-6.gif | Bin 0 -> 90 bytes .../themes/ueditor-list/list-num-3-60.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-61.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-62.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-63.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-64.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-65.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-66.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-67.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-68.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-69.gif | Bin 0 -> 104 bytes .../themes/ueditor-list/list-num-3-7.gif | Bin 0 -> 85 bytes .../themes/ueditor-list/list-num-3-70.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-71.gif | Bin 0 -> 97 bytes .../themes/ueditor-list/list-num-3-72.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-73.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-74.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-75.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-76.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-77.gif | Bin 0 -> 96 bytes .../themes/ueditor-list/list-num-3-78.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-79.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-8.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-3-80.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-81.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-82.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-83.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-84.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-85.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-86.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-87.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-88.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-89.gif | Bin 0 -> 103 bytes .../themes/ueditor-list/list-num-3-9.gif | Bin 0 -> 89 bytes .../themes/ueditor-list/list-num-3-90.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-91.gif | Bin 0 -> 98 bytes .../themes/ueditor-list/list-num-3-92.gif | Bin 0 -> 100 bytes .../themes/ueditor-list/list-num-3-93.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-94.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-95.gif | Bin 0 -> 102 bytes .../themes/ueditor-list/list-num-3-96.gif | Bin 0 -> 101 bytes .../themes/ueditor-list/list-num-3-97.gif | Bin 0 -> 99 bytes .../themes/ueditor-list/list-num-3-98.gif | Bin 0 -> 103 bytes .../third-party/SyntaxHighlighter/shCore.js | 3655 ++++ .../SyntaxHighlighter/shCoreDefault.css | 1 + .../third-party/browser-md5-file.min.js | 1 + .../third-party/codemirror/codemirror.css | 104 + .../third-party/codemirror/codemirror.js | 3581 ++++ .../highcharts/adapters/mootools-adapter.js | 13 + .../adapters/mootools-adapter.src.js | 313 + .../highcharts/adapters/prototype-adapter.js | 15 + .../adapters/prototype-adapter.src.js | 316 + .../adapters/standalone-framework.js | 17 + .../adapters/standalone-framework.src.js | 583 + .../third-party/highcharts/highcharts-more.js | 50 + .../highcharts/highcharts-more.src.js | 2430 +++ .../third-party/highcharts/highcharts.js | 283 + .../third-party/highcharts/highcharts.src.js | 16974 ++++++++++++++++ .../highcharts/modules/annotations.js | 7 + .../highcharts/modules/annotations.src.js | 401 + .../highcharts/modules/canvas-tools.js | 133 + .../highcharts/modules/canvas-tools.src.js | 3113 +++ .../third-party/highcharts/modules/data.js | 17 + .../highcharts/modules/data.src.js | 582 + .../highcharts/modules/drilldown.js | 11 + .../highcharts/modules/drilldown.src.js | 447 + .../highcharts/modules/exporting.js | 22 + .../highcharts/modules/exporting.src.js | 709 + .../third-party/highcharts/modules/funnel.js | 12 + .../highcharts/modules/funnel.src.js | 289 + .../third-party/highcharts/modules/heatmap.js | 1 + .../highcharts/modules/heatmap.src.js | 53 + .../third-party/highcharts/modules/map.js | 27 + .../third-party/highcharts/modules/map.src.js | 1002 + .../highcharts/modules/no-data-to-display.js | 12 + .../modules/no-data-to-display.src.js | 128 + .../highcharts/themes/dark-blue.js | 254 + .../highcharts/themes/dark-green.js | 255 + .../third-party/highcharts/themes/gray.js | 257 + .../third-party/highcharts/themes/grid.js | 103 + .../third-party/highcharts/themes/skies.js | 89 + .../2.1.17/third-party/jquery-1.10.2.js | 9789 +++++++++ .../2.1.17/third-party/jquery-1.10.2.min.js | 6 + .../2.1.17/third-party/jquery-1.10.2.min.map | 1 + .../snapscreen/UEditorSnapscreen.exe | Bin 0 -> 519936 bytes .../2.1.17/third-party/video-js/font/vjs.eot | Bin 0 -> 3536 bytes .../2.1.17/third-party/video-js/font/vjs.svg | 65 + .../2.1.17/third-party/video-js/font/vjs.ttf | Bin 0 -> 3372 bytes .../2.1.17/third-party/video-js/font/vjs.woff | Bin 0 -> 4228 bytes .../2.1.17/third-party/video-js/video-js.css | 766 + .../third-party/video-js/video-js.min.css | 5 + .../2.1.17/third-party/video-js/video-js.swf | Bin 0 -> 16236 bytes .../2.1.17/third-party/video-js/video.dev.js | 7108 +++++++ .../2.1.17/third-party/video-js/video.js | 129 + .../third-party/webuploader/Uploader.swf | Bin 0 -> 49382 bytes .../third-party/webuploader/webuploader.css | 28 + .../webuploader/webuploader.custom.js | 5670 ++++++ .../webuploader/webuploader.custom.min.js | 2 + .../webuploader/webuploader.flashonly.js | 4176 ++++ .../webuploader/webuploader.flashonly.min.js | 2 + .../webuploader/webuploader.html5only.js | 5559 +++++ .../webuploader/webuploader.html5only.min.js | 2 + .../third-party/webuploader/webuploader.js | 6735 ++++++ .../webuploader/webuploader.min.js | 2 + .../webuploader/webuploader.withoutimage.js | 4593 +++++ .../webuploader.withoutimage.min.js | 2 + .../zeroclipboard/ZeroClipboard.js | 1256 ++ .../zeroclipboard/ZeroClipboard.min.js | 9 + .../zeroclipboard/ZeroClipboard.swf | Bin 0 -> 3933 bytes .../static/plug-in/neditor/2.1.17/yarn.lock | 1792 ++ .../templates/components/vue/vue-list.html | 8 + .../resources/templates/vue/demo/basic.html | 29 + .../resources/templates/vue/demo/ueditor.html | 51 + 1153 files changed, 142178 insertions(+), 436 deletions(-) rename api/src/main/java/com/simon/controller/{VeriCodeController.java => SmsController.java} (51%) delete mode 100644 common/src/main/java/com/simon/mapper/VeriCodeMapper.java delete mode 100644 common/src/main/java/com/simon/model/VeriCode.java delete mode 100644 common/src/main/java/com/simon/repository/VeriCodeRepository.java delete mode 100644 common/src/main/java/com/simon/service/VeriCodeService.java delete mode 100644 common/src/main/java/com/simon/service/impl/VeriCodeServiceImpl.java delete mode 100644 common/src/main/resources/mapping/VeriCodeMapper.xml create mode 100644 tutorial/screenshots/role_authority.png rename web/src/main/java/com/simon/controller/{VeriCodeController.java => SmsController.java} (49%) create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/.editorconfig create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/.github/ISSUE_TEMPLATE.md create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/.gitignore create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/.travis.yml create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/CHANGELOG.md create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/Gruntfile.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/LICENSE create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/README.md create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeButton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeCombox.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeDialog.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/charts.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/htmlparser.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/anchor/anchor.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_chm.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_default.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_doc.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_exe.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_jpg.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mp3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mv.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_pdf.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_ppt.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_psd.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_rar.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_txt.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_xls.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/alignicon.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/alignicon.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/file-icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/file-icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/image.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/progress.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/success.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/success.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/images/bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/images/success.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/chart.config.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts0.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts1.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts2.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts3.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts4.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts5.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/0.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/bface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/cface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/fface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/jxface2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/neweditor-tab-bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/tface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/wface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/yface.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/buttoniconex.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.eot create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.ttf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.woff create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/images/addfile.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/images/selected.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/gmap/gmap.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/alignicon.jpg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/image.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/progress.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/success.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/success.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/insertframe/insertframe.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/internal.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/link/link.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/map.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/show.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/balls.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/preview/preview.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/addimg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/brush.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/delimg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/delimgH.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/empty.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/emptyH.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/eraser.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/redo.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/redoH.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/scale.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/scaleH.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/size.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/undo.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/undoH.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/snapscreen/snapscreen.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/dragicon.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittd.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittip.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/config.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/bg.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre0.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre1.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre2.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre3.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre4.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/center_focus.jpg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/file-icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/file-icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/image.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/left_focus.jpg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/none_focus.jpg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/progress.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/right_focus.jpg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/success.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/success.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/webapp/webapp.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/fClipboard_ueditor.swf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/imageUploader.swf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/tangram.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.html create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/en.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/addimage.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/alldeletebtnhoverskin.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/alldeletebtnupskin.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/background.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/button.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/copy.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deletedisable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deleteenable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/listbackground.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/localimage.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/music.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftdisable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftenable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotaterightdisable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotaterightenable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/upload.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/copy.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/localimage.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/music.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/upload.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/ja-jp.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/copy.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/localimage.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/music.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/upload.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/zh-cn.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.service.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/package.json create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/autotypesetpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/button.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/buttonicon.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/cellalignpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorbutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/combox.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/contextmenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/dialog.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/editor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/anchor.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_down.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_up.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/button-bg.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cancelbutton.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/charts.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/dialog-title-bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/filescan.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/highlighted.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons-all.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/img-cracked.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loaderror.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loading.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/lock.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/neweditor-tab-bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/pagebreak.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/scale.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sortable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/spacer.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sparator_v.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/table-cell-align.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/tangram-colorpicker.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/toolbar_bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/unhighlighted.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/upload.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/videologo.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/word.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/wordpaste.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/iframe.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/dialogbase.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.eot create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.ttf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.woff create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/anchor.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_down.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_up.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/button-bg.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cancelbutton.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/charts.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_h.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_h.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_v.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_v.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/dialog-title-bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/filescan.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/highlighted.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons-all.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loaderror.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loading.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/lock.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/neweditor-tab-bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/pagebreak.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/scale.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sortable.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/spacer.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sparator_v.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/table-cell-align.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/tangram-colorpicker.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/toolbar_bg.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/unhighlighted.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/upload.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/videologo.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/word.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/wordpaste.png create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dash.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dot.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-1.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-10.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-11.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-12.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-13.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-14.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-15.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-16.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-17.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-18.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-19.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-2.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-20.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-21.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-22.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-23.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-24.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-25.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-26.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-27.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-28.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-29.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-3.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-30.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-31.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-32.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-33.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-34.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-35.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-36.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-37.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-38.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-39.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-4.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-40.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-41.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-42.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-43.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-44.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-45.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-46.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-47.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-48.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-49.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-5.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-50.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-51.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-52.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-53.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-54.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-55.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-56.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-57.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-58.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-59.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-6.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-60.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-61.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-62.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-63.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-64.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-65.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-66.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-67.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-68.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-69.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-7.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-70.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-71.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-72.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-73.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-74.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-75.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-76.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-77.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-78.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-79.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-8.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-80.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-81.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-82.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-83.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-84.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-85.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-86.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-87.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-88.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-89.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-9.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-90.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-91.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-92.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-93.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-94.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-95.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-96.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-97.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-98.gif create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/SyntaxHighlighter/shCore.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/SyntaxHighlighter/shCoreDefault.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/browser-md5-file.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/codemirror/codemirror.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/codemirror/codemirror.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/mootools-adapter.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/mootools-adapter.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/prototype-adapter.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/prototype-adapter.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/standalone-framework.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/adapters/standalone-framework.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/highcharts-more.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/highcharts-more.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/highcharts.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/highcharts.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/annotations.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/annotations.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/canvas-tools.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/canvas-tools.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/data.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/data.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/drilldown.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/drilldown.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/exporting.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/exporting.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/funnel.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/funnel.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/heatmap.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/heatmap.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/map.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/map.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/no-data-to-display.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/modules/no-data-to-display.src.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/themes/dark-blue.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/themes/dark-green.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/themes/gray.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/themes/grid.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/highcharts/themes/skies.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/jquery-1.10.2.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/jquery-1.10.2.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/jquery-1.10.2.min.map create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/snapscreen/UEditorSnapscreen.exe create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/font/vjs.eot create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/font/vjs.svg create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/font/vjs.ttf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/font/vjs.woff create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/video-js.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/video-js.min.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/video-js.swf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/video.dev.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/video-js/video.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/Uploader.swf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.css create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.custom.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.custom.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.flashonly.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.flashonly.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.html5only.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.html5only.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.withoutimage.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/webuploader/webuploader.withoutimage.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/zeroclipboard/ZeroClipboard.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/zeroclipboard/ZeroClipboard.min.js create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/third-party/zeroclipboard/ZeroClipboard.swf create mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.17/yarn.lock create mode 100644 web/src/main/resources/templates/vue/demo/basic.html create mode 100644 web/src/main/resources/templates/vue/demo/ueditor.html diff --git "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-mysql-20190512.sql" "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-mysql-20190512.sql" index 54d3659..158a7c0 100644 --- "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-mysql-20190512.sql" +++ "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-mysql-20190512.sql" @@ -8,4 +8,7 @@ ALTER TABLE t_reset_pwd_info MODIFY COLUMN expires_in datetime; ALTER TABLE t_bill MODIFY COLUMN bill_context VARCHAR (255) COMMENT '订单内容'; -- 2019-05-21 by simon 修改数据 -update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; \ No newline at end of file +update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; + +-- 2019-05-23 by simon 删除t_veri_code表 +drop table t_veri_code; \ No newline at end of file diff --git "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-oracle-20190509.sql" "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-oracle-20190509.sql" index ed0c3ca..b2dca39 100644 --- "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-oracle-20190509.sql" +++ "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-oracle-20190509.sql" @@ -54,4 +54,7 @@ ALTER TABLE T_VERI_CODE ADD PRIMARY KEY (ID); CREATE UNIQUE INDEX ix_auth_username ON T_AUTHORITIES (user_id ASC, authority ASC); -- 2019-05-21 by simon 修改数据 -update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; \ No newline at end of file +update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; + +-- 2019-05-23 by simon 删除t_veri_code表 +drop table t_veri_code; \ No newline at end of file diff --git "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-postgresql-20190521.sql" "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-postgresql-20190521.sql" index 5261745..f6b81d9 100644 --- "a/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-postgresql-20190521.sql" +++ "b/SQL\345\242\236\351\207\217\346\233\264\346\226\260/schema-postgresql-20190521.sql" @@ -1,2 +1,5 @@ -- 2019-05-21 by simon 修改数据 -update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; \ No newline at end of file +update t_side_menu set url='/api/loggingEvents/list' where id=93126997827387392; + +-- 2019-05-23 by simon 删除t_veri_code表 +drop table t_veri_code; \ No newline at end of file diff --git a/api/pom.xml b/api/pom.xml index 6e63b6c..9408b3b 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -84,6 +84,12 @@ org.springframework.boot spring-boot-starter-test test + + + com.vaadin.external.google + android-json + + + + + com.github.qcloudsms + qcloudsms + + + org.quartz-scheduler quartz diff --git a/common/src/main/java/com/simon/common/config/AppConfig.java b/common/src/main/java/com/simon/common/config/AppConfig.java index a218c30..4c7d651 100644 --- a/common/src/main/java/com/simon/common/config/AppConfig.java +++ b/common/src/main/java/com/simon/common/config/AppConfig.java @@ -50,14 +50,12 @@ public class AppConfig { public static String FILE_UPLOAD_TYPE_LOCAL = "local"; public static String FILE_UPLOAD_TYPE_QINIU = "qiniu"; - public static String SMS_TEMPLATE = "【thymelte】您的验证码是:%s,在5分钟内有效。如非本人操作请忽略本短信。"; - public static final String ROLE_USER = "ROLE_USER"; public static final String ROLE_ADMIN = "ROLE_ADMIN"; public static final String ROLE_SU = "ROLE_SU"; /** - * 可选值yzxSmsServiceImpl,aliSmsServiceImpl + * 可选值{"云之讯": "yzxSmsServiceImpl","阿里大鱼": "aliSmsServiceImpl", "腾讯云": "txSmsServiceImpl"} */ public static final String SMS_SERVICE_IMPL = "yzxSmsServiceImpl"; diff --git a/common/src/main/java/com/simon/mapper/VeriCodeMapper.java b/common/src/main/java/com/simon/mapper/VeriCodeMapper.java deleted file mode 100644 index bad1ec8..0000000 --- a/common/src/main/java/com/simon/mapper/VeriCodeMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.simon.mapper; - -import com.simon.common.mapper.MyMapper; -import com.simon.model.VeriCode; -import org.apache.ibatis.annotations.Param; - -import java.util.List; -import java.util.Map; - -public interface VeriCodeMapper extends MyMapper { - List getList(@Param("map") Map map); -} \ No newline at end of file diff --git a/common/src/main/java/com/simon/model/VeriCode.java b/common/src/main/java/com/simon/model/VeriCode.java deleted file mode 100644 index dd74bd0..0000000 --- a/common/src/main/java/com/simon/model/VeriCode.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.simon.model; - -import com.alibaba.fastjson.annotation.JSONField; -import com.alibaba.fastjson.serializer.ToStringSerializer; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.simon.common.config.AppConfig; -import com.simon.common.utils.SnowflakeGenId; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.hibernate.annotations.GenericGenerator; -import tk.mybatis.mapper.annotation.KeySql; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** -* @author SimonSun -* @create 2018-09-12 -**/ -@ApiModel(value = "t_veri_code") -@Data -@EqualsAndHashCode(callSuper = false) -@Entity -@Table(name="t_veri_code") -public class VeriCode implements Serializable{ - private static final long serialVersionUID = 1L; - - @JSONField(serializeUsing = ToStringSerializer.class) - @Id - @KeySql(genId = SnowflakeGenId.class) - @GeneratedValue(generator = "sequenceId") - @GenericGenerator(name = "sequenceId", strategy = "com.simon.common.utils.snowflake.SequenceId") - private Long id; - - @JSONField(serializeUsing = ToStringSerializer.class) - @ApiModelProperty(value = "创建人id") - @Column(name = "create_by") - private Long createBy; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE) - @ApiModelProperty(value = "创建时间") - @Column(name = "create_date") - private LocalDateTime createDate; - - @JSONField(serializeUsing = ToStringSerializer.class) - @ApiModelProperty(value = "更新人id") - @Column(name = "update_by") - private Long updateBy; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE) - @ApiModelProperty(value = "更新时间") - @Column(name = "update_date") - private LocalDateTime updateDate; - - @ApiModelProperty(value = "code") - @Column(name = "code") - private Integer code; - - @JSONField(serializeUsing = ToStringSerializer.class) - @ApiModelProperty(value = "create_time") - @Column(name = "create_time") - private Long createTime; - - @ApiModelProperty(value = "expires") - @Column(name = "expires") - private Integer expires; - - @ApiModelProperty(value = "phone") - @Column(name = "phone") - private String phone; -} \ No newline at end of file diff --git a/common/src/main/java/com/simon/repository/VeriCodeRepository.java b/common/src/main/java/com/simon/repository/VeriCodeRepository.java deleted file mode 100644 index 16dfbd9..0000000 --- a/common/src/main/java/com/simon/repository/VeriCodeRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.simon.repository; - -import com.simon.model.VeriCode; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * 验证码 - * - * @author simon - * @create 2018-07-25 22:40 - **/ -@Repository -public interface VeriCodeRepository extends JpaRepository { - VeriCode findByPhone(String phone); - VeriCode findByPhoneAndCode(String phone, Integer code); -} diff --git a/common/src/main/java/com/simon/service/OauthUserService.java b/common/src/main/java/com/simon/service/OauthUserService.java index 6ddc0b4..d41019c 100644 --- a/common/src/main/java/com/simon/service/OauthUserService.java +++ b/common/src/main/java/com/simon/service/OauthUserService.java @@ -16,11 +16,9 @@ import java.util.List; **/ public interface OauthUserService extends BasicService { - void register(Integer code, String phone, String password); + void register(String code, String phone, String password); - void register(String phone, String password); - - int updatePwdByCode(String phone, Integer code, String newPwd); + int updatePwdByCode(String phone, String code, String newPwd); int updatePwdByOldPwd(String username, String oldPwd, String newPwd); diff --git a/common/src/main/java/com/simon/service/SmsService.java b/common/src/main/java/com/simon/service/SmsService.java index c073938..c853761 100644 --- a/common/src/main/java/com/simon/service/SmsService.java +++ b/common/src/main/java/com/simon/service/SmsService.java @@ -10,10 +10,11 @@ package com.simon.service; public interface SmsService { /** * 发送短信验证码,并把验证码写入缓存 + * @param nationCode 国家码 默认值:+86 * @param mobile 手机号 * @return 发送结果 */ - boolean sendIdentifyCode(String mobile); + boolean sendIdentifyCode(String nationCode, String mobile); /** * 校验短信验证码 diff --git a/common/src/main/java/com/simon/service/VeriCodeService.java b/common/src/main/java/com/simon/service/VeriCodeService.java deleted file mode 100644 index 71f35f7..0000000 --- a/common/src/main/java/com/simon/service/VeriCodeService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simon.service; - -import com.simon.common.service.BasicService; -import com.simon.model.VeriCode; - -/** - * 验证码 - * - * @author simon - * @create 2018-07-31 15:24 - **/ - -public interface VeriCodeService extends BasicService { - VeriCode findByPhone(String phone); - VeriCode findByPhoneAndCode(String phone, Integer code); -} diff --git a/common/src/main/java/com/simon/service/impl/AliSmsServiceImpl.java b/common/src/main/java/com/simon/service/impl/AliSmsServiceImpl.java index fccb102..8b0d358 100644 --- a/common/src/main/java/com/simon/service/impl/AliSmsServiceImpl.java +++ b/common/src/main/java/com/simon/service/impl/AliSmsServiceImpl.java @@ -9,11 +9,11 @@ import com.taobao.api.domain.BizResult; import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest; import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse; import lombok.extern.slf4j.Slf4j; -import lombok.var; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.Cache; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,11 +52,11 @@ public class AliSmsServiceImpl implements SmsService { private org.springframework.cache.CacheManager cacheManager; @Override - public boolean sendIdentifyCode(String mobile) { - var code = RandomUtils.nextInt(100000, 999999); - var client = new DefaultTaobaoClient( + public boolean sendIdentifyCode(String nationCode, String mobile) { + int code = RandomUtils.nextInt(100000, 999999); + DefaultTaobaoClient client = new DefaultTaobaoClient( DAYU_URL_REAL, DAYU_APP_KEY, DAYU_APP_SECRET); - var req = new AlibabaAliqinFcSmsNumSendRequest(); + AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest(); req.setExtend(""); req.setSmsType(DAYU_SMS_TYPE); req.setSmsFreeSignName(DAYU_SMS_FREE_SIGN_NAME); @@ -68,7 +68,7 @@ public class AliSmsServiceImpl implements SmsService { BizResult bizResult = rsp.getResult(); if (null != bizResult && bizResult.getSuccess()){ //写入缓存 - var cache = cacheManager.getCache("smsCache"); + Cache cache = cacheManager.getCache("smsCache"); cache.put(mobile, code); return true; @@ -85,18 +85,16 @@ public class AliSmsServiceImpl implements SmsService { @Override public boolean checkCode(String mobile, String code) { - log.info("checkCode"); - var cache = cacheManager.getCache("smsCache"); - var ele = cache.get(mobile); + Cache cache = cacheManager.getCache("smsCache"); + Cache.ValueWrapper ele = cache.get(mobile); if (null == ele) { throw new BusinessException(ResultCode.ERROR_VERI_CODE); } String output = ele.get().toString(); - log.info("从缓存中读到" + mobile + "," + output); - var result = false; + boolean result = false; if (StringUtils.isEmpty(output)) { throw new BusinessException(ResultCode.ERROR_VERI_CODE); diff --git a/common/src/main/java/com/simon/service/impl/OauthUserServiceImpl.java b/common/src/main/java/com/simon/service/impl/OauthUserServiceImpl.java index 990747a..8ed2c68 100644 --- a/common/src/main/java/com/simon/service/impl/OauthUserServiceImpl.java +++ b/common/src/main/java/com/simon/service/impl/OauthUserServiceImpl.java @@ -19,12 +19,13 @@ import com.simon.model.Authority; import com.simon.model.OauthUser; import com.simon.repository.AuthorityRepository; import com.simon.repository.OauthUserRepository; -import com.simon.repository.VeriCodeRepository; import com.simon.service.OauthUserService; +import com.simon.service.SmsService; import lombok.extern.slf4j.Slf4j; import lombok.var; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.data.domain.Page; @@ -54,9 +55,6 @@ public class OauthUserServiceImpl implements OauthUserService { @Autowired private OauthUserRepository oauthUserRepository; - @Autowired - private VeriCodeRepository veriCodeRepository; - @Autowired private AuthorityRepository authorityRepository; @@ -69,31 +67,30 @@ public class OauthUserServiceImpl implements OauthUserService { @Autowired private PasswordEncoder passwordEncoder; + @Autowired + @Qualifier(value = AppConfig.SMS_SERVICE_IMPL) + private SmsService smsService; + @Override - public void register(Integer code, String phone, String password) { - //加密密码 - var encoder = new BCryptPasswordEncoder(11); - password = encoder.encode(password); - if(null != code){ - var veriCode = veriCodeRepository.findByPhoneAndCode(phone, code); - if(null != veriCode){ + public void register(String code, String phone, String password) { + password = passwordEncoder.encode(password); + if (null != code) { + if (smsService.checkCode(phone, code)) { register(phone, password); - }else{ + } else { throw new CodeInvalidException(); } register(phone, password); } } - @Transactional - @Override - public void register(String phone, String password){ - if(null != oauthUserRepository.findByPhone(phone)){ + public void register(String phone, String password) { + if (null != oauthUserRepository.findByPhone(phone)) { throw new PhoneRegisteredException(); } var oauthUser = new OauthUser(); - oauthUser.setUsername("user" + phone.substring(phone.length()-4, phone.length())); + oauthUser.setUsername("user" + phone.substring(phone.length() - 4, phone.length())); oauthUser.setPhone(phone); oauthUser.setPassword(password); oauthUser.setEnabled(true); @@ -106,14 +103,11 @@ public class OauthUserServiceImpl implements OauthUserService { } @Override - public int updatePwdByCode(String phone, Integer code, String newPwd) { - //加密密码 - var encoder = new BCryptPasswordEncoder(11); - newPwd = encoder.encode(newPwd); - var veriCode = veriCodeRepository.findByPhoneAndCode(phone, code); - if(null != veriCode){ + public int updatePwdByCode(String phone, String code, String newPwd) { + newPwd = passwordEncoder.encode(newPwd); + if (smsService.checkCode(phone, code)) { return oauthUserMapper.updatePwdByPhone(phone, newPwd); - }else{ + } else { throw new CodeInvalidException(); } } @@ -121,16 +115,16 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public int updatePwdByOldPwd(String phone, String oldPwd, String newPwd) { var oauthUser = oauthUserRepository.findByPhone(phone); - if(null == oauthUser){ + if (null == oauthUser) { throw new UserNotValidException(); } var encoder = new BCryptPasswordEncoder(11); - if(encoder.matches(oldPwd, oauthUser.getPassword())){ + if (encoder.matches(oldPwd, oauthUser.getPassword())) { oauthUser.setPassword(encoder.encode(newPwd)); oauthUserRepository.save(oauthUser); return 1; - }else{ + } else { throw new UserNotValidException(); } } @@ -145,15 +139,15 @@ public class OauthUserServiceImpl implements OauthUserService { oauthUser.setPassword(passwordEncoder.encode(oauthUser.getPassword())); oauthUserMapper.insertSelective(oauthUser); - if(StringUtils.isEmpty(oauthUser.getAuthorities())){ + if (StringUtils.isEmpty(oauthUser.getAuthorities())) { Authority authority = new Authority(); authority.setUserId(oauthUser.getId()); authority.setAuthority(AppConfig.ROLE_USER); authorityMapper.insertSelective(authority); - }else{ + } else { String[] authorities = oauthUser.getAuthorities().split(","); List authorityList = new ArrayList<>(); - for(int i = 0; i < authorities.length; i++){ + for (int i = 0; i < authorities.length; i++) { Authority authority = new Authority(); authority.setUserId(oauthUser.getId()); authority.setAuthority(authorities[i]); @@ -172,13 +166,13 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public PageInfo findAll(Integer pageNo, Integer pageSize, String orderBy) { - if (null == pageSize){ + if (null == pageSize) { pageSize = AppConfig.DEFAULT_PAGE_SIZE; } orderBy = orderBy.trim(); - if (StringUtils.isEmpty(orderBy)){ + if (StringUtils.isEmpty(orderBy)) { PageHelper.startPage(pageNo, pageSize); - }else{ + } else { PageHelper.startPage(pageNo, pageSize, orderBy); } List list = oauthUserMapper.selectAll(); @@ -200,9 +194,9 @@ public class OauthUserServiceImpl implements OauthUserService { public void delete(Long id) { OauthUser oauthUser = oauthUserRepository.getOne(id); oauthUserRepository.delete(id); - if(null != cacheManager){ + if (null != cacheManager) { Cache cache = cacheManager.getCache("oauthUserCache"); - if(null != cache){ + if (null != cache) { cache.evict(oauthUser.getUsername()); cache.evict(oauthUser.getEmail()); cache.evict(oauthUser.getPhone()); @@ -235,15 +229,15 @@ public class OauthUserServiceImpl implements OauthUserService { oauthUser.setPassword(passwordEncoder.encode(oauthUser.getPassword())); int result = oauthUserMapper.insertSelective(oauthUser); - if(StringUtils.isEmpty(oauthUser.getAuthorities())){ + if (StringUtils.isEmpty(oauthUser.getAuthorities())) { Authority authority = new Authority(); authority.setUserId(oauthUser.getId()); authority.setAuthority(AppConfig.ROLE_USER); authorityMapper.insertSelective(authority); - }else{ + } else { String[] authorities = oauthUser.getAuthorities().split(","); List authorityList = new ArrayList<>(); - for(int i = 0; i < authorities.length; i++){ + for (int i = 0; i < authorities.length; i++) { Authority authority = new Authority(); authority.setUserId(oauthUser.getId()); authority.setAuthority(authorities[i]); @@ -259,9 +253,9 @@ public class OauthUserServiceImpl implements OauthUserService { public int updateByPrimaryKey(OauthUser model) { model.setPassword(passwordEncoder.encode(model.getPassword())); int affectLineNum = oauthUserMapper.updateByPrimaryKey(model); - if(null != cacheManager){ + if (null != cacheManager) { Cache cache = cacheManager.getCache("oauthUserCache"); - if(null != cache){ + if (null != cache) { OauthUser target = oauthUserRepository.findById(model.getId()); BeanUtils.copyPropertiesIgnoreNull(model, target); @@ -281,9 +275,9 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public int updateByPrimaryKeySelective(OauthUser model) { int affectLineNum = oauthUserMapper.updateByPrimaryKeySelective(model); - if(null != cacheManager){ + if (null != cacheManager) { Cache cache = cacheManager.getCache("oauthUserCache"); - if(null != cache){ + if (null != cache) { OauthUser target = oauthUserRepository.findById(model.getId()); BeanUtils.copyPropertiesIgnoreNull(model, target); @@ -300,13 +294,13 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public PageInfo getList(Map params, Integer pageNo, Integer pageSize, String orderBy) { - if (null == pageSize){ + if (null == pageSize) { pageSize = AppConfig.DEFAULT_PAGE_SIZE; } orderBy = orderBy.trim(); - if (StringUtils.isEmpty(orderBy)){ + if (StringUtils.isEmpty(orderBy)) { PageHelper.startPage(pageNo, pageSize); - }else{ + } else { PageHelper.startPage(pageNo, pageSize, orderBy); } List list = oauthUserMapper.getList(params); @@ -346,7 +340,7 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public OauthUser registerByPhone(String areaCode, String phone) { OauthUser oauthUser = oauthUserRepository.findByPhone(phone); - if (null == oauthUser){ + if (null == oauthUser) { oauthUser = new OauthUser(); oauthUser.setAreaCode(areaCode); oauthUser.setPhone(phone); @@ -354,19 +348,19 @@ public class OauthUserServiceImpl implements OauthUserService { oauthUser.setUsername(UsernameUtil.generateByPhone(phone)); oauthUser = oauthUserRepository.save(oauthUser); return oauthUser; - }else{ + } else { throw new UserExistsException("用户已存在,请登录"); } } @Override public OauthUser registerByAccountAndPwd(String account, String password) { - if(ValidUtil.isMobile(account)){ + if (ValidUtil.isMobile(account)) { //account是手机号 - }else if(ValidUtil.isEmail(account)){ + } else if (ValidUtil.isEmail(account)) { //account是邮箱 - }else{ + } else { } return null; @@ -375,7 +369,7 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public OauthUser registerByPhoneAndPwd(String phone, String password) { OauthUser oauthUser = oauthUserRepository.findByPhone(phone); - if (null == oauthUser){ + if (null == oauthUser) { oauthUser = new OauthUser(); oauthUser.setUsername(UsernameUtil.generateByPhone(phone)); oauthUser.setPassword(passwordEncoder.encode(password)); @@ -383,7 +377,7 @@ public class OauthUserServiceImpl implements OauthUserService { oauthUser.setPhone(phone); oauthUser = oauthUserRepository.save(oauthUser); return oauthUser; - }else{ + } else { throw new UserExistsException("用户已存在,请登录"); } } @@ -391,7 +385,7 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public OauthUser registerByEmailAndPwd(String email, String password) { OauthUser oauthUser = oauthUserRepository.findByEmail(email); - if (null == oauthUser){ + if (null == oauthUser) { oauthUser = new OauthUser(); oauthUser.setUsername(UsernameUtil.generateByEmail(email)); oauthUser.setPassword(passwordEncoder.encode(password)); @@ -399,7 +393,7 @@ public class OauthUserServiceImpl implements OauthUserService { oauthUser.setEmail(email); oauthUser = oauthUserRepository.save(oauthUser); return oauthUser; - }else{ + } else { throw new UserExistsException("用户已存在,请登录"); } } @@ -407,14 +401,14 @@ public class OauthUserServiceImpl implements OauthUserService { @Override public OauthUser registerByUsernameAndPwd(String username, String password) { OauthUser oauthUser = oauthUserRepository.findByUsername(username); - if (null == oauthUser){ + if (null == oauthUser) { oauthUser = new OauthUser(); oauthUser.setUsername(username); oauthUser.setPassword(passwordEncoder.encode(password)); oauthUser.setEnabled(true); oauthUser = oauthUserRepository.save(oauthUser); return oauthUser; - }else{ + } else { throw new UserExistsException("用户已存在,请登录"); } } diff --git a/common/src/main/java/com/simon/service/impl/TxSmsServiceImpl.java b/common/src/main/java/com/simon/service/impl/TxSmsServiceImpl.java index ca8f6ec..f5a7054 100644 --- a/common/src/main/java/com/simon/service/impl/TxSmsServiceImpl.java +++ b/common/src/main/java/com/simon/service/impl/TxSmsServiceImpl.java @@ -1,11 +1,22 @@ package com.simon.service.impl; +import com.github.qcloudsms.SmsSingleSender; +import com.github.qcloudsms.SmsSingleSenderResult; +import com.github.qcloudsms.httpclient.HTTPException; +import com.simon.common.domain.ResultCode; +import com.simon.common.exception.BusinessException; import com.simon.service.SmsService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.Cache; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; + /** * 腾讯云短信服务 * @@ -16,16 +27,81 @@ import org.springframework.transaction.annotation.Transactional; @Service(value = "txSmsServiceImpl") @Transactional(rollbackFor = {Exception.class}) public class TxSmsServiceImpl implements SmsService { + /** + * 短信应用 SDK AppID + */ + @Value("${com.github.qcloudsms.appid}") + private Integer appId; + + /** + * 短信应用 SDK AppKey + */ + @Value("${com.github.qcloudsms.app-key}") + private String appKey; + + /** + * 短信模板 ID,需要在短信应用中申请 + */ + @Value("${com.github.qcloudsms.template-id}") + private Integer templateId; + + /** + * 签名。签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台申请 + */ + @Value("${com.github.qcloudsms.sign}") + private String sign; + @Autowired private org.springframework.cache.CacheManager cacheManager; @Override - public boolean sendIdentifyCode(String mobile) { + public boolean sendIdentifyCode(String nationCode, String mobile) { + if (nationCode.startsWith("+")) { + nationCode = nationCode.substring(1); + } + SmsSingleSender sender = new SmsSingleSender(appId, appKey); + int code = RandomUtils.nextInt(100000, 999999); + try { + SmsSingleSenderResult result = sender.sendWithParam(nationCode, mobile, templateId, new String[]{String.valueOf(code)}, sign, "", ""); + if (0 == result.result) { + //短信发送成功,写入缓存 + //写入缓存 + Cache cache = cacheManager.getCache("smsCache"); + cache.put(mobile, code); + } + } catch (HTTPException | IOException e) { + e.printStackTrace(); + } return false; } @Override public boolean checkCode(String mobile, String code) { - return false; + Cache cache = cacheManager.getCache("smsCache"); + Cache.ValueWrapper ele = cache.get(mobile); + + if (null == ele) { + throw new BusinessException(ResultCode.ERROR_VERI_CODE); + } + + String output = ele.get().toString(); + + boolean result = false; + + if (StringUtils.isEmpty(output)) { + throw new BusinessException(ResultCode.ERROR_VERI_CODE); + } + + if (StringUtils.isNotEmpty(code) && StringUtils.isNotEmpty(output)) { + if (code.equals(output)) { + result = true; + //cache.evict(mobile);//删除 + } + } + + //删除缓存 + cache.evict(mobile); + + return result; } } diff --git a/common/src/main/java/com/simon/service/impl/VeriCodeServiceImpl.java b/common/src/main/java/com/simon/service/impl/VeriCodeServiceImpl.java deleted file mode 100644 index 16a87d3..0000000 --- a/common/src/main/java/com/simon/service/impl/VeriCodeServiceImpl.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.simon.service.impl; - -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; -import com.simon.common.config.AppConfig; -import com.simon.mapper.VeriCodeMapper; -import com.simon.model.VeriCode; -import com.simon.repository.VeriCodeRepository; -import com.simon.service.VeriCodeService; -import lombok.extern.slf4j.Slf4j; -import lombok.var; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; - -/** - * 验证码 - * - * @author simon - * @create 2018-07-31 15:24 - **/ - -@Slf4j -@Service -public class VeriCodeServiceImpl implements VeriCodeService { - @Autowired - private VeriCodeMapper veriCodeMapper; - - @Autowired - private VeriCodeRepository veriCodeRepository; - - @Override - public long count() { - return veriCodeRepository.count(); - } - - @Override - public VeriCode save(VeriCode veriCode){ - return veriCodeRepository.save(veriCode); - } - - @Override - public List save(List veriCodeList) { - return veriCodeRepository.save(veriCodeList); - } - - @Override - public PageInfo findAll(Integer pageNo, Integer pageSize, String orderBy) { - if (null == pageSize){ - pageSize = AppConfig.DEFAULT_PAGE_SIZE; - } - orderBy = orderBy.trim(); - if (StringUtils.isEmpty(orderBy)){ - PageHelper.startPage(pageNo, pageSize); - }else{ - PageHelper.startPage(pageNo, pageSize, orderBy); - } - List list = veriCodeMapper.selectAll(); - return new PageInfo<>(list); - } - - @Override - public Page findAll(Pageable pageable){ - return veriCodeRepository.findAll(pageable); - } - - @Override - public List findAll(){ - return veriCodeRepository.findAll(); - } - - @Override - public void delete(Long id){ - veriCodeRepository.delete(id); - } - - @Override - public int deleteByIds(String ids){ - return veriCodeMapper.deleteByIds(ids); - } - - @Override - public VeriCode findById(Long id){ - return veriCodeRepository.findOne(id); - } - - @Override - public int insertList(List list){ - return veriCodeMapper.insertList(list); - } - - @Override - public int insert(VeriCode veriCode){ - return veriCodeMapper.insert(veriCode); - } - - @Override - public int insertSelective(VeriCode veriCode){ - return veriCodeMapper.insertSelective(veriCode); - } - - @Override - public int updateByPrimaryKey(VeriCode veriCode) { - return veriCodeMapper.updateByPrimaryKey(veriCode); - } - - @Override - public int updateByPrimaryKeySelective(VeriCode veriCode) { - return veriCodeMapper.updateByPrimaryKeySelective(veriCode); - } - - @Override - public PageInfo getList(Map params, Integer pageNo, Integer pageSize, String orderBy) { - if (null == pageSize){ - pageSize = AppConfig.DEFAULT_PAGE_SIZE; - } - orderBy = orderBy.trim(); - if (StringUtils.isEmpty(orderBy)){ - PageHelper.startPage(pageNo, pageSize); - }else{ - PageHelper.startPage(pageNo, pageSize, orderBy); - } - var list = veriCodeMapper.getList(params); - return new PageInfo<>(list); - } - - @Override - public VeriCode findByPhone(String phone) { - return veriCodeRepository.findByPhone(phone); - } - - @Override - public VeriCode findByPhoneAndCode(String phone, Integer code) { - return veriCodeRepository.findByPhoneAndCode(phone, code); - } -} diff --git a/common/src/main/java/com/simon/service/impl/YzxSmsServiceImpl.java b/common/src/main/java/com/simon/service/impl/YzxSmsServiceImpl.java index 08b0485..4251ac9 100644 --- a/common/src/main/java/com/simon/service/impl/YzxSmsServiceImpl.java +++ b/common/src/main/java/com/simon/service/impl/YzxSmsServiceImpl.java @@ -2,17 +2,16 @@ package com.simon.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.simon.common.config.AppConfig; import com.simon.common.domain.ResultCode; import com.simon.common.exception.BusinessException; import com.simon.common.utils.SmsUtil; import com.simon.service.SmsService; import lombok.extern.slf4j.Slf4j; -import lombok.var; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.Cache; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,13 +35,14 @@ public class YzxSmsServiceImpl implements SmsService { @Value("${sms.password}") private String password; - private String identityCodeMsgTemplate = AppConfig.SMS_TEMPLATE; + @Value("${sms.identity-code-msg-template}") + private String identityCodeMsgTemplate; @Autowired private org.springframework.cache.CacheManager cacheManager; @Override - public boolean sendIdentifyCode(String mobile) { + public boolean sendIdentifyCode(String nationCode, String mobile) { int code = RandomUtils.nextInt(100000, 999999); String content = String.format(identityCodeMsgTemplate, code); String result = SmsUtil.getInstance().sendSMS(clientid, password, mobile, content, "4"); @@ -57,10 +57,9 @@ public class YzxSmsServiceImpl implements SmsService { if (index != null) { responseCode = index.getString("code"); if ("0".equals(responseCode)) { - log.info("发送成功"); ret = true; //写入缓存 - var cache = cacheManager.getCache("smsCache"); + Cache cache = cacheManager.getCache("smsCache"); cache.put(mobile, code); } } @@ -72,18 +71,16 @@ public class YzxSmsServiceImpl implements SmsService { @Override public boolean checkCode(String mobile, String code) { - log.info("checkCode"); - var cache = cacheManager.getCache("smsCache"); - var ele = cache.get(mobile); + Cache cache = cacheManager.getCache("smsCache"); + Cache.ValueWrapper ele = cache.get(mobile); if (null == ele) { throw new BusinessException(ResultCode.ERROR_VERI_CODE); } String output = ele.get().toString(); - log.info("从缓存中读到" + mobile + "," + output); - var result = false; + boolean result = false; if (StringUtils.isEmpty(output)) { throw new BusinessException(ResultCode.ERROR_VERI_CODE); diff --git a/common/src/main/resources/application-common.properties b/common/src/main/resources/application-common.properties index 4b81c74..cd10ab0 100644 --- a/common/src/main/resources/application-common.properties +++ b/common/src/main/resources/application-common.properties @@ -21,7 +21,17 @@ com.alibaba.dayu.sms-template-code= # ֮Ѷŷ sms.clientid= sms.password= -sms.identity-code-msg-template=thymelte֤:%s +sms.identity-code-msg-template=thymelte֤:%s5ЧDZ˲Աš + +# Ѷƶŷ +# Ӧ SDK AppID +com.github.qcloudsms.appid= +# Ӧ SDK AppKey +com.github.qcloudsms.app-key= +# ģ IDҪڶӦ +com.github.qcloudsms.template-id= +# ǩǩʹõ`ǩ``ǩID`ǩ"Ѷ"ֻʾʵǩҪڶſ̨ +com.github.qcloudsms.sign=Ѷ # ļϴ· file.upload.dir=fileUpload diff --git a/common/src/main/resources/mapping/VeriCodeMapper.xml b/common/src/main/resources/mapping/VeriCodeMapper.xml deleted file mode 100644 index 0e8ffa4..0000000 --- a/common/src/main/resources/mapping/VeriCodeMapper.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - id, code, create_time, expires, phone - - \ No newline at end of file diff --git a/tutorial/screenshots/role_authority.png b/tutorial/screenshots/role_authority.png new file mode 100644 index 0000000000000000000000000000000000000000..c40df5a7cc0feaa07d048b32ef57d284fac2f901 GIT binary patch literal 21638 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 Y>CC`Koi_ getVeriCodeByPhone( + @ApiParam(value = "国家码", required = true, defaultValue = "+86", example = "+86") @RequestParam String nationCode, + @ApiParam(value = "手机号", required = true) @RequestParam String mobile) { + if (!ValidUtil.isMobile(mobile)) { + //400 Bad Request客户端请求的语法错误,服务器无法理解 + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ResultMsg.fail(ResultCode.ERROR_INVALID_PHONE)); } //测试手机号 - List whiteList = new ArrayList<>(); + /*List whiteList = new ArrayList<>(); whiteList.add("18800000000"); whiteList.add("18800000001"); whiteList.add("18800000002"); - if (whiteList.contains(phone)){ + if (whiteList.contains(mobile)) { //写入缓存 var cache = cacheManager.getCache("smsCache"); - cache.put(phone, "123456"); + cache.put(mobile, "123456"); return ResultMsg.success(); - } + }*/ - if (smsService.sendIdentifyCode(phone)){ - return ResultMsg.success(); - }else{ - return ResultMsg.fail(ResultCode.FAIL); + if (smsService.sendIdentifyCode(nationCode, mobile)) { + return ResponseEntity.ok(ResultMsg.success()); + } else { + //500 Internal Server Error服务器内部错误,无法完成请求 + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResultMsg.fail(ResultCode.FAIL)); } } } diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/.editorconfig b/web/src/main/resources/static/plug-in/neditor/2.1.17/.editorconfig new file mode 100644 index 0000000..fa31fcb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/.editorconfig @@ -0,0 +1,16 @@ +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{html,js,css,scss,xml}] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/.github/ISSUE_TEMPLATE.md b/web/src/main/resources/static/plug-in/neditor/2.1.17/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..38d48b1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,24 @@ +**声明:如果不看该说明,只在标题中描述问题,一律忽略** + +**首先**,感谢各位使用 Neditor,并来到这儿提 `ISSUE`。 + +**其次**,在回答大量用户提出的 `ISSUE` 的过程中,我们发现需要建立一个提 `ISSUE` 的规则, +将我们的主要精力投入到修复 `Neditor` Bugs 和改进 `Neditor` 中去,让越来越多的人能够使用的舒心。 + +## 规则 + +* 提 `ISSUE` 之前,**请先看看文档**。传送门:[文档](http://fex.baidu.com/ueditor/)。很多问题,在文档中都能有答案。特别是配置之类的。 +* 提 `ISSUE` 之前,**请先问问搜索引擎(百度、Google)**,因为你遇到的问题,可能其他人也遇到了,并且已经解决了。 +只需要动动手指,在输入框里输入,就会有答案,这样方便,远比等我们回复快捷。 +* 提 `ISSUE` 之前,如果你已经走过上面两步了,来到 `ISSUE` 这个页面了,此刻,请别急,**建议你再搜索一下`ISSUE`**。 +因为,或许你将提的问题,也有人遇到了,而且我们已经反馈了。这时,你只需要找到相应的 `ISSUE`,在那个 `ISSUE` 里留下你的关注就好了。很简单吧! + +以上都不满足你,看来这一定是个新的问题。首先,我们要感谢你,帮我们发现了一个新的问题,但是,为了使问题能尽快得到解决。我们建议你按照如下的规则来提: + +* 构想清楚问题的表达; +* 写一个简明扼要的标题 +* 写一个能描述清楚问题的内容,如果有复现步骤及截图当是极好的; + +**最后,是我们的一点希望:希望提 `ISSUE` 的同学,能自行排查、定位问题,甚至自行修复,然后给我们提 `Pull Request`。即使做不到提 `Pull Request`,但是你的排查的过程也是在增加你的 `debug` 的能力。** + +### 再次感谢各位选择 `Neditor`! diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/.gitignore b/web/src/main/resources/static/plug-in/neditor/2.1.17/.gitignore new file mode 100644 index 0000000..e832951 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/.gitignore @@ -0,0 +1,199 @@ +############### +# folder # +############### +.idea +log +jsp/upload +php/upload +net/upload +asp/upload +node/upload + + +############### +# fixed file # +############### +*.pptx +*.doc +*.docx +*.xml + + + + + + + + + + +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +eggs +parts +# bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store +/node_modules + + +# Config Files +/*.bak.* + +# Package Lock +package-lock.json \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/.travis.yml b/web/src/main/resources/static/plug-in/neditor/2.1.17/.travis.yml new file mode 100644 index 0000000..2480839 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/.travis.yml @@ -0,0 +1,35 @@ +sudo: false +branches: + only: + - master +language: nodejs +node_js: + - 10 +install: + - npm install +notifications: + - https://hook.bearychat.com/=bwA22/travis/52fa443470377f35e5a3d068b8d2d5ca + - https://hook.bearychat.com/=bwA7K/travis/3c04d191a6066d3e178ab8d93643e708 +jobs: + include: + - stage: Build + name: Upload dist to CDN + script: + - npm run build + - cd dist + - tar -cvf neditor.tar ./ && xz -z9 neditor.tar + - sh -c "curl -T neditor.tar.xz http://v0.api.upyun.com/notadd/download/neditor/Neditor-next-master.tar.xz -u "$UPYUN" -v; fi" + - echo "demo.neditor.notadd.com" > CNAME +deploy: + provider: pages + repo: notadd/neditor + skip-cleanup: true + github-token: $GITHUB_PUBLISH_TOKEN + keep-history: true + local-dir: dist + target-branch: gh-pages + name: Notadd Bot + verbose: true + on: + repo: notadd/neditor + branch: master diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/CHANGELOG.md b/web/src/main/resources/static/plug-in/neditor/2.1.17/CHANGELOG.md new file mode 100644 index 0000000..3843108 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/CHANGELOG.md @@ -0,0 +1,45 @@ + +## [2.1.6](https://github.com/notadd/neditor/compare/2.1.2...2.1.6) (2018-10-11) + + +### Bug Fixes + +* **dialogs/video:** amend default field, fix [#61](https://github.com/notadd/neditor/issues/61) ([a840cd5](https://github.com/notadd/neditor/commit/a840cd5)) +* **file:** delete package-lock.json ([43ef29d](https://github.com/notadd/neditor/commit/43ef29d)) + + +### Features + +* **gitignore:** add package-lock.json ([fc5ab46](https://github.com/notadd/neditor/commit/fc5ab46)) +* **upload:** amend upload service ([8571761](https://github.com/notadd/neditor/commit/8571761)) + + + + +## [2.1.2](https://github.com/notadd/neditor/compare/2.1.1...2.1.2) (2018-08-31) + + +### Bug Fixes + +* **button icon:** change toolbar search-replace button icon ([feaa0e0](https://github.com/notadd/neditor/commit/feaa0e0)) +* **dialogs/video:** amend service name ([209c3cd](https://github.com/notadd/neditor/commit/209c3cd)) + + + + +## [2.1.1](https://github.com/notadd/neditor/compare/2.1.0...2.1.1) (2018-08-29) + + +### Bug Fixes + +* **adapter:** remove debug log ([3fb6c0a](https://github.com/notadd/neditor/commit/3fb6c0a)) +* **service:** amend neditor.service ([17d0419](https://github.com/notadd/neditor/commit/17d0419)) + + +### Features + +* update build config ([b3b2c5f](https://github.com/notadd/neditor/commit/b3b2c5f)) +* **config:** amend neditor.config ([d868995](https://github.com/notadd/neditor/commit/d868995)) + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/Gruntfile.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/Gruntfile.js new file mode 100644 index 0000000..f5707bd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/Gruntfile.js @@ -0,0 +1,274 @@ +"use strict"; + +module.exports = function (grunt) { + var fs = require("fs"), + Util = { + jsBasePath: "_src/", + parseBasePath: "_parse/", + cssBasePath: "themes/notadd/_css/", + + fetchScripts: function (readFile, basePath) { + var sources = fs.readFileSync(readFile); + sources = /\[([^\]]+\.js'[^\]]+)\]/.exec(sources); + sources = sources[1] + .replace(/\/\/.*\n/g, "\n") + .replace(/'|"|\n|\t|\s/g, ""); + sources = sources.split(","); + sources.forEach(function (filepath, index) { + sources[index] = basePath + filepath; + }); + + return sources; + }, + + fetchStyles: function () { + var sources = fs.readFileSync(this.cssBasePath + "neditor.css"), + filepath = null, + pattern = /@import\s+([^;]+)*;/g, + src = []; + + while ((filepath = pattern.exec(sources))) { + src.push(this.cssBasePath + filepath[1].replace(/'|"/g, "")); + } + + return src; + } + }, + packageJson = { + name: "neditor", + version: grunt.file.readJSON("package.json").version + }, + encode = grunt.option("encode") || "utf8", + disDir = "dist/", + banner = + "/*!\n * " + + packageJson.name + + "\n * version: " + + packageJson.version + + "\n * build: <%= new Date() %>\n */\n\n"; + + //init + (function () { + encode = typeof encode === "string" ? encode.toLowerCase() : "utf8"; + disDir = "dist/"; + })(); + + grunt.initConfig({ + pkg: packageJson, + concat: { + js: { + options: { + banner: "/*!\n * " + + packageJson.name + + "\n * version: " + + packageJson.version + + "\n * build: <%= new Date() %>\n */\n\n" + + "(function(){\n\n", + footer: "\n\n})();\n", + process: function (src, s) { + var filename = s.substr(s.indexOf("/") + 1); + return ( + "// " + filename + "\n" + src.replace("/_css/", "/css/") + "\n" + ); + } + }, + src: Util.fetchScripts("_examples/editor_api.js", Util.jsBasePath), + dest: disDir + packageJson.name + ".all.js" + }, + parse: { + options: { + banner: "/*!\n * " + + packageJson.name + + " parse\n * version: " + + packageJson.version + + "\n * build: <%= new Date() %>\n */\n\n" + + "(function(){\n\n", + footer: "\n\n})();\n" + }, + src: Util.fetchScripts("neditor.parse.js", Util.parseBasePath), + dest: disDir + packageJson.name + ".parse.js" + }, + css: { + src: Util.fetchStyles(), + dest: disDir + "themes/notadd/css/neditor.css" + } + }, + cssmin: { + options: { + banner: banner + }, + files: { + expand: true, + cwd: disDir + "themes/notadd/css/", + src: ["*.css", "!*.min.css"], + dest: disDir + "themes/notadd/css/", + ext: ".min.css" + } + }, + uglify: { + dist: { + options: { + banner: "/*!\n * " + + packageJson.name + + "\n * version: " + + packageJson.version + + "\n * build: <%= new Date() %>\n */" + }, + src: disDir + "<%= pkg.name %>.all.js", + dest: disDir + "<%= pkg.name %>.all.min.js" + }, + parse: { + options: { + banner: "/*!\n * " + + packageJson.name + + " parse\n * version: " + + packageJson.version + + "\n * build: <%= new Date() %>\n */" + }, + src: disDir + "<%= pkg.name %>.parse.js", + dest: disDir + "<%= pkg.name %>.parse.min.js" + } + }, + copy: { + base: { + files: [{ + src: [ + "*.html", + "themes/iframe.css", + "themes/notadd/dialogbase.css", + "themes/notadd/images/**", + "themes/notadd/fonts/**", + "themes/ueditor-list/**", + "dialogs/**", + "i18n/**", + "third-party/**", + "README.md", + "package.json" + ], + dest: disDir + }] + }, + demo: { + files: [{ + src: "_examples/completeDemo.html", + dest: disDir + "index.html" + }] + } + }, + transcoding: { + options: { + charset: encode + }, + src: [ + disDir + "**/*.html", + disDir + "**/*.js", + disDir + "**/*.css", + disDir + "**/*.json" + ] + }, + replace: { + fileEncode: { + src: [ + disDir + "**/*.html", + disDir + "dialogs/**/*.js", + disDir + "**/*.css" + ], + overwrite: true, + replacements: [{ + from: /utf-8/gi, + to: "gbk" + }] + }, + demo: { + src: disDir + "index.html", + overwrite: true, + replacements: [{ + from: /\.\.\//gi, + to: "" + }, + { + from: "editor_api.js", + to: packageJson.name + ".all.min.js" + } + ] + } + }, + clean: { + build: { + src: [ + disDir + "*/upload", + disDir + ".DS_Store", + disDir + "**/.DS_Store", + disDir + ".git", + disDir + "**/.git" + ] + } + } + }); + + grunt.loadNpmTasks("grunt-text-replace"); + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-contrib-cssmin"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-copy"); + grunt.loadNpmTasks("grunt-transcoding"); + grunt.loadNpmTasks("grunt-contrib-clean"); + + grunt.registerTask("neditor", "UEditor build", function () { + var tasks = [ + "concat", + "cssmin", + "uglify", + "copy:base", + "copy:demo", + "replace:demo", + "clean" + ]; + + if (encode === "gbk") { + tasks.push("replace:fileEncode"); + } + + tasks.push("transcoding"); + + //config修改 + updateConfigFile(); + + //service + updateServiceFile(); + + grunt.task.run(tasks); + }); + + function updateConfigFile() { + var filename = "neditor.config.js", + file = grunt.file.read(filename); + + if (encode == "gbk") { + file = file.replace(/utf-8/gi, "gbk"); + } + + //写入到dist + if (grunt.file.write(disDir + filename, file)) { + grunt.log.writeln("config file update success"); + } else { + grunt.log.warn("config file update error"); + } + } + + function updateServiceFile() { + var filename = "neditor.service.js", + file = grunt.file.read(filename); + + if (encode == "gbk") { + file = file.replace(/utf-8/gi, "gbk"); + } + + //写入到dist + if (grunt.file.write(disDir + filename, file)) { + grunt.log.writeln("config file update success"); + } else { + grunt.log.warn("config file update error"); + } + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/LICENSE b/web/src/main/resources/static/plug-in/neditor/2.1.17/LICENSE new file mode 100644 index 0000000..c3c4968 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Notadd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/README.md b/web/src/main/resources/static/plug-in/neditor/2.1.17/README.md new file mode 100644 index 0000000..9734381 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/README.md @@ -0,0 +1,168 @@ + +

+ + +

+ +## 新版发布 + +2.1 发布,此次版本移除了后端相关代码,纯 ajax 提交,请配置 `neditor.config.js` `neditor.service.js`,支持各种后端或者云存储。 + +## 捐赠 + +该项目需要您的支持, [捐赠](https://gitee.com/notadd/neditor?donate=true) 以支持此项目的发展。 + + +## 第一步:下载编辑器 + +**方式一:完整安装包 (推荐)** + +* [Neditor.tar.xz](https://www.notadd.com/download/neditor/Neditor-next-master.tar.xz) + +**方式二: npm安装** + +`npm i @notadd/neditor -S` + +**方式三:编译安装** + +```shell +git clone https://github.com/notadd/neditor.git +npm install +npm run build +``` + +### 第二步:在浏览器打开 index.html ### + +进入到目录 `dist` , 使用浏览器打开文件 `index.html` 。 + +如果看到了下面这样的编辑器,恭喜你,初次部署成功! + +![部署成功](https://www.notadd.com/src/neditor-demo.webp) + +## 相关版本 + +[Angular 版 Neditor](https://github.com/notadd/ngx-neditor) + +[Vue 版 Neditor](https://github.com/caiya/vue-neditor-wrap) 【第三方维护】 + +## 技术支持 + +该项目基于 MIT 协议开源,任何组织/企业以及个人都可以免费使用(保留版权)。 +如果您需要额外商业技术支持或者定制编辑器,请联系 QQ:1256985886 + + + +其他版本待添加 + +### 自定义的参数 + +编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器: + +```javascript +var ue = UE.getEditor('container', { + autoHeight: false +}); +``` + +配置项也可以通过 `neditor.config.js` 文件修改,具体的配置方法请看 [前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md)、[后端配置项说明](http://fex.baidu.com/ueditor/#server-config) + +### 编辑器图片、视频、涂鸦、附件上传service + +编辑器上传逻辑单独在 `neditor.service.js` 文件配置,具体的配置方法见注释 + +### 设置和读取编辑器的内容 + +通 getContent 和 setContent 方法可以设置和读取编辑器的内容 + +```javascript +var ue = UE.getContent(); +ue.ready(function(){ + //设置编辑器的内容 + ue.setContent('hello'); + //获取html内容,返回:

hello

+ var html = ue.getContent(); + //获取纯文本内容,返回: hello + var txt = ue.getContentTxt(); +}); +``` + +Ueditor 的更多API请看[API 文档](http://ueditor.baidu.com/doc "ueditor API 文档") + +## 下载地址 + +Neditor 码云: [http://gitee.com/notadd/neditor](http://gitee.com/notadd/neditor "Neditor github 地址") + +Neditor github 地址:[http://github.com/notadd/neditor](http://github.com/notadd/neditor "Neditor github 地址") + +## 相关链接 + +Ueditor 官网:[http://ueditor.baidu.com](http://ueditor.baidu.com "ueditor 官网") + +Ueditor API 文档:[http://ueditor.baidu.com/doc](http://ueditor.baidu.com/doc "ueditor API 文档") + +## 详细文档 + +Ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/) + +注: 对IE8以下版本不再承诺兼容 + + +### 关于 HTTPS + +使用了 [又拍云CDN](https://console.upyun.com/register/?invite=r17EYO3BW) 服务,支持跨域 和 https。 + +如果有需要,也可将下面域名改成自己的。 +``` +imgbaidu.b0.upaiyun.com +tingapi.b0.upaiyun.com +``` + +## 联系我们 ## + +Neditor官方交流群:257753500 + +QQ 群: 321735506 + +[issue](http://github.com/notadd/neditor/issues) + + + +## Todo + +### 2.1 + +- [x] 将上传封装为 service ,支持非 GraphQL 接口。 +- [x] 细节样式修改(美化) + +### 2.2 + +- [ ] word 内图片自动上传 +- [x] 粘贴图片转为本地图片(图片本地化) + +### 2.3 + +- [ ] 上传文件/图片无需后端 + +### 3.0 + +- [ ] 使用 Typescript 重构 +- [ ] 草稿箱功能与离线保存 +- [ ] service worker 特性 +- [ ] 实现 2.0 的大部分功能 + +## 其他项目:Notadd + +https://github.com/notadd/notadd + + + ## 感谢提供赞助: + + +   + +**UCloud 云服务器限时优惠 — Notadd 项目用户福利** + +[【基础型】1核2G 1M带宽 50GB SSD数据盘 低至250元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd ) + +[【标准型】2核4G 1M带宽 50GB SSD数据盘 低至550元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd ) + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeButton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeButton.js new file mode 100644 index 0000000..4daa6d2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeButton.js @@ -0,0 +1,72 @@ +UE.registerUI('button',function(editor,uiName){ + //注册按钮执行时的command命令,使用命令默认就会带有回退操作 + editor.registerCommand(uiName,{ + execCommand:function(){ + alert('execCommand:' + uiName) + } + }); + + //创建一个button + var btn = new UE.ui.Button({ + //按钮的名字 + name:uiName, + //提示 + title:uiName, + //需要添加的额外样式,指定icon图标,这里默认使用一个重复的icon + cssRules :'background-position: -500px 0;', + //点击时执行的命令 + onclick:function () { + //这里可以不用执行命令,做你自己的操作也可 + editor.execCommand(uiName); + } + }); + + //当点到编辑内容上时,按钮要做的状态反射 + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState(uiName); + if (state == -1) { + btn.setDisabled(true); + btn.setChecked(false); + } else { + btn.setDisabled(false); + btn.setChecked(state); + } + }); + + //因为你是添加button,所以需要返回这个button + return btn; +}/*index 指定添加到工具栏上的那个位置,默认时追加到最后,editorId 指定这个UI是那个编辑器实例上的,默认是页面上所有的编辑器都会添加这个按钮*/); + +//自定义引用样式例子 +UE.registerUI('myblockquote',function(editor,uiName){ + editor.registerCommand(uiName,{ + execCommand:function(){ + this.execCommand('blockquote',{ + "style":"border-left: 3px solid #E5E6E1; margin-left: 0px; padding-left: 5px; line-height:36px;" + }); + } + }); + + var btn = new UE.ui.Button({ + name:uiName, + title:'自定义引用', + cssRules :"background-position: -220px 0;", + onclick:function () { + editor.execCommand(uiName); + } + }); + + editor.addListener('selectionchange', function () { + console.log(this); + var state = editor.queryCommandState('blockquote'); + if (state == -1) { + btn.setDisabled(true); + btn.setChecked(false); + } else { + btn.setDisabled(false); + btn.setChecked(state); + } + }); + + return btn; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeCombox.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeCombox.js new file mode 100644 index 0000000..fc272ab --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeCombox.js @@ -0,0 +1,69 @@ +UE.registerUI('combox',function(editor,uiName){ + //注册按钮执行时的command命令,用uiName作为command名字,使用命令默认就会带有回退操作 + editor.registerCommand(uiName,{ + execCommand:function(cmdName,value){ + //这里借用fontsize的命令 + this.execCommand('fontsize',value + 'px') + }, + queryCommandValue:function(){ + //这里借用fontsize的查询命令 + return this.queryCommandValue('fontsize') + } + }); + + + //创建下拉菜单中的键值对,这里我用字体大小作为例子 + var items = []; + for(var i= 0,ci;ci=[10, 11, 12, 14, 16, 18, 20, 24, 36][i++];){ + items.push({ + //显示的条目 + label:'字体:' + ci + 'px', + //选中条目后的返回值 + value:ci, + //针对每个条目进行特殊的渲染 + renderLabelHtml:function () { + //这个是希望每个条目的字体是不同的 + return '
' + (this.label || '') + '
'; + } + }); + } + //创建下来框 + var combox = new UE.ui.Combox({ + //需要指定当前的编辑器实例 + editor:editor, + //添加条目 + items:items, + //当选中时要做的事情 + onselect:function (t, index) { + //拿到选中条目的值 + editor.execCommand(uiName, this.items[index].value); + }, + //提示 + title:uiName, + //当编辑器没有焦点时,combox默认显示的内容 + initValue:uiName + }); + + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState(uiName); + if (state == -1) { + combox.setDisabled(true); + } else { + combox.setDisabled(false); + var value = editor.queryCommandValue(uiName); + if(!value){ + combox.setValue(uiName); + return; + } + //ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + combox.setValue(value); + + } + } + + }); + return combox; +},2/*index 指定添加到工具栏上的那个位置,默认时追加到最后,editorId 指定这个UI是那个编辑器实例上的,默认是页面上所有的编辑器都会添加这个按钮*/); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeDialog.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeDialog.js new file mode 100644 index 0000000..6b86555 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/addCustomizeDialog.js @@ -0,0 +1,49 @@ +UE.registerUI('dialog',function(editor,uiName){ + + //创建dialog + var dialog = new UE.ui.Dialog({ + //指定弹出层中页面的路径,这里只能支持页面,因为跟addCustomizeDialog.js相同目录,所以无需加路径 + iframeUrl:'customizeDialogPage.html', + //需要指定当前的编辑器实例 + editor:editor, + //指定dialog的名字 + name:uiName, + //dialog的标题 + title:"这是个测试浮层", + + //指定dialog的外围样式 + cssRules:"width:600px;height:300px;", + + //如果给出了buttons就代表dialog有确定和取消 + buttons:[ + { + className:'edui-okbutton', + label:'确定', + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:'取消', + onclick:function () { + dialog.close(false); + } + } + ]}); + + //参考addCustomizeButton.js + var btn = new UE.ui.Button({ + name:'dialogbutton' + uiName, + title:'dialogbutton' + uiName, + //需要添加的额外样式,指定icon图标,这里默认使用一个重复的icon + cssRules :'background-position: -500px 0;', + onclick:function () { + //渲染dialog + dialog.render(); + dialog.open(); + } + }); + + return btn; +}/*index 指定添加到工具栏上的那个位置,默认时追加到最后,editorId 指定这个UI是那个编辑器实例上的,默认是页面上所有的编辑器都会添加这个按钮*/); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/charts.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/charts.html new file mode 100644 index 0000000..d5d0d0b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/charts.html @@ -0,0 +1,71 @@ + + + + 图表demo + + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html new file mode 100644 index 0000000..bb68baa --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html @@ -0,0 +1,179 @@ + + + + 完整demo + + + + + + + + + + + + + +
+

完整demo

+ +
+
+
+ + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + +
+ +
+
+ + +
+ + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html new file mode 100644 index 0000000..09ea336 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html @@ -0,0 +1,54 @@ + + + + + + + + + + +

UEditor自定义插件

+ + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html new file mode 100644 index 0000000..bcaab8f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html @@ -0,0 +1,105 @@ + + + + + + + + + + +

UEditor自定义toolbar

+
+
+
+ + + + + + + + +
+
+
+
+ + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html new file mode 100644 index 0000000..84c1cc2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html @@ -0,0 +1,25 @@ + + + + + + + +
+

测试页面

+
+ + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html new file mode 100644 index 0000000..5c67c19 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html @@ -0,0 +1,43 @@ + + + + 完整demo + + + + + + + + + + + + + + + + +
+

二次开发demo

+ +
+ + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js new file mode 100644 index 0000000..fa951a0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js @@ -0,0 +1,131 @@ +/** + * 开发版本的文件导入 + */ +(function (){ + var paths = [ + 'editor.js', + 'core/browser.js', + 'core/utils.js', + 'core/EventBase.js', + 'core/dtd.js', + 'core/domUtils.js', + 'core/Range.js', + 'core/Selection.js', + 'core/Editor.js', + 'core/Editor.defaultoptions.js', + 'core/loadconfig.js', + 'core/ajax.js', + 'core/filterword.js', + 'core/node.js', + 'core/htmlparser.js', + 'core/filternode.js', + 'core/plugin.js', + 'core/keymap.js', + 'core/localstorage.js', + 'plugins/defaultfilter.js', + 'plugins/inserthtml.js', + 'plugins/autotypeset.js', + 'plugins/autosubmit.js', + 'plugins/background.js', + 'plugins/image.js', + 'plugins/justify.js', + 'plugins/font.js', + 'plugins/link.js', + 'plugins/iframe.js', + 'plugins/scrawl.js', + 'plugins/removeformat.js', + 'plugins/blockquote.js', + 'plugins/convertcase.js', + 'plugins/indent.js', + 'plugins/print.js', + 'plugins/preview.js', + 'plugins/selectall.js', + 'plugins/paragraph.js', + 'plugins/directionality.js', + 'plugins/horizontal.js', + 'plugins/time.js', + 'plugins/rowspacing.js', + 'plugins/lineheight.js', + 'plugins/insertcode.js', + 'plugins/cleardoc.js', + 'plugins/anchor.js', + 'plugins/wordcount.js', + 'plugins/pagebreak.js', + 'plugins/wordimage.js', + 'plugins/dragdrop.js', + 'plugins/undo.js', + 'plugins/copy.js', + 'plugins/paste.js', + 'plugins/puretxtpaste.js', + 'plugins/list.js', + 'plugins/source.js', + 'plugins/enterkey.js', + 'plugins/keystrokes.js', + 'plugins/fiximgclick.js', + 'plugins/autolink.js', + 'plugins/autoheight.js', + 'plugins/autofloat.js', + 'plugins/video.js', + 'plugins/table.core.js', + 'plugins/table.cmds.js', + 'plugins/table.action.js', + 'plugins/table.sort.js', + 'plugins/contextmenu.js', + 'plugins/shortcutmenu.js', + 'plugins/basestyle.js', + 'plugins/elementpath.js', + 'plugins/formatmatch.js', + 'plugins/searchreplace.js', + 'plugins/customstyle.js', + 'plugins/catchremoteimage.js', + 'plugins/snapscreen.js', + 'plugins/insertparagraph.js', + 'plugins/webapp.js', + 'plugins/template.js', + 'plugins/music.js', + 'plugins/autoupload.js', + 'plugins/autosave.js', + 'plugins/charts.js', + 'plugins/section.js', + 'plugins/simpleupload.js', + 'plugins/serverparam.js', + 'plugins/insertfile.js', + 'plugins/xssFilter.js', + 'ui/ui.js', + 'ui/uiutils.js', + 'ui/uibase.js', + 'ui/separator.js', + 'ui/mask.js', + 'ui/popup.js', + 'ui/colorpicker.js', + 'ui/tablepicker.js', + 'ui/stateful.js', + 'ui/button.js', + 'ui/splitbutton.js', + 'ui/colorbutton.js', + 'ui/tablebutton.js', + 'ui/autotypesetpicker.js', + 'ui/autotypesetbutton.js', + 'ui/cellalignpicker.js', + 'ui/pastepicker.js', + 'ui/toolbar.js', + 'ui/menu.js', + 'ui/combox.js', + 'ui/dialog.js', + 'ui/menubutton.js', + 'ui/multiMenu.js', + 'ui/shortcutmenu.js', + 'ui/breakline.js', + 'ui/message.js', + 'ui/iconfont.js', + 'adapter/editorui.js', + 'adapter/editor.js', + 'adapter/message.js', + 'adapter/autosave.js' + + ], + baseURL = '../_src/'; + for (var i=0,pi;pi = paths[i++];) { + document.write(''); + } +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html new file mode 100644 index 0000000..e0ce5d4 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html @@ -0,0 +1,151 @@ + + + + 过滤规则定制化 + + + + + + +

尝试粘贴内容近来,这里边不能粘贴任何inline的样式,不能有iframe,style,script,embed等标签,表格不能嵌套

+
+ +
+ + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html new file mode 100644 index 0000000..91391f3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +

代码高亮演示

+

获得编辑器实例

+
+
+        UE.getEditor('myEditor');
+    
+
+ + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html new file mode 100644 index 0000000..a5a4347 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html @@ -0,0 +1,118 @@ + + + + + + + + +

UEditor各种实例演示

+

基础示例

+
    +
  • + 简单示例
    + 使用基础的按钮实现简单的功能 +
  • +
+

应用展示

+
    +
  • + 表单应用
    + 编辑器的内容通过表单提交到后台 +
  • +
  • + 重置编辑器
    + 将编辑器的内部变量清空,重置。 +
  • +
  • + 文本域渲染编辑器
    + 将编辑器渲染到文本域,并且将文本域的内容放到编辑器的初始化内容里 +
  • +
+

二次开发

+ +

高级案例

+ + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html new file mode 100644 index 0000000..3997ff5 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html @@ -0,0 +1,43 @@ + + + + 使用jquery的完整demo + + + + + + + +
+ + +
+ + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html new file mode 100644 index 0000000..b944a69 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html @@ -0,0 +1,63 @@ + + + + + Ueditor在jquery validation下的验证 + + + + + + + + + + + +
+

Ueditor在jquery validation下的验证

+ + + + +
+ + + + +
+ +
+ + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html new file mode 100644 index 0000000..2702881 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html @@ -0,0 +1,43 @@ + + + + + + + + + +

UEditor多实例

+ + + + + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html new file mode 100644 index 0000000..ba612cc --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html @@ -0,0 +1,60 @@ + + + + + + + + + + + +

UEditor多编辑区域一个编辑器实例

+ + + + + + + + + + + + + +
+ 编辑区域一 +
+ 编辑区域二 + 内容2
+ 编辑区域三 + 内容3
+ + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html new file mode 100644 index 0000000..628656a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html @@ -0,0 +1,26 @@ + + + + + + + 表格内实例化编辑器实例 + + + +
+
+ + + + + + + +
表格标题
标题内容
中国
+
+ + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html new file mode 100644 index 0000000..9b63d2a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html @@ -0,0 +1,52 @@ + + + + + + 重置编辑器 + + + + + +

重置编辑器和销毁编辑器示例

+
+

+

+ + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html new file mode 100644 index 0000000..2b0143b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html @@ -0,0 +1,181 @@ + + + + 目录大纲demo + + + + + + + + +
+

目录大纲demo

+
+
+
目录:
+
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx new file mode 100644 index 0000000..877cf8e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx @@ -0,0 +1,44 @@ +<%@ WebHandler Language="C#" Class="getContent" %> +/** + * Created by visual studio 2010 + * User: xuheng + * Date: 12-3-6 + * Time: 下午21:23 + * To get the value of editor and output the value . + */ +using System; +using System.Web; + +public class getContent : IHttpHandler { + + public void ProcessRequest (HttpContext context) { + context.Response.ContentType = "text/html"; + + //获取数据 + string content = context.Server.HtmlEncode(context.Request.Form["myEditor"]); + + + //存入数据库或者其他操作 + //------------- + + //显示 + context.Response.Write(""); + context.Response.Write( + + ""); + + context.Response.Write("Content of First Editor: "); + context.Response.Write("
" + context.Server.HtmlDecode(content) + "
"); + + } + + public bool IsReusable { + get { + return false; + } + } + +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp new file mode 100644 index 0000000..416455f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp @@ -0,0 +1,15 @@ +<% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %> + + + +<% + Dim content + content = Request.Form("myEditor") + Response.Write("第1个编辑器的值") + Response.Write("
" + content + "
") +%> \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp new file mode 100644 index 0000000..1ea4508 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp @@ -0,0 +1,19 @@ + <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> + + + +<% +request.setCharacterEncoding("utf-8"); +response.setCharacterEncoding("utf-8"); +String content = request.getParameter("myEditor"); + + + +response.getWriter().print("第1个编辑器的值"); +response.getWriter().print("
"+content+"
"); + +%> \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html new file mode 100644 index 0000000..3ccac79 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + +

UEditor设置宽高demo

+

这里的宽高都只是编辑区域的宽高,不包括工具栏的高度和状态栏的高度

+

容器给定编辑器的宽高

+ + + +
+

初始化时给定编辑器的宽高

+ + +

没有工具栏的编辑器

+
+ + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html new file mode 100644 index 0000000..42ed0f9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html @@ -0,0 +1,36 @@ + + + + + + + + + + +

UEditor简单功能

+ + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html new file mode 100644 index 0000000..8c22396 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html @@ -0,0 +1,86 @@ + + + + + + + + + +

表格排序演示

+

+

+ 默认排序方法有五种:
+ reversecurrent : 逆序当前
+ orderbyasc : 按ASCII字符升序
+ reversebyasc : 按ASCII字符降序
+ orderbynum : 按数值大小升序
+ reversebynum : 按数值大小降序 +

+

+ 表格data-sort-type属性值为reversebynum,按照数值大小降序排序,点击第一行的单元格进行排序。 +

+
+ + + + + + + + +
343 352 323 234 379 782
341 163 422 234 725 833
221 456 335 423 445 793
112 277 563 423 932 425
587 175 159 734 582 458
+
+ +

+
+

+

+ 自定义排序,按照个位数排序,点击第一行的单元格进行排序。 +

+
+ + + + + + + + +
343 352 323 234 379 782
341 163 422 234 725 833
221 456 335 423 445 793
112 277 563 423 932 425
587 175 159 734 582 458
+
+ + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html new file mode 100644 index 0000000..d1006f7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html @@ -0,0 +1,54 @@ + + + + + + + + + + + +

UEditor提交示例

+
+ + +
+

+ 从1.2.6开始,会自动同步数据无需再手动调用sync方法 + + +

+ + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html new file mode 100644 index 0000000..04b7073 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + +

文本域渲染编辑器

+ + + +
+ + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html new file mode 100644 index 0000000..dc5987f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html @@ -0,0 +1,204 @@ + + + + + + + + + +

解析编辑的内容

+
+
  1. 这里可以书写,编辑器的初始内容

  • sdfas

    1. dfas

  1. dfa

    1. sdfadf

+

+ 这里可以书写,编辑器的初始内容 +

+

+ +

+
+               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;
+        },
+        
+
    +
  1. +

    + dfasdf +

    +
  2. +
  3. +

    + asd +

    +
  4. +
  5. +

    + fa +

    +
  6. +
  7. +

    + sdfa +

    +
  8. +
  9. +

    + sdfa +

    +
  10. +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ sdf
+
+ sdf
+
+ sdf
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ UEditor +

+

+ 简介 +

+

+ UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议,所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出,可以帮助不少网站开者在开发富文本编辑器所遇到的难题,节约开发者因开发富文本编辑器所需要的大量时间,有效降低了企业的开发成本。 +

+

+ 特点
+

+

+ 1、核心层提供了编辑器底层的一些方法和概念,如DOM树操作、Selection、Range等。 +

+

+ 2、在核心层之上覆盖的是命令插件层。之所以叫命令插件层,是因为UEditor中所有的功能型实现都是通过这一层中的命令和插件来完成的,并且各个命令和插件之间基本互不耦合——使用者需要使用哪个功能就导入哪个功能对应的命令或者插件文件,完全不用考虑另外那些杂七杂八的JS文件(极少数插件除外,关于这些插件下文会整理出一个依赖列表来供同学们参考)。 +

+

+ 理论上来讲,所有的命令都是可以用插件来代替的,但是依然将两者分开的主要原因是命令都是一些静态的方法,无需随editor实例初始化,从而优化了编辑器的性能。而插件随编辑器的初始化而初始化,性能上会有少许的影响,但相比命令而言,插件能够完成更加复杂的功能。其中最主要的一个特点是在插件内部既可以为编辑器注册命令,也可以为编辑器绑定监听事件。这个特点使得为编辑器添加任何功能都可以在插件中独立完成。 +

+

+ 3、在命令插件层之上则是UI层。UEditor的UI设计与核心层和命令插件层几乎完全解耦,简单的几个配置就可以为编辑器在界面上添加额外的UI元素和功能,具体的配置下面将会深入阐述。 +

+

+
+

+

+
+

+
+ + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js new file mode 100644 index 0000000..246bb0e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js @@ -0,0 +1,21 @@ +UE.parse.register("background", function(utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName("p"), + styles; + + for (var i = 0, ci; (ci = p[i++]); ) { + styles = ci.getAttribute("data-background"); + if (styles) { + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && + utils.cssRule( + "ueditor_background", + me.selector + "{" + styles + "}", + document + ); +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js new file mode 100644 index 0000000..5dbf41a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js @@ -0,0 +1,288 @@ +UE.parse.register("charts", function(utils) { + utils.cssRule( + "chartsContainerHeight", + ".edui-chart-container { height:" + + (this.chartContainerHeight || 300) + + "px}" + ); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; + + //不存在指定的根路径, 则直接退出 + if (!resourceRoot) { + return; + } + + if ((sources = parseSources())) { + loadResources(); + } + + function parseSources() { + if (!containers) { + return null; + } + + return extractChartData(containers); + } + + /** + * 提取数据 + */ + function extractChartData(rootNode) { + var data = [], + tables = rootNode.getElementsByTagName("table"); + + for (var i = 0, tableNode; (tableNode = tables[i]); i++) { + if (tableNode.getAttribute("data-chart") !== null) { + data.push(formatData(tableNode)); + } + } + + return data.length ? data : null; + } + + function formatData(tableNode) { + var meta = tableNode.getAttribute("data-chart"), + metaConfig = {}, + data = []; + + //提取table数据 + for (var i = 0, row; (row = tableNode.rows[i]); i++) { + var rowData = []; + + for (var j = 0, cell; (cell = row.cells[j]); j++) { + var value = cell.innerText || cell.textContent || ""; + rowData.push(cell.tagName == "TH" ? value : value | 0); + } + + data.push(rowData); + } + + //解析元信息 + meta = meta.split(";"); + for (var i = 0, metaData; (metaData = meta[i]); i++) { + metaData = metaData.split(":"); + metaConfig[metaData[0]] = metaData[1]; + } + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + } + + //加载资源 + function loadResources() { + loadJQuery(); + } + + function loadJQuery() { + //不存在jquery, 则加载jquery + if (!window.jQuery) { + utils.loadFile( + document, + { + src: resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + loadHighcharts(); + } + ); + } else { + loadHighcharts(); + } + } + + function loadHighcharts() { + //不存在Highcharts, 则加载Highcharts + if (!window.Highcharts) { + utils.loadFile( + document, + { + src: resourceRoot + "/third-party/highcharts/highcharts.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + loadTypeConfig(); + } + ); + } else { + loadTypeConfig(); + } + } + + //加载图表差异化配置文件 + function loadTypeConfig() { + utils.loadFile( + document, + { + src: resourceRoot + "/dialogs/charts/chart.config.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + render(); + } + ); + } + + //渲染图表 + function render() { + var config = null, + chartConfig = null, + container = null; + + for (var i = 0, len = sources.length; i < len; i++) { + config = sources[i]; + + chartConfig = analysisConfig(config); + + container = createContainer(config.table); + + renderChart(container, typeConfig[config.meta.chartType], chartConfig); + } + } + + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart(container, typeConfig, config) { + $(container).highcharts( + $.extend({}, typeConfig, { + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [ + { + value: 0, + width: 1, + color: "#808080" + } + ] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: "vertical", + align: "right", + verticalAlign: "middle", + borderWidth: 1 + }, + series: config.series + }) + ); + } + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer(tableNode) { + var container = document.createElement("div"); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild(container, tableNode); + + return container; + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig(config) { + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if (meta.dataFormat != "1") { + for (var i = 0, len = data.length; i < len; i++) { + for (var j = 0, jlen = data[i].length; j < jlen; j++) { + if (!result[j]) { + result[j] = []; + } + + result[j][i] = data[i][j]; + } + } + + data = result; + } + + result = {}; + + //普通图表 + if (meta.chartType != typeConfig.length - 1) { + categories = data[0].slice(1); + + for (var i = 1, curData; (curData = data[i]); i++) { + series.push({ + name: curData[0], + data: curData.slice(1) + }); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + } else { + var curData = []; + + for (var i = 1, len = data[0].length; i < len; i++) { + curData.push([data[0][i], data[1][i] | 0]); + } + + //饼图 + series[0] = { + type: "pie", + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + } + + return result; + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js new file mode 100644 index 0000000..cda95a3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js @@ -0,0 +1,49 @@ +UE.parse.register("insertcode", function(utils) { + var pres = this.root.getElementsByTagName("pre"); + if (pres.length) { + if (typeof XRegExp == "undefined") { + var jsurl, cssurl; + if (this.rootPath !== undefined) { + jsurl = + utils.removeLastbs(this.rootPath) + + "/third-party/SyntaxHighlighter/shCore.js"; + cssurl = + utils.removeLastbs(this.rootPath) + + "/third-party/SyntaxHighlighter/shCoreDefault.css"; + } else { + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document, { + id: "syntaxhighlighter_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile( + document, + { + id: "syntaxhighlighter_js", + src: jsurl, + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + utils.each(pres, function(pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + } + ); + } else { + utils.each(pres, function(pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + } + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js new file mode 100644 index 0000000..2bab684 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js @@ -0,0 +1,235 @@ +UE.parse.register("list", function(utils) { + var customCss = [], + customStyle = { + cn: "cn-1-", + cn1: "cn-2-", + cn2: "cn-3-", + num: "num-1-", + num1: "num-2-", + num2: "num-3-", + dash: "dash", + dot: "dot" + }; + + utils.extend(this, { + liiconpath : utils.removeLastbs(this.rootPath) + '/themes/ueditor-list/', + listDefaultPaddingLeft: "20" + },true); + + var root = this.root, + ols = root.getElementsByTagName("ol"), + uls = root.getElementsByTagName("ul"), + selector = this.selector; + + if (ols.length) { + applyStyle.call(this, ols); + } + + if (uls.length) { + applyStyle.call(this, uls); + } + + if (ols.length || uls.length) { + customCss.push(selector + " .list-paddingleft-1{padding-left:0}"); + customCss.push( + selector + + " .list-paddingleft-2{padding-left:" + + this.listDefaultPaddingLeft + + "px}" + ); + customCss.push( + selector + + " .list-paddingleft-3{padding-left:" + + this.listDefaultPaddingLeft * 2 + + "px}" + ); + + utils.cssRule( + "list", + selector + + " ol," + + selector + + " ul{margin:0;padding:0;}\n" + + selector + + " li{clear:both;}\n" + + customCss.join("\n"), + document + ); + } + function applyStyle(nodes) { + var T = this; + utils.each(nodes, function(list) { + if (list.className && /custom_/i.test(list.className)) { + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if (listStyle == "dash" || listStyle == "dot") { + utils.pushItem( + customCss, + selector + + " li.list-" + + customStyle[listStyle] + + "{background-image:url(" + + T.liiconpath + + customStyle[listStyle] + + ".gif)}" + ); + utils.pushItem( + customCss, + selector + + " ul.custom_" + + listStyle + + "{list-style:none;} " + + selector + + " ul.custom_" + + listStyle + + " li{background-position:0 3px;background-repeat:no-repeat}" + ); + } else { + var index = 1; + utils.each(list.childNodes, function(li) { + if (li.tagName == "LI") { + utils.pushItem( + customCss, + selector + + " li.list-" + + customStyle[listStyle] + + index + + "{background-image:url(" + + T.liiconpath + + "list-" + + customStyle[listStyle] + + index + + ".gif)}" + ); + index++; + } + }); + utils.pushItem( + customCss, + selector + + " ol.custom_" + + listStyle + + "{list-style:none;}" + + selector + + " ol.custom_" + + listStyle + + " li{background-position:0 3px;background-repeat:no-repeat}" + ); + } + switch (listStyle) { + case "cn": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:25px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:55px}" + ); + break; + case "cn1": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:30px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:55px}" + ); + break; + case "cn2": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:55px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:68px}" + ); + break; + case "num": + case "num1": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:25px}" + ); + break; + case "num2": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:35px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + break; + case "dash": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft{padding-left:35px}" + ); + break; + case "dot": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft{padding-left:20px}" + ); + } + } + }); + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js new file mode 100644 index 0000000..4c377e6 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js @@ -0,0 +1,365 @@ +(function() { + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs: function(url) { + return url.replace(/\/$/, ""); + }, + extend: function(t, s) { + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE: isIE, + cssRule: isIE + ? function(key, style, doc) { + var indexList, index; + doc = doc || document; + if (doc.indexList) { + indexList = doc.indexList; + } else { + indexList = doc.indexList = {}; + } + var sheetStyle; + if (!indexList[key]) { + if (style === undefined) { + return ""; + } + sheetStyle = doc.createStyleSheet( + "", + (index = doc.styleSheets.length) + ); + indexList[key] = index; + } else { + sheetStyle = doc.styleSheets[indexList[key]]; + } + if (style === undefined) { + return sheetStyle.cssText; + } + sheetStyle.cssText = sheetStyle.cssText + "\n" + (style || ""); + } + : function(key, style, doc) { + doc = doc || document; + var head = doc.getElementsByTagName("head")[0], + node; + if (!(node = doc.getElementById(key))) { + if (style === undefined) { + return ""; + } + node = doc.createElement("style"); + node.id = key; + head.appendChild(node); + } + if (style === undefined) { + return node.innerHTML; + } + if (style !== "") { + node.innerHTML = node.innerHTML + "\n" + style; + } else { + head.removeChild(node); + } + }, + domReady: function(onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + } else { + if (isIE) { + (function() { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent("onload", function() { + onready(); + }); + } else { + doc.addEventListener( + "DOMContentLoaded", + function() { + doc.removeEventListener( + "DOMContentLoaded", + arguments.callee, + false + ); + onready(); + }, + false + ); + window.addEventListener( + "load", + function() { + onready(); + }, + 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; + } + } + } + }, + inArray: function(arr, item) { + var index = -1; + this.each(arr, function(v, i) { + if (v === item) { + index = i; + return false; + } + }); + return index; + }, + pushItem: function(arr, item) { + if (this.inArray(arr, item) == -1) { + arr.push(item); + } + }, + trim: function(str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); + }, + 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; + }, + hasClass: function(element, className) { + className = className + .replace(/(^[ ]+)|([ ]+$)/g, "") + .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; + }, + addClass: function(elm, classNames) { + if (!elm) return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); + for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) { + if (!new RegExp("\\b" + ci + "\\b").test(cls)) { + cls += " " + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass: function(elm, classNames) { + classNames = this.isArray(classNames) + ? classNames + : this.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 = this.trim(cls).replace(/[ ]{2,}/g, " "); + elm.className = cls; + !cls && elm.removeAttribute("className"); + }, + on: function(element, type, handler) { + var types = this.isArray(type) ? type : 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; + }, + off: function(element, type, handler) { + var types = this.isArray(type) ? type : 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]; + } + } + } + }, + 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(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function() { + throw Error( + "The load " + (obj.href || obj.src) + " fails,check the url" + ); + }; + doc.getElementsByTagName("head")[0].appendChild(element); + }; + })() + }; + utils.each( + ["String", "Function", "Array", "Number", "RegExp", "Object", "Boolean"], + function(v) { + utils["is" + v] = function(obj) { + return Object.prototype.toString.apply(obj) == "[object " + v + "]"; + }; + } + ); + var parselist = {}; + UE.parse = { + register: function(parseName, fn) { + parselist[parseName] = fn; + }, + load: function(opt) { + utils.each(parselist, function(v) { + v.call(opt, utils); + }); + } + }; + uParse = function(selector, opt) { + utils.domReady(function() { + var contents; + if (document.querySelectorAll) { + contents = document.querySelectorAll(selector); + } else { + if (/^#/.test(selector)) { + contents = [document.getElementById(selector.replace(/^#/, ""))]; + } else if (/^\./.test(selector)) { + var contents = []; + utils.each(document.getElementsByTagName("*"), function(node) { + if ( + node.className && + new RegExp("\\b" + selector.replace(/^\./, "") + "\\b", "i").test( + node.className + ) + ) { + contents.push(node); + } + }); + } else { + contents = document.getElementsByTagName(selector); + } + } + utils.each(contents, function(v) { + UE.parse.load(utils.extend({ root: v, selector: selector }, opt)); + }); + }); + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js new file mode 100644 index 0000000..fc3333c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js @@ -0,0 +1,217 @@ +UE.parse.register("table", function(utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName("table"); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule( + "table", + selector + + " table.noBorderTable td," + + selector + + " table.noBorderTable th," + + selector + + " table.noBorderTable caption{border:1px dashed #ddd !important}" + + selector + + " table.sortEnabled tr.firstRow th," + + selector + + " table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;" + + "background-position: center right; background-image:url(" + + this.rootPath + + "themes/default/images/sortable.png);}" + + selector + + " table.sortEnabled tr.firstRow th:hover," + + selector + + " table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}" + + selector + + " table{margin-bottom:10px;border-collapse:collapse;display:table;}" + + selector + + " td," + + selector + + " th{padding: 5px 10px;border: 1px solid #DDD;}" + + selector + + " caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + + selector + + " th{border-top:1px solid #BBB;background:#F7F7F7;}" + + selector + + " table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}" + + selector + + " tr.ue-table-interlace-color-single td{ background: #fcfcfc; }" + + selector + + " tr.ue-table-interlace-color-double td{ background: #f7faff; }" + + selector + + " td p{margin:0;padding:0;width:auto;height:auto;}", + document + ); + //填充空的单元格 + + utils.each("td th caption".split(" "), function(tag) { + var cells = root.getElementsByTagName(tag); + cells.length && + utils.each(cells, function(node) { + if (!node.firstChild) { + node.innerHTML = " "; + } + }); + }); + + //表格可排序 + var tables = root.getElementsByTagName("table"); + utils.each(tables, function(table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, "click", function(e) { + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ["td", "th"]); + var table = findParentByTagName(target, "table"), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute("data-sort-type"); + if (colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, + current = target; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + while (current) { + for (i = 0; i < tagNames.length; i++) { + if (current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + reversecurrent: function(td1, td2) { + return 1; + }, + orderbyasc: function(td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + reversebyasc: function(td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + orderbynum: function(td1, td2) { + var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( + /\d+/ + ), + value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + reversebynum: function(td1, td2) { + var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( + /\d+/ + ), + value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute( + "data-sort-type", + compareFn && typeof compareFn === "string" && Fn[compareFn] + ? compareFn + : "" + ); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray, function(tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if ( + compareFn && + typeof compareFn === "string" && + Fn[compareFn] + ) { + result = Fn[compareFn].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else { + result = Fn["orderbyasc"].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore( + fragment, + rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] + ); + } + } + //冒泡排序 + function sort(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; + } + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!utils.hasClass(table.rows[0], "firstRow")) { + for (var i = 1; i < table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js new file mode 100644 index 0000000..b494253 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js @@ -0,0 +1,38 @@ +UE.parse.register("vedio", function(utils) { + var video = this.root.getElementsByTagName("video"), + audio = this.root.getElementsByTagName("audio"); + + document.createElement("video"); + document.createElement("audio"); + if (video.length || audio.length) { + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + "/third-party/video-js/video.js", + cssurl = sourcePath + "/third-party/video-js/video-js.min.css", + swfUrl = sourcePath + "/third-party/video-js/video-js.swf"; + + if (window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document, { + id: "video_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile( + document, + { + id: "video_js", + src: jsurl, + tag: "script", + type: "text/javascript" + }, + function() { + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + } + ); + } + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js new file mode 100644 index 0000000..722feb8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js @@ -0,0 +1,17 @@ +UE.registerUI("autosave", function(editor) { + var timer = null, + uid = null; + editor.on("afterautosave", function() { + clearTimeout(timer); + + timer = setTimeout(function() { + if (uid) { + editor.trigger("hidemessage", uid); + } + uid = editor.trigger("showmessage", { + content: editor.getLang("autosave.success"), + timeout: 2000 + }); + }, 2000); + }); +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js new file mode 100644 index 0000000..870f653 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js @@ -0,0 +1,998 @@ +///import core +///commands 全屏 +///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 = []; + + 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; + + 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 + ); + + //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("property") + + ': ' + + 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.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog"; + } + if (img.src.indexOf("https://api.map.baidu.com") != -1) { + dialogName = "mapDialog"; + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog"; + } + if ( + img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1 + ) { + dialogName = "gmapDialog"; + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + "" + + editor.getLang("property") + + ': ' + + editor.getLang("modify") + + "  " + + "" + + editor.getLang("delete") + + "" + ); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog"; + } + if ( + domUtils.hasClass(img, "loadingclass") || + domUtils.hasClass(img, "loaderrorclass") + ) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = + "" + + editor.getLang("property") + + ": " + + '' + + editor.getLang("default") + + "  " + + '' + + editor.getLang("justifyleft") + + "  " + + '' + + editor.getLang("justifyright") + + "  " + + '' + + editor.getLang("justifycenter") + + "  " + + "' + + editor.getLang("modify") + + ""; + + !html && (html = popup.formatHtml(str)); + } + 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("anthorMsg") + + ': ' + + 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; + } + 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 + '
' + + '' + + '' + + '' + + "
" + + '
' + + "
" + ); + }, + 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" + ); + 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/neditor.css", + 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); + } + 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 + }; + }); + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js new file mode 100644 index 0000000..7aa892c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js @@ -0,0 +1,1002 @@ +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据neditor.config中的toolbars找到相应的进行实例化 +;(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", + insertimage: "~/dialogs/image/image.html", + link: "~/dialogs/link/link.html", + spechars: "~/dialogs/spechars/spechars.html", + searchreplace: "~/dialogs/searchreplace/searchreplace.html", + map: "~/dialogs/map/map.html", + gmap: "~/dialogs/gmap/gmap.html", + insertvideo: "~/dialogs/video/video.html", + help: "~/dialogs/help/help.html", + preview: "~/dialogs/preview/preview.html", + emotion: "~/dialogs/emotion/emotion.html", + wordimage: "~/dialogs/wordimage/wordimage.html", + attachment: "~/dialogs/attachment/attachment.html", + insertframe: "~/dialogs/insertframe/insertframe.html", + edittip: "~/dialogs/table/edittip.html", + edittable: "~/dialogs/table/edittable.html", + edittd: "~/dialogs/table/edittd.html", + webapp: "~/dialogs/webapp/webapp.html", + snapscreen: "~/dialogs/snapscreen/snapscreen.html", + scrawl: "~/dialogs/scrawl/scrawl.html", + music: "~/dialogs/music/music.html", + template: "~/dialogs/template/template.html", + background: "~/dialogs/background/background.html", + charts: "~/dialogs/charts/charts.html" + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + 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", + "drafts" + ]; + + 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); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + })(ci); + } + + //清除文档 + 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 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", "webapp", "preview"], + ok: [ + "attachment", + "anchor", + "link", + "insertimage", + "map", + "gmap", + "insertframe", + "wordimage", + "insertvideo", + "insertframe", + "edittip", + "edittable", + "edittd", + "scrawl", + "template", + "music", + "background", + "charts" + ] + }; + + 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, + className: "edui-for-" + cmd, + title: title, + holdScroll: cmd === "insertimage", + fullscreen: /charts|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 (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) || + cmd == "charts" + }); + 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.snapscreen = function(editor, iframeUrl, title) { + title = + editor.options.labelMap["snapscreen"] || + editor.getLang("labelMap.snapscreen") || + ""; + var ui = new editorui.Button({ + className: "edui-for-snapscreen", + title: title, + onclick: function() { + editor.execCommand("snapscreen"); + }, + theme: editor.options.theme + }); + editorui.buttons["snapscreen"] = ui; + iframeUrl = + iframeUrl || + (editor.options.iframeUrlMap || {})["snapscreen"] || + iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl: editor.ui.mapUrl(iframeUrl), + editor: editor, + className: "edui-for-snapscreen", + title: title, + 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); + } + } + ] + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener("selectionchange", function() { + ui.setDisabled(editor.queryCommandState("snapscreen") == -1); + }); + return ui; + }; + + 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); + } + }); + } + 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: 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.iframeUrlMap || {})[cmd] || + iframeUrlMap[cmd] + ) + }); + editorui.buttons[cmd] = 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["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; + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js new file mode 100644 index 0000000..d9b14b0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js @@ -0,0 +1,67 @@ +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"; + } + holder.style.zIndex = + Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js new file mode 100644 index 0000000..0c78d47 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js @@ -0,0 +1,62 @@ +/** + * 该文件定义了API文档所使用到的本地函数的说明 + * @file + * @module Native + */ + +/** + * 辅助接口说明 + * @module Native + * @unfile + */ + +/** + * 原生String对象, 字符串 + * @class String + */ + +/** + * 原生Function对象, 函数 + * @class Function + */ + +/** + * 原生Object对象, 普通对象 + * @remind 如果某一方法的参数类型为Object时, 表示该参数应该接受一个key-value集合 + * @class Object + */ + +/** + * 原生Boolean对象, 布尔值 + * @class Boolean + */ + +/** + * 原生Number对象, 数值 + * @class Number + */ + +/** + * 原生NULL对象, 空 + * @class NULL + */ + +/** + * 原生Array对象, 数组 + * @class Array + */ + +/** + * 浏览器Node, dom节点 + * @class Node + */ + +/** + * 浏览器Element, dom元素 + * @class Element + */ + +/** + * UEditor模拟dom节点对象 + * @class uNode + */ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js new file mode 100644 index 0000000..de209de --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js @@ -0,0 +1,30 @@ +//维护编辑器一下默认的不在插件中的配置项 +UE.Editor.defaultOptions = function(editor) { + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: "", + initialStyle: "", + autoClearinitialContent: false, + iframeCssUrl: _url + "themes/iframe.css", + 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 + "i18n/", + theme: "default", + themePath: _url + "themes/", + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData: true, + fileNameFormat: "{time}{rand:6}" + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js new file mode 100644 index 0000000..9a62823 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js @@ -0,0 +1,1703 @@ +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + +;(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; + } + } + } else { + textarea = editor.textarea; + } + } + 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; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行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 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * 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到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @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)); + + /* 尝试异步加载后台配置 */ + //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", + 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; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function(fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener("ready", fn); + } + }, + /** + * 该方法用于设置placeholder + * @method setPlaceholder + * @param { String } placeholder 编辑器的placeholder文案 + * @example + * ```javascript + * editor.setPlaceholder('请输入内容'); + * ``` + */ + setPlaceholder: function(){ + + function contentChange(){ + var localHtml = this.getPlainTxt(); + if(!localHtml.trim()){ + UE.dom.domUtils.addClass( this.body, 'empty' ); + }else{ + UE.dom.domUtils.removeClasses( this.body, 'empty' ); + } + } + + return function(placeholder){ + var _editor = this; + + _editor.ready(function () { + contentChange.call(_editor); + _editor.body.setAttribute('placeholder', placeholder); + }); + _editor.removeListener('keyup contentchange', contentChange); + _editor.addListener('keyup contentchange', contentChange); + } + }(), + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + 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 + * ```javascript + * 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 = ""; + } + + 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 + * @remind 执行该方法,会触发ready事件 + * @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; + } + + 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 html = + (ie && browser.version < 9 ? "" : "") + + "" + + "" + + "" + + (options.iframeCssUrl + ? "" + : "") + + (options.initialStyle + ? "" + : "") + + "" + + "" + + "" + + (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"; + } + }); + } + }, + + /** + * 编辑器初始化 + * @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; + } + } 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项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的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); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * 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"); + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * 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); + }, + + /** + * 对编辑器设置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); + } + } + } + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

123456

+ * var content = editor.getContent(); //返回值:

123456

+ * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + 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文档字符串 + * @eaxmple + * ```javascript + * 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) + + "" + ); + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

1

2

+ * 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, " "); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

1

2

+ * 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, " "); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

test

'); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

old text

+ * editor.setContent('

new text

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

old text

new text

+ * ``` + */ + setContent: function(html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent("beforesetcontent", html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + 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; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement("p"); + } + } + child = child.nextSibling; + } + } + } + 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); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * 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); + } 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 { + sel.removeAllRanges(); + } + + //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); + }); + }, + /** + * 触发事件代理 + * @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() + ); + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _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); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @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); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function(cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this; + var result; + var 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 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function(cmdName) { + return this._callCmdFn("queryCommandState", arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function(cmdName) { + return this._callCmdFn("queryCommandValue", arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * 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; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function() { + this.fireEvent("reset"); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * 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(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * 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); + }, + + /** + * 设置默认内容 + * @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); + } + } + + return function(cont) { + var me = this; + me.body.innerHTML = '

' + cont + "

"; + + me.addListener("firstBeforeExecCommand focus", clear); + }; + })(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * 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(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * 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(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * 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; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

132

+ * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

132

+ * 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; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function(rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function(root) { + for (var i = 0, ci; (ci = this.inputRules[i++]); ) { + ci.call(this, root); + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function(rule) { + this.outputRules.push(rule); + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function(root) { + for (var i = 0, ci; (ci = this.outputRules[i++]); ) { + ci.call(this, root); + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * 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"); + /* if (!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); + } + + if (serverUrl) { + serverUrl = + serverUrl + + (serverUrl.indexOf("?") == -1 ? "?" : "&") + + "action=" + + (actionName || ""); + return utils.formatUrl(serverUrl); + } else { + return ""; + } */ + + if (serverUrl) { + serverUrl = serverUrl + "?"; + return utils.formatUrl(serverUrl); + } else { + return ""; + } + } + }; + utils.inherits(Editor, EventBase); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js new file mode 100644 index 0000000..f65ddf8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js @@ -0,0 +1,170 @@ +/** + * UE采用的事件基类 + * @file + * @module UE + * @class EventBase + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。 + * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。 + * @unfile + * @module UE + * @class EventBase + */ + +/** + * 通过此构造器,子类可以继承EventBase获取事件监听的方法 + * @constructor + * @example + * ```javascript + * UE.EventBase.call(editor); + * ``` + */ +var EventBase = (UE.EventBase = function() {}); + +EventBase.prototype = { + /** + * 注册事件监听器 + * @method addListener + * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔 + * @param { Function } fn 监听的事件被触发时,会执行该回调函数 + * @waining 事件被触发时,监听的函数假如返回的值恒等于true,回调函数的队列中后面的函数将不执行 + * @example + * ```javascript + * editor.addListener('selectionchange',function(){ + * console.log("选区已经变化!"); + * }) + * editor.addListener('beforegetcontent aftergetcontent',function(type){ + * if(type == 'beforegetcontent'){ + * //do something + * }else{ + * //do something + * } + * console.log(this.getContent) // this是注册的事件的编辑器实例 + * }) + * ``` + * @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); + } + }, + + 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 移除的事件名称,同时移除多个事件使用空格分隔 + * @param { Function } fn 移除监听事件的函数引用 + * @example + * ```javascript + * //changeCallback为方法体 + * 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); + } + }, + + /** + * 触发事件 + * @method fireEvent + * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 + * @remind 该方法会触发addListener + * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 + * @example + * ```javascript + * editor.fireEvent("selectionchange"); + * ``` + */ + + /** + * 触发事件 + * @method fireEvent + * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 + * @param { *... } options 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数 + * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 + * @example + * ```javascript + * + * editor.addListener( "selectionchange", function ( type, arg1, arg2 ) { + * + * console.log( arg1 + " " + arg2 ); + * + * } ); + * + * //触发selectionchange事件, 会执行上面的事件监听器 + * //output: Hello World + * 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; + } + } + } + if ((t = this["on" + ti.toLowerCase()])) { + r = t.apply(this, arguments); + } + } + return r; + } +}; +/** + * 获得对象所拥有监听类型的所有监听器 + * @unfile + * @module UE + * @since 1.2.6.1 + * @method getListener + * @public + * @param { Object } obj 查询监听器的对象 + * @param { String } type 事件类型 + * @param { Boolean } force 为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组 + * @return { Array } 监听器数组 + */ +function getListener(obj, type, force) { + var allListeners; + type = type.toLowerCase(); + return ( + (allListeners = + obj.__allListeners || (force && (obj.__allListeners = {}))) && + (allListeners[type] || (force && (allListeners[type] = []))) + ); +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js new file mode 100644 index 0000000..3a42c41 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js @@ -0,0 +1,1982 @@ +/** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + +/** + * dom操作封装 + * @unfile + * @module UE.dom + */ + +/** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + +;(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 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; + } + 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(""))); + } + 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)) + ); + //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; + } + 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); + } + } + } 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; + } + + /** + * 创建一个跟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; + }); + + /** + * 删除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, ""); + } + } + } 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; + } + } + + Range.prototype = { + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents: function() { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + 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 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents: function() { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart: function(node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd: function(node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter: function(node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore: function(node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter: function(node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore: function(node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst: function(node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @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 + ); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst: function(node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @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 + ); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode: function(node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + 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); + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + 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对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @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; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + 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 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + 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); + } + } + 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 + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @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); + } + } + } + + 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); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor: function(toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * 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++); + + 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; + }, + + /** + * 调整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; + } + 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; + }, + /** + * 调整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; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

xxxx[xxxx]x

==> range.applyInlineStyle("strong") ==>

xxxx[xxxx]x

+ * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

xxxx[xxxx]x

+ * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

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; + } + 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); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组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); + }, + + /** + * 获取当前选中的自闭合的节点 + * @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; + }, + + /** + * 在页面上高亮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); + } + } 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; + }, + + /** + * 判断当前选区内容是否占位符 + * @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; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

+ * aaaa + * + * + * bbbb + * + * + *

+ * + * + * + * ``` + */ + 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; + } + firstIndex++; + if (first.nodeType == 3) { + while (first && first.nodeType == 3) { + first = first.nextSibling; + } + } else { + first = first.nextSibling; + } + } + } + } + } 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; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

+ * aaaa + * + * + * bbbb + * + * + *

+ * + * + * + * ``` + */ + 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; + }, + + /** + * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + 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); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js new file mode 100644 index 0000000..2d4e00c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js @@ -0,0 +1,417 @@ +/** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 选区集合 + * @unfile + * @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 }; + } + + 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 ? -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); + } + } + 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() { + try { + if (!_getIERange(me) && me._bakIERange) { + me._bakIERange.select(); + } + } catch (ex) {} + me._bakIERange = null; + }); + } + iframe = doc = null; + }); + + 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对象 + * @example + * ```javascript + * 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; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + 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(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * 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 []; + }, + + /** + * 清空缓存 + * @method clear + */ + 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; + } + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * 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); + } + } + + 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 } 获得开始元素 + * @example + * ```javascript + * 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; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * 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 ""; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange: function() { + this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js new file mode 100644 index 0000000..ac8b916 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js @@ -0,0 +1,278 @@ +/** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + +/** + * 提供对ajax请求的支持 + * @module UE.ajax + */ +UE.ajax = (function() { + //创建一个ajaxRequest对象 + var fnStr = "XMLHttpRequest()"; + try { + 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]) + ); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method: "POST", + timeout: 5000, + async: true, + 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; + + 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 (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); + + 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 + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'neditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + 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); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js new file mode 100644 index 0000000..b4e1aca --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js @@ -0,0 +1,263 @@ +/** + * 浏览器判断模块 + * @file + * @module UE.browser + * @since 1.2.6.1 + */ + +/** + * 提供浏览器检测的模块 + * @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), + + /** + * @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} 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} 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 + * ```javascript + * if ( UE.browser.ie9Compat ) { + * console.log( '当前浏览器运行在IE9兼容模式下' ); + * } + * ``` + */ + browser.ie9Compat = document.documentMode == 9; + + /** + * @property { boolean } ie8 检测浏览器是否是IE8浏览器 + * @warning 如果浏览器不是IE, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.ie8 ) { + * console.log( '当前浏览器是IE8浏览器' ); + * } + * ``` + */ + browser.ie8 = !!document.documentMode; + + /** + * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式 + * @warning 如果浏览器不是IE, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.ie8Compat ) { + * console.log( '当前浏览器运行在IE8兼容模式下' ); + * } + * ``` + */ + browser.ie8Compat = document.documentMode == 8; + + /** + * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式 + * @warning 如果浏览器不是IE, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.ie7Compat ) { + * console.log( '当前浏览器运行在IE7兼容模式下' ); + * } + * ``` + */ + browser.ie7Compat = + (version == 7 && !document.documentMode) || document.documentMode == 7; + + /** + * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式 + * @warning 如果浏览器不是IE, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.ie6Compat ) { + * console.log( '当前浏览器运行在IE6模式或者怪异模式下' ); + * } + * ``` + */ + browser.ie6Compat = version < 7 || browser.quirks; + + browser.ie9above = version > 8; + + browser.ie9below = version < 9; + + 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; + } + } + + /** + * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号 + * @warning 如果浏览器不是chrome, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.chrome ) { + * console.log( '当前浏览器是Chrome' ); + * } + * ``` + */ + if (/chrome\/(\d+\.\d)/i.test(agent)) { + browser.chrome = +RegExp["\x241"]; + } + + /** + * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号 + * @warning 如果浏览器不是safari, 则该值为undefined + * @example + * ```javascript + * if ( UE.browser.safari ) { + * console.log( '当前浏览器是Safari' ); + * } + * ``` + */ + 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()); + + // WebKit 522+ (Safari 3+) + if (browser.webkit) + version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); + + /** + * @property { Number } version 检测当前浏览器版本号 + * @remind + *
    + *
  • IE系列返回值为5,6,7,8,9,10等
  • + *
  • gecko系列会返回10900,158900等
  • + *
  • webkit系列会返回其build号 (如 522等)
  • + *
+ * @example + * ```javascript + * console.log( '当前浏览器版本号是: ' + UE.browser.version ); + * ``` + */ + browser.version = version; + + /** + * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容 + * @example + * ```javascript + * if ( UE.browser.isCompatible ) { + * console.log( '浏览器与UEditor能够良好兼容' ); + * } + * ``` + */ + 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; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js new file mode 100644 index 0000000..e04ee15 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js @@ -0,0 +1,2542 @@ +/** + * Dom操作工具包 + * @file + * @module UE.dom.domUtils + * @since 1.2.6.1 + */ + +/** + * Dom操作工具包 + * @unfile + * @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; + } + tmpNode = parent[ltr]; + } + 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*/ + }, + /** + * 获取节点A相对于节点B的位置关系 + * @method getPosition + * @param { Node } nodeA 需要查询位置关系的节点A + * @param { Node } nodeB 需要查询位置关系的节点B + * @return { Number } 节点A与节点B的关系 + * @example + * ```javascript + * //output: 20 + * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body ); + * + * switch ( position ) { + * + * //0 + * case UE.dom.domUtils.POSITION_IDENTICAL: + * console.log('元素相同'); + * break; + * //1 + * case UE.dom.domUtils.POSITION_DISCONNECTED: + * console.log('两个节点在不同的文档中'); + * break; + * //2 + * case UE.dom.domUtils.POSITION_FOLLOWING: + * console.log('节点A在节点B之后'); + * break; + * //4 + * case UE.dom.domUtils.POSITION_PRECEDING; + * console.log('节点A在节点B之前'); + * break; + * //8 + * case UE.dom.domUtils.POSITION_IS_CONTAINED: + * console.log('节点A被节点B包含'); + * break; + * case 10: + * console.log('节点A被节点B包含且节点A在节点B之后'); + * break; + * //16 + * case UE.dom.domUtils.POSITION_CONTAINS: + * console.log('节点A包含节点B'); + * break; + * case 20: + * console.log('节点A包含节点B且节点A在节点B之前'); + * break; + * + * } + * ``` + */ + 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 需要检测的节点对象 + * @return { Number } 该节点在父节点中的位置 + * @see UE.dom.domUtils.getNodeIndex(Node,Boolean) + */ + + /** + * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点 + * @method getNodeIndex + * @param { Node } node 需要检测的节点对象 + * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点 + * @return { Number } 该节点在父节点中的位置 + * @example + * ```javascript + * + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "hello" ) ); + * node.appendChild( document.createTextNode( "world" ) ); + * node.appendChild( node = document.createElement( "div" ) ); + * + * //output: 2 + * console.log( UE.dom.domUtils.getNodeIndex( node ) ); + * + * //output: 1 + * console.log( UE.dom.domUtils.getNodeIndex( node, true ) ); + * + * ``` + */ + 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++; + } + return i; + }, + + /** + * 检测节点node是否在给定的document对象上 + * @method inDoc + * @param { Node } node 需要检测的节点对象 + * @param { DomDocument } doc 需要检测的document对象 + * @return { Boolean } 该节点node是否在给定的document的dom树上 + * @example + * ```javascript + * + * var node = document.createElement("div"); + * + * //output: false + * console.log( UE.do.domUtils.inDoc( node, document ) ); + * + * document.body.appendChild( node ); + * + * //output: true + * console.log( UE.do.domUtils.inDoc( node, document ) ); + * + * ``` + */ + inDoc: function(node, doc) { + return domUtils.getPosition(node, doc) == 10; + }, + /** + * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, + * 查找的起点是给定node节点的父节点。 + * @method findParent + * @param { Node } node 需要查找的节点 + * @param { Function } filterFn 自定义的过滤方法。 + * @warning 查找的终点是到body节点为止 + * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 + * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 + * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL + * @example + * ```javascript + * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) { + * + * //由于查找的终点是body节点, 所以永远也不会匹配当前过滤器的条件, 即这里永远会返回false + * return node.tagName === "HTML"; + * + * } ); + * + * //output: true + * console.log( filterNode === null ); + * ``` + */ + + /** + * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, + * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点 + * @method findParent + * @param { Node } node 需要查找的节点 + * @param { Function } filterFn 自定义的过滤方法。 + * @param { Boolean } includeSelf 查找过程是否包含自身 + * @warning 查找的终点是到body节点为止 + * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 + * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 + * @remind 如果includeSelf为true, 则过滤器第一次执行时的参数会是节点本身。 + * 反之, 过滤器第一次执行时的参数将是该节点的父节点。 + * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL + * @example + * ```html + * + * + *
+ *
+ * + * + * + * ``` + */ + 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; + } + } + return null; + }, + /** + * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); + * //output: BODY + * console.log( node.tagName ); + * ``` + */ + + /** + * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, + * 否则, 起点是node的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @param { Boolean } includeSelf 查找过程是否包含node节点自身 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var queryTarget = document.getElementsByTagName("div")[0]; + * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); + * //output: true + * 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 + ); + }, + /** + * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 + */ + + /** + * 查找节点node的祖先节点集合, 如果includeSelf的值为true, + * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @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(); + }, + + /** + * 在节点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); + }, + + /** + * 删除节点node及其下属的所有节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
+ *
你好
+ *
+ * + * ``` + */ + + /** + * 删除节点node,并根据keepChildren的值决定是否保留子节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @param { Boolean } keepChildren 是否需要保留子节点 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
+ *
你好
+ *
+ * + * ``` + */ + 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); + } + return node; + }, + + /** + * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, + * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```html + * + *
+ * + *
+ * xxx + * + * + * ``` + * @example + * ```html + * + *
+ * + * xxx + *
+ * xxx + * + * + * ``` + */ + + /** + * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, + * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, + * 则执行getNextDomNode(Node node)的查找过程。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @param { Boolean } startFromChild 查找过程是否从其子节点开始 + * @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 + ); + }, + /** + * 检测节点node是否属是UEditor定义的bookmark节点 + * @method isBookmarkNode + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是bookmark节点 + * @example + * ```html + * + * + * ``` + */ + isBookmarkNode: function(node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** + * 获取节点node所属的window对象 + * @method getWindow + * @param { Node } node 节点对象 + * @return { Window } 当前节点所属的window对象 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); + * ``` + */ + getWindow: function(node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** + * 获取离nodeA与nodeB最近的公共的祖先节点 + * @method getCommonAncestor + * @param { Node } nodeA 第一个节点 + * @param { Node } nodeB 第二个节点 + * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 + * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 + * @example + * ```javascript + * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); + * //output: true + * 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]; + }, + /** + * 清除node节点左右连续为空的兄弟inline节点 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * 则这些兄弟节点将被删除 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 + * @example + * ```html + * + *
+ * + * + * + * xxx + * + * + * + * ``` + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @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"); + }, + /** + * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 + * @method split + * @param { Node } textNode 需要拆分的文本节点对象 + * @param { int } offset 需要拆分的位置, 位置计算从0开始 + * @return { Node } 拆分后形成的新节点 + * @example + * ```html + *
abcdef
+ * + * ``` + */ + 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 需要检测的节点对象 + * @return { Boolean } 检测的节点是否为空 + * @example + * ```html + *
+ * + *
+ * + * ``` + */ + isWhitespace: function(node) { + return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test( + node.nodeValue + ); + }, + /** + * 获取元素element相对于viewport的位置坐标 + * @method getXY + * @param { Node } element 需要计算位置的节点对象 + * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, + * y代表垂直偏移距离。 + * + * @example + * ```javascript + * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); + * //output: test的坐标为: 12, 24 + * 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 }; + }, + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { String } type 绑定的事件类型 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,"click",function(e){ + * //e为事件对象,this为被点击元素对戏那个 + * }); + * ``` + */ + + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { Array } type 绑定的事件类型数组 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + 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; + }, + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { String } type 需要接触绑定的事件类型 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body,"click",function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { Array } type 需要接触绑定的事件类型数组 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + 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]; + } + } + } + }, + + /** + * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 + * @method isSameElement + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + 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++; + } + 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; + } + } + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; (attrB = otherAttrs[i++]); ) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } + } + return true; + }, + + /** + * 判断节点nodeA与节点nodeB的元素的style属性是否一致 + * @method isSameStyle + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的style属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + 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 || !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; + }, + /** + * 检查节点node是否为block元素 + * @method isBlockElm + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是block元素节点 + * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; + * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 + * @example + * ```html + * + * + *
+ * + * + * ``` + */ + 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元素 + * @return { Boolean } 给定的元素是否是body元素 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.isBody( document.body ) ); + * ``` + */ + isBody: function(node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body"; + }, + /** + * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, + * 拆分形成的两个节点之间是node节点 + * @method breakParent + * @param { Node } node 作为分界的节点对象 + * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 + * @return { Node } 给定的node分界节点 + * @example + * ```javascript + * + * var node = document.createElement("span"), + * wrapNode = document.createElement( "div" ), + * parent = document.createElement("p"); + * + * parent.appendChild( node ); + * wrapNode.appendChild( parent ); + * + * //拆分前 + * //output:

+ * console.log( wrapNode.innerHTML ); + * + * + * UE.dom.domUtils.breakParent( node, parent ); + * //拆分后 + * //output:

+ * console.log( wrapNode.innerHTML ); + * + * ``` + */ + 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 需要检测的节点对象 + * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 + * @example + * ```html + * => 1 + * => 1 + * => 1 + * 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; + }, + + /** + * 删除node节点下首尾两端的空白文本子节点 + * @method trimWhiteTextNode + * @param { Element } node 需要执行删除操作的元素对象 + * @example + * ```javascript + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * node.appendChild( document.createElement("div") ); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * //3 + * console.log( node.childNodes.length ); + * + * UE.dom.domUtils.trimWhiteTextNode( node ); + * + * //1 + * 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"); + }, + + /** + * 合并node节点下相同的子节点 + * @name mergeChild + * @desc + * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 + * @example + *

xxaaxx

+ * ==> 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]; + } + } + } + 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); + } + } + + return arr; + }, + /** + * 将节点node提取到父节点上 + * @method mergeToParent + * @param { Element } node 需要提取的元素对象 + * @example + * ```html + *
+ *
+ * + *
+ *
+ * + * + * ``` + */ + 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; + } + }, + /** + * 合并节点node的左右兄弟节点 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @param { Boolean } ignoreNext 是否忽略合并右节点 + * @remind 如果同时忽略左右节点, 则该操作什么也不会做 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + 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); + } + } + !ignorePre && merge("previousSibling", "firstChild", node); + !ignoreNext && merge("nextSibling", "lastChild", node); + }, + + /** + * 设置节点node及其子节点不会被选中 + * @method unSelectable + * @param { Element } node 需要执行操作的dom元素 + * @remind 执行该操作后的节点, 将不能被鼠标选中 + * @example + * ```javascript + * 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"); + } + } + } + : function(node) { + node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = + "none"; + }, + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 + * @example + * ```html + *
+ * xxxxx + *
+ * + * + * ``` + */ + + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { Array } attrNames 需要删除的属性名数组 + * @example + * ```html + *
+ * xxxxx + *
+ * + * + * ``` + */ + 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节点创建 + * @param { String } tagName 需要创建的元素的标签名 + * @param { Object } attrs 新创建的元素的属性key-value集合 + * @return { Element } 新创建的元素对象 + * @example + * ```javascript + * var ele = UE.dom.domUtils.createElement( document, 'div', { + * id: 'test' + * } ); + * + * //output: DIV + * console.log( ele.tagName ); + * + * //output: test + * console.log( ele.id ); + * + * ``` + */ + createElement: function(doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs); + }, + /** + * 为节点node添加属性attrs,attrs为属性键值对 + * @method setAttributes + * @param { Element } node 需要设置属性的元素对象 + * @param { Object } attrs 需要设置的属性名-值对 + * @return { Element } 设置属性的元素对象 + * @example + * ```html + * + * + * + * + */ + setAttributes: function(node, attrs) { + for (var attr in attrs) { + if (attrs.hasOwnProperty(attr)) { + var value = attrs[attr]; + switch (attr) { + case "class": + //ie下要这样赋值,setAttribute不起作用 + node.className = value; + break; + case "style": + node.style.cssText = node.style.cssText + ";" + value; + break; + case "innerHTML": + node[attr] = value; + break; + case "value": + node.value = value; + break; + default: + node.setAttribute(attrFix[attr] || attr, value); + } + } + } + return node; + }, + + /** + * 获取元素element经过计算后的样式值 + * @method getComputedStyle + * @param { Element } element 需要获取样式的元素对象 + * @param { String } styleName 需要获取的样式名 + * @return { String } 获取到的样式值 + * @example + * ```html + * + * + * + * + * + * ``` + */ + 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)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + 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的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + 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 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault: function(evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + 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"]); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
+ * + * + * ``` + */ + getStyle: function(element, name) { + var value = element.style[utils.cssStyleToDomStyle(name)]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
+ * + * + * ``` + */ + 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 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
+ * + * + * ``` + */ + 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"); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
+ * + *
+ * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
+ * + *
+ * + * + * ``` + */ + 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 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode: function(node) { + return ( + !node.firstChild || + domUtils.getChildCount(node, function(node) { + return ( + !domUtils.isBr(node) && + !domUtils.isBookmarkNode(node) && + !domUtils.isWhitespace(node) + ); + }) == 0 + ); + }, + 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 + }; + } + }; + 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"; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @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; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
+ * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @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"); + + 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 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
+ * + * + * ``` + */ + 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 + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
+ * + * + * ``` + */ + 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 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
+ * + *
+ *
+ *
+ *
+ * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
+ * + *
+ *
+ *
+ *
+ * + * + * ``` + */ + 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 + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
xxxx
+ * + * + * ``` + */ + hasNoAttributes: function(node) { + return browser.ie + ? /^<\w+\s*?>/.test(node.outerHTML) + : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode: function(node) { + return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
+ * + * + * ``` + */ + isTagNode: function(node, tagNames) { + return ( + node.nodeType == 1 && + new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) + ); + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * 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; + }, + + /** + * 查询给定的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; + } + 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"); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js new file mode 100644 index 0000000..db4f986 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js @@ -0,0 +1,434 @@ +///import editor.js +///import core/dom/dom.js +///import core/utils.js +/** + * dtd html语义化的体现类 + * @constructor + * @namespace dtd + */ +var dtd = (dom.dtd = (function() { + function _(s) { + for (var k in s) { + s[k.toUpperCase()] = s[k]; + } + 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 + }); + + 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 + }); +})()); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js new file mode 100644 index 0000000..49b0113 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js @@ -0,0 +1,126 @@ +/** + * UE过滤节点的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + +/** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * 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); + } + }); + 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); + } + } + 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; + }; +})()); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js new file mode 100644 index 0000000..8c0872e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js @@ -0,0 +1,226 @@ +/** + * UE过滤word的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + +/** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * 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; + } + + 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); + + for (var i = 0, v; (v = s[i]); i++) { + var name, + value, + parts = v.split(":"); + + 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; + } + + 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 (!/htmlparser

', true); + * ``` + */ + +var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 " + ); + } + html.push(""); + } + //禁止指定table-width + 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; + + //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" + }; + + 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)); + } + } + + 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; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js new file mode 100644 index 0000000..e6d8f9f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js @@ -0,0 +1,48 @@ +var keymap = (UE.keymap = { + Backspace: 8, + Tab: 9, + Enter: 13, + + Shift: 16, + Control: 17, + Alt: 18, + CapsLock: 20, + + Esc: 27, + + Spacebar: 32, + + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + + Left: 37, + Up: 38, + Right: 39, + Down: 40, + + Insert: 45, + + Del: 46, + + NumLock: 144, + + Cmd: 91, + + "=": 187, + "-": 189, + + b: 66, + i: 73, + //回退 + z: 90, + y: 89, + //粘贴 + v: 86, + x: 88, + + s: 83, + + n: 78 +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js new file mode 100644 index 0000000..c6b7949 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js @@ -0,0 +1,72 @@ +;(function() { + UE.Editor.prototype.loadServerConfig = function() { + var me = this; + setTimeout(function() { + try { + me.options.imageUrl && + me.setOpt( + "serverUrl", + me.options.imageUrl.replace( + /^(.*[\/]).+([\.].+)$/, + "$1controller$2" + ) + ); + + 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); + 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' + //}); + } + }; + + 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); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js new file mode 100644 index 0000000..3945ccf --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js @@ -0,0 +1,117 @@ +//存储媒介封装 +var LocalStorage = (UE.LocalStorage = (function() { + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = "localStorage"; + + return { + saveLocalData: function(key, data) { + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + }, + + getLocalData: function(key) { + if (storage) { + return storage.getItem(key); + } + + return null; + }, + + removeItem: function(key) { + storage && storage.removeItem(key); + } + }; + + function getUserData() { + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + getItem: function(key) { + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) {} + + return result; + }, + + setItem: function(key, value) { + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function(key) { + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + } + }; + } +})()); + +;(function() { + var ROOTKEY = "ueditor_preference"; + + UE.Editor.prototype.setPreferences = function(key, value) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function(key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data; + } + return null; + }; + + UE.Editor.prototype.removePreferences = function(key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key]; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js new file mode 100644 index 0000000..35a95b8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js @@ -0,0 +1,772 @@ +/** + * 编辑器模拟的节点类 + * @file + * @module UE + * @class uNode + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +;(function() { + /** + * 编辑器模拟的节点类 + * @unfile + * @module UE + * @class uNode + */ + + /** + * 通过一个键值对,创建一个uNode对象 + * @constructor + * @param { Object } attr 传入要创建的uNode的初始属性 + * @example + * ```javascript + * var node = new uNode({ + * type:'element', + * tagName:'span', + * attrs:{style:'font-size:14px;'} + * }) + * ``` + */ + 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; + }); + + 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); + } + } + + //创建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 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] ? "/" : "") + + ">" + ); + //插入新行 + 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); + } + 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); + } + } + 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; + } + } + } + } + + 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字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml: function(formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join(""); + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * 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(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * 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, ""); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData: function() { + if (this.type == "element") return ""; + return this.data; + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild: function() { + // if (this.type != 'element' || dtd.$empty[this.tagName]) { + // return this; + // } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + 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 } 返回前一个节点 + * @example + * ```javascript + * 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]; + } + } + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * 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]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * 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; + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr: function(attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()]; + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * 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; + } + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * 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; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * 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; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * 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 ""; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * 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; + } + } + + 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 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal: function(fn) { + if (this.children && this.children.length) { + nodeTraversal(this, fn); + } + return this; + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js new file mode 100644 index 0000000..7b57fe8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js @@ -0,0 +1,79 @@ +/** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * 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); + } + }); + } + } 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); + } + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js new file mode 100644 index 0000000..022c3d2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js @@ -0,0 +1,1279 @@ +/** + * 工具函数包 + * @file + * @module UE.utils + * @since 1.2.6.1 + */ + +/** + * UEditor封装使用的静态工具函数 + * @module UE.utils + * @unfile + */ + +var utils = (UE.utils = { + /** + * 用给定的迭代器遍历对象 + * @method each + * @param { Object } obj 需要遍历的对象 + * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key + * @example + * ```javascript + * var demoObj = { + * key1: 1, + * key2: 2 + * }; + * + * //output: key1: 1, key2: 2 + * UE.utils.each( demoObj, funciton ( value, key ) { + * + * console.log( key + ":" + value ); + * + * } ); + * ``` + */ + + /** + * 用给定的迭代器遍历数组或类数组对象 + * @method each + * @param { Array } array 需要遍历的数组或者类数组 + * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key + * @example + * ```javascript + * var divs = document.getElmentByTagNames( "div" ); + * + * //output: 0: DIV, 1: DIV ... + * UE.utils.each( divs, funciton ( value, key ) { + * + * console.log( key + ":" + value.tagName ); + * + * } ); + * ``` + */ + 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 该对象将作为新创建对象的原型 + * @return { Object } 新的对象, 该对象的原型是给定的protoObject对象 + * @example + * ```javascript + * + * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } }; + * + * var newObject = UE.utils.makeInstance( protoObject ); + * //output: Hello UEditor! + * newObject.sayHello(); + * ``` + */ + 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 ); + * + * ``` + */ + + /** + * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与 + * 源对象属性名相同的属性值。 + * @method extend + * @param { Object } target 目标对象, 新的属性将附加到该对象上 + * @param { Object } source 源对象, 该对象的属性会被附加到target对象上 + * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性 + * @return { Object } 返回target对象 + * @example + * ```javascript + * + * var target = { name: 'target', sex: 1 }, + * source = { name: 'source', age: 17 }; + * + * UE.utils.extend( target, source, true ); + * + * //output: { name: 'target', sex: 1, age: 17 } + * console.log( target ); + * + * ``` + */ + extend: function(t, s, b) { + if (s) { + for (var k in s) { + if (!b || !t.hasOwnProperty(k)) { + t[k] = s[k]; + } + } + } + return t; + }, + + /** + * 将给定的多个对象的属性复制到目标对象target上 + * @method extend2 + * @remind 该方法将强制把源对象上的属性复制到target对象上 + * @remind 该方法支持两个及以上的参数, 从第二个参数开始, 其属性都会被复制到第一个参数上。 如果遇到同名的属性, + * 将会覆盖掉之前的值。 + * @param { Object } target 目标对象, 新的属性将附加到该对象上 + * @param { Object... } source 源对象, 支持多个对象, 该对象的属性会被附加到target对象上 + * @return { Object } 返回target对象 + * @example + * ```javascript + * + * var target = {}, + * source1 = { name: 'source', age: 17 }, + * source2 = { title: 'dev' }; + * + * UE.utils.extend2( target, source1, source2 ); + * + * //output: { name: 'source', age: 17, title: 'dev' } + * console.log( target ); + * + * ``` + */ + 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; + }, + + /** + * 模拟继承机制, 使得subClass继承自superClass + * @method inherits + * @param { Object } subClass 子类对象 + * @param { Object } superClass 超类对象 + * @warning 该方法只能让subClass继承超类的原型, subClass对象自身的属性和方法不会被继承 + * @return { Object } 继承superClass后的子类对象 + * @example + * ```javascript + * function SuperClass(){ + * this.name = "小李"; + * } + * + * SuperClass.prototype = { + * hello:function(str){ + * console.log(this.name + str); + * } + * } + * + * function SubClass(){ + * this.name = "小张"; + * } + * + * UE.utils.inherits(SubClass,SuperClass); + * + * var sub = new SubClass(); + * //output: '小张早上好! + * 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); + }, + + /** + * 用指定的context对象作为函数fn的上下文 + * @method bind + * @param { Function } fn 需要绑定上下文的函数对象 + * @param { Object } content 函数fn新的上下文对象 + * @return { Function } 一个新的函数, 该函数作为原始函数fn的代理, 将完成fn的上下文调换工作。 + * @example + * ```javascript + * + * var name = 'window', + * newTest = null; + * + * function test () { + * console.log( this.name ); + * } + * + * newTest = UE.utils.bind( test, { name: 'object' } ); + * + * //output: object + * newTest(); + * + * //output: window + * test(); + * + * ``` + */ + bind: function(fn, context) { + return function() { + return fn.apply(context, arguments); + }; + }, + + /** + * 创建延迟指定时间后执行的函数fn + * @method defer + * @param { Function } fn 需要延迟执行的函数对象 + * @param { int } delay 延迟的时间, 单位是毫秒 + * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, + * 而不能保证刚好到达延迟时间时执行。 + * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 + * @example + * ```javascript + * var start = 0; + * + * function test(){ + * console.log( new Date() - start ); + * } + * + * var testDefer = UE.utils.defer( test, 1000 ); + * // + * start = new Date(); + * //output: (大约在1000毫秒之后输出) 1000 + * testDefer(); + * ``` + */ + + /** + * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值, + * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。 + * @method defer + * @param { Function } fn 需要延迟执行的函数对象 + * @param { int } delay 延迟的时间, 单位是毫秒 + * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数,该值将决定是否取消执行前一次函数的执行, + * 值为true表示取消执行, 反之则将在执行前一次函数之后才执行本次函数调用。 + * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, + * 而不能保证刚好到达延迟时间时执行。 + * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 + * @example + * ```javascript + * + * function test(){ + * console.log(1); + * } + * + * var testDefer = UE.utils.defer( test, 1000, true ); + * + * //output: (两次调用仅有一次输出) 1 + * testDefer(); + * testDefer(); + * ``` + */ + defer: function(fn, delay, exclusion) { + var timerID; + return function() { + if (exclusion) { + clearTimeout(timerID); + } + timerID = setTimeout(fn, delay); + }; + }, + + /** + * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1 + * @method indexOf + * @remind 该方法的匹配过程使用的是恒等“===” + * @param { Array } array 需要查找的数组对象 + * @param { * } item 需要在目标数组中查找的值 + * @return { int } 返回item在目标数组array中首次出现的位置, 如果在数组中未找到item, 则返回-1 + * @example + * ```javascript + * var item = 1, + * arr = [ 3, 4, 6, 8, 1, 1, 2 ]; + * + * //output: 4 + * console.log( UE.utils.indexOf( arr, item ) ); + * ``` + */ + + /** + * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。 + * @method indexOf + * @remind 该方法的匹配过程使用的是恒等“===” + * @param { Array } array 需要查找的数组对象 + * @param { * } item 需要在目标数组中查找的值 + * @param { int } start 搜索的起始位置 + * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置, 如果在数组中未找到item, 则返回-1 + * @example + * ```javascript + * var item = 1, + * arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ]; + * + * //output: 9 + * 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; + }, + + /** + * 移除数组array中所有的元素item + * @method removeItem + * @param { Array } array 要移除元素的目标数组 + * @param { * } item 将要被移除的元素 + * @remind 该方法的匹配过程使用的是恒等“===” + * @example + * ```javascript + * var arr = [ 4, 5, 7, 1, 3, 4, 6 ]; + * + * UE.utils.removeItem( arr, 4 ); + * //output: [ 5, 7, 1, 3, 6 ] + * console.log( arr ); + * + * ``` + */ + 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 需要删除首尾空格的字符串 + * @return { String } 删除了首尾的空格后的字符串 + * @example + * ```javascript + * + * var str = " UEdtior "; + * + * //output: 9 + * console.log( str.length ); + * + * //output: 7 + * console.log( UE.utils.trim( " UEdtior " ).length ); + * + * //output: 9 + * console.log( str.length ); + * + * ``` + */ + trim: function(str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); + }, + + /** + * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 + * @method listToMap + * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 + * @param { String } str 该字符串将被以','分割为数组, 然后进行转化 + * @return { Object } 转化之后的hash对象 + * @example + * ```javascript + * + * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} + * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) ); + * + * ``` + */ + + /** + * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 + * @method listToMap + * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 + * @param { Array } arr 字符串数组 + * @return { Object } 转化之后的hash对象 + * @example + * ```javascript + * + * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} + * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) ); + * + * ``` + */ + 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 需要转义的字符串 + * @return { String } 转义后的字符串 + * @example + * ```javascript + * var html = '&'; + * + * //output: <body>&</body> + * console.log( UE.utils.unhtml( html ) ); + * + * ``` + */ + 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 + * @param { String } str 需要逆转义的字符串 + * @return { String } 逆转义后的字符串 + * @example + * ```javascript + * + * var str = '<body>&</body>'; + * + * //output: & + * console.log( UE.utils.html( str ) ); + * + * ``` + */ + 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样式名 + * @return { String } 转换成驼峰形式后的css样式名 + * @example + * ```javascript + * + * var str = 'border-top'; + * + * //output: borderTop + * console.log( UE.utils.cssStyleToDomStyle( str ) ); + * + * ``` + */ + 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(); + })) + ); + }; + })(), + + /** + * 动态加载文件到doc中 + * @method loadFile + * @param { DomDocument } document 需要加载资源文件的文档对象 + * @param { Object } options 加载资源文件的属性集合, 取值请参考代码示例 + * @example + * ```javascript + * + * UE.utils.loadFile( document, { + * src:"test.js", + * tag:"script", + * type:"text/javascript", + * defer:"defer" + * } ); + * + * ``` + */ + + /** + * 动态加载文件到doc中,加载成功后执行的回调函数fn + * @method loadFile + * @param { DomDocument } document 需要加载资源文件的文档对象 + * @param { Object } options 加载资源文件的属性集合, 该集合支持的值是script标签和style标签支持的所有属性。 + * @param { Function } fn 资源文件加载成功之后执行的回调 + * @warning 对于在同一个文档中多次加载同一URL的文件, 该方法会在第一次加载之后缓存该请求, + * 在此之后的所有同一URL的请求, 将会直接触发回调。 + * @example + * ```javascript + * + * UE.utils.loadFile( document, { + * src:"test.js", + * tag:"script", + * type:"text/javascript", + * defer:"defer" + * }, function () { + * console.log('加载成功'); + * } ); + * + * ``` + */ + 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(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function() { + throw Error( + "The load " + + (obj.href || obj.src) + + " fails,check the url settings of file neditor.config.js " + ); + }; + doc.getElementsByTagName("head")[0].appendChild(element); + }; + })(), + + /** + * 判断obj对象是否为空 + * @method isEmptyObject + * @param { * } obj 需要判断的对象 + * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空, + * 返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true + * @return { Boolean } 对象是否为空 + * @example + * ```javascript + * + * //output: true + * console.log( UE.utils.isEmptyObject( {} ) ); + * + * //output: true + * console.log( UE.utils.isEmptyObject( [] ) ); + * + * //output: true + * console.log( UE.utils.isEmptyObject( "" ) ); + * + * //output: false + * console.log( UE.utils.isEmptyObject( { key: 1 } ) ); + * + * //output: false + * console.log( UE.utils.isEmptyObject( [1] ) ); + * + * //output: false + * console.log( UE.utils.isEmptyObject( "1" ) ); + * + * ``` + */ + 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格式的颜色值 + * @param { String } + * @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; + }, + /** + * 只针对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; + } + } + 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 + ";;" : ";"; + }); + }, + + /** + * 克隆对象 + * @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; + } + } + } + return target; + }, + + /** + * 把cm/pt为单位的值转换为px为单位的值 + * @method transUnitToPx + * @param { String } 待转换的带单位的字符串 + * @return { String } 转换为px为计量单位的值的字符串 + * @example + * ```javascript + * + * //output: 500px + * console.log( UE.utils.transUnitToPx( '20cm' ) ); + * + * //output: 27px + * console.log( UE.utils.transUnitToPx( '20pt' ) ); + * + * ``` + */ + 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, 那么回调函数将立刻执行 + * @param { Function } fn dom树ready之后的回调函数 + * @example + * ```javascript + * + * UE.utils.domReady( function () { + * + * console.log('123'); + * + * } ); + * + * ``` + */ + 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; + } + 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 } 节点名称 + * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上']) + * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null //给body添加背景颜色 + * @grammar UE.utils.cssRule('body') =>样式的字符串 //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc} + * @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; + }, + 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)); + } + } + } + result.push("}"); + return result.join(""); + } + } + }; + } + })(), + renderTplstr: function(tpl, data) { + return tpl.replace(/\$\{\s*(\w*?)\s*\}/g, function (match, variable) { + if (data.hasOwnProperty(variable)) { + return data[variable]; + } + }); + } +}); +/** + * 判断给定的对象是否是字符串 + * @method isString + * @param { * } object 需要判断的对象 + * @return { Boolean } 给定的对象是否是字符串 + */ + +/** + * 判断给定的对象是否是数组 + * @method isArray + * @param { * } object 需要判断的对象 + * @return { Boolean } 给定的对象是否是数组 + */ + +/** + * 判断给定的对象是否是一个Function + * @method isFunction + * @param { * } object 需要判断的对象 + * @return { Boolean } 给定的对象是否是Function + */ + +/** + * 判断给定的对象是否是Number + * @method isNumber + * @param { * } object 需要判断的对象 + * @return { Boolean } 给定的对象是否是Number + */ + +/** + * 判断给定的对象是否是一个正则表达式 + * @method isRegExp + * @param { * } object 需要判断的对象 + * @return { Boolean } 给定的对象是否是正则表达式 + */ + +/** + * 判断给定的对象是否是一个普通对象 + * @method isObject + * @param { * } object 需要判断的对象 + * @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 + "]"; + }; + } +); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js new file mode 100644 index 0000000..eea033e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js @@ -0,0 +1,15 @@ +UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}; + +var baidu = window.baidu || {}; + +window.baidu = baidu; + +window.UE = baidu.editor = { + plugins: {}, + commands: {}, + instants: {}, + I18N: {}, + _customizeUI: {}, + version: "1.5.0" +}; +var dom = (UE.dom = {}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js new file mode 100644 index 0000000..329a378 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js @@ -0,0 +1,91 @@ +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register("anchor", function () { + var me = this; + 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: 16px;}", + 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); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = utils.renderTplstr('', { + name: name + }); + me.execCommand("inserthtml", anchor, true); + } + } + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js new file mode 100644 index 0000000..92716a4 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js @@ -0,0 +1,157 @@ +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 +/** + * 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; + + //如果不固定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; + } + + 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); + //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar + var scrollBox = document.getElementById("scrollBox"); + if (scrollBox) { + domUtils.un(scrollBox, ['scroll','resize'], 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 = me.ui.getDom("iframeholder").offsetHeight + "px"; + if (LteIE6) { + fixIE6FixedPos(); + } + domUtils.on(window, ["scroll", "resize"], updateFloating); + me.addListener("keydown", defer_updateFloating); + //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar + var scrollBox = document.getElementById("scrollBox"); + if (scrollBox) { + domUtils.on(scrollBox, ['scroll','resize'], 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); + }); + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js new file mode 100644 index 0000000..193c71e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js @@ -0,0 +1,125 @@ +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 +/** + * @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() { + 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; + } + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js new file mode 100644 index 0000000..bb8c29a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js @@ -0,0 +1,218 @@ +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 +/** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + +UE.plugin.register( + "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; + + 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; + } + + 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); + + 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(); + } + } + } + } + } + : {}; + }, + 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; + + 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; + } + } + 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); + } + } + } + }); + } +); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js new file mode 100644 index 0000000..7bf11ae --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js @@ -0,0 +1,128 @@ +UE.plugin.register("autosave", function() { + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save(editor) { + var saveData; + + if (new Date() - lastSaveTime < MIN_TIME) { + return; + } + + if (!editor.hasContents()) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences(saveKey); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( + editor.fireEvent("beforeautosave", { + content: saveData + }) === false + ) { + return; + } + + me.setPreferences(saveKey, saveData); + + editor.fireEvent("afterautosave", { + content: saveData + }); + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500, + enableAutoSave: true + }, + bindEvents: { + ready: function() { + var _suffix = "-drafts-data", + key = null; + + if (me.key) { + key = me.key + _suffix; + } else { + key = (me.container.parentNode.id || "ue-common") + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = + (location.protocol + location.host + location.pathname).replace( + /[.:\/]/g, + "_" + ) + key; + }, + + contentchange: function() { + if (!me.getOpt("enableAutoSave")) { + return; + } + + if (!saveKey) { + return; + } + + if (me._saveFlag) { + window.clearTimeout(me._saveFlag); + } + + if (me.options.saveInterval > 0) { + me._saveFlag = window.setTimeout(function() { + save(me); + }, me.options.saveInterval); + } else { + save(me); + } + } + }, + commands: { + clearlocaldata: { + execCommand: function(cmd, name) { + if (saveKey && me.getPreferences(saveKey)) { + me.removePreferences(saveKey); + } + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + getlocaldata: { + execCommand: function(cmd, name) { + return saveKey ? me.getPreferences(saveKey) || "" : ""; + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + drafts: { + execCommand: function(cmd, name) { + if (saveKey) { + window.setTimeout(function(){ + me.body.innerHTML = + me.getPreferences(saveKey) || "

    " + domUtils.fillHtml + "

    "; + // me.focus(true); + }, 0); + } + }, + queryCommandState: function() { + return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1; + }, + notNeedUndo: true, + ignoreContentChange: true + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js new file mode 100644 index 0000000..5165efe --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js @@ -0,0 +1,39 @@ +/** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + +/** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + +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(); + } + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js new file mode 100644 index 0000000..680db58 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js @@ -0,0 +1,354 @@ +/** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + +/** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + +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 + } + }); + + 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) { + 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"); + + 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); + } + }); + 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); + } + }); + 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) { + me.addListener("beforepaste", autotype); + } + autotype.call(me); + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js new file mode 100644 index 0000000..7579d31 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js @@ -0,0 +1,229 @@ +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UE.plugin.register("autoupload", function() { + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, + urlPrefix, + maxSize, + allowFiles, + actionUrl, + loadingHtml, + errorHandler, + successHandler, + filetype = /image\/\w+/i.test(file.type) ? "image" : "file", + loadingId = "loading_" + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + "FieldName"); + urlPrefix = me.getOpt(filetype + "UrlPrefix"); + maxSize = me.getOpt(filetype + "MaxSize"); + allowFiles = me.getOpt(filetype + "AllowFiles"); + actionUrl = me.getActionUrl(me.getOpt(filetype + "ActionName")); + errorHandler = function(title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent("showmessage", { + id: loadingId, + content: title, + type: "error", + timeout: 4000 + }); + }; + + if (filetype == "image") { + loadingHtml = + ''; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + domUtils.removeClasses(loader, "loadingclass"); + loader.setAttribute("src", link); + loader.setAttribute("_src", link); + loader.setAttribute("alt", data.original || ""); + loader.removeAttribute("id"); + me.trigger("contentchange", loader); + } + }; + } else { + loadingHtml = + "

    " + + '' + + "

    "; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand("insertfile", { url: link }); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand("inserthtml", loadingHtml); + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + "ActionName")) { + errorHandler(me.getLang("autoupload.errorLoadConfig")); + return; + } + /* 判断文件大小是否超出限制 */ + if (file.size > maxSize) { + errorHandler(me.getLang("autoupload.exceedSizeError")); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf(".")) : ""; + if ( + (fileext && filetype != "image") || + (allowFiles && + (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") == -1) + ) { + errorHandler(me.getLang("autoupload.exceedTypeError")); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue("serverparam")) || "", + url = utils.formatUrl( + actionUrl + (actionUrl.indexOf("?") == -1 ? "?" : "&") + params + ); + + fd.append( + fieldName, + file, + file.name || "blob." + file.type.substr("image/".length) + ); + fd.append("type", "ajax"); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener("load", function(e) { + try { + var json = new Function("return " + utils.trim(e.target.response))(); + if (json.state == "SUCCESS" && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + } catch (er) { + errorHandler(me.getLang("autoupload.loadError")); + } + }); + xhr.send(fd); + } + + function getPasteImage(e) { + return e.clipboardData && + e.clipboardData.items && + e.clipboardData.items.length == 1 && + /^image\//.test(e.clipboardData.items[0].type) + ? e.clipboardData.items + : null; + } + function getDropImage(e) { + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; + } + + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(n) { + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName("p"), function(n) { + if (/\bloadpara\b/.test(n.getAttr("class"))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents: { + defaultOptions: { + //默认间隔时间 + enableDragUpload: true, + enablePasteUpload: true + }, + //插入粘贴板的图片,拖放插入图片 + ready: function(e) { + var me = this; + if (window.FormData && window.FileReader) { + var handler = function(e) { + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == "paste" ? getPasteImage(e) : getDropImage(e); + if (items) { + var len = items.length, + file; + while (len--) { + file = items[len]; + if (file.getAsFile) file = file.getAsFile(); + if (file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + }; + + if (me.getOpt("enablePasteUpload") !== false) { + domUtils.on(me.body, "paste ", handler); + } + if (me.getOpt("enableDragUpload") !== false) { + domUtils.on(me.body, "drop", handler); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, "dragover", function(e) { + if (e.dataTransfer.types[0] == "Files") { + e.preventDefault(); + } + }); + } else { + if (browser.gecko) { + domUtils.on(me.body, "drop", function(e) { + if (getDropImage(e)) { + e.preventDefault(); + } + }); + } + } + + //设置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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" + + "}", + this.document + ); + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js new file mode 100644 index 0000000..bccaf2a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js @@ -0,0 +1,130 @@ +/** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ +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); + } + } + //重写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 + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js new file mode 100644 index 0000000..70ebae1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js @@ -0,0 +1,152 @@ +/** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["basestyle"] = function() { + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + bold: ["strong", "b"], + italic: ["em", "i"], + subscript: ["sub"], + superscript: ["sup"] + }, + getObj = function(editor, tagNames) { + return domUtils.filterNodeList( + editor.selection.getStartElementPath(), + tagNames + ); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + Bold: "ctrl+66", //^B + Italic: "ctrl+73", //^I + Underline: "ctrl+85" //^U + }); + me.addInputRule(function(root) { + utils.each(root.getNodesByTagName("b i"), function(node) { + switch (node.tagName) { + case "b": + node.tagName = "strong"; + break; + case "i": + node.tagName = "em"; + } + }); + }); + for (var style in basestyles) { + (function(cmd, tagNames) { + me.commands[cmd] = { + execCommand: function(cmdName) { + var range = me.selection.getRange(), + obj = getObj(this, tagNames); + if (range.collapsed) { + if (obj) { + var tmpText = me.document.createTextNode(""); + range.insertNode(tmpText).removeInlineStyle(tagNames); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement(tagNames[0]); + if (cmdName == "superscript" || cmdName == "subscript") { + tmpText = me.document.createTextNode(""); + range + .insertNode(tmpText) + .removeInlineStyle(["sub", "sup"]) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode(tmpNode).setStart(tmpNode, 0); + } + range.collapse(true); + } else { + if (cmdName == "superscript" || cmdName == "subscript") { + if (!obj || obj.tagName.toLowerCase() != cmdName) { + range.removeInlineStyle(["sub", "sup"]); + } + } + obj + ? range.removeInlineStyle(tagNames) + : range.applyInlineStyle(tagNames[0]); + } + range.select(); + }, + queryCommandState: function() { + return getObj(this, tagNames) ? 1 : 0; + } + }; + })(style, basestyles[style]); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js new file mode 100644 index 0000000..32bf13c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js @@ -0,0 +1,188 @@ +/** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + +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(); + + 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; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js new file mode 100644 index 0000000..b0ca131 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js @@ -0,0 +1,177 @@ +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 +/** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ +UE.plugins["catchremoteimage"] = function() { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function() { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function() { + var catcherLocalDomain = me.getOpt("catcherLocalDomain"), + catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), + catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), + catcherFieldName = me.getOpt("catcherFieldName"); + + var remoteImages = [], + loadingIMG = me.options.themePath + me.options.theme + '/images/spacer.gif', + imgs = me.document.querySelectorAll('[style*="url"],img'), + test = function(src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; (url = urls[j++]); ) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; (ci = imgs[i++]); ) { + if (ci.getAttribute("word_img")) { + continue; + } + if(ci.nodeName == "IMG"){ + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + // 添加上传时的uploading动画 + domUtils.setAttributes(ci, { + class: "loadingclass", + _src: src, + src: loadingIMG + }) + } + } else { + // 获取背景图片url + var backgroundImageurl = ci.style.cssText.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, ''); + if (/^(https?|ftp):/i.test(backgroundImageurl) && !test(backgroundImageurl, catcherLocalDomain)) { + remoteImages.push(backgroundImageurl); + ci.style.cssText = ci.style.cssText.replace(backgroundImageurl, loadingIMG); + domUtils.setAttributes(ci, { + "data-background": backgroundImageurl + }) + } + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function(r) { + try { + var info = r.state !== undefined + ? r + : eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, + j, + ci, + cj, + oldSrc, + newSrc, + list = info.list; + + /* 抓取失败统计 */ + var catchFailList = []; + /* 抓取成功统计 */ + var catchSuccessList = []; + /* 抓取失败时显示的图片 */ + var failIMG = me.options.themePath + me.options.theme + '/images/img-cracked.png'; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + oldBgIMG = ci.getAttribute("data-background") || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { + newSrc = catcherUrlPrefix + cj.url; + // 上传成功是删除uploading动画 + domUtils.removeClasses( ci, "loadingclass" ); + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc, + "data-catchResult":"img_catchSuccess" // 添加catch成功标记 + }); + catchSuccessList.push(ci); + break; + } else if (oldSrc == cj.source && cj.state == "FAIL") { + // 替换成统一的失败图片 + domUtils.removeClasses( ci, "loadingclass" ); + domUtils.setAttributes(ci, { + "src": failIMG, + "_src": failIMG, + "data-catchResult":"img_catchFail" // 添加catch失败标记 + }); + catchFailList.push(ci); + break; + } else if (oldBgIMG == cj.source && cj.state == "SUCCESS") { + newBgIMG = catcherUrlPrefix + cj.url; + ci.style.cssText = ci.style.cssText.replace(loadingIMG, newBgIMG); + domUtils.removeAttributes(ci,"data-background"); + domUtils.setAttributes(ci, { + "data-catchResult":"img_catchSuccess" // 添加catch成功标记 + }); + catchSuccessList.push(ci); + break; + } else if (oldBgIMG == cj.source && cj.state == "FAIL"){ + ci.style.cssText = ci.style.cssText.replace(loadingIMG, failIMG); + domUtils.removeAttributes(ci,"data-background"); + domUtils.setAttributes(ci, { + "data-catchResult":"img_catchFail" // 添加catch失败标记 + }); + catchFailList.push(ci); + break; + } + } + + } + // 监听事件添加成功抓取和抓取失败的dom列表参数 + me.fireEvent('catchremotesuccess',catchSuccessList,catchFailList); + }, + //回调失败,本次请求超时 + error: function() { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = + utils.serializeParam(me.queryCommandValue("serverparam")) || "", + url = utils.formatUrl( + catcherActionUrl + + (catcherActionUrl.indexOf("?") == -1 ? "?" : "&") + + params + ), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + method: "POST", + dataType: isJsonp ? "jsonp" : "", + timeout: 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + onsuccess: callbacks["success"], + onerror: callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js new file mode 100644 index 0000000..82ed1cf --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js @@ -0,0 +1,127 @@ +UE.plugin.register("charts", function() { + var me = this; + + return { + bindEvents: { + chartserror: function() {} + }, + commands: { + charts: { + execCommand: function(cmd, data) { + var tableNode = domUtils.findParentByTagName( + this.selection.getRange().startContainer, + "table", + true + ), + flagText = [], + config = {}; + + if (!tableNode) { + return false; + } + + if (!validData(tableNode)) { + me.fireEvent("chartserror"); + return false; + } + + config.title = data.title || ""; + config.subTitle = data.subTitle || ""; + config.xTitle = data.xTitle || ""; + config.yTitle = data.yTitle || ""; + config.suffix = data.suffix || ""; + config.tip = data.tip || ""; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ""; + //图表类型 + config.chartType = data.chartType || 0; + + for (var key in config) { + if (!config.hasOwnProperty(key)) { + continue; + } + + flagText.push(key + ":" + config[key]); + } + + tableNode.setAttribute("data-chart", flagText.join(";")); + domUtils.addClass(tableNode, "edui-charts-table"); + }, + queryCommandState: function(cmd, name) { + var tableNode = domUtils.findParentByTagName( + this.selection.getRange().startContainer, + "table", + true + ); + return tableNode && validData(tableNode) ? 0 : -1; + } + } + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("table"), function(tableNode) { + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style"); + } + }); + }, + outputRule: function(root) { + utils.each(root.getNodesByTagName("table"), function(tableNode) { + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style", "display: none;"); + } + }); + } + }; + + function validData(table) { + var firstRows = null, + cellCount = 0; + + //行数不够 + if (table.rows.length < 2) { + return false; + } + + //列数不够 + if (table.rows[0].cells.length < 2) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[0].cells; + cellCount = firstRows.length; + + for (var i = 0, cell; (cell = firstRows[i]); i++) { + if (cell.tagName.toLowerCase() !== "th") { + return false; + } + } + + for (var i = 1, row; (row = table.rows[i]); i++) { + //每行单元格数不匹配, 返回false + if (row.cells.length != cellCount) { + return false; + } + + //第一列不是th也返回false + if (row.cells[0].tagName.toLowerCase() !== "th") { + return false; + } + + for (var j = 1, cell; (cell = row.cells[j]); j++) { + var value = utils.trim(cell.innerText || cell.textContent || ""); + + value = value + .replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "") + .replace(/^\s+|\s+$/g, ""); + + //必须是数字 + if (!/^\d*\.?\d+$/.test(value)) { + return false; + } + } + } + + return true; + } +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js new file mode 100644 index 0000000..63bee09 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js @@ -0,0 +1,35 @@ +/** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + +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); + } + setTimeout(function() { + me.fireEvent("clearDoc"); + }, 0); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js new file mode 100644 index 0000000..9c50532 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js @@ -0,0 +1,534 @@ +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins["contextmenu"] = function() { + var me = this; + + me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true); + + if (me.getOpt("enableContextMenu") === false) { + return; + } + var lang = me.getLang("contextMenu"), + menu, + items = me.options.contextMenu || [ + { label: lang["selectall"], cmdName: "selectall" }, + { + label: lang.cleardoc, + cmdName: "cleardoc", + exec: function() { + if (confirm(lang.confirmclear)) { + this.execCommand("cleardoc"); + } + } + }, + "-", + { + label: lang.unlink, + cmdName: "unlink" + }, + "-", + { + group: lang.paragraph, + icon: "justifyjustify", + subMenu: [ + { + label: lang.justifyleft, + cmdName: "justify", + value: "left" + }, + { + label: lang.justifyright, + cmdName: "justify", + value: "right" + }, + { + label: lang.justifycenter, + cmdName: "justify", + value: "center" + }, + { + label: lang.justifyjustify, + cmdName: "justify", + value: "justify" + } + ] + }, + "-", + { + group: lang.table, + icon: "table", + subMenu: [ + { + label: lang.inserttable, + cmdName: "inserttable" + }, + { + label: lang.deletetable, + cmdName: "deletetable" + }, + "-", + { + label: lang.deleterow, + cmdName: "deleterow" + }, + { + label: lang.deletecol, + cmdName: "deletecol" + }, + { + label: lang.insertcol, + cmdName: "insertcol" + }, + { + label: lang.insertcolnext, + cmdName: "insertcolnext" + }, + { + label: lang.insertrow, + cmdName: "insertrow" + }, + { + label: lang.insertrownext, + cmdName: "insertrownext" + }, + "-", + { + label: lang.insertcaption, + cmdName: "insertcaption" + }, + { + label: lang.deletecaption, + cmdName: "deletecaption" + }, + { + label: lang.inserttitle, + cmdName: "inserttitle" + }, + { + label: lang.deletetitle, + cmdName: "deletetitle" + }, + { + label: lang.inserttitlecol, + cmdName: "inserttitlecol" + }, + { + label: lang.deletetitlecol, + cmdName: "deletetitlecol" + }, + "-", + { + label: lang.mergecells, + cmdName: "mergecells" + }, + { + label: lang.mergeright, + cmdName: "mergeright" + }, + { + label: lang.mergedown, + cmdName: "mergedown" + }, + "-", + { + label: lang.splittorows, + cmdName: "splittorows" + }, + { + label: lang.splittocols, + cmdName: "splittocols" + }, + { + label: lang.splittocells, + cmdName: "splittocells" + }, + "-", + { + label: lang.averageDiseRow, + cmdName: "averagedistributerow" + }, + { + label: lang.averageDisCol, + cmdName: "averagedistributecol" + }, + "-", + { + label: lang.edittd, + cmdName: "edittd", + exec: function() { + if (UE.ui["edittd"]) { + new UE.ui["edittd"](this); + } + this.getDialog("edittd").open(); + } + }, + { + label: lang.edittable, + cmdName: "edittable", + exec: function() { + if (UE.ui["edittable"]) { + new UE.ui["edittable"](this); + } + this.getDialog("edittable").open(); + } + }, + { + label: lang.setbordervisible, + cmdName: "setbordervisible" + } + ] + }, + { + group: lang.tablesort, + icon: "tablesort", + subMenu: [ + { + label: lang.enablesort, + cmdName: "enablesort" + }, + { + label: lang.disablesort, + cmdName: "disablesort" + }, + "-", + { + label: lang.reversecurrent, + cmdName: "sorttable", + value: "reversecurrent" + }, + { + label: lang.orderbyasc, + cmdName: "sorttable", + value: "orderbyasc" + }, + { + label: lang.reversebyasc, + cmdName: "sorttable", + value: "reversebyasc" + }, + { + label: lang.orderbynum, + cmdName: "sorttable", + value: "orderbynum" + }, + { + label: lang.reversebynum, + cmdName: "sorttable", + value: "reversebynum" + } + ] + }, + { + group: lang.borderbk, + icon: "borderBack", + subMenu: [ + { + label: lang.setcolor, + cmdName: "interlacetable", + exec: function() { + this.execCommand("interlacetable"); + } + }, + { + label: lang.unsetcolor, + cmdName: "uninterlacetable", + exec: function() { + this.execCommand("uninterlacetable"); + } + }, + { + label: lang.setbackground, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["#bbb", "#ccc"] + }); + } + }, + { + label: lang.unsetbackground, + cmdName: "cleartablebackground", + exec: function() { + this.execCommand("cleartablebackground"); + } + }, + { + label: lang.redandblue, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["red", "blue"] + }); + } + }, + { + label: lang.threecolorgradient, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["#aaa", "#bbb", "#ccc"] + }); + } + } + ] + }, + { + group: lang.aligntd, + icon: "aligntd", + subMenu: [ + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "bottom" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "bottom" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "bottom" } + } + ] + }, + { + group: lang.aligntable, + icon: "aligntable", + subMenu: [ + { + cmdName: "tablealignment", + className: "left", + label: lang.tableleft, + value: "left" + }, + { + cmdName: "tablealignment", + className: "center", + label: lang.tablecenter, + value: "center" + }, + { + cmdName: "tablealignment", + className: "right", + label: lang.tableright, + value: "right" + } + ] + }, + "-", + { + label: lang.insertparagraphbefore, + cmdName: "insertparagraph", + value: true + }, + { + label: lang.insertparagraphafter, + cmdName: "insertparagraph" + }, + { + label: lang["copy"], + cmdName: "copy" + }, + { + label: lang["paste"], + cmdName: "paste" + } + ]; + if (!items.length) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener("contextmenu", function(type, evt) { + var offset = uiUtils.getViewportOffsetByEvent(evt); + me.fireEvent("beforeselectionchange"); + if (menu) { + menu.destroy(); + } + for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) { + var last; + (function(item) { + if (item == "-") { + if ((last = contextItems[contextItems.length - 1]) && last !== "-") { + contextItems.push("-"); + } + } else if (item.hasOwnProperty("group")) { + for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) { + (function(subItem) { + if (subItem == "-") { + if ((last = subMenu[subMenu.length - 1]) && last !== "-") { + subMenu.push("-"); + } else { + subMenu.splice(subMenu.length - 1); + } + } else { + if ( + (me.commands[subItem.cmdName] || + UE.commands[subItem.cmdName] || + subItem.query) && + (subItem.query + ? subItem.query() + : me.queryCommandState(subItem.cmdName)) > -1 + ) { + subMenu.push({ + label: + subItem.label || + me.getLang( + "contextMenu." + + subItem.cmdName + + (subItem.value || "") + ) || + "", + className: + "edui-for-" + + subItem.cmdName + + (subItem.className + ? " edui-for-" + + subItem.cmdName + + "-" + + subItem.className + : ""), + onclick: subItem.exec + ? function() { + subItem.exec.call(me); + } + : function() { + me.execCommand(subItem.cmdName, subItem.value); + } + }); + } + } + })(cj); + } + if (subMenu.length) { + function getLabel() { + switch (item.icon) { + case "table": + return me.getLang("contextMenu.table"); + case "justifyjustify": + return me.getLang("contextMenu.paragraph"); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default: + return ""; + } + } + contextItems.push({ + //todo 修正成自动获取方式 + label: getLabel(), + className: "edui-for-" + item.icon, + subMenu: { + items: subMenu, + editor: me + } + }); + } + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ( + (me.commands[item.cmdName] || + UE.commands[item.cmdName] || + item.query) && + (item.query + ? item.query.call(me) + : me.queryCommandState(item.cmdName)) > -1 + ) { + contextItems.push({ + label: item.label || me.getLang("contextMenu." + item.cmdName), + className: + "edui-for-" + + (item.icon ? item.icon : item.cmdName + (item.value || "")), + onclick: item.exec + ? function() { + item.exec.call(me); + } + : function() { + me.execCommand(item.cmdName, item.value); + } + }); + } + } + })(ti); + } + if (contextItems[contextItems.length - 1] == "-") { + contextItems.pop(); + } + + menu = new UE.ui.Menu({ + items: contextItems, + className: "edui-contextmenu", + editor: me + }); + menu.render(); + menu.showAt(offset); + + me.fireEvent("aftershowcontextmenu", menu); + + domUtils.preventDefault(evt); + if (browser.ie) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + } + } + }); + + // 添加复制的flash按钮 + me.addListener("aftershowcontextmenu", function(type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == "edui-for-copy") { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js new file mode 100644 index 0000000..be0b025 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js @@ -0,0 +1,57 @@ +/** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + +/** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + +/** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ +UE.commands["touppercase"] = UE.commands["tolowercase"] = { + 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(); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js new file mode 100644 index 0000000..cd4cadc --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js @@ -0,0 +1,80 @@ +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" + }); + + var client = (me.zeroclipboard = new ZeroClipboard()); + + // 复制内容 + 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(); + }); + + // 触发事件 + 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")); + } + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js new file mode 100644 index 0000000..da3e76d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js @@ -0,0 +1,181 @@ +/** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ +UE.plugins["customstyle"] = function() { + var me = this; + me.setOpt({ + customstyle: [ + { + tag: "h1", + name: "tc", + style: + "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;" + }, + { + tag: "h1", + name: "tl", + style: + "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;" + }, + { + tag: "span", + name: "im", + style: + "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;" + }, + { + tag: "span", + name: "hi", + style: + "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;" + } + ] + }); + me.commands["customstyle"] = { + execCommand: function(cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label"); + }, + true + ), + range, + bk, + tmpObj = {}; + for (var p in obj) { + if (obj[p] !== undefined) tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute("label") == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if (dtd.$block[node.tagName]) { + var fillNode = me.document.createElement("p"); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + } else { + domUtils.remove(node, true); + } + } else { + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if (new RegExp(tagName, "i").test(common.tagName)) { + nodes.push(common); + } + for (var i = 0, ni; (ni = nodes[i++]); ) { + if (ni.getAttribute("label") == obj.label) { + var ps = domUtils.getPosition(ni, bk.start), + pe = domUtils.getPosition(ni, bk.end); + if ( + (ps & domUtils.POSITION_FOLLOWING || + ps & domUtils.POSITION_CONTAINS) && + (pe & domUtils.POSITION_PRECEDING || + pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement("p"); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent( + common, + function(node) { + return node.getAttribute("label") == obj.label; + }, + true + ); + if (node) { + domUtils.remove(node, true); + } + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand("paragraph", tagName, tmpObj, "customstyle"); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label") == obj.label; + }, + true + ); + var pNode = me.document.createElement("p"); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + }, + queryCommandValue: function() { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function(node) { + return node.getAttribute("label"); + } + ); + return parent ? parent.getAttribute("label") : ""; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener("keyup", function(type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label"); + }, + true + ); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement("p"); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js new file mode 100644 index 0000000..89b1e28 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js @@ -0,0 +1,276 @@ +///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); + // } + }); + }); + + //从编辑器出去的内容处理 + 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: "" + }); + } + } + } + }); + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js new file mode 100644 index 0000000..21c0c45 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js @@ -0,0 +1,132 @@ +/** + * 设置文字输入的方向的插件 + * @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); + }, + 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; + } + + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * 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); + } + + range.select(); + return true; + }, + queryCommandValue: function() { + var node = getObj(this); + return node ? node.getAttribute("dir") : "ltr"; + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js new file mode 100644 index 0000000..ab99589 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js @@ -0,0 +1,65 @@ +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 ( + ((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"); + } + } + }); + }); + 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"); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js new file mode 100644 index 0000000..1f5b7a6 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js @@ -0,0 +1,42 @@ +/** + * 选取路径命令 + * @file + */ +UE.plugins["elementpath"] = function() { + var currentLevel, + tagNames, + me = this; + me.setOpt("elementPathEnabled", true); + if (!me.options.elementPathEnabled) { + return; + } + me.commands["elementpath"] = { + execCommand: function(cmdName, level) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level * 1; + range.selectNode(start).select(); + }, + queryCommandValue: function() { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for (var i = 0, ci; (ci = parents[i]); i++) { + if (ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if (name == "img" && ci.getAttribute("anchorname")) { + name = "anchor"; + } + names[i] = name; + if (currentLevel == i) { + currentLevel = -1; + break; + } + } + return names; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js new file mode 100644 index 0000000..d8728a4 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js @@ -0,0 +1,200 @@ +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @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; + + //修正在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(); + } + } + //没有站位符,会出现多行的问题 + 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(); + } 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(); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js new file mode 100644 index 0000000..7da97c0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js @@ -0,0 +1,382 @@ +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///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 }; + } + + (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] + ]; + + Scale.prototype = { + init: function(editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = { x: 0, y: 0 }; + me.dragId = -1; + + var hands = [], + cover = (me.cover = document.createElement("div")), + resizer = (me.resizer = document.createElement("div")); + + 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(); + }); + + 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 + + ";"; + + 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, + pressMouseLeft = e.buttons === undefined ? e.which === 1 : e.buttons === 1; + 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 && pressMouseLeft) { + 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); + + var doc = me.editor.document; + domUtils.setStyles(resizer, { + width: target.width + "px", + height: target.height + "px", + left: + iframePos.x + + imgPos.x - + (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0) - + editorPos.x - + parseInt(resizer.style.borderLeftWidth) + + "px", + top: + iframePos.y + + imgPos.y - + (doc.documentElement.scrollTop || doc.body.scrollTop || 0) - + 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") { + if ( + img.className.indexOf("edui-faked-music") != -1 || + 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); + } + }, + 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(); + } + }); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js new file mode 100644 index 0000000..5968df7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js @@ -0,0 +1,556 @@ +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + +/** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + +/** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + +/** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ +/** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + +/** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ +/** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + +/** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + +/** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + +/** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + +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] + }); + + 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) { + rng.traversal(function(node){ + var start; + if(domUtils.isTagNode(node,'span')){ + start = node; + }else{ + start = domUtils.getElementsByTagName(node,'span')[0]; + } + 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); + } + }); + } + } + } + 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); + } + 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) + ); + }); + if (parent && !/background-color/.test(span.style.cssText)) { + span.style.backgroundColor = parent.style.backgroundColor; + } + } + }); + 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"; + }); + // 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.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; + + 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); + + 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); + } + + 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; + } + 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]); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js new file mode 100644 index 0000000..9161c6e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js @@ -0,0 +1,124 @@ +/** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + +/** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ +UE.plugins["formatmatch"] = function() { + var me = this, + list = [], + img, + flag = 0; + + me.addListener("reset", function() { + list = []; + flag = 0; + }); + + function addList(type, evt) { + if (browser.webkit) { + var target = evt.target.tagName == "IMG" ? evt.target : null; + } + + function addFormat(range) { + if (text) { + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length - 1].tagName, null, list); + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if (img && imgT && imgT.tagName == "IMG") { + //trace:964 + + imgT.style.cssText += + ";float:" + + (img.style.cssFloat || img.style.styleFloat || "none") + + ";display:" + + (img.style.display || "inline"); + + img = null; + } else { + if (!img) { + var collapsed = range.collapsed; + if (collapsed) { + var text = me.document.createTextNode("match"); + range.insertNode(text).select(); + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ""; + me.execCommand("removeformat"); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if (list.length) { + addFormat(range); + } + if (text) { + range.setStartBefore(text).collapse(true); + } + range.select(); + text && domUtils.remove(text); + } + } + + me.undoManger && me.undoManger.save(); + me.removeListener("mouseup", addList); + flag = 0; + } + + me.commands["formatmatch"] = { + execCommand: function(cmdName) { + if (flag) { + flag = 0; + list = []; + me.removeListener("mouseup", addList); + return; + } + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if (!img || img.tagName != "IMG") { + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start, true, function(node) { + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for (var i = 0, ci; (ci = list[i]); i++) { + if (ci.tagName == "A") { + list.splice(i, 1); + break; + } + } + } + + me.addListener("mouseup", addList); + flag = 1; + }, + queryCommandState: function() { + return flag; + }, + notNeedUndo: 1 + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js new file mode 100644 index 0000000..536ab32 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js @@ -0,0 +1,102 @@ +/** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * 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(); + } + } + } + } + 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; + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js new file mode 100644 index 0000000..f2d43e3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js @@ -0,0 +1,17 @@ +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + +UE.plugins["insertframe"] = function() { + var me = this; + function deleteIframe() { + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange", function() { + deleteIframe(); + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js new file mode 100644 index 0000000..1eeaf88 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js @@ -0,0 +1,303 @@ +/** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + +/** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + +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", ""); + } + } + + 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") { + var 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.getElementsByClassName("_img_parent_tmp")[0]; + tmpNode.removeAttribute("class"); + 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"); + + 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; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { + return 0; + } + return -1; + } +}; + +/** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + +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("word_img") + ) { + 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); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js new file mode 100644 index 0000000..8d960d3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js @@ -0,0 +1,32 @@ +/** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + +/** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ +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; + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js new file mode 100644 index 0000000..f2a0b7a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js @@ -0,0 +1,612 @@ +/** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["insertcode"] = function() { + var me = this; + me.ready(function() { + utils.cssRule( + "pre", + "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", + me.document + ); + }); + 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" + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + 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"; + } + } + } 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; + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js new file mode 100644 index 0000000..a42add3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js @@ -0,0 +1,90 @@ +/** + * 插入附件 + */ +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); + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js new file mode 100644 index 0000000..2a2b6a9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js @@ -0,0 +1,276 @@ +/** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

    xx|xxx

    当前选区为闭合状态 + * //插入

    CC

    + * //结果

    xx

    CC

    xxx

    + * //

    xxxx

    |

    xxx

    当前选区在两个p标签之间 + * //插入 xxxx + * //结果

    xxxx

    xxxx

    xxx

    + * ``` + */ + +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"; + + 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; + } + 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 { + 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; + } + } + + 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); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js new file mode 100644 index 0000000..32fd84e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js @@ -0,0 +1,43 @@ +/** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + +UE.commands["insertparagraph"] = { + execCommand: function(cmdName, front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer, + tmpNode; + while (start) { + if (domUtils.isBody(start)) { + break; + } + tmpNode = start; + start = start.parentNode; + } + if (tmpNode) { + var p = me.document.createElement("p"); + if (front) { + tmpNode.parentNode.insertBefore(p, tmpNode); + } else { + tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling); + } + domUtils.fillNode(me.document, p); + range.setStart(p, 0).setCursor(false, true); + } + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js new file mode 100644 index 0000000..dbdda0c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js @@ -0,0 +1,131 @@ +/** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ +/** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + +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); + }; + + 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; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js new file mode 100644 index 0000000..7c3dbeb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js @@ -0,0 +1,265 @@ +/* 处理特殊键的兼容性问题 */ +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 + ) { + 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(); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js new file mode 100644 index 0000000..367ee69 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js @@ -0,0 +1,53 @@ +/** + * 设置行内间距 + * @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"] }); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + 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, ""); + } + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js new file mode 100644 index 0000000..4884d15 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js @@ -0,0 +1,194 @@ +/** + * 超链接 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'neditor.baidu.com', + * title:'neditor', + * target:'_blank' + * }' ); + * ``` + */ +/** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + +/** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + +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; + } + } 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; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js new file mode 100644 index 0000000..affdb3b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js @@ -0,0 +1,1436 @@ +/** + * 有序列表,无序列表插件 + * @file + * @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: me.options.UEDITOR_HOME_URL + "themes/ueditor-list/", + 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) { + 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 + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + 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); + } + 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; + } + } + + 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); + 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; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js new file mode 100644 index 0000000..788c7f1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js @@ -0,0 +1,113 @@ +/** + * 插入音乐命令 + * @file + */ +UE.plugin.register("music", function() { + var me = this; + function creatInsertStr(url, width, height, align, cssfloat, toEmbed) { + return !toEmbed + ? "' + : ''; + } + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(node) { + var html; + if (node.getAttr("class") == "edui-faked-music") { + var cssfloat = node.getStyle("float"); + var align = node.getAttr("align"); + html = creatInsertStr( + node.getAttr("_url"), + node.getAttr("width"), + node.getAttr("height"), + align, + cssfloat, + true + ); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }); + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("embed"), function(node) { + if (node.getAttr("class") == "edui-faked-music") { + var cssfloat = node.getStyle("float"); + var align = node.getAttr("align"); + html = creatInsertStr( + node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + align, + cssfloat, + false + ); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img, node); + } + }); + }, + commands: { + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + music: { + execCommand: function(cmd, musicObj) { + var me = this, + str = creatInsertStr( + musicObj.url, + musicObj.width || 400, + musicObj.height || 95, + "none", + false + ); + me.execCommand("inserthtml", str); + }, + queryCommandState: function() { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && img.className == "edui-faked-music"; + return flag ? 1 : 0; + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js new file mode 100644 index 0000000..d0b5c85 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js @@ -0,0 +1,177 @@ +/** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ +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; + + 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( + '
    ' + ); + 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 + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + 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 { + 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); + } + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js new file mode 100644 index 0000000..11f7e7e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js @@ -0,0 +1,219 @@ +/** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + +/** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + +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, 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; + }, + queryCommandValue: function () { + var node = domUtils.filterNodeList( + this.selection.getStartElementPath(), + "p h1 h2 h3 h4 h5 h6" + ); + return node ? node.tagName.toLowerCase() : ""; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js new file mode 100644 index 0000000..a90d253 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js @@ -0,0 +1,354 @@ +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @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; + } + } + } + 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 + ); + } 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) { + if (me.undoManger.list.length < 1) me.undoManger.save(); + setTimeout(function() { + 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")); + } + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js new file mode 100644 index 0000000..ceef25d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js @@ -0,0 +1,36 @@ +/** + * 预览 + * @file + * @since 1.2.6.1 + */ + +/** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ +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 +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js new file mode 100644 index 0000000..23ecdfd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js @@ -0,0 +1,22 @@ +/** + * 打印 + * @file + * @since 1.2.6.1 + */ + +/** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ +UE.commands["print"] = { + execCommand: function() { + this.window.print(); + }, + notNeedUndo: 1 +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js new file mode 100644 index 0000000..748c5e1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js @@ -0,0 +1,107 @@ +/** + * 纯文本粘贴插件 + * @file + * @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); + } + } + } + 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 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands["pasteplain"] = { + queryCommandState: function() { + return pasteplain ? 1 : 0; + }, + execCommand: function() { + pasteplain = !pasteplain | 0; + }, + notNeedUndo: 1 + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js new file mode 100644 index 0000000..608232e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js @@ -0,0 +1,207 @@ +/** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + +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); + } + } else { + //trace:939 不能把list上的样式去掉 + if ( + !dtd.$tableContent[current.tagName] && + !dtd.$list[current.tagName] + ) { + domUtils.removeAttributes(current, removeFormatAttributes); + if (isRedundantSpan(current)) { + domUtils.remove(current, true); + } + } + } + } + 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(); + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js new file mode 100644 index 0000000..80c7369 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js @@ -0,0 +1,51 @@ +/** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + +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; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js new file mode 100644 index 0000000..e373c6d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js @@ -0,0 +1,10 @@ +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl +UE.commands["scrawl"] = { + queryCommandState: function() { + return browser.ie && browser.version <= 8 ? -1 : 0; + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js new file mode 100644 index 0000000..34b7462 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js @@ -0,0 +1,238 @@ +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace +/** + * @description 查找替换 + * @author zhanyi + */ + +UE.plugin.register("searchreplace", function() { + var me = this; + + var _blockElm = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; + + var lastRng = null; + + function getText(node) { + var text = node.nodeType == 3 + ? node.nodeValue + : node[browser.ie ? "innerText" : "textContent"]; + return text.replace(domUtils.fillChar, ""); + } + + function findTextInString(textContent, opt, currentIndex) { + var str = opt.searchStr; + + var reg = new RegExp(str, "g" + (opt.casesensitive ? "" : "i")), + match; + + if (opt.dir == -1) { + textContent = textContent.substr(0, currentIndex); + textContent = textContent.split("").reverse().join(""); + str = str.split("").reverse().join(""); + match = reg.exec(textContent); + if (match) { + return currentIndex - match.index - str.length; + } + } else { + textContent = textContent.substr(currentIndex); + match = reg.exec(textContent); + if (match) { + return match.index + currentIndex; + } + } + + return -1; + } + function findTextBlockElm(node, currentIndex, opt) { + var textContent, + index, + methodName = opt.all || opt.dir == 1 ? "getNextDomNode" : "getPreDomNode"; + if (domUtils.isBody(node)) { + node = node.firstChild; + } + var first = 1; + while (node) { + textContent = getText(node); + index = findTextInString(textContent, opt, currentIndex); + first = 0; + if (index != -1) { + return { + node: node, + index: index + }; + } + node = domUtils[methodName](node); + while (node && _blockElm[node.nodeName.toLowerCase()]) { + node = domUtils[methodName](node, true); + } + if (node) { + currentIndex = opt.dir == -1 ? getText(node).length : 0; + } + } + } + function findNTextInBlockElm(node, index, str) { + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while (currentNode) { + if (currentNode.nodeType == 3) { + currentNodeLength = getText(currentNode).replace( + /(^[\t\r\n]+)|([\t\r\n]+$)/, + "" + ).length; + currentIndex += currentNodeLength; + if (currentIndex >= index) { + return { + node: currentNode, + index: currentNodeLength - (currentIndex - index) + }; + } + } else if (!dtd.$empty[currentNode.tagName]) { + currentNodeLength = getText(currentNode).replace( + /(^[\t\r\n]+)|([\t\r\n]+$)/, + "" + ).length; + currentIndex += currentNodeLength; + if (currentIndex >= index) { + result = findNTextInBlockElm( + currentNode, + currentNodeLength - (currentIndex - index), + str + ); + if (result) { + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + } + } + + function searchReplace(me, opt) { + var rng = lastRng || me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement("span"); + span.innerHTML = "$$ueditor_searchreplace_key$$"; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if (!rng.collapsed) { + rng.select(); + var rngText = me.selection.getText(); + if ( + new RegExp( + "^" + opt.searchStr + "$", + opt.casesensitive ? "" : "i" + ).test(rngText) + ) { + if (opt.replaceStr != undefined) { + replaceText(rng, opt.replaceStr); + rng.select(); + return true; + } else { + rng.collapse(opt.dir == -1); + } + } + } + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = getText(startBlockNode).indexOf( + "$$ueditor_searchreplace_key$$" + ); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode, currentIndex, opt); + if (result) { + var rngStart = findNTextInBlockElm(result.node, result.index, searchStr); + var rngEnd = findNTextInBlockElm( + result.node, + result.index + searchStr.length, + searchStr + ); + rng + .setStart(rngStart.node, rngStart.index) + .setEnd(rngEnd.node, rngEnd.index); + + if (opt.replaceStr !== undefined) { + replaceText(rng, opt.replaceStr); + } + rng.select(); + return true; + } else { + rng.setCursor(); + } + } + function replaceText(rng, str) { + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + } + return { + commands: { + searchreplace: { + execCommand: function(cmdName, opt) { + utils.extend( + opt, + { + all: false, + casesensitive: false, + dir: 1 + }, + true + ); + var num = 0; + if (opt.all) { + lastRng = null; + var rng = me.selection.getRange(), + first = me.body.firstChild; + if (first && first.nodeType == 1) { + rng.setStart(first, 0); + rng.shrinkBoundary(true); + } else if (first.nodeType == 3) { + rng.setStartBefore(first); + } + rng.collapse(true).select(true); + if (opt.replaceStr !== undefined) { + me.fireEvent("saveScene"); + } + while (searchReplace(this, opt)) { + num++; + lastRng = me.selection.getRange(); + lastRng.collapse(opt.dir == -1); + } + if (num) { + me.fireEvent("saveScene"); + } + } else { + if (opt.replaceStr !== undefined) { + me.fireEvent("saveScene"); + } + if (searchReplace(this, opt)) { + num++; + lastRng = me.selection.getRange(); + lastRng.collapse(opt.dir == -1); + } + if (num) { + me.fireEvent("saveScene"); + } + } + + return num; + }, + notNeedUndo: 1 + } + }, + bindEvents: { + clearlastSearchResult: function() { + lastRng = null; + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js new file mode 100644 index 0000000..b6790ec --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js @@ -0,0 +1,305 @@ +/** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ +UE.plugin.register("section", function() { + /* 目录节点对象 */ + function Section(option) { + this.tag = ""; + (this.level = -1), (this.dom = null); + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + function getNodeFromAddress(startAddress, root) { + var current = root; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents: { + type: "aftersetcontent afterscencerestore", + handler: function() { + me.fireEvent("updateSections"); + } + }, + bindEvents: { + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + ready: function() { + me.fireEvent("updateSections"); + domUtils.on(me.body, "drop paste", function() { + me.fireEvent("updateSections"); + }); + }, + /* 执行paragraph命令之后 */ + afterexeccommand: function(type, cmd) { + if (cmd == "paragraph") { + me.fireEvent("updateSections"); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + keyup: function(type, e) { + var me = this, + range = me.selection.getRange(); + if (range.collapsed != true) { + me.fireEvent("updateSections"); + } else { + var keyCode = e.keyCode || e.which; + if (keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent("updateSections"); + } + } + } + }, + commands: { + getsections: { + execCommand: function(cmd, levels) { + var levelFn = levels || ["h1", "h2", "h3", "h4", "h5", "h6"]; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == "string") { + levelFn[i] = (function(fn) { + return function(node) { + return node.tagName == fn.toUpperCase(); + }; + })(levelFn[i]); + } else if (typeof levelFn[i] != "function") { + levelFn[i] = function(node) { + return null; + }; + } + } + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({ level: -1, title: "root" }), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection + .getRange() + .selectNode(child) + .createAddress(true).startAddress, + current = getSection({ + tag: child.tagName, + title: child.innerText || child.textContent || "", + level: level, + dom: child, + startAddress: utils.clone(address, []), + endAddress: utils.clone(address, []), + children: [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while (level <= parent.level) { + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && + tmpSection.endAddress[tmpSection.endAddress.length - 1]++; + } + } + } + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + movesection: { + execCommand: function(cmd, sourceSection, targetSection, isAfter) { + var me = this, + targetAddress, + target; + + if (!sourceSection || !targetSection || targetSection.level == -1) + return; + + targetAddress = isAfter + ? targetSection.endAddress + : targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if ( + !targetAddress || + !target || + isContainsAddress( + sourceSection.startAddress, + sourceSection.endAddress, + targetAddress + ) + ) + return; + + var startNode = getNodeFromAddress( + sourceSection.startAddress, + me.body + ), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if (isAfter) { + current = endNode; + while ( + current && + !( + domUtils.getPosition(startNode, current) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if (current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while ( + current && + !( + domUtils.getPosition(current, endNode) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if (current == endNode) break; + current = nextNode; + } + } + + me.fireEvent("updateSections"); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget) { + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for (var i = 0; i < startAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if (addressTarget[i] < startAddress[i]) { + break; + } + } + for (var i = 0; i < endAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if (addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + deletesection: { + execCommand: function(cmd, section, keepChildren) { + var me = this; + + if (!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if (!keepChildren) { + while ( + current && + domUtils.inDoc(endNode, me.document) && + !( + domUtils.getPosition(current, endNode) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent("updateSections"); + } + }, + selectsection: { + execCommand: function(cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + startAddress: utils.clone(section.startAddress, []), + endAddress: utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + scrolltosection: { + execCommand: function(cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + startAddress: section.startAddress, + endAddress: section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js new file mode 100644 index 0000000..d25e77d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js @@ -0,0 +1,42 @@ +/** + * 全选 + * @file + * @since 1.2.6.1 + */ + +/** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * 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 + }; + + //快捷键 + me.addshortcutkey({ + selectAll: "ctrl+65" + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js new file mode 100644 index 0000000..8e05120 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js @@ -0,0 +1,110 @@ +/** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register("serverparam", function() { + var me = this, + serverParam = {}; + + return { + commands: { + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * 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; + } + } else if (utils.isObject(key)) { + //传入对象,覆盖列表项 + utils.extend(serverParam, key, false); + } else if (utils.isFunction(key)) { + //传入函数,添加列表项 + utils.extend(serverParam, key(), false); + } + }, + queryCommandValue: function() { + return serverParam || {}; + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js new file mode 100644 index 0000000..322bbb9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js @@ -0,0 +1,73 @@ +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 +/** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + +UE.plugins["shortcutmenu"] = function() { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener("contextmenu mouseup", function(type, e) { + var me = this, + customEvt = { + type: type, + target: e.target || e.srcElement, + screenX: e.screenX, + screenY: e.screenY, + clientX: e.clientX, + clientY: e.clientY + }; + + setTimeout(function() { + var rng = me.selection.getRange(); + if (rng.collapsed === false || type == "contextmenu") { + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu({ + editor: me, + items: items, + theme: me.options.theme, + className: "edui-shortcutmenu" + }); + + menu.render(); + me.fireEvent("afterrendershortcutmenu", menu); + } + + menu.show(customEvt, !!UE.plugins["contextmenu"]); + } + }); + + if (type == "contextmenu") { + domUtils.preventDefault(e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + } + } + } + }); + + me.addListener("keydown", function(type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide(); + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js new file mode 100644 index 0000000..cc11817 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js @@ -0,0 +1,224 @@ +/** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ +UE.plugin.register("simpleupload", function() { + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn() { + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement("iframe"), + btnStyle = + "display:block;width:" + + w + + "px;height:" + + h + + "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;"; + + domUtils.on(btnIframe, "load", function() { + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = + btnIframe.contentDocument || btnIframe.contentWindow.document; + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement("div"); + + wrapper.innerHTML = + '
    ' + + '' + + "
    " + + ''; + + 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, + json, + loader, + body = (iframe.contentDocument || iframe.contentWindow.document) + .body, + result = body.innerText || body.textContent || ""; + json = new Function("return " + result)(); + link = me.options.imageUrlPrefix + json.url; + if (json.state == "SUCCESS" && json.url) { + loader = me.document.getElementById(loadingId); + domUtils.removeClasses(loader, "loadingclass"); + domUtils.on(loader,'load',function(){ + me.fireEvent('contentchange'); + }); + loader.setAttribute("src", link); + loader.setAttribute("_src", link); + loader.setAttribute("alt", json.original || ""); + loader.removeAttribute("id"); + } else { + showErrorLoader && showErrorLoader(json.state); + } + } 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 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + 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; + } + + domUtils.on(iframe, "load", callback); + form.action = utils.formatUrl( + imageActionUrl + + (imageActionUrl.indexOf("?") == -1 ? "?" : "&") + + params + ); + form.submit(); + }); + + 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; + }); + + 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:1px solid #cccccc;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:1px solid #cccccc;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; + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js new file mode 100644 index 0000000..ad9ed7d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js @@ -0,0 +1,106 @@ +/** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ +UE.plugin.register("snapscreen", function() { + var me = this; + var snapplugin; + + function getLocation(url) { + var search, + a = document.createElement("a"), + params = utils.serializeParam(me.queryCommandValue("serverparam")) || ""; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + search = a.search; + if (params) { + search = search + (search.indexOf("?") == -1 ? "?" : "&") + params; + search = search.replace(/[&]+/gi, "&"); + } + return { + port: a.port, + hostname: a.hostname, + path: a.pathname + search || +a.hash + }; + } + + return { + commands: { + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + snapscreen: { + execCommand: function(cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if (!snapplugin) { + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try { + snapplugin.type = "application/x-pluginbaidusnap"; + } catch (e) { + return; + } + snapplugin.style.cssText = + "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width", "0"); + snapplugin.setAttribute("height", "0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs) { + try { + rs = eval("(" + rs + ")"); + if (rs.state == "SUCCESS") { + var opt = me.options; + me.execCommand("insertimage", { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || "", + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + } catch (e) { + alert(lang.callBackErrorMsg); + } + } + url = me.getActionUrl(me.getOpt("snapscreenActionName")); + local = getLocation(url); + setTimeout(function() { + try { + res = snapplugin.saveSnapshot( + local.hostname, + local.path, + local.port + ); + } catch (e) { + me.ui._dialogs["snapscreenDialog"].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function() { + return navigator.userAgent.indexOf("Windows", 0) != -1 ? 0 : -1; + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js new file mode 100644 index 0000000..20ae308 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js @@ -0,0 +1,347 @@ +/** + * 源码编辑插件 + * @file + * @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; + }, + 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 + }); + 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); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + 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()); + } + } + 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); + }; + + 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" + }); + }); + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js new file mode 100644 index 0000000..dcbc45d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js @@ -0,0 +1,2023 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ +UE.plugins["table"] = function() { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function(editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function(editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function(cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { + // throw e; + } + me.ready(function() { + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function() { + var table = getUETableBySelected(me); + if (table) { + var str = ""; + utils.each(table.selectedTds, function(td) { + str += td[browser.ie ? "innerText" : "textContent"]; + }); + return str; + } else { + return orgGetText.call(me.selection); + } + }; + }); + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + maxColNum: 20, + maxRowNum: 100, + defaultCols: 5, + defaultRows: 5, + tdvalign: "top", + cursorpath: me.options.UEDITOR_HOME_URL + "themes/" + me.options.theme + "/images/cursor_", + tableDragable: false, + classList: [ + "ue-table-interlace-color-single", + "ue-table-interlace-color-double" + ] + }); + me.getUETable = getUETable; + var commands = { + deletetable: 1, + inserttable: 1, + cellvalign: 1, + insertcaption: 1, + deletecaption: 1, + inserttitle: 1, + deletetitle: 1, + mergeright: 1, + mergedown: 1, + mergecells: 1, + insertrow: 1, + insertrownext: 1, + deleterow: 1, + insertcol: 1, + insertcolnext: 1, + deletecol: 1, + splittocells: 1, + splittorows: 1, + splittocols: 1, + adaptbytext: 1, + adaptbywindow: 1, + adaptbycustomer: 1, + insertparagraph: 1, + insertparagraphbeforetable: 1, + averagedistributecol: 1, + averagedistributerow: 1 + }; + me.ready(function() { + utils.cssRule( + "table", + //选中的td上的样式 + ".selectTdClass{background-color:#edf5fa !important}" + + "table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}" + + //插入的表格的默认样式 + "table{margin-bottom:10px;border-collapse:collapse;display:table;}" + + "td,th{padding: 5px 10px;border: 1px solid #DDD;}" + + "caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + + "th{border-top:1px solid #BBB;background-color:#F7F7F7;}" + + "table tr.firstRow th{border-top-width:2px;}" + + ".ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }" + + "td p{margin:0;padding:0;}", + me.document + ); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener("keydown", function(cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + if (ut.isFullCol()) { + me.execCommand("deletecol"); + } else if (ut.isFullRow()) { + me.execCommand("deleterow"); + } else { + me.fireEvent("delcells"); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName( + me.selection.getStart(), + "caption", + true + ), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent("saveScene"); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent("saveScene"); + } + } + + if (keyCode == 46) { + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent("saveScene"); + for (var i = 0, ci; (ci = ut.selectedTds[i++]); ) { + domUtils.fillNode(me.document, ci); + } + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + } + } + if (keyCode == 13) { + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName( + rng.startContainer, + "caption", + true + ); + if (caption) { + var table = domUtils.findParentByTagName(caption, "table"); + if (!rng.collapsed) { + rng.deleteContents(); + me.fireEvent("saveScene"); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName( + me.selection.getStart(), + ["td", "th"], + true + ), + preNode = table.previousSibling; + if ( + cell === start && + (!preNode || + (preNode.nodeType == 1 && preNode.tagName == "TABLE")) && + domUtils.isStartInblock(rng) + ) { + var first = domUtils.findParent( + me.selection.getStart(), + function(n) { + return domUtils.isBlockElm(n); + }, + true + ); + if ( + first && + (/t(h|d)/i.test(first.tagName) || first === start.firstChild) + ) { + me.execCommand("insertparagraphbeforetable"); + domUtils.preventDefault(evt); + } + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == "67") { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [[ut.cloneCell(tds[0], null, true)]]; + for (var i = 1, ci; (ci = tds[i]); i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci, null, true)]); + } else { + tableCopyList[tableCopyList.length - 1].push( + ut.cloneCell(ci, null, true) + ); + } + } + } + } + }); + me.addListener("tablehasdeleted", function() { + toggleDraggableState(this, false, "", null); + if (dragButton) domUtils.remove(dragButton); + }); + + me.addListener("beforepaste", function(cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, "caption", true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? "innerText" : "textContent"]; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent("saveScene"); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName( + rng.startContainer, + ["td", "th"], + true + ), + tmpNode, + preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == "TH") { + rowIndex++; + } + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; (cj = ci[j]); j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j); + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute("width") && + cell.setAttribute("width", cj.getAttribute("width")); + cj.getAttribute("vAlign") && + cell.setAttribute("vAlign", cj.getAttribute("vAlign")); + cj.getAttribute("align") && + cell.setAttribute("align", cj.getAttribute("align")); + cj.style.cssText && (cell.style.cssText = cj.style.cssText); + } + for (var j = 0, cj; (cj = tr.cells[j]); j++) { + if (!ci[j]) break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute("width") && + cj.setAttribute("width", ci[j].getAttribute("width")); + ci[j].getAttribute("vAlign") && + cj.setAttribute("vAlign", ci[j].getAttribute("vAlign")); + ci[j].getAttribute("align") && + cj.setAttribute("align", ci[j].getAttribute("align")); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText); + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; (cj = ci[j++]); ) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand("insertcol"); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == "TH") { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + tmpNode = td; + for (var j = 0, cj; (cj = ci[j++]); ) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute("width") && + td.setAttribute("width", cj.getAttribute("width")); + cj.getAttribute("vAlign") && + td.setAttribute("vAlign", cj.getAttribute("vAlign")); + cj.getAttribute("align") && + td.setAttribute("align", cj.getAttribute("align")); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, [ + "class", + "rowSpan", + "colSpan" + ]); + + preNode.parentNode.appendChild(cloneTd); + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement("table"); + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; (cj = ci[j++]); ) { + cloneTd = UT.cloneCell(cj, null, true); + domUtils.removeAttributes(cloneTd, ["class"]); + tr.appendChild(cloneTd); + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = + me.body.offsetWidth - + (needIEHack + ? parseInt( + domUtils.getComputedStyle(me.body, "margin-left"), + 10 + ) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (me.options.offsetWidth || 0); + me.execCommand( + "insertHTML", + "" + + table.innerHTML + .replace(/>\s*<") + .replace(/\bth\b/gi, "td") + + "
    " + ); + } + me.fireEvent("contentchange"); + me.fireEvent("saveScene"); + html.html = ""; + return true; + } else { + var div = me.document.createElement("div"), + tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), "table")) { + utils.each(tables, function(t) { + domUtils.remove(t); + }); + if ( + domUtils.findParentByTagName( + me.selection.getStart(), + "caption", + true + ) + ) { + div.innerHTML = div[browser.ie ? "innerText" : "textContent"]; + } + } else { + utils.each(tables, function(table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ["style", "border"]); + utils.each(domUtils.getElementsByTagName(table, "td"), function( + td + ) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); + // domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener("afterpaste", function() { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function( + table + ) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = + me.body.offsetWidth - + (needIEHack + ? parseInt( + domUtils.getComputedStyle(me.body, "margin-left"), + 10 + ) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (me.options.offsetWidth || 0) + + "px"; + } + }); + }); + me.addListener("blur", function() { + tableCopyList = null; + }); + var timer; + me.addListener("keydown", function() { + clearTimeout(timer); + timer = setTimeout(function() { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName( + rng.startContainer, + ["th", "td"], + true + ); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + }, 100); + }); + me.addListener("selectionchange", function() { + toggleDraggableState(me, false, "", null); + }); + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function() { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me)) return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ["td", "th"], true); + utils.each(domUtils.getElementsByTagName(me.document, "table"), function( + table + ) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 + // utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { + // + // if (domUtils.isEmptyBlock(td) && td !== start) { + // domUtils.fillNode(me.document, td); + // if (browser.ie && browser.version == 6) { + // td.innerHTML = ' ' + // } + // } + // }); + // utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { + // if (domUtils.isEmptyBlock(th) && th !== start) { + // domUtils.fillNode(me.document, th); + // if (browser.ie && browser.version == 6) { + // th.innerHTML = ' ' + // } + // } + // }); + table.onmouseover = function() { + me.fireEvent("tablemouseover", table); + }; + table.onmousemove = function() { + me.fireEvent("tablemousemove", table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function() { + me.fireEvent("contentchange", 50); + }, true); + }; + table.onmouseout = function() { + me.fireEvent("tablemouseout", table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function(evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target) return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); + // if ("topLeft" == inPosition(table, mouseCoords(evt))) { + // cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); + // ut.setSelected(cellsRange); + // return; + // } + // if ("bottomRight" == inPosition(table, mouseCoords(evt))) { + // + // return; + // } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell( + ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, + ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex + ); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell( + ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, + ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex + ); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function(evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable", function(type, table, classList) { + if (!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function(list, index, repeat) { + return list[index] + ? list[index] + : repeat ? list[index % list.length] : ""; + }; + for (var i = 0; i < len; i++) { + rows[i].className = getClass( + classList || me.options.classList, + i, + true + ); + } + }); + me.addListener("uninterlacetable", function(type, table) { + if (!table) return; + var me = this, + rows = table.rows, + classList = me.options.classList, + len = rows.length; + for (var i = 0; i < len; i++) { + domUtils.removeClasses(rows[i], classList); + } + }); + + me.addListener("mousedown", mouseDownEvent); + me.addListener("mouseup", mouseUpEvent); + //拖动的时候触发mouseup + domUtils.on(me.body, "dragstart", function(evt) { + mouseUpEvent.call(me, "dragstart", evt); + }); + me.addOutputRule(function(root) { + utils.each(root.getNodesByTagName("div"), function(n) { + if (n.getAttr("id") == "ue_tableDragLine") { + n.parentNode.removeChild(n); + } + }); + }); + + var currentRowIndex = 0; + me.addListener("mousedown", function() { + currentRowIndex = 0; + }); + me.addListener("tabkeydown", function() { + var range = this.selection.getRange(), + common = range.getCommonAncestor(true, true), + table = domUtils.findParentByTagName(common, "table"); + if (table) { + if (domUtils.findParentByTagName(common, "caption", true)) { + var cell = domUtils.getElementsByTagName(table, "th td"); + if (cell && cell.length) { + range.setStart(cell[0], 0).setCursor(false, true); + } + } else { + var cell = domUtils.findParentByTagName(common, ["td", "th"], true), + ua = getUETable(cell); + currentRowIndex = cell.rowSpan > 1 + ? currentRowIndex + : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true); + } else { + range.selectNodeContents(nextCell).select(); + } + } else { + me.fireEvent("saveScene"); + me.__hasEnterExecCommand = true; + this.execCommand("insertrownext"); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range + .setStart(table.rows[table.rows.length - 1].cells[0], 0) + .setCursor(); + me.fireEvent("saveScene"); + } + } + return true; + } + }); + browser.ie && + me.addListener("selectionchange", function() { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function(type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = + !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function() { + switchBorderColor(this, false); + browser.ie && + utils.each(this.document.getElementsByTagName("caption"), function(ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = " "; + } + }); + }); + me.addListener("aftergetcontent", function() { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function() { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function(type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function(table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function(td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; (td = tds[i]); i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute( + "width", + Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))) + ); + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function(cmd, datatat) { + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), + tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if ( + ut && + !commands[cmd] && + !cmdFun.notNeedUndo && + !me.__hasEnterExecCommand + ) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, + lastValue = -2, + value, + state; + for (var i = 0, td; (td = tds[i]); i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true); + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent("contentchange"); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + }); + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && + obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if ( + (td = + domUtils.findParentByTagName(ele, "td", true) || + domUtils.findParentByTagName(ele, "th", true)) + ) + return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, "g"); + if ( + node[browser.ie ? "innerText" : "textContent"] + .replace(/^\s*$/, "") + .replace(reg, "").length > 0 + ) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return { x: evt.pageX, y: evt.pageY }; + } + return { + x: + evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + if (isEditorDisabled()) { + return; + } + + try { + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if (isInResizeBuffer) { + me.body.style.webkitUserSelect = "none"; + + if ( + Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell || + Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell + ) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = "none"; + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent("excludetable", target) === true) return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = + "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = + "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ""); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState( + me, + target ? !!state : false, + target ? state : "", + pos, + target + ); + } + } else { + toggleDragButton(false, table, me); + } + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver) return; + dragButtonTimer = setTimeout(function() { + !dragOver && + dragButton && + dragButton.parentNode && + dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode) return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = + "width:15px;height:15px;background-image:url(" + + editor.options.UEDITOR_HOME_URL + + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + + (pos.y - 15) + + "px;left:" + + pos.x + + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function(evt) { + dragOver = true; + }; + dragButton.onmouseout = function(evt) { + dragOver = false; + }; + domUtils.on(dragButton, "click", function(type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, "dblclick", function(type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, "dragstart", function(type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function() { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + // function inPosition(table, pos) { + // var tablePos = domUtils.getXY(table), + // width = table.offsetWidth, + // height = table.offsetHeight; + // if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { + // return "topLeft"; + // } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { + // return "bottomRight"; + // } + // } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return state == "v1" && pos.y - domUtils.getXY(table).y - capHeight < 8; + } else { + return state == "h1" && pos.x - domUtils.getXY(table).x < 8; + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = + (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20, + right = nextTd + ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 + : me.body.offsetWidth + 5 || + parseInt(domUtils.getComputedStyle(me.body, "width"), 10); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" + ? "col-resize" + : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor); + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + var lineId = "_UETableResizeLine", + line = this.document.getElementById(lineId); + + if (!line) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2 * cellBorderWidth + 1 + "px", + position: "absolute", + "z-index": 100000, + cursor: "col-resize", + background: "red", + display: "none" + }; + + //切换状态 + line.onmouseout = function() { + this.style.display = "none"; + }; + + utils.extend(line.style, styles); + + this.document.body.appendChild(line); + } + + return line; + } + + /** + * 更新resize-line + */ + function updateResizeLine(cell, uetable) { + var line = getResizeLineByUETable.call(this), + table = uetable.table, + styles = { + top: domUtils.getXY(table).y + "px", + left: + domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + "px", + display: "block", + height: table.offsetHeight + "px" + }; + + utils.extend(line.style, styles); + } + + /** + * 显示resize-line + */ + function showResizeLine(cell) { + var uetable = getUETable(cell); + + updateResizeLine.call(this, cell, uetable); + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if (!elePos) { + return ""; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return "h1"; + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return "v1"; + } + return ""; + } + + function mouseDownEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function(ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected(); + } else { + td = ut.selectedTds[0]; + setTimeout(function() { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + } + } + } else { + tableClickHander(evt); + } + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout(tabTimer); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if ((h = getRelation(target, mouseCoords(evt)))) { + hideDragLine(me); + + if (h == "h1") { + h = "h"; + if ( + inTableSide( + domUtils.findParentByTagName(target, "table"), + target, + evt + ) + ) { + me.execCommand("adaptbywindow"); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true); + } + } + } + if (h == "h") { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder(target, table, true); + + cells = extractArray(cells, "left"); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each(cells, function(cell) { + oldWidth.push(cell.offsetWidth); + }); + + utils.each(cells, function(cell) { + cell.removeAttribute("width"); + }); + + window.setTimeout(function() { + //是否允许改变 + var changeable = true; + + utils.each(cells, function(cell, index) { + var width = cell.offsetWidth; + + if (width > oldWidth[index]) { + changeable = false; + return false; + } + + newWidth.push(width); + }); + + var change = changeable ? newWidth : oldWidth; + + utils.each(cells, function(cell, index) { + cell.width = change[index] - getTabcellSpace(); + }); + }, 0); + + // minWidth -= cellMinWidth; + // + // table.removeAttribute("width"); + // utils.each(cells, function (cell) { + // cell.style.width = ""; + // cell.width -= minWidth; + // }); + } + } + } + } + + function tableClickHander(evt) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName("table"), function(t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if (!startTd) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ""; + mousedown = true; + me.addListener("mouseover", mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler(evt); + } + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler(evt) { + if (browser.ie) { + evt = reconstruct(evt); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function() { + tableBorderDrag(evt); + }, dblclickTime); + } + + function extractArray(originArr, key) { + var result = [], + tmp = null; + + for (var i = 0, len = originArr.length; i < len; i++) { + tmp = originArr[i][key]; + + if (tmp) { + result.push(tmp); + } + } + + return result; + } + + function clearTableDragTimer() { + tableDragTimer && clearTimeout(tableDragTimer); + tableDragTimer = null; + } + + function reconstruct(obj) { + var attrs = [ + "pageX", + "pageY", + "clientX", + "clientY", + "srcElement", + "target" + ], + newObj = {}; + + if (obj) { + for (var i = 0, key, val; (key = attrs[i]); i++) { + val = obj[key]; + val && (newObj[key] = val); + } + } + + return newObj; + } + + //边框拖动 + function tableBorderDrag(evt) { + isInResizeBuffer = false; + + startTd = evt.target || evt.srcElement; + if (!startTd) return; + var state = getRelation(startTd, mouseCoords(evt)); + if (/\d/.test(state)) { + state = state.replace(/\d/, ""); + startTd = getUETable(startTd).getPreviewCell(startTd, state == "v"); + } + hideDragLine(me); + getDragLine(me, me.document); + me.fireEvent("saveScene"); + showDragLineAt(state, startTd); + mousedown = true; + //拖动开始 + onDrag = state; + dragTd = startTd; + } + + function mouseUpEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + clearTableDragTimer(); + + isInResizeBuffer = false; + + if (onBorder) { + singleClickState = ++singleClickState % 3; + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + tableResizeTimer = setTimeout(function() { + singleClickState > 0 && singleClickState--; + }, dblclickTime); + + if (singleClickState === 2) { + singleClickState = 0; + tableDbclickHandler(evt); + return; + } + } + + if (evt.button == 2) return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, "table", true), + end = domUtils.findParentByTagName(range.endContainer, "table", true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName( + range.startContainer, + ["td", "th", "caption"], + true + ); + end = domUtils.findParentByTagName( + range.endContainer, + ["td", "th", "caption"], + true + ); + if (start !== end) { + me.selection.clearRange(); + } + } else { + me.selection.clearRange(); + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ""; + //拖拽状态下的mouseUP + if (onDrag && dragTd) { + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + + singleClickState = 0; + dragLine = me.document.getElementById("ue_tableDragLine"); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight( + dragTd, + dragLinePos.y - dragTdPos.y - dragTd.offsetHeight + ); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent("saveScene"); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + "td", + true + ); + if (!target) + target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + "th", + true + ); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range + .selectNodeContents(cell) + .shrinkBoundary() + .setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName( + range.startContainer, + ["td", "th"], + true + ), + end = domUtils.findParentByTagName( + range.endContainer, + ["td", "th"], + true + ); + //在table里边的不能清除 + if ( + (start && !end) || + (!start && end) || + (start && end && start !== end) + ) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener("mouseover", mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = + domUtils.findParentByTagName(tar, "td", true) || + domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if ( + startTd && + currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || + (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, "table") == + domUtils.findParentByTagName(currentTd, "table") + ) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = "none"; + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ""; + ut.clearSelected(); + } + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt( + domUtils.getComputedStyle(cell, "line-height"), + 10 + ), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 + ? cell.setAttribute("height", height) + : cell.removeAttribute && cell.removeAttribute("height"); + } + + function getWidth(cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + var ut = getUETable(cell); + if (ut) { + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder(cell, table); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue(changeValue, cell, cells); + + if (cell.nextSibling) { + var i = 0; + + utils.each(cells, function(cellGroup) { + cellGroup.left.width = +cellGroup.left.width + changeValue; + cellGroup.right && + (cellGroup.right.width = +cellGroup.right.width - changeValue); + }); + } else { + utils.each(cells, function(cellGroup) { + cellGroup.left.width -= -changeValue; + }); + } + } + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; (cell = cells[i++]); ) { + setCellHeight(cell, changeValue, backHeight); + } + } + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder(cell, table, isContainMergeCell) { + if (!table) { + table = domUtils.findParentByTagName(cell, "table"); + } + + if (!table) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex(cell), + temp = cell, + rows = table.rows, + colIndex = 0; + + while (temp) { + //获取到当前单元格在未发生单元格合并时的序列 + if (temp.nodeType === 1) { + colIndex += temp.colSpan || 1; + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function(tabRow) { + var cells = tabRow.cells, + currIndex = 0; + + utils.each(cells, function(tabCell) { + currIndex += tabCell.colSpan || 1; + + if (currIndex === colIndex) { + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + } else if (currIndex > colIndex) { + if (isContainMergeCell) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + }); + }); + + return borderCells; + } + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells(cells) { + var minWidth = Number.MAX_VALUE; + + for (var i = 0, curCell; (curCell = cells[i]); i++) { + minWidth = Math.min( + minWidth, + curCell.width || getTableCellWidth(curCell) + ); + } + + return minWidth; + } + + function correctChangeValue(changeValue, relatedCell, cells) { + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if (changeValue < 0) { + return 0; + } + + changeValue -= getTableCellWidth(relatedCell); + + //确定方向 + var direction = changeValue < 0 ? "left" : "right"; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each(cells, function(cellGroup) { + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if (curCell) { + changeValue = Math.min( + changeValue, + getTableCellWidth(curCell) - cellMinWidth + ); + } + }); + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === "left" ? -changeValue : changeValue; + } + + function getTableCellWidth(cell) { + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if (!cell.nextSibling) { + width -= getTableCellOffset(cell); + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch (e) {} + + return width; + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset(cell) { + tab = domUtils.findParentByTagName(cell, "table", false); + + if (tab.offsetVal === undefined) { + var prev = cell.previousSibling; + + if (prev) { + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth + ? UT.borderWidth + : 0; + } else { + tab.offsetVal = 0; + } + } + + return tab.offsetVal; + } + + function getTabcellSpace() { + if (UT.tabcellSpace === undefined) { + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = "border: 0;"; + tabcell.width = 1; + + trow.appendChild(tabcell); + trow.appendChild((mirror = tabcell.cloneNode(false))); + + tbody.appendChild(trow); + + tab.appendChild(tbody); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild(tab); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ""; + mirror.style.cssText = ""; + + UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild(tab); + } + + getTabcellSpace = function() { + return UT.tabcellSpace; + }; + + return UT.tabcellSpace; + } + + function getDragLine(editor, doc) { + if (mousedown) return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id: "ue_tableDragLine", + unselectable: "on", + contenteditable: false, + onresizestart: "return false", + ondragstart: "return false", + onselectstart: "return false", + style: + "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown) return; + var line; + while ((line = editor.document.getElementById("ue_tableDragLine"))) { + domUtils.remove(line); + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName("caption"), + width = table.offsetWidth, + height = + table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), + css; + switch (state) { + case "h": + css = + "height:" + + height + + "px;top:" + + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + + "px;left:" + + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = + css + + "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)"; + break; + case "v": + css = + "width:" + + width + + "px;left:" + + tablePos.x + + "px;top:" + + (cellPos.y + cell.offsetHeight); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = + css + + "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), + color; + for (var i = 0, node; (node = tableArr[i++]); ) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = td[0].style.borderColor.replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/gi.test(color)) + domUtils.addClass(node, "noBorderTable"); + } else { + domUtils.removeClasses(node, "noBorderTable"); + } + } + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return ( + body.offsetWidth - + (needIEHack + ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (editor.options.offsetWidth || 0) + ); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + var target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + ["td", "th"], + true + ), + dir = null; + + if (!target) { + return null; + } + + dir = getRelation(target, mouseCoords(evt)); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if (!target) { + return null; + } + + if (dir === "h1" && target.previousSibling) { + var position = domUtils.getXY(target), + cellWidth = target.offsetWidth; + + if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) { + target = target.previousSibling; + } + } else if (dir === "v1" && target.parentNode.previousSibling) { + var position = domUtils.getXY(target), + cellHeight = target.offsetHeight; + + if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) { + target = target.parentNode.previousSibling.firstChild; + } + } + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) + ? target + : null; + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js new file mode 100644 index 0000000..8dd9c8a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js @@ -0,0 +1,1045 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ +;(function() { + var UT = UE.UETable, + getTableItemsByRange = function(editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function(editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function(editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + UE.commands["inserttable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function(cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(""); + for (var c = 0; c < colsNum; c++) { + html.push( + '
  • ' + + (browser.ie && browser.version < 11 + ? domUtils.fillChar + : "
    ") + + "
    " + html.join("") + "
    "; + } + + if (!opt) { + opt = utils.extend( + {}, + { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + } + ); + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = + domUtils.findParent( + start, + function(node) { + return domUtils.isBlockElm(node); + }, + true + ) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor( + tableWidth / opt.numCols - + defaultValue.tdPadding * 2 - + defaultValue.tdBorder + ); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands["insertparagraphbeforetable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? " " : "
    "; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands["deletetable"] = { + queryCommandState: function() { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, "table", true) + ? 0 + : -1; + }, + execCommand: function(cmd, table) { + var rng = this.selection.getRange(); + table = + table || + domUtils.findParentByTagName(rng.startContainer, "table", true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, "p", { + innerHTML: browser.ie ? domUtils.fillChar : "
    " + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next); + } else { + rng.setStart(next, 0); + } + rng.setCursor(false, true); + this.fireEvent("tablehasdeleted"); + } + } + }; + UE.commands["cellalign"] = { + queryCommandState: function() { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function(cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; (ci = selectedTds[i++]); ) { + ci.setAttribute("align", align); + } + } + } + }; + UE.commands["cellvalign"] = { + queryCommandState: function() { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function(cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; (ci = selectedTds[i++]); ) { + ci.setAttribute("vAlign", valign); + } + } + } + }; + UE.commands["insertcaption"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName("caption").length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement("caption"); + caption.innerHTML = browser.ie ? domUtils.fillChar : "
    "; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + } + }; + UE.commands["deletecaption"] = { + queryCommandState: function() { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + return table.getElementsByTagName("caption").length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + domUtils.remove(table.getElementsByTagName("caption")[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + } + }; + UE.commands["inserttitle"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[ + firstRow.cells.length - 1 + ].tagName.toLowerCase() != "th" + ? 0 + : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, "th"); + } + var th = table.getElementsByTagName("th")[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands["deletetitle"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[ + firstRow.cells.length - 1 + ].tagName.toLowerCase() == "th" + ? 0 + : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]); + } + var td = table.getElementsByTagName("td")[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands["inserttitlecol"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName("th").length ? -1 : 0; + } + return -1; + }, + execCommand: function(cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, "th"); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName("th")[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands["deletetitlecol"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName("th").length ? 0 : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + for (var i = 0; i < table.rows.length; i++) { + domUtils.remove(table.rows[i].children[0]); + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName("td")[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = + table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return rightCellInfo.rowIndex == cellInfo.rowIndex && + rightCellInfo.rowSpan == cellInfo.rowSpan + ? 0 + : -1; + }, + execCommand: function(cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = + table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return downCellInfo.colIndex == cellInfo.colIndex && + downCellInfo.colSpan == cellInfo.colSpan + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function() { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function() { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true); + } else { + rng.selectNodeContents(cell); + } + rng.select(); + } + } + }; + UE.commands["insertrow"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + (cell.tagName == "TD" || + (cell.tagName == "TH" && + tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; + i < len; + i++ + ) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + cell.tagName == "TD" && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; + i < len; + i++ + ) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function() { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for ( + var i = cellsRange.beginRowIndex; + i < cellsRange.endRowIndex + 1; + i++ + ) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName("td").length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if ( + cellInfo.rowSpan == 1 || + cellInfo.rowSpan == + cellsRange.endRowIndex - cellsRange.beginRowIndex + 1 + ) { + if (nextCell || preCell) + rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell( + cellInfo.rowIndex, + ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex + ); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + (cell.tagName == "TD" || + (cell.tagName == "TH" && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum + ? 0 + : -1; + }, + execCommand: function(cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1) return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endColIndex - range.beginColIndex + 1; + i < len; + i++ + ) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + getUETable(tableItems.table).colsNum < this.options.maxColNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endColIndex - range.beginColIndex + 1; + i < len; + i++ + ) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function() { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName("td").length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["adaptbytext"] = UE.commands["adaptbywindow"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == "adaptbywindow") { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function(cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands["averagedistributecol"] = { + queryCommandState: function() { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function(cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, + sumWidth = 0, + colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end; ) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = + Math.ceil(sumWidth / colsNum) - + tbAttr.tdBorder * 2 - + tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function( + node + ) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() + ? domUtils.getElementsByTagName(ut.table, "td") + : ut.selectedTds; + + utils.each(cells, function(node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands["averagedistributerow"] = { + queryCommandState: function() { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function(cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, + rowNum, + sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt( + domUtils.getComputedStyle( + tb.getElementsByTagName("td")[0], + "padding-top" + ) + ); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, + thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : ut.rowsNum - 1; + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = + Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() + ? domUtils.getElementsByTagName(ut.table, "td") + : ut.selectedTds; + utils.each(cells, function(node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands["cellalignment"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = + start && + domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/gi.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function(cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function(cmd) { + var activeMenuCell = getTableItemsByRange(this).cell; + + if (!activeMenuCell) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + return null; + } else { + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && (cells = activeMenuCell); + + return UE.UETable.getTableCellAlignState(cells); + } + } + }; + //表格对齐方式 + UE.commands["tablealignment"] = { + queryCommandState: function() { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align", value); + } + } + }; + + //表格属性 + UE.commands["edittable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + var arr = domUtils + .getElementsByTagName(table, "td") + .concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function(node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands["edittd"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = + start && + domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function(cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function() { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function(cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function() { + var cells = getSelectedArr(this); + if (!cells.length) return -1; + for (var i = 0, cell; (cell = cells[i++]); ) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function() { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return interlaced === "enabled" ? -1 : 0; + } else { + return !interlaced || interlaced === "disabled" ? -1 : 0; + } + }, + execCommand: function(cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table, "td"), function(td) { + td.style.borderWidth = "1px"; + td.style.borderStyle = "solid"; + }); + } + }; + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table, "td th"); + utils.each(tds, function(td) { + td.removeAttribute("width"); + }); + table.setAttribute( + "width", + getTableWidth(editor, true, getDefaultValue(editor, table)) + ); + var tdsWidths = []; + setTimeout(function() { + utils.each(tds, function(td) { + td.colSpan == 1 && tdsWidths.push(td.offsetWidth); + }); + utils.each(tds, function(td, i) { + td.colSpan == 1 && td.setAttribute("width", tdsWidths[i] + ""); + }); + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return ( + body.offsetWidth - + (needIEHack + ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (editor.options.offsetWidth || 0) + ); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js new file mode 100644 index 0000000..67dcf85 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js @@ -0,0 +1,1354 @@ +/** + * Created with JetBrains WebStorm. + * User: taoqili + * Date: 13-1-18 + * Time: 上午11:09 + * To change this template use File | Settings | File Templates. + */ +/** + * UE表格操作类 + * @param table + * @constructor + */ +;(function() { + var UETable = (UE.UETable = function(table) { + this.table = table; + this.indexTable = []; + this.selectedTds = []; + this.cellsRange = {}; + this.update(table); + }); + + //===以下为静态工具方法=== + UETable.removeSelectedClass = function(cells) { + utils.each(cells, function(cell) { + domUtils.removeClasses(cell, "selectTdClass"); + }); + }; + UETable.addSelectedClass = function(cells) { + utils.each(cells, function(cell) { + domUtils.addClass(cell, "selectTdClass"); + }); + }; + UETable.isEmptyBlock = function(node) { + var reg = new RegExp(domUtils.fillChar, "g"); + if ( + node[browser.ie ? "innerText" : "textContent"] + .replace(/^\s*$/, "") + .replace(reg, "").length > 0 + ) { + return 0; + } + for (var i in dtd.$isNotEmpty) + if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function(cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function(cells) { + !utils.isArray(cells) && (cells = [cells]); + + var result = {}, + status = ["align", "valign"], + tempStatus = null, + isSame = true; //状态是否相同 + + utils.each(cells, function(cellNode) { + utils.each(status, function(currentState) { + tempStatus = cellNode.getAttribute(currentState); + + if (!result[currentState] && tempStatus) { + result[currentState] = tempStatus; + } else if ( + !result[currentState] || + tempStatus !== result[currentState] + ) { + isSame = false; + return false; + } + }); + + return isSame; + }); + + return isSame ? result : null; + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function(editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if ( + start && + start.id && + start.id.indexOf("_baidu_bookmark_start_") === 0 && + start.nextSibling + ) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + table = tr && domUtils.findParentByTagName(tr, ["table"]), + caption = table && table.getElementsByTagName("caption")[0]; + + return { + cell: cell, + tr: tr, + table: table, + caption: caption + }; + }; + UETable.getUETableBySelected = function(editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function(editor, table) { + var borderMap = { + thin: "0px", + medium: "1px", + thick: "2px" + }, + tableBorder, + tdPadding, + tdBorder, + tmpValue; + if (!table) { + table = editor.document.createElement("table"); + table.insertRow(0).insertCell(0).innerHTML = "xxx"; + editor.body.appendChild(table); + var td = table.getElementsByTagName("td")[0]; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } else { + td = table.getElementsByTagName("td")[0]; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function(tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = tag == "td" || tag == "th" || tag == "caption" + ? domUtils.findParentByTagName(tdOrTable, "table", true) + : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function(cell, ignoreMerge, keepPro) { + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || "td"); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell, "width height"); + !keepPro && domUtils.removeAttributes(tmpCell, "style"); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + }; + + UETable.prototype = { + getMaxRows: function() { + var rows = this.table.rows, + maxLen = 1; + for (var i = 0, row; (row = rows[i]); i++) { + var currentMax = 1; + for (var j = 0, cj; (cj = row.cells[j++]); ) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols: function() { + var rows = this.table.rows, + maxLen = 0, + cellRows = {}; + for (var i = 0, row; (row = rows[i]); i++) { + var cellsNum = 0; + for (var j = 0, cj; (cj = row.cells[j++]); ) { + cellsNum += cj.colSpan || 1; + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows["row_" + (i + k)]) { + cellRows["row_" + (i + k)] = cj.colSpan || 1; + } else { + cellRows["row_" + (i + k)]++; + } + } + } + } + cellsNum += cellRows["row_" + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex: function(cell) {}, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell: function(cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, + previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ( + (!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || + (right && + (!len + ? cellInfo.colIndex == this.colsNum - 1 + : range.endColIndex == this.colsNum - 1)) + ) + return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right + ? !len + ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 + : range.beginColIndex - 1 + : !len ? cellInfo.colIndex + 1 : range.endColIndex + 1; + return this.getCell( + this.indexTable[previewRowIndex][previewColIndex].rowIndex, + this.indexTable[previewRowIndex][previewColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + getTabNextCell: function(cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell( + this.indexTable[rowIndex][colIndex].rowIndex, + this.indexTable[rowIndex][colIndex].cellIndex + ); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell( + this.indexTable[rowIndex][colIndex].rowIndex, + this.indexTable[rowIndex][colIndex].cellIndex + ); + } catch (e) {} + } + return nextCell; + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell: function(cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, + nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ( + (!bottom && cellInfo.rowIndex == 0) || + (bottom && + (!len + ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 + : range.endRowIndex == this.rowsNum - 1)) + ) + return null; + + nextRowIndex = !bottom + ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 + : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell( + this.indexTable[nextRowIndex][nextColIndex].rowIndex, + this.indexTable[nextRowIndex][nextColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells: function(cell, xOrY) { + try { + var flag = xOrY.toLowerCase() === "x", + end = + domUtils.getXY(cell)[flag ? "x" : "y"] + + cell["offset" + (flag ? "Width" : "Height")], + rows = this.table.rows, + cells = null, + returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { + var tmpEnd = + domUtils.getXY(tmpCell)[flag ? "x" : "y"] + + tmpCell["offset" + (flag ? "Width" : "Height")]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent: function(cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
    "); + }, + cloneCell: UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells: function(cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, + cells, + returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update: function(table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; (row = rows[rowIndex]); rowIndex++) { + for ( + var cellIndex = 0, cell, cells = row.cells; + (cell = cells[cellIndex]); + cellIndex++ + ) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex: rowIndex, + cellIndex: cellIndex, + colIndex: colIndex, + rowSpan: rowSpan, + colSpan: colSpan + }; + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell + ? cell.cloneNode(true) + : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1) cell.colSpan = 1; + if (cell.rowSpan !== 1) cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex: j, + cellIndex: cell.cellIndex, + colIndex: k, + rowSpan: 1, + colSpan: 1 + }; + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function(td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex: startInfo.rowIndex, + beginColIndex: startInfo.colIndex, + endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex: endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for (var i = 1; i < this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo: function(cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if ( + cellInfo.rowIndex === rowIndex && + cellInfo.cellIndex === cellIndex + ) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell: function(rowIndex, cellIndex) { + return ( + (rowIndex < this.rowsNum && + this.table.rows[rowIndex].cells[cellIndex]) || + null + ); + }, + /** + * 删除单元格 + */ + deleteCell: function(cell, rowIndex) { + rowIndex = typeof rowIndex == "number" + ? rowIndex + : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange: function(cellA, cellB) { + function checkRange( + beginRowIndex, + beginColIndex, + endRowIndex, + endColIndex + ) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, + colIndex, + rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if ( + tmpBeginRowIndex != beginRowIndex || + tmpBeginColIndex != beginColIndex || + tmpEndRowIndex != endRowIndex || + tmpEndColIndex != endColIndex + ) { + return checkRange( + tmpBeginRowIndex, + tmpBeginColIndex, + tmpEndRowIndex, + tmpEndColIndex + ); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex: beginRowIndex, + beginColIndex: beginColIndex, + endRowIndex: endRowIndex, + endColIndex: endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex: cellAInfo.rowIndex, + beginColIndex: cellAInfo.colIndex, + endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max( + cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + cellBInfo.rowIndex + cellBInfo.rowSpan - 1 + ), + endColIndex = Math.max( + cellAInfo.colIndex + cellAInfo.colSpan - 1, + cellBInfo.colIndex + cellBInfo.colSpan - 1 + ); + + return checkRange( + beginRowIndex, + beginColIndex, + endRowIndex, + endColIndex + ); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells: function(range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, + rowIndex, + colIndex, + tdHash = {}, + returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + "|" + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if ( + rowIndex < i || + colIndex < j || + rowIndex + cellInfo.rowSpan - 1 > endRowIndex || + colIndex + cellInfo.colSpan - 1 > endColIndex + ) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected: function() { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected: function(range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow: function() { + var range = this.cellsRange; + return range.endColIndex - range.beginColIndex + 1 == this.colsNum; + }, + isFullCol: function() { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length + ? rows == this.rowsNum + : rows == this.rowsNum || rows == this.rowsNum - 1; + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell: function(cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, + nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ( + (!bottom && cellInfo.rowIndex == 0) || + (bottom && + (!len + ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 + : range.endRowIndex == this.rowsNum - 1)) + ) + return null; + + nextRowIndex = !bottom + ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 + : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell( + this.indexTable[nextRowIndex][nextColIndex].rowIndex, + this.indexTable[nextRowIndex][nextColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + getPreviewCell: function(cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, + previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ( + (!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || + (top && + (!len + ? cellInfo.rowIndex > this.colsNum - 1 + : range.endColIndex == this.colsNum - 1)) + ) + return null; + + previewRowIndex = !top + ? !len ? cellInfo.rowIndex : range.beginRowIndex + : !len + ? cellInfo.rowIndex < 1 ? 0 : cellInfo.rowIndex - 1 + : range.beginRowIndex; + previewColIndex = !top + ? !len + ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 + : range.beginColIndex - 1 + : !len ? cellInfo.colIndex : range.endColIndex + 1; + return this.getCell( + this.indexTable[previewRowIndex][previewColIndex].rowIndex, + this.indexTable[previewRowIndex][previewColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent: function(cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement("br")); + } + while ((child = cellFrom.firstChild)) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight: function(cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell( + rightCellInfo.rowIndex, + rightCellInfo.cellIndex + ); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown: function(cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange: function() { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell( + range.beginRowIndex, + this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex + ); + + // 这段关于行表头或者列表头的特殊处理会导致表头合并范围错误 + // 为什么有这段代码的原因未明,暂且注释掉,希望原作者看到后出面说明下 + // if ( + // leftTopCell.tagName == "TH" && + // range.endRowIndex !== range.beginRowIndex + // ) { + // var index = this.indexTable, + // info = this.getCellInfo(leftTopCell); + // leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + // range = this.getCellsRange( + // leftTopCell, + // this.getCell( + // index[this.rowsNum - 1][info.colIndex].rowIndex, + // index[this.rowsNum - 1][info.colIndex].cellIndex + // ) + // ); + // } + + // 删除剩余的Cells + var cells = this.getCells(range); + for (var i = 0, ci; (ci = cells[i++]); ) { + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if (this.table.deleteRow) { + for ( + var i = rowIndex + 1, + curIndex = rowIndex + 1, + len = leftTopCell.rowSpan; + i < len; + i++ + ) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow: function(rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), + cell, + thead = null, + isInsertTitle = + typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == "TH") { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell); + } + } else { + if (cell.tagName == "TH") { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell); + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute("vAlign") && + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + row.appendChild(cell); + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + + if (isInsertTitle) { + thead = table.createTHead(); + thead.insertBefore(row, thead.firstChild); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow: function(rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum; ) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = + this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) + nextRow.insertBefore(clone, nextRow.cells[0]); + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], + cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key]) continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function(td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function(td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol: function(colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, + cell, + backWidth = parseInt( + (this.table.offsetWidth - + (this.colsNum + 1) * 20 - + (this.colsNum + 1)) / + (this.colsNum + 1), + 10 + ), + isInsertTitleCol = + typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == "TH") { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell); + } + } else { + if (cell.tagName == "TH") { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell); + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = + tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + preCell && cell.setAttribute("width", preCell.getAttribute("width")); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter( + tableRow.cells[tableRow.cells.length - 1], + cell + ); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + preCell && + cell.setAttribute("width", preCell.getAttribute("width")); + //防止IE下报错 + preCell + ? tableRow.insertBefore(cell, preCell) + : tableRow.appendChild(cell); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth( + backWidth, + defaultValue || { tdPadding: 10, tdBorder: 1 } + ); + }, + updateWidth: function(width, defaultValue) { + var table = this.table, + tmpWidth = + UETable.getWidth(table) - + defaultValue.tdPadding * 2 - + defaultValue.tdBorder + + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function(td) { + td.setAttribute("width", width); + }); + }, + deleteCol: function(colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum; ) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + "_" + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key]) continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) + backTdWidth = + cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells: function(cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function(cell) { + me.splitToCols(cell); + }); + }, + splitToRows: function(cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for ( + var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; + i < endRow; + i++ + ) { + if (i == rowIndex) continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell( + colIndex - this.getPreviewMergedCellsNum(i, colIndex) + ); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + tmpCell.setAttribute("align", cell.getAttribute("align")); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum: function(rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex; ) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += colSpan - (tmpRowIndex == rowIndex ? 1 : 0); + i += colSpan; + } + return num; + }, + splitToCols: function(cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for ( + var j = colIndex, endCol = colIndex + cellInfo.colSpan; + j < endCol; + j++ + ) { + if (j == colIndex) continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell( + this.indexTable[rowIndex][j].cellIndex + 1 + ); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + tmpCell.setAttribute("align", cell.getAttribute("align")); + tmpCell.setAttribute("width", backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == "TH") { + var th = cell.ownerDocument.createElement("th"); + th.appendChild(tmpCell.firstChild); + th.setAttribute("vAlign", cell.getAttribute("vAlign")); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell: function(cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ( + cellInfo.rowIndex + cellInfo.rowSpan == rowsNum && + cellInfo.colIndex + cellInfo.colSpan == colsNum + ); + }, + getLastCell: function(cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, + last = cells[0], + tr = last.parentNode, + cellsNum = 0, + cols = 0, + rows; + utils.each(cells, function(cell) { + if (cell.parentNode == tr) cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function(cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + }, + selectRow: function(rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell( + indexRow[this.colsNum - 1].rowIndex, + indexRow[this.colsNum - 1].cellIndex + ), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable: function() { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground: function(cells, value) { + if (typeof value === "string") { + utils.each(cells, function(cell) { + cell.style.backgroundColor = value; + }); + } else if (typeof value === "object") { + value = utils.extend( + { + repeat: true, + colorList: ["#ddd", "#fff"] + }, + value + ); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function(list, index, repeat) { + return list[index] + ? list[index] + : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; (cell = cells[i++]); ) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor( + colors, + rowIndex + count == cellInfo.rowIndex ? count : ++count, + value.repeat + ); + } + } + }, + removeBackground: function(cells) { + utils.each(cells, function(cell) { + cell.style.backgroundColor = ""; + }); + } + }; + function showError(e) {} +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js new file mode 100644 index 0000000..9e4a2e7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js @@ -0,0 +1,201 @@ +/** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + +UE.UETable.prototype.sortTable = function(sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if (this.selectedTds.length) { + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0, range.beginRowIndex); + lastRowIndex = range.endRowIndex + 1 === this.rowsNum + ? 0 + : range.endRowIndex + 1; + } else { + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + reversecurrent: function(td1, td2) { + return 1; + }, + orderbyasc: function(td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + reversebyasc: function(td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + orderbynum: function(td1, td2) { + var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), + value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + reversebynum: function(td1, td2) { + var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), + value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute( + "data-sort-type", + compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : "" + ); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray, function(tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else { + result = Fn["orderbyasc"].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore( + fragment, + rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] + ); + } +}; + +UE.plugins["tablesort"] = function() { + var me = this, + UT = UE.UETable, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function(editor) { + return UT.getTableItemsByRange(editor); + }; + + me.ready(function() { + //添加表格可排序的样式 + utils.cssRule( + "tablesort", + "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;" + + " background-image:url(" + + me.options.themePath + + me.options.theme + + "/images/sortable.png);}", + me.document + ); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function(type, cmd) { + if (cmd == "mergeright" || cmd == "mergedown" || cmd == "mergecells") { + this.execCommand("disablesort"); + } + }); + }); + + //表格排序 + UE.commands["sorttable"] = { + queryCommandState: function() { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; (cell = cells[i++]); ) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function(cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try { + range.select(); + } catch (e) {} + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (table && cmd == "enablesort") { + var cells = domUtils.getElementsByTagName(table, "th td"); + for (var i = 0; i < cells.length; i++) { + if ( + cells[i].getAttribute("colspan") > 1 || + cells[i].getAttribute("rowspan") > 1 + ) + return -1; + } + } + + return !table + ? -1 + : (cmd == "enablesort") ^ + (table.getAttribute("data-sort") != "sortEnabled") + ? -1 + : 0; + }, + execCommand: function(cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute( + "data-sort", + cmd == "enablesort" ? "sortEnabled" : "sortDisabled" + ); + cmd == "enablesort" + ? domUtils.addClass(table, "sortEnabled") + : domUtils.removeClasses(table, "sortEnabled"); + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js new file mode 100644 index 0000000..adb5e1a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js @@ -0,0 +1,47 @@ +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template +UE.plugins["template"] = function() { + UE.commands["template"] = { + execCommand: function(cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function(type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent( + el, + function(node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, + true + ); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function(type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent( + range.startContainer, + function(node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, + true + ); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js new file mode 100644 index 0000000..2734ebf --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js @@ -0,0 +1,57 @@ +/** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + +/** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ +UE.commands["time"] = UE.commands["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); + } + + this.execCommand( + "insertHtml", + cmd == "time" ? formatTime(date, format) : formatDate(date, format) + ); + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js new file mode 100644 index 0000000..083b75b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js @@ -0,0 +1,332 @@ +/** + * undo redo + * @file + * @since 1.2.6.1 + */ + +/** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + +/** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + +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; + } + + 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; + } + 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.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); + } + }, 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; + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js new file mode 100644 index 0000000..a406898 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js @@ -0,0 +1,239 @@ +/** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["video"] = function() { + var me = this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url, width, height, id, align, classname, type) { + var str; + switch (type) { + case "image": + str = + "'; + break; + case "embed": + str = + ''; + break; + case "video": + var ext = url.substr(url.lastIndexOf(".") + 1); + if (ext == "ogv") ext = "ogg"; + str = + "' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root, img2video) { + utils.each( + root.getNodesByTagName(img2video ? "img" : "embed video"), + function(node) { + var className = node.getAttr("class"); + if (className && className.indexOf("edui-faked-video") != -1) { + var html = creatInsertStr( + img2video ? node.getAttr("_url") : node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + null, + node.getStyle("float") || "", + className, + img2video ? "embed" : "image" + ); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + if (className && className.indexOf("edui-upload-video") != -1) { + var html = creatInsertStr( + img2video ? node.getAttr("_url") : node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + null, + node.getStyle("float") || "", + className, + img2video ? "video" : "image" + ); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + } + ); + } + + me.addOutputRule(function(root) { + switchImgAndVideo(root, true); + }); + me.addInputRule(function(root) { + switchImgAndVideo(root); + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function(cmd, videoObjs, type) { + videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]; + + if (me.fireEvent("beforeinsertvideo", videoObjs) === true) { + return; + } + + var html = [], + id = "tmpVedio", + cl; + for (var i = 0, vi, len = videoObjs.length; i < len; i++) { + vi = videoObjs[i]; + cl = type == "upload" + ? "edui-upload-video video-js vjs-default-skin" + : "edui-faked-video"; + html.push( + creatInsertStr( + vi.url, + vi.width || 420, + vi.height || 280, + id + i, + null, + cl, + "image" + ) + ); + } + me.execCommand("inserthtml", html.join(""), true); + var rng = this.selection.getRange(); + for (var i = 0, len = videoObjs.length; i < len; i++) { + var img = this.document.getElementById("tmpVedio" + i); + domUtils.removeAttributes(img, "id"); + rng.selectNode(img).select(); + me.execCommand("imagefloat", videoObjs[i].align); + } + + me.fireEvent("afterinsertvideo", videoObjs); + }, + queryCommandState: function() { + var img = me.selection.getRange().getClosedNode(), + flag = + img && + (img.className == "edui-faked-video" || + img.className.indexOf("edui-upload-video") != -1); + return flag ? 1 : 0; + } + }; +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js new file mode 100644 index 0000000..ddd5954 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js @@ -0,0 +1,193 @@ +/** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

    ' : '') + '' + +// (addParagraph ? '

    ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + +UE.plugin.register("webapp", function() { + var me = this; + function createInsertStr(obj, toEmbed) { + return !toEmbed + ? '" + : ''; + } + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(node) { + var html; + if (node.getAttr("class") == "edui-faked-webapp") { + html = createInsertStr( + { + title: node.getAttr("title"), + width: node.getAttr("width"), + height: node.getAttr("height"), + align: node.getAttr("align"), + cssfloat: node.getStyle("float"), + url: node.getAttr("_url"), + logo: node.getAttr("_logo_url") + }, + true + ); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }); + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("iframe"), function(node) { + if (node.getAttr("class") == "edui-faked-webapp") { + var img = UE.uNode.createElement( + createInsertStr({ + title: node.getAttr("title"), + width: node.getAttr("width"), + height: node.getAttr("height"), + align: node.getAttr("align"), + cssfloat: node.getStyle("float"), + url: node.getAttr("src"), + logo: node.getAttr("logo_url") + }) + ); + node.parentNode.replaceChild(img, node); + } + }); + }, + commands: { + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + webapp: { + execCommand: function(cmd, obj) { + var me = this, + str = createInsertStr( + utils.extend(obj, { + align: "none" + }), + false + ); + me.execCommand("inserthtml", str); + }, + queryCommandState: function() { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && img.className == "edui-faked-webapp"; + return flag ? 1 : 0; + } + } + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js new file mode 100644 index 0000000..a0532e8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js @@ -0,0 +1,41 @@ +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 +/* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * 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() { + 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); + }); + }); +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js new file mode 100644 index 0000000..1878ef2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js @@ -0,0 +1,58 @@ +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + +UE.plugin.register("wordimage", function() { + var me = this, + images = []; + 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("word_img"); + 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("word_img")) { + 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/notadd/images/spacer.gif"; + if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { + img.setAttr({ + width: attrs.width, + height: attrs.height, + alt: attrs.alt, + word_img: 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" + }); + } + }); + } + }; +}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js new file mode 100644 index 0000000..39665ef --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js @@ -0,0 +1,79 @@ +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UE.plugins.xssFilter = function() { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js new file mode 100644 index 0000000..68ed19d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js @@ -0,0 +1,151 @@ +///import core +///import uicore +///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); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js new file mode 100644 index 0000000..51ad3c9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js @@ -0,0 +1,170 @@ +///import core +///import uicore +;(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 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js new file mode 100644 index 0000000..908bd1e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js @@ -0,0 +1,18 @@ +;(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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js new file mode 100644 index 0000000..969b844 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js @@ -0,0 +1,80 @@ +///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; + } + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js new file mode 100644 index 0000000..2ebe3bb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js @@ -0,0 +1,99 @@ +///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; + + /** + * 该参数将新增一个参数: 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 + }, + 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]; + } + }, + 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; + + tempIndex === 0 && tmpl.push(""); + + tmpl.push( + '
    ' + ); + + tempIndex === 2 && tmpl.push(""); + } + + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js new file mode 100644 index 0000000..1cc3a82 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js @@ -0,0 +1,61 @@ +///import core +///import uicore +///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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js new file mode 100644 index 0000000..d8f9cd3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js @@ -0,0 +1,98 @@ +///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(); + }); + + 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"); + } + }; + 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; + } +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js new file mode 100644 index 0000000..7dc0651 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js @@ -0,0 +1,99 @@ +///import core +///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 + }); + + 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); + } + } + }; + utils.inherits(Combox, SplitButton); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js new file mode 100644 index 0000000..46afddb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js @@ -0,0 +1,449 @@ +///import core +///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 + ) + ); + } + } + } + }, + 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() { + var popBodyEl = this.getDom("body"); + // if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) { + // uiUtils.removeStyle(popBodyEl, 'width'); + // uiUtils.removeStyle(popBodyEl, 'height'); + // } + var size = this.mesureSize(); + 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; + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js new file mode 100644 index 0000000..955d162 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js @@ -0,0 +1 @@ +!function(o){var h,p='',l=(h=document.getElementsByTagName("script"))[h.length-1].getAttribute("data-injectcss");if(l&&!o.__iconfont__svg__cssinject__){o.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}!function(h){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(h,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(a=h,t=o.document,i=!1,v=function(){i||(i=!0,a())},(p=function(){try{t.documentElement.doScroll("left")}catch(h){return void setTimeout(p,50)}v()})(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())});var a,t,i,v,p}(function(){var h,l,a,t,i,v;(h=document.createElement("div")).innerHTML=p,p=null,(l=h.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",a=l,(t=document.body).firstChild?(i=a,(v=t.firstChild).parentNode.insertBefore(i,v)):t.appendChild(a))})}(window); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js new file mode 100644 index 0000000..68602ae --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js @@ -0,0 +1,53 @@ +///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; + + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js new file mode 100644 index 0000000..2ff853a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js @@ -0,0 +1,280 @@ +///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, + 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); + } + } + }, + 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(); + } + }; + 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; + + //获取单元格对齐初始状态 + 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 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(); + } + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js new file mode 100644 index 0000000..2a9cfbd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js @@ -0,0 +1,39 @@ +///import core +///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; + } + } + }); + this.initSplitButton(); + }, + setValue: function(value) { + this._value = value; + } + }; + utils.inherits(MenuButton, SplitButton); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js new file mode 100644 index 0000000..98b7f8e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js @@ -0,0 +1,82 @@ +///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(); + }); + }, + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js new file mode 100644 index 0000000..f0c0b40 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js @@ -0,0 +1,45 @@ +///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(); + }); + + 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(); + } + }; + + utils.inherits(MultiMenuPop, SplitButton); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js new file mode 100644 index 0000000..edcc4d1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js @@ -0,0 +1,71 @@ +///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; + + 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 (/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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js new file mode 100644 index 0000000..83cf4f3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js @@ -0,0 +1,268 @@ +///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(); + }); + + 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(); + } + } + } + + 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上的鼠标滚轮事件, 防止用户的正常操作被误解 + if (window.XMLHttpRequest) { + 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; + } + } + ); + } else { + //ie6 + domUtils.on(this.getDom(), "mousewheel", function(e) { + e.returnValue = false; + + me.getDom("content").scrollTop -= e.wheelDelta / 120 * 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() { + 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; + } + + 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); + }); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js new file mode 100644 index 0000000..b0deb13 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js @@ -0,0 +1,18 @@ +;(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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js new file mode 100644 index 0000000..16c2d8a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js @@ -0,0 +1,245 @@ +;(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 ShortCutMenu = (UI.ShortCutMenu = function(options) { + this.initOptions(options); + this.initShortCutMenu(); + }); + + 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) { + 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, 0.2); + } + + 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(window, "scroll", function(e) { + hideAllMenu(e); + }); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js new file mode 100644 index 0000000..67a94bf --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js @@ -0,0 +1,99 @@ +///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( + '
    ' + ) + ); + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js new file mode 100644 index 0000000..c6e20b7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js @@ -0,0 +1,110 @@ +;(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);"'); + + 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"); + } + } + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js new file mode 100644 index 0000000..b94d8c8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js @@ -0,0 +1,36 @@ +///import core +///import uicore +///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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js new file mode 100644 index 0000000..2a99a31 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js @@ -0,0 +1,102 @@ +///import core +///import uicore +;(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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js new file mode 100644 index 0000000..9768ca0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js @@ -0,0 +1,49 @@ +;(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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js new file mode 100644 index 0000000..dcf6c4d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js @@ -0,0 +1,3 @@ +var baidu = baidu || {}; +baidu.editor = baidu.editor || {}; +UE.ui = baidu.editor.ui = {}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js new file mode 100644 index 0000000..3565944 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js @@ -0,0 +1,82 @@ +;(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); + + //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); + } + holder = holder || uiUtils.getFixedLayer(); + 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); +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js new file mode 100644 index 0000000..2558927 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js @@ -0,0 +1,273 @@ +;(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 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 = []; + } + 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"; + } + 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"; + } + } + } + }); + 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) + ); + } +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/anchor/anchor.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/anchor/anchor.html new file mode 100644 index 0000000..bacffe9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/anchor/anchor.html @@ -0,0 +1,40 @@ + + + + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.css new file mode 100644 index 0000000..15f49ed --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.css @@ -0,0 +1,682 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 上传附件 */ +.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: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#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; + /*border: 2px dashed #e6e6e6;*/ + height: 172px; + padding-top: 150px; + text-align: center; + /*background: url(./images/image.png) center 70px no-repeat;*/ + background-color: #f3f3f3; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 16px; + background: #f3f3f3; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + color: #646464; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */ + border: 1px solid #ccc; +} + +#upload .placeholder .webuploader-pick-hover { + border: 1px solid #00a2d4; + color: #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: 300px; +} + +#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: 9px 0 0 9px; + *margin: 6px 0 0 6px; + 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(../fonts/images/addfile.svg) no-repeat center; + 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; +} + + + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#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; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li div.file-wrapper { + cursor: pointer; + position: absolute; + display: block; + width: 111px; + height: 111px; + border: 1px solid #eee; + background: url("./images/bg.png") repeat; +} +#online li div span.file-title{ + display: block; + padding: 0 3px; + margin: 3px 0 0 0; + font-size: 12px; + height: 15px; + color: #555555; + text-align: center; + width: 107px; + white-space: nowrap; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + 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; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 在线文件的文件预览图标 */ +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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.html new file mode 100644 index 0000000..f698f19 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.html @@ -0,0 +1,60 @@ + + + + + neditor图片对话框 + + + + + + + + + + + + + + +
    +
    + + +
    +
    + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.js new file mode 100644 index 0000000..d9598b0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/attachment.js @@ -0,0 +1,775 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var uploadFile, + onlineFile; + + window.onload = function () { + initTabs(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + setTabFocus('upload'); + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id') + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'upload': + uploadFile = uploadFile || new UploadFile('queueList'); + break; + case 'online': + onlineFile = onlineFile || new OnlineFile('fileList'); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'upload': + list = uploadFile.getInsertList(); + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineFile.getInsertList(); + break; + } + + editor.execCommand('insertfile', list); + }; + } + + + /* 上传附件 */ + 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('fileActionName')), + fileMaxSize = editor.getOpt('fileMaxSize'), + acceptExtensions = (editor.getOpt('fileAllowFiles') || + [".txt",".doc",".docs",".xls",".xlsx",".ppt",".pdf",".odt",".ott",".fodt",".uot",".xml",".dot",".htm",".html",".rtf",".docm",".zip",".rar",".tar",".7z",".tar.gz",".tar.bz",".tar.xz"]).join('').replace(/\./g, ',').replace(/^[,]/, '');; + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('fileActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('fileFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + 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) { + $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) { + /* 选择文件后设置上传相关的url和自定义参数 */ + editor.getOpt("fileUploadService")(_this, editor).setUploadData(file); + + if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) { + fileCount++; + fileSize += file.size; + } + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) { + 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': + /* 设置Uploader配置项 */ + editor.getOpt("fileUploadService")(_this, editor).setUploaderOptions(uploader); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (object, data, headers) { + //这里可以通过data对象添加POST参数 + editor.getOpt("fileUploadService")(_this, editor).setFormData(object, data, headers); + }); + + 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, res) { + var $file = $('#' + file.id); + try { + if (editor.getOpt("fileUploadService")(_this, editor).getResponseSuccess(res)) { + _this.fileList.push(res); + $file.append(''); + } else { + $file.find('.error').text(res.message).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + 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('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; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'), + fileSrcField = editor.getOpt("fileUploadService")(this, editor).fileSrcField || 'url', + fileSrc = '', + fileSrcFieldKeys = fileSrcField.split('.'); + + for (i = 0; i < this.fileList.length; i++) { + data = this.fileList[i]; + if(fileSrcFieldKeys.length > 1) { + function setFileSrc(obj, keys, index) { + obj = obj[keys[index]]; + if (index < keys.length - 1) { + setFileSrc(obj, keys, index += 1) + } else { + fileSrc = obj; + } + } + + setFileSrc(data, fileSrcFieldKeys, 0); + } else { + fileSrc = data[fileSrcField]; + } + link = fileSrc; + list.push({ + title: data.original || link.substr(link.lastIndexOf('/') + 1), + url: prefix + link + }); + } + return list; + } + }; + + + /* 在线附件 */ + function OnlineFile(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineFile.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + this.initData(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('fileList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getFileData(); + } + }); + /* 选中图片 */ + domUtils.on(this.list, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('fileManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getFileData(); + }, + /* 向后台拉取图片列表数据 */ + getFileData: function () { + var _this = this; + + 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')), + method: 'get', + onsuccess: function (r) { + try { + var json = 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) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + onerror: function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + 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) { + 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 ) { + preview = document.createElement('img'); + 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) ); + } else { + var ic = document.createElement('i'), + textSpan = document.createElement('span'); + textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + preview = document.createElement('div'); + preview.appendChild(ic); + preview.appendChild(textSpan); + domUtils.addClass(preview, 'file-wrapper'); + domUtils.addClass(textSpan, 'file-title'); + domUtils.addClass(ic, 'file-type-' + filetype); + domUtils.addClass(ic, 'file-preview'); + } + domUtils.addClass(icon, 'icon'); + item.setAttribute('data-url', urlPrefix + list[i].url); + if (list[i].original) { + item.setAttribute('data-title', list[i].original); + } + + item.appendChild(preview); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = []; + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var url = lis[i].getAttribute('data-url'); + var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); + list.push({ + title: title, + url: url + }); + } + } + return list; + } + }; + + +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_chm.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_chm.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ca4fb6a23c7ed528374426575c3e7f67730cfb7 GIT binary patch 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~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_default.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_default.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac1cb1654c147225f6c99f98fa820d8b1d47d3 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_doc.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_doc.gif new file mode 100644 index 0000000000000000000000000000000000000000..206fede4ee7495c3d4fa8dbbb76425e23566e9cc GIT binary patch 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~@^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mp3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mp3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b351a1f2a294cd0f8e145e20c2c455a38cad2001 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mv.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_mv.gif new file mode 100644 index 0000000000000000000000000000000000000000..26019b099d96b382a549fa383bd81315cd6d295c GIT binary patch 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+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_pdf.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_pdf.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb65c837dea9a6c28d6209ca1b1140a37988423 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_ppt.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_ppt.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccb26fbebdff5521eab7418d22e99fbae6c1d08c GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_psd.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_psd.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e8743a2705b98b9c546c28c97fe724dd4668b16 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_xls.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/fileTypeImages/icon_xls.gif new file mode 100644 index 0000000000000000000000000000000000000000..e86c1c6631b34ecd605b655baf3d7b1ae643d014 GIT binary patch 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| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/alignicon.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/alignicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..005a5ac65a3ddc9cdac037abdb5fe92267155a0d GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/file-icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..717c4865c90a959c6a0e9ad1af9c777d900a2e9c GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/success.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/attachment/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# + + + + + + + +

    +
    + + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + : +
    +
    +
    +
    +
    + +
    +
    + : +
    +
    + :x:px  y:px +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.js new file mode 100644 index 0000000..9a4a131 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/background.js @@ -0,0 +1,376 @@ +(function () { + + var onlineImage, + backupStyle = editor.queryCommandValue('background'); + + window.onload = function () { + initTabs(); + initColorSelector(); + }; + + /* 初始化tab标签 */ + 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){ + tabs[j].className = "focus"; + var contentId = tabs[j].getAttribute('data-content-id'); + $G(contentId).style.display = "block"; + if(contentId == 'imgManager') { + initImagePanel(); + } + }else { + tabs[j].className = ""; + $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; + } + } + }); + } + } + + /* 初始化颜色设置 */ + function initColorSelector () { + var obj = editor.queryCommandValue('background'); + if (obj) { + var color = obj['background-color'], + repeat = obj['background-repeat'] || 'repeat', + image = obj['background-image'] || '', + position = obj['background-position'] || 'center center', + pos = position.split(' '), + x = parseInt(pos[0]) || 0, + y = parseInt(pos[1]) || 0; + + if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; + + image = image.match(/url[\s]*\(([^\)]*)\)/); + image = image ? image[1]:''; + updateFormState('colored', color, image, repeat, x, y); + } else { + updateFormState(); + } + + var updateHandler = function () { + updateFormState(); + updateBackground(); + } + 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); + }); + } + updateHandler(); + }); + domUtils.on($G('repeatType'), 'change', updateHandler); + domUtils.on($G('x'), 'keyup', updateBackground); + domUtils.on($G('y'), 'keyup', updateBackground); + + initColorPicker(); + } + + /* 初始化颜色选择器 */ + function initColorPicker() { + var me = editor, + cp = $G("colorPicker"); + + /* 生成颜色选择器ui对象 */ + var popup = new UE.ui.Popup({ + content: new UE.ui.ColorPicker({ + noColorText: me.getLang("clearColor"), + editor: me, + onpickcolor: function (t, color) { + updateFormState('colored', color); + updateBackground(); + UE.ui.Popup.postHide(); + }, + onpicknocolor: function (t, color) { + updateFormState('colored', 'transparent'); + updateBackground(); + UE.ui.Popup.postHide(); + } + }), + editor: me, + onhide: function () { + } + }); + + /* 设置颜色选择器 */ + domUtils.on(cp, "click", function () { + popup.showAnchor(this); + }); + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + UE.ui.Popup.postHide(el); + }); + domUtils.on(window, 'scroll', function () { + UE.ui.Popup.postHide(); + }); + } + + /* 初始化在线图片列表 */ + function initImagePanel() { + onlineImage = onlineImage || new OnlineImage('imageList'); + } + + /* 更新背景色设置面板 */ + 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(color) { + domUtils.setStyle($G("colorPicker"), "background-color", color); + } + + 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); + } + + 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(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'; + } + + /* 更新背景颜色 */ + function updateBackground () { + if ($G('coloredRadio').checked) { + var color = domUtils.getStyle($G("colorPicker"), "background-color"), + bgimg = $G("url").value, + align = $G("repeatType").value, + backgroundObj = { + "background-repeat": "no-repeat", + "background-position": "center center" + }; + + if (color) backgroundObj["background-color"] = color; + if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; + if (align == 'self') { + backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; + } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { + backgroundObj["background-repeat"] = align; + } + + editor.execCommand('background', backgroundObj); + } else { + editor.execCommand('background', null); + } + } + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.id = 'imageListUl'; + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode, + nodes = $G('imageListUl').childNodes; + + if (li.tagName.toLowerCase() == 'li') { + updateFormState('nocolor', null, ''); + for (var i = 0, node; node = nodes[i++];) { + if (node == li && !domUtils.hasClass(node, 'selected')) { + domUtils.addClass(node, 'selected'); + updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); + } else { + domUtils.removeClasses(node, 'selected'); + } + } + updateBackground(); + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + 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':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + 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) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + 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(){ + _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); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + floatStyle: align + }); + } + + } + return list; + } + }; + + dialog.onok = function () { + updateBackground(); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + editor.execCommand('background', backupStyle); + }; + +})(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/background/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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'+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; + } + } + } + } + } +]; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.css new file mode 100644 index 0000000..ac3c764 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.css @@ -0,0 +1,165 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; +} + +.main { + width: 100%; + overflow: hidden; +} + +.table-view { + height: 100%; + float: left; + margin: 20px; + width: 40%; +} + +.table-view .table-container { + width: 100%; + margin-bottom: 50px; + overflow: scroll; +} + +.table-view th { + padding: 5px 10px; + background-color: #F7F7F7; +} + +.table-view td { + width: 50px; + text-align: center; + padding:0; +} + +.table-container input { + width: 40px; + padding: 5px; + border: none; + outline: none; +} + +.table-view caption { + font-size: 18px; + text-align: left; +} + +.charts-view { + /*margin-left: 49%!important;*/ + width: 50%; + margin-left: 49%; + height: 400px; +} + +.charts-container { + border-left: 1px solid #c3c3c3; +} + +.charts-format fieldset { + padding-left: 20px; + margin-bottom: 50px; +} + +.charts-format legend { + padding-left: 10px; + padding-right: 10px; +} + +.format-item-container { + padding: 20px; +} + +.format-item-container label { + display: block; + margin: 10px 0; +} + +.charts-format .data-item { + border: 1px solid black; + outline: none; + padding: 2px 3px; +} + +/* 图表类型 */ + +.charts-type { + margin-top: 50px; + height: 300px; +} + +.scroll-view { + border: 1px solid #c3c3c3; + border-left: none; + border-right: none; + overflow: hidden; +} + +.scroll-container { + margin: 20px; + width: 100%; + overflow: hidden; +} + +.scroll-bed { + width: 10000px; + _margin-top: 20px; + -webkit-transition: margin-left .5s ease; + -moz-transition: margin-left .5s ease; + transition: margin-left .5s ease; +} + +.view-box { + display: inline-block; + *display: inline; + *zoom: 1; + margin-right: 20px; + border: 2px solid white; + line-height: 0; + overflow: hidden; + cursor: pointer; +} + +.view-box img { + border: 1px solid #cecece; +} + +.view-box.selected { + border-color: #7274A7; +} + +.button-container { + margin-bottom: 20px; + text-align: center; +} + +.button-container a { + display: inline-block; + width: 100px; + height: 25px; + line-height: 25px; + border: 1px solid #c2ccd1; + margin-right: 30px; + text-decoration: none; + color: black; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.button-container a:HOVER { + background: #fcfcfc; +} + +.button-container a:ACTIVE { + border-top-color: #c2ccd1; + box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); +} + +.edui-charts-not-data { + height: 100px; + line-height: 100px; + text-align: center; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.html new file mode 100644 index 0000000..70e2314 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.html @@ -0,0 +1,89 @@ + + + + chart + + + + + +
    +
    +

    +
    +

    +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    + + + + +
    +
    +
    + +
    + +

    +
    +
    +
    + +
    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.js new file mode 100644 index 0000000..37344fd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/charts.js @@ -0,0 +1,519 @@ +/* + * 图片转换对话框脚本 + **/ + +var tableData = [], + //编辑器页面table + editorTable = null, + chartsConfig = window.typeConfig, + resizeTimer = null, + //初始默认图表类型 + currentChartType = 0; + +window.onload = function () { + + editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); + + //未找到表格, 显示错误页面 + if ( !editorTable ) { + document.body.innerHTML = "
    未找到数据
    "; + return; + } + + //初始化图表类型选择 + initChartsTypeView(); + renderTable( editorTable ); + initEvent(); + initUserConfig( editorTable.getAttribute( "data-chart" ) ); + $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); + updateViewType( currentChartType ); + + dialog.addListener( "resize", function () { + + if ( resizeTimer != null ) { + window.clearTimeout( resizeTimer ); + } + + resizeTimer = window.setTimeout( function () { + + resizeTimer = null; + + renderCharts(); + + }, 500 ); + + } ); + +}; + +function initChartsTypeView () { + + var contents = []; + + for ( var i = 0, len = chartsConfig.length; i
    ' ); + + } + + $( "#scrollBed" ).html( contents.join( "" ) ); + +} + +//渲染table, 以便用户修改数据 +function renderTable ( table ) { + + var tableHtml = []; + + //构造数据 + for ( var i = 0, row; row = table.rows[ i ]; i++ ) { + + tableData[ i ] = []; + tableHtml[ i ] = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = getCellValue( cell ); + + if ( i > 0 && j > 0 ) { + value = +value; + } + + if ( i === 0 || j === 0 ) { + tableHtml[ i ].push( ''+ value +'' ); + } else { + tableHtml[ i ].push( '' ); + } + + tableData[ i ][ j ] = value; + + } + + tableHtml[ i ] = tableHtml[ i ].join( "" ); + + } + + //draw 表格 + $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
    ' ); + +} + +/* + * 根据表格已有的图表属性初始化当前图表属性 + */ +function initUserConfig ( config ) { + + var parsedConfig = {}; + + if ( !config ) { + return; + } + + config = config.split( ";" ); + + $.each( config, function ( index, item ) { + + item = item.split( ":" ); + parsedConfig[ item[ 0 ] ] = item[ 1 ]; + + } ); + + setUserConfig( parsedConfig ); + +} + +function initEvent () { + + var cacheValue = null, + //图表类型数 + typeViewCount = chartsConfig.length- 1, + $chartsTypeViewBox = $( '#scrollBed .view-box' ); + + $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { + + renderCharts(); + + } ) + + $( ".table-view" ).delegate( ".data-item", "focus", function () { + + cacheValue = this.value; + + } ).delegate( ".data-item", "blur", function () { + + if ( this.value !== cacheValue ) { + renderCharts(); + } + + cacheValue = null; + + } ); + + $( "#buttonContainer" ).delegate( "a", "click", function (e) { + + e.preventDefault(); + + if ( this.getAttribute( "data-title" ) === 'prev' ) { + + if ( currentChartType > 0 ) { + currentChartType--; + updateViewType( currentChartType ); + } + + } else { + + if ( currentChartType < typeViewCount ) { + currentChartType++; + updateViewType( currentChartType ); + } + + } + + } ); + + //图表类型变化 + $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { + + var index = $( this ).attr( "data-chart-type" ); + $chartsTypeViewBox.removeClass( "selected" ); + $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); + + currentChartType = index | 0; + + //饼图, 禁用部分配置 + if ( currentChartType === chartsConfig.length - 1 ) { + + disableNotPieConfig(); + + //启用完整配置 + } else { + + enableNotPieConfig(); + + } + + renderCharts(); + + } ); + +} + +function renderCharts () { + + var data = collectData(); + + $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: data.title, + x: -20 //center + }, + subtitle: { + text: data.subTitle, + x: -20 + }, + xAxis: { + title: { + text: data.xTitle + }, + categories: data.categories + }, + yAxis: { + title: { + text: data.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: data.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: data.series + + } )); + +} + +function updateViewType ( index ) { + + $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); + +} + +function collectData () { + + var form = document.forms[ 'data-form' ], + data = null; + + if ( currentChartType !== chartsConfig.length - 1 ) { + + data = getSeriesAndCategories(); + $.extend( data, getUserConfig() ); + + //饼图数据格式 + } else { + data = getSeriesForPieChart(); + data.title = form[ 'title' ].value; + data.suffix = form[ 'unit' ].value; + } + + return data; + +} + +/** + * 获取用户配置信息 + */ +function getUserConfig () { + + var form = document.forms[ 'data-form' ], + info = { + title: form[ 'title' ].value, + subTitle: form[ 'sub-title' ].value, + xTitle: form[ 'x-title' ].value, + yTitle: form[ 'y-title' ].value, + suffix: form[ 'unit' ].value, + //数据对齐方式 + tableDataFormat: getTableDataFormat (), + //饼图提示文字 + tip: $( "#tipInput" ).val() + }; + + return info; + +} + +function setUserConfig ( config ) { + + var form = document.forms[ 'data-form' ]; + + config.title && ( form[ 'title' ].value = config.title ); + config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); + config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); + config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); + config.suffix && ( form[ 'unit' ].value = config.suffix ); + config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); + config.tip && ( form[ 'tip' ].value = config.tip ); + currentChartType = config.chartType || 0; + +} + +function getSeriesAndCategories () { + + var form = document.forms[ 'data-form' ], + series = [], + categories = [], + tmp = [], + tableData = getTableData(); + + //反转数据 + if ( getTableDataFormat() === "-1" ) { + + for ( var i = 0, len = tableData.length; i < len; i++ ) { + + for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { + + if ( !tmp[ j ] ) { + tmp[ j ] = []; + } + + tmp[ j ][ i ] = tableData[ i ][ j ]; + + } + + } + + tableData = tmp; + + } + + categories = tableData[0].slice( 1 ); + + for ( var i = 1, data; data = tableData[ i ]; i++ ) { + + series.push( { + name: data[ 0 ], + data: data.slice( 1 ) + } ); + + } + + return { + series: series, + categories: categories + }; + +} + +/* + * 获取数据源数据对齐方式 + */ +function getTableDataFormat () { + + var form = document.forms[ 'data-form' ], + items = form['charts-format']; + + return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; + +} + +/* + * 禁用非饼图类型的配置项 + */ +function disableNotPieConfig() { + + updateConfigItem( 'disable' ); + +} + +/* + * 启用非饼图类型的配置项 + */ +function enableNotPieConfig() { + + updateConfigItem( 'enable' ); + +} + +function updateConfigItem ( value ) { + + var table = $( "#showTable" )[ 0 ], + isDisable = value === 'disable' ? true : false; + + //table中的input处理 + for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + $( "input", cell ).attr( "disabled", isDisable ); + + } + + } + + //其他项处理 + $( "input.not-pie-item" ).attr( "disabled", isDisable ); + $( "#tipInput" ).attr( "disabled", !isDisable ) + +} + +/* + * 获取饼图数据 + * 饼图的数据只取第一行的 + **/ +function getSeriesForPieChart () { + + var series = { + type: 'pie', + name: $("#tipInput").val(), + data: [] + }, + tableData = getTableData(); + + + for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { + + var title = tableData[ 0 ][ j ], + val = tableData[ 1 ][ j ]; + + series.data.push( [ title, val ] ); + + } + + return { + series: [ series ] + }; + +} + +function getTableData () { + + var table = document.getElementById( "showTable" ), + xCount = table.rows[0].cells.length - 1, + values = getTableInputValue(); + + for ( var i = 0, value; value = values[ i ]; i++ ) { + + tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; + + } + + return tableData; + +} + +function getTableInputValue () { + + var table = document.getElementById( "showTable" ), + inputs = table.getElementsByTagName( "input" ), + values = []; + + for ( var i = 0, input; input = inputs[ i ]; i++ ) { + values.push( input.value | 0 ); + } + + return values; + +} + +function getCellValue ( cell ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + +} + + +//dialog确认事件 +dialog.onok = function () { + + //收集信息 + var form = document.forms[ 'data-form' ], + info = getUserConfig(); + + //添加图表类型 + info.chartType = currentChartType; + + //同步表格数据到编辑器 + syncTableData(); + + //执行图表命令 + editor.execCommand( 'charts', info ); + +}; + +/* + * 同步图表编辑视图的表格数据到编辑器里的原始表格 + */ +function syncTableData () { + + var tableData = getTableData(); + + for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + cell.innerHTML = tableData[ i ] [ j ]; + + } + + } + +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts0.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts0.png new file mode 100644 index 0000000000000000000000000000000000000000..9485e5ed8f83888e782eafae6f7505c79671a985 GIT binary patch literal 25306 zcmbTd1yEdF*EQHkAR%ag0Kp-_U4v_oV8H^x-5r8MLkOht;O_43F2P-bLxA884GoRW z<$2!s`)a0Ys{WZukqa04o^#LHvi92R1b^SWgR`HGBJmjkIYKfE0;KO;Ny?Hu}ObSg6$a0f*G@A7B z^af4aLC+9F4oh~~kdTm`U)*laJ0=qa8JdkTjqKc?&suMfBsr&3#$t`1`?zx?g#j}G zF@?od0i%OJ2FL@VPnY1I{=lX473I^5_`MTHd3qDM@94W3d$57tewaD4tn~KS$Mzd++4toDDb^O@XQu9aP_-F zyZ`s+|AWzRIG)DQq%xrZE|rp`VJjez9Y$((EQA9LFI8Z5^weLm7jhUSUro@()yb#lhol$GnYSouhsQ20szZP8S7Rin%3B(p3+@)HufID5~1 z6XYS=#8^0cPz#-m6-nE+SH5Anw6|d#O;PyxD2*o!IZs+#kr|zn-r|*z)6a-cE*P96 z&(!62J5Jq3fIyB{THKD8n~GEmfH6jbgRYd;cW~>lIp#A&hjxZLcBEuS5y?=XH1)&x_17 zB5o_S1QuN`kq)^8mK>?@sjY}zR747uOU|%+|Dp7pUnd*+rw1)G3q=Q|xZN|g<< z;t{~6ZYBTJD}LLC&?MohS`&S`)}p$_8iE^duwo$+zrL;%KeswS0VBL7#$YV+O-kP(W;(&ExqZ zY$kAKWDrMRs>KK@BIt-x59HTw!Aq-^AYjCV-g!M@ozH_}0rGnZEGn>>%lEf1Zb5w* z-z4EnB)~%DzE`pRW2pb@Pw0k=#hTlZlPQ#sn(IZc36#NS@pgvL3gFKT6}kKnNv6RtS#Zz!xl0VOg43$FQ-yk4sCFksU7Bd6$w81F04?lZVQ=zafNtS!3E z2PSjsC_=(BuHZ|lG9B#&A77La?sO+a?IY=M9$vnp`vh+JA-l`}))r@H<@hIIk zD9NarjR%R|`uS3TkSvRMWqM%6BK`;Kl*i2ye=ADQS;~C5e0;7xYXhr=&VlW>zWXXb ztF3yq!V(P+1ywzLT2Dj(6?;8{@zR4a)1d_*ndLvqLM7(Zk zIaF<}&b;$*G};EPg)g`a+Ij1P%)cmf5#zh_60zPrs#{&wlsr0RVZG>#HthI!o&US+ z|F;nJ{|FlYyBGhjv2Eb{)yvSZFcY%g-rhoQ*_-#kCi=O`zeD;UB~^_h{ZMtM8n_AE z18H%_RaM4!hkG9f2L~J8hCJPKF=QZu1daio0b&EG61}8ux)IfqQ&5pWhwk~`*aituAny@P5+n*2#GBYeP&8D@lMb}9{-=ru|8g$Sfnq)}+xl|XQw{UaH^9E66msZ2? zcTR{)gg~A2K;ZZL5pDmOk^JtgdH$3c0ff})O#!NO;g!oT}eUx^JI!#-uwijPTeg4CGtxQswyWlTQ+cJ*=j^h4X{x{9RpicIYU=)zt znY7)}R_o$$Q=P{7!QaRhv{Ikt!;I7Yx76^zJ1uA@M&Bmc#v=|SbiMeO-c+`MI+=kf zSv2&1Rgm9pO4UfwU8Q(b0TXDG^S02o@(b;)$O{vw=`bnN^)iXI0^}7Y1YRDg+1-@$SZ*++7kI8MJpOARBbX` z&-Bw{u7Od#6PQq(avO6|tNgO0r0V^%m;J84-co`%0|6u4_D@=lQU6@wq{12F<-L5^ zG$1s@ya0Z9@V^k34G6REPvNW{&aPT%Y^Mk9k^*l=s9^Tx{wgwSd--Y)R@%LXGY|Y&m8OQzpB)9=`>R>#H%@$Wcxoq*g+Tx zD>BI(7?9yv9uWELiv~LCsSfx>pTv!ZT2@wAbTg@H<`fxOlBP$)?YxuX46E`b>pV>S zm}Zen0+Ms)Yl!!ln4$3a zP5OwU5=n$9p@?V!PJZ+DU5A}@agmFcYn(0t7C}EI?drbup_HY>#H8nCF4;6&HfzAmtZ_dksUN4EcspNuS9ibo2keFWT0O@R;`F8i{uA_rq!Y2v{0W~$ zD$PJ;GtH0o=R)TNg4DLPo0F;hkPy}WiIKo)&0)`IN~qk)xx3&MvNdA~s=}xf>VsIP zoBMJ@M~t6{`viy<0eqVIfGFMGu?Fhl(j(9m!7@mer$ZVPQP(7{IDZdHe0g)6aV8YP z;Va^FHT9Ls>0oknXsEcc_8SD*`^V;43(D;kK}avyZ26V?-10!?fJ7`0yY zHrJJjjoaBq8ZxU6i!V!b$AaN}qd zu173l%~<&;=qD=%KU#b6QXoFKUWmC@7BRu z2F|>$aG4PGg&wBstdVA}0PEt%Gr-8SaJR5}{r&B>bl9983Byw$QXS$&>_bzDvaLKDAoiPGN=qY zq_<_W{g&!V+cEq*1o-&!k06^Q-udX^`BJUNz4Qt!+{xX7px%?!-j&ArNgO@koGqseO_WN%KT^@U-#d#ag?}vWs87 z&k?12HLiEfGxzL!ao(tQ%uvn8gW!Sw(XsIr--|Oes^opvdA6SLPys~E=Rg3sMh%2c z_c&*&cNCH8qGDWDuCeuC{0fcpA-vy;PpdL1L==~FVaS08d{>bTuqo~^Fs*zE{|l-O z0CpFPK9^j-qd&JTpy+@CReQC&YDJG|_SZZHm#!2&1$2KE5%`EG))FhVAYc%+PyQw; zdD|g!brnP^4<`~HS-Uy2TnJy4{C-T1@#4cqV2Q9i|D^y?u^+Y(wqFE*YM6$@!?elT zbOc_KjqWWx-d8CIv@s6G-7VL{&YiSp5$AjT;{_+EjBD@RI_4rR zjl^M*m_QUDC|^uWkCTv0S=DZSzwu7dzQ2#6o%EywhYTVHN(KzF5>Flk1YB%o)&{cC z>ip>Hk5v0x+vj5`FTH~zbW=1xGkE$PleZbXe6HYmwf8hL7ae(>xmubmE^fJRgvb*# zfFZmV69%!Ha5%XgT|JzGl`=?LX`476jPSE=r7O@?MIo0DQPCMw#ldt|o{>MZ()ij4 zL~jj9@$pR$c|f3@zP8ho5HIl?YC$puFJXu7nT1doLE3oHyX=PalZP%BJdqjVjCMU% zc@G|D>RVSmLvQhDd8zR*!l9L;J`5+OS3D*OytyW_I%)jqlJ?l5)=vx6ExOjV_Kqy( z1a^73N5Ez}Sg&7fwV!g^GJouuM-W23uWL@*pJ1+NXBVH==5h~{oAbTf8o4$Pa&z6- zKM=J0nG=vUdy~2t%M={8D|@0yvhqCBr&E(q^j1S<_Px_@FPMGWyXZ4_L8@x!<9p2k zfo>EpDo^Ih;e*X);+F8E<)jOZ*X4@?c-V_=mu*Gk&z#&UdP~%mrH5Yx<|1eX_)_?} zD$>1*OusSPN-O!ybG0Jfs-+QcNbTU9Qu*;?8cO5SMCWq56#MLqZ+8}!gbo8`zwq7c zec_XiNE>2hA{FwMk@gZ`Ip&@iU7aoJA#bV!$ITGDB<{x$hmrYN0i=P&_;;$azkK$0 zaULmiU90yCv#z>A2PXtBf86Tozg8Y~w$uhK?Q>_^?5s+pxO$uVA&M7fKA&Jf%cCBC_cNm7YZgV2l}QH(G|WO&LmS!ZB;*2NUY+-<9u4 zX@tj)%rG;fOXTJV^1~879-)H{-o=rRcg{nNt-OJ03yye`kO=u88J9pC4Py=5(&^u1E4V#m4R}(F4 z@QQpg;X*%bG+CrtWPr>%8s+@~PVTTNYm}O@A0T{lWoE02%Ikl5zN1@O>K-?XWg~DZ zb?K%l(lgpZj7Ir}NL!Rni19}YqPQ#1XIyfET>P2sHSp<0#zxdV$pkTSr>F?FXv_KN zddBOHwqOW9jCj`cx&*Vnm5(~D3cAw!pNJ&M1uvp(X=vS` zRh%rETmVsaWpK!7U7jkUASom*-O6sykJ2$R_upK*0gMMM7aM@)fSQ^E%gD$`tv%P9 z1mvs0s9U)qVR+1~hkCoCuXnSz;YfJL;bytF@KVE8etZb$lyud@xoZQG04e;aqac~~ z3{DRZBSaR>kMXCXre1(hKWaV{bvuGyYB1T%JG|X#Svh!9f>vgG=q3f`*zo`x^P)i| z=w5ZSIrevb$Cc#TTPWb|=x`a!hCz1c{l_oy1Lno2dISZ0`CDkwWCNaY#G$`ciV;LM zSa+q>IF_St{Ay!utZrz&V<*yQyJzYFMcX)`!i$SNuk$5c zol-JH+$zt_2sj)p86#r9n%s73>!S<)nR2fI?$1nc-C1FZ+dmir<&W1E2ksO4si>-6 z&J%)SqGN}Zm=D!poyA$#=PS-$DR1&NrJl9&Tc3v?%!SRqrKP2fk})Z5(S{HNWHddP z=jR?Pb5+&tof@5T0)@FwJtM4U0xOyPrG|950D+E(!FJ$2w*O#%oPWw6gOZEg|q~O(S>QGZsCCPtY zJI$1kZeM+Ddg*&*`0SSuZ*#>z+Iqot(75HL% z_Tf2-hX2>X1ATK`V~EB2a?*3rc;ia@N1z%&_C`fmTTjb-=`N^sca={Lo&-0*`iPEI z??|opP3?WOquuL1p3I@LapzaFgkkWb2bKoFMGgF~GCDeFo2v8m`VMctQq$82QwBp^ zZGCs*l2pT1_}OZSi5eglz!2&OA}be{hQJu}{%JZRf#xq|jYTjlU;uH10Fv`P4PCgf z?vd8U@$8oG#mjR?P4fL9w2+Ah0L~I-od3~KGS^0? z_@qSlN(oK7+Y()z($ZoL2peIt9;XLI!kCh=@#&=XyGPy8P9hoY{hMytXjFx7$pgmj zYa>Iomzm;NB3T)5c_~rEZUF#fz%>-0KXO(JJsfn7hgiQo5&+qX%t~*a;cuQ0Hoh}s zuBbGD#(K;~F9HBpXlZq4!{xh$acIsTGNA8c|r-Xma#((L8&?95exop)-@1_Cr zbNBu=$V_4D55dJ0kO{kAw^5fzAxDBe$A7~XtwBIj;9gd4JRPr|ko|dP88p=&Zz@s{ zAS=H0XYvDM)=7%eb>gXqltFGHms(XxaG?@%Bk zZ~Y0!#FUhB*6BuBO9vhrtJ+*bp@>KB95MbZ(G==N$bL%rC^vH&O-8tUkHeBJ#I_;0XukD#sagb+^_`Rh;D5_ z;ZNhEZ+8ImFq$N{vRf>&8|1gk&vgg zo*e|B0w~|>-%}O@M%bEoTLAbLq;lO8C~5mF)~bFcmv!0=yzGG6jf?ZC$B3<&{SJ;0 zvafCP8|QZEgebKBm&X~j+2ZTZs2H&ID5z+N@zr&W9)~eY7PKyONqmm@pOf9sEh;y? z8)+FK=ne+lzyT)!1zM^4Km$9pDmga+srKD?X98AjKm$x6PK5I5m+z;>5I?Ew z8cwd|=wc{fp;p?IUf=7|KwZfuJ8qqaINe=z9)IOhZFl5sMG!2Du=-H6-#TzH=REi~ zszlFDsP+6Mz9FNBoAWqTpXAAT$%lBO!#OW2eHod;NP9INFj+QWLQV^P-XU?j1zpkIuaPJK#Tdqk86=KE6(Me6$gZucOis!wJ5t<+E zDrmTX^e>y$*9}XvCaQ6DZh71UOiAHzM)a9cSJgH)x98^B%wXF1K8^x$ajM3NX52%f zL%_0CuzGlFS?h*gOp&xq^6MxNZmW%qUKD_a>M|Z9NpNMY?7mn2G;s_t8Il;{G1%WanH5*b|z@%$3zXSyP_kVn)0<{NUUVBVf*< zS79@v_s*`bfNGVG-ewSZn@i#VlB2TrhVwds2QH$(67A)My1u_>ksY2{Q#k$4|~y;CQWDZl5InxTv_`RrXQD^Pon94g_EuAg z@rM+q^mH1m*-9n-&83#;qj1!n28#6=rWZJdp4f@+B@W{dCRhgD9!t?(Ul1*RxkQcSx=8d zSKoQ$qn9a15)-}gy9-nHY0NAjVF1YgXI48>(w>+k*Q~zZo|r-P6MB_zzm?wVBM1Y= z^76TqR*bldQo7EN5ti#?L@G0LQ*l*jx$CC8v|hYCHgSKCqW}rrgiAI5J^M1G{GblunX0)EA?U18WIKK zDMP8{$=ZFB?@9*eUnMt3J-yThUYx+4?PPI{pPtWP<0)T%{PZ`*&PVkR2CCkP*q{{= z=s2kNkAMrm<7sGD`#r|wr*~HQO@uxQw^5FpA<;3xkhPYEle?Rdu49Ry`LD84jemf9_Iy-wP zMidqDMGowY<=vQ++&LV2#J-P@*DJWYePVxdSi0}CH~YRjLLRjX5U&-5p1aMZ#xiYWnN$p2H5r??s!u!ms9U$njH+ zuGJZ8p=e}uJehOYRUUu}OX4|-3@64{{LIN%$i|oC@yX-f(?=a2XI4XfrOh{u&m9K8 zl&We}z}WQiWI)XUwl7w%(c$axYbsA3p3e#z*iUgXwyK*%;JaRkPMXU;Z1q^k_mO>! zt&X2vXh6~=ezyOuhTd4oQ~con5OGAK->;5=(G$L9MuGAXSxkTeXz9f05P_>gxQ-tT znRJ@i|3!Wcj|UXo`p}+oUT#?2c}+ULL$beCh;aM*x{tVcYHOQP(2up{2Bme~ zfbG#~NB=}MI+Fn9Djo2v8pI69$FbDOQx($dyCRXh39rNX&*NPEn3P#Eg7h}Bo}b5z zk#6_gB-pvxga&p$7QfM7Ow(ZYsZEK@X`5{bZCw^vs)g$Td{}6w>m&B0wZE<&`J8SK zZ#4pB0j>R`&dL{q?`gGp;n|FVRr0XNoV44@RUC!{&r4UbtVivJ*FN(Bhkgl&3Vp>; z@z|7MztQNX9 zVn^Nt28bcuOxAeS!}a3UgGlL(^^KHNeKWnkb$el;6FvV!{PM= zy;bi=4r=%^^jILaHsw`y+e*+CGdOo$Ak~?%u^yZJ3rmkgG7}kz-)2>jrW`8jY?tKa z6&K1LI($fj$>9P3ZQ3Q25{~be8=gJAK+G`|fvwDo znqjbZq@w}1q=!Rayx1dtmE9kx6%>U-0E+~02**O^&BaUbeI1R+<5ct4x$K-ql_ z4!K+aX_B|{G;f_`-SWt~W2IQ=LS9S^`p|iK5#dkaoU1TveAbO>IN9S^V??&A~(a z#p%64gN`E-bpexXB`KZdwpy+$0|AII6ZdqLS0w3@*P*7e-SMwNI-0w8VZ{9~C%}ndR)g1j?GX z=)%^www+^1&J~eO@85#Q53Fr#*(=f+_0ed7b2&Mj8yks>AAm52FdUDO%&W8oBATY` z9l?IX`zN4(+5AmwTQbK6FK0d~kqXc#P5(OtbfJMpsaru{b6L0sC#}{E`#mSplT2h1 zD7eZM=tf!WDax9`1M>(nzI$G4<(mQb^#=_pVtnxV=g1=@=EGsaLsQ1a_IL;D;d@F;f~Gq~bYnCa-Se_AKJ!B&?i{#r@Jo-fcS&+^1}h%7;e0^%AT zxJBX{9p(_~Y&%Th zO%(5m-=4j+Jw1CFoZzIVbf$R$OLmYXC(Y~c(+dkRDnO&J$m0#gq}=Sw1ejT%pa<|q zqnS7n1c!*IDAoU`m#CZP-UDU!|5U~`6106b+Bqj?^$=aSq9k?O>V(l=%X?PVv85D9 zx3hDeIAu0g0a{EsrT?EktuW?@#J?RLc0L@t`+tfsdfna zHc(l+9v#3VEW3HPKf>_*iuciCYIy&uJ$!6t_A!U;?Em?5DoSODc`hWFXgLNE)-jly zszEY2x8AE^^i>>N?L@bZfa>u#k8@D-!ZO0@Vo>CKJwMGr$tWcRh#L_mjvWPPlPB{B zMHx7;FF>--YdiX7H zq3qkM!_2_=-&4cm&b)P)S*_jCld9W9z7p&n=hFf0VW*u;mOZLp7Nz??=F-q7JJsLZW?u4&P0k{F zRb72)F_9%vUtZqKH8nUW`}WnI)3aeUuY=E9>pk5WV6$|7bfPKK4au&HaXeny&jY^i zvLj}emaO~(;tG^gZe$dF2V1lswHeFEMXYwKpY;`;X=<*lmk_4~UXlVGd_59}j)qO7 z9Il>S#5kDK^=YRYo2H;3#XSWQ7g-^QriIXJUQ_gz;I>@hV zlcJccH0%KqmhjhOt4CiS^rqJ;tF>oX1*o=dlvs`2486Q5Sp-P`_;YBAbQU2 z-^muChsz$5_QfljF-hp>zlGV}ylpzrSU~r`xq+_SJ)|^q*W)*{`j`W`OG!$SjX2qr zRFLq(SN>;A0}S%@K&n(5=D_UZ`;hnbz=HG={7#^=~1)zNB*fY=~^!%Z6oGjsK!nV^9HMYN z4TYeLr3ujRziIJIdKu`mck=LndasBnlxE#inj-ymgHOxtx;X?wR%&%o?&{h5my8DG z>+AO+#n%7ych12(`p4M&0w@KXby@3K3%%SAM8qv7PY(QAKcI zOLcV`0MyAaONEAT;if6ZYd>fmRM+s-THdAhd@RiX4xrEjnUOlB@4GJ?-1LF^`^kZ%uI4SfXX9C$3AfNJ<7w0F`rW+2f zJ*Xor3H)*aCabW}#|Ivpo4@!RdEEPaFtwHonWDz*+#$hFeCAnGvxCSo?Qf>|fB{i#E>$qfDeWmhUx`zA;1LvQ9LY z)~!$B0n834jTSCf`a;ML8x#(7*VwOT+iyNdzV)!l41Ki(V@Ra_Js52UuCfWqlH(a( z0@}@T8jsN;-7XA-?YxkObh6qT_h0r4udWQ7%titEoIQa@lN*m&MiRa8gZaJhS#pGs zXfB>)Vg%8RVsgFf{D6MttlQo^v5AwHDab-bXAWv*Bj)NM0VY@~LQsr`n^B!R){z%T z&|(w&c{Vkr-dmCrAQb+2xB*Z!!@H#1r71Ub-!G7(0=Ub(Cv07GevNDddt}WgrzX@9 z?K!hf9s7e!bhp?_zp6_WMg8eVy|V7EO#i#x1)=aMGB$$Laa5Ht2~abjle>4b5mRU@ z?Fc>6xVWrmdkc6WP)NJF?7BFNzb-?XXcCz0Rb}sSu&8iw-D}B7^Qt`IIf`#L-byf~ zw^n;DDrw>)c{iF7`Ge&B@7qCh^ffA)gMogE6wKeD+ie!t@s-sd^M+94RB`+e$L0dr zi3gm02rB7Fo@D~mYI>W?3c&53UF!n4xVC+)NoTgL8vGgzbKpcK1;#iXo@yj@Y?1ze zhUyXVyIOnpg;F?CmCv-QeVgs|=fVEWF+|_EMzizOcm0@$Gh3_?t4Z@xpA16SUZa?8 zt4Uoh_D&^xF5rRt)w_hCgnk>i(Jok`lC}408S#2gND8HcNmcn{$a&WrLyz;U+3?3< zTB)=cfa^b1dA&`@j-hzF=u*7>{qyjUTbtm%3L1Q#cB~;tBjX%_swF(V+UI(|;bLkP{~baV(9H5?X|(eQp~e8>vsvXvxNA2W zH3cvllDTU}7M@t5xgF@=fd|LcD!c3smEP*>S3fj|&{}SLc`C}vu>D?jkct!=YJcwo z6DfiP(+%_+wvDx*ir)sj2{u4^k0B}v*pgXH@^EnVk4#E0;({+dm|v4_)i(RftJ|-* zZ*G1BVYXr8o5uFN7kB}*ZlM3Rzz3aI0Y#0JWl-x}|JTRyRz0BM8_P5(*K%Q3tR;++ zO!(fE{x54T_ZJlapfuL2kE+#gfj?I=KXBFo1BKp+FO(1GXz?zB z%ncmN6XKe#e6QUYbT3MH_pRQ@Gl1dU7ao0xhx9Q{l$XJu@AH~D^07Q!tC>cIJ=ND6 zfLg>`U=>h{zHToGawVPBvJWdx&~0lphWI}1IHu~es28I8W3UNh5PbVo39xM-{^1Um zdhk3P*GPM?#yw8&FMVig5()ZFlEI!sBhqp3rz@*KNu5sw^H%>HFSws1?+ArOkse#_GAT<_6r6J8P^n-`ne>kn@vv_R5%89Ao98`z_`k4gs z=+$-GB1vZ(mu~gkA-}wp#$Qxb1!X9iCA06E6}fnLD+@ z$9$eoWauF5U{|wM!Z5>iT9$Kh-Aa**^ZF8~$HKn(Z@;Se+*V%!SwJ@tZWeCN404HF}-Tnq%h%ATl0Rb zZyaLby4zbuzRPTT_vL(r7c6gzh<%abR+1Q}|6;Qbup9>kVHEWnwIJP&Va4{OG=Y}^QX1rUw_jcySDS9DFjP5hz_2P!AUJc!X=(y&Myl7hg@autHpPoWu=Vc<5!E^PVzhJDBA~9< z#26dL$NBi7Uu5lFwqZJ{NZLw`j}jK*>nr(Z#;@kMZRLuu*%b~AhPBD}c~<9?BMEls zKxt!I;5xd9hlk*)DNA719a56m$_;*gL)LT889O@N0oDXZSF`163Vta$GrI;Bw<+za zC*<5BblHnAx#=>J4Hy9$lC(8m`&BeViA*yx$T@~36db0Rm$$5#fN;ef9uihfJ);F2 z2he1#*uV3pipE($Lk5VHaLooq{ZWubiF8`R{TjI2SQtlLr{zjjMn*x*KRjj{QdsC` zI*dO3N;N|4e|pT=s4G(j-`Hs1g!OnM{S3$Nm<2&^_h+9}No13%CmoR>btAL6im~P+VCYd^~ z&kn~Sw8WR9n~TC?VN_-Bk(7xAUueP}zxUr(iC^dB`d-oc#+zV3x3qaCaCxqsU#lD& zTg6duu0hQBP-=)edl*28kH%WAoltN5<4#PPwF0uNvyy_4N!`?R$4PTzYmT|9DD$3( zY?bcy5|BiJJT&4^Mh`>5QQnv>ww1+?Mp^J9tIrraUYK6^J#{QPw?4ik4Tv2m9=_;TtPV;)SPy{S4vh*C;V4HZf0Rt~gkrmU zd|7%lc2WAX#ZAeg2)hF9mIEm6d+k8q_M00*$-YE7+YNRA|NX1|6PJ8SF=V_~9B?wj z^GX(U^dC74kaGkG<)4el{u7eJCH;Ozjaht}{15fbxcdO0mOJ>36BRDXM#I0ziWp1| zoMU=_KM}Vu#9p|uSQoRt4zpXP$Tk=;!hPzo z(c+Q-G0er+)MiEjoB=^vFGq(GR6VM`rz$VvJH2NoWz}X;e1vb9Tp~bLF26zU5?I0q zh9y9VH4_qlc&+Efh#7sQ7I4f$xO(1E{0WT3d(4vy-fh?##zKAOD5Sg?TOh*;aOPeTP#rqW$!8wv5hPHxOuIm}|c6=8lOw`KSrVZ7(T&2dH8lrz{#Px&lnyhBHSt&{9U z3Qnu}!ELin&1~AIJn{8G$a9+;Of!XcUW;Wv?(?;sbKE@I-oC4s7+baP^4Eyf06ONi zzBh2{!M{QWqI6># z7ND2zH6^m3dKJ%>UxQRkvj+ad+>(et`l_#VOPrq8dykYHun~rE(kJ((ZKD(%V;Z6FAX?Gc^ z+`C1UJcGDbB?Pnl)kW=NBBZ1$;Q0qM)cL(29KUVqQ z1IQIkAd3Mx6CnODQJ>w{dwb-_{1rBnpT9hKE^6?5Uaab)>~A$HUS8neRi=te~~axGL*g+ zcv-RkwV?#a-Ezo5vfdq4!av~V4-1Ho-vubor%N=(0hj%XCCYsCodF+BHGx@x%f&+0 zieatCcq)pTQ&lyswe2e$9YiClfKHX|w>508+qU@i^pBUNnY!xK88K&+Zp}Rt4*hasG+xm6jz&adU$K@BY-H zbJ3$@>dH5GnENX(g;yb109p(*gk4v0ac@zO>dgdrZ>sWOt|^@i!9WI3EnG;E9Blu| z;XtY5Qr1dMpdA~YwwD{BLIH%8O7M<$386zk`&0w_dm;i}n`gEP$c~NOm{Gf-{zXqe z@`fGhQzD^>%ko&TnSsv8)c>%~fH;kqv`;p8R#|ns3SnT)-tU;e#*$VIAYzlYh8LQ~ zaW^*5>s#LX`O6Z2_)$Jm9BV>9j$uS6A8YoY=b(H&1l>VluP0#@ajy!2 zRef_3@C}ax8|M-o&6ASv%V>+5qLrPcRLxNTVG=W`2KZS-;wPV{BRtz;^73Ir39*p@ zFE$F%Yg>U@s*m>V9y_S6_MfN#Fu^0sJO5B72?xHcAl2Vi=l}%|5Vy|YYyUJk;`9{8 z)AK1Wxsi7$h8h?(|0QUDex0WtV)ZX#UjvyK|03V13Bq_n9stkPkq|E>xjLQy)K_-- zfbO^VGg6H5fjv#&>a+09VnIf_Zd-FxRTM-p9W4B}_XUfV5z7<2g9cFNja1)!rL^1h z`T8anRf6M^Z}Pl}mWC$ih!GJt*1gW^D*f)?BJJe0SBftvnkVGdl%6r-1ds!Ow)BXP zA|dawp4OYS9%?9buShzQ3go|4+2EMWeTdD;yL%8CGyH3BXa|ac0U#C}{JT462HvgQ zQ6oESoG0n5Rl9U%q=Z7-VVS)gAYXjb@*$HRb4RiU{J!~FBHr6#(#H zZr?AB;z#>)m$hH(o8%8~Gh@&a$xy;5Q0lyH$JfjeCxC|G2pwqfCUN)Kkrqz)=Nt@GJmb_v`KX?JfT`1{xmeZMjD&OP;?1^Pb}Sk+ zomU+p$>n7bm+_T|;1M^wgWr39c~%FhM!ETG&6=O!u|HJ! za|vmwU~r+sh1nM8k&w{A#RY4bw%cZ>|7wYb+kVAC#4of}ZNb}>GW~}*4*@!phaZdt z@A+M(PA)HZ%M3s3uR5^cOr|Ebnl0o|jokC|wz8|usYCrAnU0Y7eJL%r{;LJpU_c^z z*3Q@X`F{^jo;!=pc}1f_9mvtiS?r$9N~rFX@0Xw!>ZCp#&GNq4U6(R&19y0Gc_s@4P;wI0{UpH;d5;h-oY6#?M>rMivq!*P*OGcY(Woy_RdaqW5hZHie)W}B z1nbQ~cbMJd%`K3@A;+?0^P1CLf$1bi6oqS)Y&U72B;bd97bm>9ec>g8<0t&?4!e8P z<3~$BK**Uk|04UtOwEc+ia4-mBq_1$J-_P5GoUBxnL%kH6<{RUt6GIYkY^w{((BM- zUW}*^@~#-2zYxoW>YK z4LMcKsF@;i?Q&zQ69B^}{l3}5+z<%=I8Bj6oRln>UcLwxkYF*%YFZ(JtG(B`r&cFp zJq!IRS*J#7YK!I>ILaE}N1z7uWU91#&A$7K^}Krc03Q?c;_!Ob8!M+4RgI$wAP%Y( z*GeBKvP$#YzpTF}0GBL)YOOB>Dn?SXH)j*WJ56R4%4xmOI^HWudSgYhPfpHXyv!_n zh!A5aB?L>aKVPCW+5F2z#lRp6HvKLyfzGO)VKn=Ic@8$ahUz zXa7-hdN}zcTc^ejG_1LN9^3B6* zN7?S1#HNu_yQS`oeGTWInF1MlY5u+htG`_nx~^Q3ib8ds z&SMMs(zY#8H59-NfBJN3#@ASn!}+ULN|u(tq~n7^AvUq4?9hKSUKr=U@d6 z_zDfeqB%Tz--@f(`f2iwbWf{Uuz*R0-wHrSX z@Du6)L1hxqC6`^E1E+$jI3LntGzRXh|NI@0Mn_aI5XKgi7ZJ%9N>wA=-DETWUeh&& zwf7qddYZ9WEwz*o3Mq8_qH*wuR`zyO@^6FZU;e35*7eo@Vlc5 z`3JMG*IsjX*Q64LY{**P%CjzU1L2>6fRN`^jMK?SU()}pxvPq+>S@;t3F%T&Y7eK=nsoGt?u8cZQsH=epe&BwG-H=< zb2r2pt{QbCK(kFs-MM|*f}*A(Jv8MIW^B{b4(%fhcJU#EVGFi5e9;V$B~Ui8S@w~} zo*b^Awx0LS6~_31 zd!NnfwW7Ixdo8bhU9@&FLK8!hprMV4x#4)dfa=pH*EE1Sd z>LpI6uCk8|+0{^$_?h#mZ*1o`hln&QVu(efopP*?<#5~vvbqCo00?RCzhG^f#O%;Z zzfVW}4>8Wa6+=f411apVi76ms^zyESdWZxq5bfnkhV6a zq2qCiGh!H8c#f{cy_Aw(+Kv!)+4-=1cE{dVq}o)kG*WI&AXmwQ)ix?YHLB12#sEO= zO}m>wb_E}XSOE|q`=s3)0id?BXRNdjJ$9NzJTj*000#DLOL_nNVb-`PGwN(*1B4~p z%_&fSSmx)8AN*n$x*>&(qW_D50kT;8W_f@w`HB0s3&vGE*#)gUwJr2WfiieZN^z2q zVP8pOnzrRuh}FgrJ)Y*4ocJYm-b6HQD!A7>Tm*F%h|S6<*r(UdD8S{>{0Hp3b#~~8 zD+yT`H}xY|Z`#8?WjdCLBiMB!xUudTGPqwhoF@wacpCs{dAzz~W3~KYK8rgUblvtA@~&hQ z1Xv(Gi{XxG2VwNPxVg>he=?kFRCI>U$AU;?B)@?LGII4#@;L#R;7Esk`)$2{!%l4{ zhrriQ(y3;1C zh@b{{27mZOQErwXmJtLsq-qt(96i93EX`+RMpZ2}E^QHk;QLHjtLPUxu4kXZ+nWD9jB(P&rWvCOg>$hUyzVJVSPstV-A1q0uKjg zu7)-M{^t*`?32-@Rn6}8&@ffY(pH_@akWATkddg(t+ASiiy z6?w5J%3~^J(sX?u|8~NSEw&=;)fS*0-=cNmi(_}oK;#m z)mj>(FE#SMPMs}ue>#u5`!)#Ed*X7}jj!~h8Dw)K#s{^4@O&R0NUT%INJvRMXobAFNrxLn2Wjrxo%q5-FZZ%yp|<7B`@j zdiC8=hEO(x5e4~bO8+TcO)qAf4-O6l@g%Pg=FiNCWUjDmnX3qJTAtlK^WEB{MGk1? z%+#7t<$OvY!5}sq0(4i#^sGFtb)3!qtAkswGWJH!kW;>}RL`)T1;2OMJ!FcYL^=ziF3aQUIr|C>i4SSsOu zta^Ah4RC*ep5&Z=vY`oh`#7;?M`uvn2Jz_qr-a*yod|5~UlPsfF;46P0_*~n&n}$0 zE6T2}d}X9j%9#c>n*m^Da0SV;dmYTCk!Q-JWW6dV>rvENs;zduA~#~1kDd8WAd}JL z7g%?awLvojSfqgVvA2xt&91JQ=5#Yp9ufW(6HCv)oAwmAUr>*!D6dOw#$@#ov`tu` zZKcdQ9AytBK47SYb))3lbDyJPh2E)JI(Bi0m|SBMIlZh9WaWSOr8GGt;pf05vAZyR zgD84-2S;lKPE7X2+S;1)KX!uv^!d1r|M=Y-KkpBk-xp7L@?Oa18_j@4|z@f z$IXL=P6#p3mT*ukpE3Z|&r`t&4f%UwSPCmUA(r!P%fy0C%M5 ztNV7}V9paxPPU>VF14=hQ4f1mP2UZ<-turTp)5Qx;L%>hatpIEJ{FbcqO%{?GSvA& zXZAzAJS(dO2E(z%bNWpPS2r`uy%@bVmDT zN}~PBom%ed9#r7(WU4ihO@dMlFh|wVXeJ0FfVLx2N*QlGQ>c_Q{b3TI@oB1mYXSw+ zh%jsLnQ6r_MAgHB2|IC$q}kw7RQRQ!Y{n&W|CE6Nti3l5_7OflYG-6p^I(;vw54Qk zR_b7-ra|exjKh10Yu}8r6^E*Iy{GkSN^dL5YwI<--{&PZE)4*}{ZF~ruJQ~E z7jn&>Q&|yYza1{8mZGhtBLKQyNwz0H?SX3U1n}UmiL`fwlUaTnuU)rKSWmnn#<9Qw zI#$Fmeg5nM4z{$q75s;G{K_K^nR*8_gjs_o~4H62qhqR@tC?10~PE@j6xJfq|AI?Q2(Il^_I;z zV)hr$z3t_d*MJ!UvQ2w?JWcFMRgEyNFer;J@OGCSJaf3IDlvD!s zEj{xgtT2(`@2jdXP*8lV^w?#*BMk49wd}+4^!~)%HBwzdX!fi6&W4S`zw*lD(s^*# zVP<*5hWOfJu=IQaS6^5bDQ}HU20*{ChrORAC~N=e1lLKYo?qJ5*L=z0zht6y+X6d< z_C7U1d^w3(%0VCq?_piSqIwIS?dUp>lfh>rCk&nb-8}iEl(#ZQB&BgxIMf;5-jK3Q zL{cL9#pE2tUNni}HW%pne9d01R#)f1j*z@$8LW-VNSYrcn6({2MC<4jTXRUip?E`z zcQ^SPuWW{*kbrdn-N!2dIC0heMkRL!zp4Yj%fz0(9iRTKtu6M}vtD60x8GYU6O9cC zYdN!{ZYozARsP@ODCpDm+wT|H%{2u=Sd!8krTK#F2jD*Mf^hSyPR>$?KNl)w1ulT%LBmdu4IP_u^=QqWa|9 z+_UOb2+cyH6Qe~W{TPV%HzF1hQpK!VN^^dx~T5%Ni7n{`N*7D{iW8uI%%X0 zn)S1{^(*_^%gkON8k(!J<0F{9Ig=oP`K z>Sy`{)*owcG{y#&z2>AXrM~|Zx3Vy=-Hv0;PJd>Zn}$uOh2y6@eiizDswmq@VLqR( zd-qe{cwVIeY_b3kv7;A(3$M@NF|P=$Jqc*mxX#BuPo7j|;=$hJ$lWaO(QCXNX;UtF z)SJ~Lx~=tfL9?KkhMR@kc4DLm89G9sOL2CF9LzEDYk_ljN!xGJ&w0-eqH;Rlq+t5D zZfpBC-n>E+zg2xYw?5}MFr)eVAf%_VRvHTHKOJD8Rp;vVGct&xUU~S7*hep;#xanbwFpI=E_T5m~fzpH${p#s7ySG(y| zx2Ml<6+t1mwK>s9^Dtidl^_Xp)D{Z~^nbmw#c@5nraWK!%eDWpNxqF%Mw6)n*+!WE2b zu{3Q^UCfc6ZL$$(2P5)|3G~VBR|(kA4fyW33_ z@9i$fDic_D1raV0fL%h6^m*c-@4L~;x9yL@KIVPB3gQAj+4;rJGiPNv(qTqVqh1j* zV`A*R`&r8O+_$1^l`;KC2CFQAH3PL9>oQXSKg9{7)N$~QYAX?>PrP34M)1Z?X4^;4>L!X zlzqq6ghLmXS(6>a&6ti)GqKIRd2*_)#TSo#M}ok>MVTiFltc9T`WR%S(xOiN`fW^j zv4KNlwjv%puZ|C*`pV7@944FAD^D@jOws1dvRP^`iG|~zuh9MzA9fwi}UmMhw2RqU+~m@ zZOxxA>abnDZ}M9KV#n>@yr57WNVnQ4FWK+V9?};QIh++k3t)=2c(jV7M zMZ6FQ9NO%X%%Ez;8%T*dK~Gn!+Iv2%%QEX&+pX8)ggif%66G(5!ei<#^DNMB*tj1* zZhU8{I@#hCBm@oakwRNel?Bbk&ZWo~&Oahgrk_>6t16+24HWJ9j29yW7HefmLJ@@l z*-j3=AR}hM^hz{_G<2>;szpmL6o1M<70;_h_E$;9{7&oYuoSw2z*KHeVTHN(L-Uk1 zrJueIDHmSl{FY=QZCvpkt`jk!SB?#AVi$s%@63LwtJkvk^pqRixPznSTCWK0(b$v2 z4|2SEqeg>*PYr1pvT8qs+24=_!^FtW#ys+pS+V+vC-vHlX|l-vX=6iUCgQK4AVfqx zt8sN~QnRpdf!E4(2?cE4U7i-; zZWQ5CDp(X$h-oNoDzV@L2JxZW)?)EXw`A(J?p{Jr46~zImO2M(FbAJ74fS8#8Gf}b z{9B!o>7vfa!bzii>x--&&M z!}h2rUU)xW*HY!<n5^9H;F<)n>mkE7CE3y7X4`;~kskkE`_{L^e*NFK3!ZeZck?jk{l?IC_3$8} z=Kr?M1u@od*Mil6mF7OjQCyz)Tv!$!fpR^~J9lPh4UQPm9W*P0z>`L$pKIopzVIlr zT{^l?5bCdwC?WvDPV&cuS_TF?J-)_{yCo6&53PL`;%@Ga_N@rGRu+g2)t0YMtNv8d zub-@ncL^$r7)#5Zf@Q(jQ^&-%9m8!@DszVCmK-?{j?yl2h!Xiu=IN^G{EGD;~^&TD;n7%L>*8PMNK?CZF3Aqz#|{ zP!aE{1{DO&GN0G*cXFUZe7}*#O31!)dOYN=a~7_o4|X&oT>XZw?e3rJ|630wOb8$k z_&S0ONv6Uu+4dacGnW7PLqX;gc2^XH1xf0Fm<2%+|N8wTF;Kv4UlY>pQe`QkhX+AU z5RjgOPRYi9Ku`cgb9FM@le2O9KmkK3D(4VTFAV5iY=EU zd_}fEyn|&bwsN!iRzdSCwN8yJ%Q<*XS#R2ywpKrP2M2gDEk#z__#Lrw40~klE3rHnWdj$ z*kOFZyUdzu{kM}HU;EB2*!Kkd@-xq7W1-FUnL6{tms{AlEdl*syR7k3kGT8QE%yE^DIc?}{xxwWI9*#q9HHFpG|nL>?!Mj136(Y8W7`i?Itup` z++%6B#{;zH{y0!juD*Q7qoDh-)Qy(mXI$D%R}om>Ybwo_SFyzW2ob_LajMN=N-^@h zuE+A}b+dAv#fk29^13hKW*i0~v{3oM?n6=^4A^-WC8Tl*IL+qveB{- z)KvWWbB~?EmdxMGG+6H#J9!dLw_TR=t-`eu?rExEs&W(7e*FJHY%f#1%J zU_t(cEoV=#`My+{Omo*oTGF)GU1&!fppfIr=3gU#8e>2xTiS_fvVPkrOyMMGf!m64 z^hx}Zzv@e4czKSJv~QFY$blizdqR?j+u`HYsS7X4IM)sXk16h@Y|CDMCt+MtSSa4f zw}e;!RTL1|fll8v9wg)`O5k?@uOP3B^!nZKs2fjP)k4ttb-I#>|D@fUs>!GE_gLHx zfeiIGzI!Pj;)Rqu1HBOl%)o&7JP3litvl^}KpV#r&9F1m^@kAl8XkIexT?A`eKUtc z(7f^Ao37+o^vln1f`Q`+WxZuYy#)@npR7Na>OA;%!T#`5DMx%0sAt|DyAR&!}AV_zMlyo-?NC-+xs5H{u-QC^Y-QCQ2_&ttbr1*E@XowX+;QF4eLeGCR$2@bjTjArAj}WqBJvP~hyXzdiKq|2Gwy$H zD8LWo&yr#y5d8jMVr_ajc;=CnxSA~lVYS@=xpT}!?d`Zk*O{$D)Y@VDeK%*#g`U_ zFQR{}W=cI~Y{f;4_e5Apd|NND=TH@g+x+^?xqJVu3;&JY+FJad0BbDEylq>pUyWuQ z=wLi?#wm7);3u9SG8ngu$p7P`q8Ku3OfLfk5(JgBMnZa4Hs2=AIG$p}Ti`>GC-Ykw zR;=rre+cRLfBhK!auyP-t)i775F+hz%hwh- z+FItgNvfumIg>ATfA4}!I(TJ?(qPmfC|Jt{$8uQCb2}^DZH%H9zq7l%cyvPNais-G zQ6M7NA9x4j(%+qvARHjB_b0%w=i#us8)w3P%h9aSH~qZBSxWTf{PTy(*S}nwU zcOOMj2XjLVv=#hh>(A%K1&VgjvW{V-wCmZe5qxeZLf{?0^M%KoH#YAz<6ZEdAcQ*qwVQ6_$8<&ooE zvI}3R)po1wIgFCY1<)N-Pxe!68XP-oKXKA}gLRJrj7On{1xqher6G`>u%ddUYzny}flCd7is&!79T$6*C zwI`{o8`}e|%#ztUy*2}_$GK#!Tj%z8-kNR<*c{W5uEnmjWNt7s9SjE?|=)hh6%TGr3>Wn2*JbrKr!zQ<~NF0}L`kwLmEcGKo z_3yyUP0pn>j#h72B+8o{b6`5tIyx%-$WZ=Ya#T;rx>$iW3-Uk|g=p+2*t6mg16XZE zDG9PNxrQSxi_5SZwr+z>FT0{u|6R-LrBjkyAP3C(GnH4`e6IY27ASuH( zx+WRDNz{#@d44y@@2hIc6Z*) zOs4@Y%J$8(ZL>$vX(HHjNUZi9)7;qQqd79NBW*|joA_ORiMaacbl5q!#sfj$4na>2 zw&%#B&i!QdGVBG!q$RGw^>=%aCYa}fWzBfLUSu;be)kGKhjLK550U5j05(!aG%u2> zFSZ!UGpU6lSK;jNXZSqTO%~ajypwVmCgKf6RrH&`ehNt1-|h7!FkOX0xq9`lAt+HS z(Dy!aQ2i4>{6(}~h4<-UK4qcqT$ z3yt$=COkggVv`<3zb~kz`V{Egt{|3SXBaSi?AZD`Q)bXj5K@BVx#r{N_bV!jZWayd z@(&4dTvn#*5)9t@s<}R=0HT|nxc$9(K>UeO7%N{WK5C;#W#T~40iO4ynQ|3oy{MiJCV%hawta@Jq_LPlDR<)_mnVPNS4ePFUO|DeQ4}_L zmPNfn*1*)(1fCh5=_1Qbn;nzo@=3Bp$2smldP*>bC-t`qSM~h$Mo*=PXv>H zlVA&u$6^>}TA?s07?^A8o`zf!9tSGTuPROO(Oy?>H$}6b8Dv92V3h~*zon2SJWM1H z*6N|p>3X9K|LrlT>N06FV@81NecEYADTIibd{s(n?~48tXMvP`5VFgnq-@JZcsZ_W zUs1r_uX?I?*V-(~t}L)S`|2eJ_r_RXuPKwxpTeSnt#m#fq+7czy4&jGZU;?@M+kjj z<2J&w9t>3s>F2DY0rs`1`Qt0kRYtB$IqU_kX8RyQDtP_ek_E9^7M1^1Iyi^8!)G8F%;*5{`c`df16_hWxhx~dB6ZN`~tqb zTFA)oa!O9RtKFw-0t9XI&b(xNFm80IQm^Mo9rwHRCZ&ihGd*3~fUmC5P^R;5@4C2< z=R+b?C{JG5-e9utv+=_wjcPV>u*PE5GEQYV?VKwgHlltTW;&M1%S=P$3UbIM9e2La z!ecN4G94TFIuy}r|Fk2iir8PLGgGO~W{QdJ-7dVr&yi41^(kmwap)>&D52UvrBfH9 z{NbaGBvUBb!`uUMYW=xd(e3XaUMA+WFB8CA9VUa9eh?Q^JbL$Qq=+Bq6^bYE#H`PD z!{!!ZdUk5J)-a*7!}h)VfD-5k-FtE4ox{7Sc%Sc4`hEFc(rmxzNuDRQl<)bmQdTlKdu zvBNq-qDC@5H*CQ!a=wnfZu0b@1AD{7 zo+Um!{mN=A%fMaJN#Fd}a{EcP9f`Y11x|W^=@3Uk_l!NeVvJlnLG zm3YH7mpo__9PntUPD$4|akSyQ`IdrVdxtuuK%X*L2wfEtWGMwSME(RRH0 z$DZS*%&rCZQBz4$9h6B1d1QpjxY`EkDo*)O4k%c0AooI^i&VR0wr09Vd@)art2cii z2a{HLC6bwBf)Hq_caXh!rHMPU9{ox3iHo(=A~5BZ>HH@;iIm)o=ZJ~)XVg7$~egMPO z0A6^5>8;bHezB|8ou+s6Tv6GcCci)(^)U&4#&j!f5*@hu&byI0vS12!3cM>8Pe5&bGLD(XAr2MgpY-a24#?X)F^2a?uN&lR=J%Vxiyt)l!j8z*?+_8kLB z@EBYo(^BqMq9ci1KhmtI#zV!ZGv%$k2i`Uza5qIf9C~E>{K3HM?8bZ*Ke2Ml$BA~y zR*?mULFR~|I6_xChluhzj5K0^hcQ=fk9{yclpO?+5BX~-viO-LHTp=6dRd>Qe=py zp7kOX7yBgGKM2c(Zh2(!Z*+y$ItBzLd zhI%Vkh5UWUD9>j}EjVI`ZoH_0?^p-Oka8*DKKXJnU26_T(SC3ALTaOtkBu)u1ci{h{||oWQyJLWDzb#*^eIOMp|IqpaFQn+@o%OW0KIhm8j;= zqvxGYQ)Y00F6~x!+cXciRYtWoGCKe<4csEVK$;EGx%dY_M-D{ zjR@cNkLWSh**T9HwK;GrBJ#f zEFRw=fFU@>G3EU!?fT+4a@)5@$#02OlI0%YDbwa4u}7q?Z4NUOeK)mcD^ZRbEyjlf zS#oJ<7JoT*HlF%5$$){pjeB>f+CE*yrjlqdz$)oHFc7cX|Dp`+p~bNTa+T%Olgm-& z^^n60VMz9k^VMUa=jRx4p#$9c1%_uPdd{c#AiaM|R{181z4cB2XQpuT)8x)*+Ye&f z@(xeO_hsoR7<-3S$VCzYHqR*qv3JtQFI5!Zb*2s^wk5s8Xi0u&6QoqELXGro|2{p|GGAdC@Q$kx_O)bXLq z`c46w621EB1@i1!G9w|<>bnd9lfMWRAt#9Jp}$bvdDC!NP??V0_(FFDpUw(+!YOYB zmB5W<3}WfnM!z8u-?60Oy5=1Vpm_e|InGH z8^%uA{*^#I9J&qLDg42G`IoFCGVgy>0S)cq0`eJw`(q#%n@4lOKdM(lTJZsACZK9UT1d3c~PhD)oV2N6Mf4z(1 z>l|j5aK-vY?yUr@Rn!s1#8E5vU|v6Z@ok`kB8mPuDDE}gC>=qhTgw}Hu&N1%MLM9Dt)rT1{+`O|`Eey9&X zS^U#r?e|CAU$jj;V*~cF2tXER=ua zAu~?{*(FK)p3Jt}awu%!Jg3WB8%A-Jw=KLIua+-RbJ?xA4RUvEeV|hqLYZbxRJh;s zY+G@Gfe?^K1c;`MVajrAcST0Zcqwy}CPG4{VzfN);igF3#7FnLRMRLYPIW8j2T*?e zn;I>%5#M_Fy4jWEIw%41F^aWC23rLfGfDtV&~j>gF>)RdflOD0uk!lTI&qG+vD{IN=hZ4itdUy~D3K zwxa(shkOm`vV25FW{tG=i~RwB5qtaidE%}MN_K|`#D*lEJ~+tUzu(k6L+Btu6@=~E zMmyVr^%+_tqS_Wz`AUg&HsQ3k>a+rF7>qDYjVpV z-&s!c?*@?+;6}Wrm;I^X@O;+#tEKY-};J+sK+%w*Z|KK_9mpiM+JOU?adGkB?{iH=glOmQIjcH&N4 zM^mlfw`h>o`TqeUpuSUe?{urkFkJb&+~*kMx8`KZu+x312kIgt##w9K!8O~}(X|Dr z`NC%`c^RfLl`ykxp0z6##@QoBt;K~x0Ctz3XnJ#c#-@87-`m9pm2xeYSv_9i=iTfj zC@I|xRPk)FZV*oeJ&{+4v*)_Fsc+4R$w_z_3mM59aq>>Laa?9zXNYwqW}~#G(TcvX z!*({g+?;Kv7fV^KzY(;nEmQO5cBV)C5GQE&5CQX7*`+4%AYUAi5mmk&c5d63C4GI0 zKq&%JLvehavbxyeAN+?q%xfq$^0?-uALv}u9_&rpmrxz<>ZC$!MV2CC!{bjpKiy*= z9)+GD+l4CN%Y-R*PHQ3NUWgbvyPQGd-RZLG!>Y8zveY20#Hbmi@YPq9VLEXXn*Wo4 zBI+W3clqEv)}=#>bI5i!+m17rNq#Z4%y1p>i1KB`7*oD};&mEh(msmSbegvTa~?~S zN{lZKfUB`@GlGT~hvJ?nOoqyN;0xtwoYiH0#!(cdiy#o1c`_U*WX$+EA452nNxqN~SPs0XyHTqhtX`RIJzHzC$rsNAiPD zEl&|2b$NQaNKCs~Oa`M5jhq|dPV*1&2yGH<0^&j~SQB@6@pK(dOgwYbMmAoGimgy! zE=$|}?O5m@py&`0NF|jhJFy^khWSCX4$pF(Oq>4zT0zKvB|d5R3H2q0l0=iY$7C%$ zar9mBq}glDQu@xI*?e^DYxBJm&$?R1c9fG{8ZA_G%uQ!uPRp_rM}cR&R6Z4(S9x{L zZzoDY;SJW5&ZK8>Q3{0H9}oEN8FPuBWw)U0dMqU3%MLS8Eg2Kweik{e-YacW5}gp9 z;G(oPKB-}Qrf<>1Z(SwspZ!E;`F)VZ224xbsu)hjE3a%l7{s$b!BnK+_hr-Ovbqo2^ zE@|*j<)_Zu!6)LPS9m8cU|h>L;SZ-Bc6(=j*WSgLM|meT_AXz|#MZhy8rYZOP%%7r za&Pl1o1}7Wx9DEY<#J6$PfaUIxa0I!HlY&;JOzZ$7=KaV{xvmoQ9UYlh?;dIt(b5{{sU&5YUrQM^G76esN1Hga9L@&~D~*WT zJN0svPZZSTyPjX>8@_&;r&;;=_0uLHuW%IX*n^2?{_O5=T6hxKvE$ocf74>4Qi4LL z+krr`TKnFj96nn5s zzLLuK25!Jh{pq}kA#I*}5#K)eAhSFEheKZa`KJU&A zaTfnbnOc{-Ro^ffN2g^UY--$#XKIt66aj+=yEGeJ+-@T63I+|PxHDf)xXiD7Btrn^ zq+Ox!o2s!9%+DF(@_KU+#qZ_x>sl6&$ouKKW^`V>j8H}yL-Cs9+6=d|<|w;=KY@{iu6hw|&Ua&lvtq!KT;LQCFLLD@I7*_V~)x^ZQfv5MEAescoh z#$%k{HO7Fb*_`Kms?S)4j5m~toD=U?G;lIz&7(>K{C1LR9Zu_>X0lkh{rBft`-Gi} z_uQ#kcA%@Y;v-7=tM?xze<)Uoa<>wHZ&1>_IVio>?Jd)Z|LiDTT@si?-eaty8E{ZA zh)oj$d+7}S+Kdjbq&nW-Nx;5kwZ7UO3cLaarS0;KaW>n*V{1OCT>|h?fT#g+9l!yB zH61tS-`YPODzzRHiPIq$F$N%)2;C8B89o2WKRoZ|n3Q0Cy~-!4l7}laq5OA3t4$U) z%t^&Vto!NTuP$=~jJLgNOHzlE^>0#%PKmOMS(S}GyxH=b;cM{jubg+>tOMSd;bZU zTUlq7by0bmoc9wkc!m7IcIsEIre$^DqUW^h^!>WBiQ4McDB1bTx9_8nJ{I_Q6qr`!x`qO&NNMPX+r_Oc02hI=3b6s4rJF^^~mp*MZwzOe`=ETv|1Lv#c-Y z`)#KJ$0zSSch_6^L9nPB-p0>ryh9Dls3*U;e!g`7TI)LA)&46d2laA*CSAmx+4X(( zkrUuM6pYqG0xObsqCuQR)cW)vEr2rz#1i%B^tIBM{I#Y|Yie4F2kdawqwKfuBn51K zo!7u=>F*`;%Zb+&Uq01qAfHvIUii)%jYy^rVY4`CuIyy3r zNkR+pH0F8*bDkhEs#ljQs&7nw?kqz$EDm+xPC2WT27d0U*GN0$lV36I!Y|+)>(9N>A*Tk{%jC09DycwiXBDzEqZYESblc(%XxEWTt&#&4tS*ig#g zEBWok);8lGlHyzr>f&fQ_;4e&kbg|xe%41^cFB7r3t-GAQDf}S{fZ4!z07Nqe0BS) zs^sM&!XReDmTz0<_orxmHb5?Hi?B{6mr$;fll5dv2BG0Js<$JB=u~)*%<9N)FjOww z2WLCVT@WKHACP!EN^R6eCO$ZQ=&6g`Iy-;Rz68v|5-q~MCdlmMh}e!W!Sx$$^BGm) zy&RMxU#yP5>%H%Zy{Z@r@;YLO35!(H!~`d@ewPw(}aXh1`-i%(ov& zk6&+-3Q12T^WVai_XI+XUf5!C;G(Ny=B0RG(pEnv{GNT6cIXg>M{5;QSAc zPlVl%=Qe*BR1=^)oRcz6P*Dw6QKj+m4?-gzp%&R3%k+(a5iqGyO1Y48?aUE{x3dru z_eK8h`YHdSv%EF3&c*N}+4)U`byun6wEWO9Hi2r$6m~7w&ZzDn7(l>{i91Duxul~e zs20=!`D1pF-Tb#Xn%!ca%5y`nb?~Qvr|o0ir0qBS1ucnWvw53?rN>$J^L_3f)@yA$ zm2YUfRb)H^e$bnkWAF9lpSVkw1UTys@cgU(s++QWBEK~Jf{6uoOMx@^;BY$BGnvnQ{INF+yd$#gDeiwrph$R7It77(SKV(qQ*v#mo$T8* zzzj&9i+(jvwk%Q;-KX6e5vyx$h^#()N?4pz^9j`SU@G8?JGd$G78$rLv~N@duSRdX!2K=!Z*T0(SFo^v)99G%tQ0BfbpdQd202# zN2VQK@8^SKoB$j2*wCBgaiE`lxl8nH{Ajr_4ixsUqqJd5!wSYR{jX-J*pDQTi-<2j zQ(%}BfJzlKAppt&eLi>o!T>D##9fC6j9Qh_5&~&QKS1oY(5ik8pp{~ZkQ!rC^IAX5 zWP6GRfK=C_#Fx$|D`IUj>B1RxE+Q!Ihx)%jafwDbRL=uHXws`}qXVr!rk)@_rXC%g zh%f~zAMrgRZlen2`i0pHlqV|VBHjJ^o#bC0ln!D3GR*qs)FFL2O%sXhb;6-Q zN6MBC-Sa+oU9@?E18g(4F+mU}?wv;RRoY3=(}V$azh^=th>iImQiCqcQgzJ_VEJMm zdx;5<;%B;WhvbNY73`b2p3D$<$z=erjOZ@<_fl^Bpqd651593WsvI>mN*+&0e`ocHs>P%nl+o#LTpvjpPNcp1WdDodD~{TDylG4If4N+r=3o`CL1A zQivSAmJVnOF_Du~Gp4?^8MLltOx;L!p?F07`5?ZecO6(5^FPMK$RaNgS0xW!S?)ci z6!F{WpkJHvYO=jwVOnL9px!vHKPoWyUJacR-gFVvK}ObvxUgM&R@-$v}+9}m9 zS(uO5fJ!6RFBMOXmUzmcs$vZ=+t`GoK+~a3MBqMtnj}%)k^V#>{suPApY82 zYeYo28QlG8SQIlplywsm*c@Gg$6M>avrz zy?n}R0fZQq=5OhJ{6jEdN=DsoT6~+cI1?qtr>T-c{vcGJ5|Pi@xvLn&puEgp$DHM0 z(0OUjRtBh~X@|Yjq4#>Qu}AvWU=_;kjrrM^N8)jn`g2|$ET`ht4q>;XympEN)b1Ev zGM;C=zhxyws<%!Z*RxBjPPEIEb2#k0H7yd3ivH*YgkS?a|HyqU{k!8SXQWDx({61` z1noKb+nr1v87ZmKY0(u<(1?gK>_b6$TGyQomZyIEi|OemX8lw!?nOlyz=Sjc;)Q0 z$l{?cF-Yi|hF0af@W}KmqNb!w9CZ+Mv8$_y;9UZ02Q#MV46bo~aqI>s!krSFXamnL z-|Kh5FRC8Lz6ZMTE4LisT-f=72k?P*M8b44yd&*ABdujcWT-*piQ4t zaydLo;OCvPJxi+Ka?W-nbj@+6b4W@#DRmUEn76gsD78)+Z{s^GS7C~XpqqW!;6ch` zeH9Y&F?3GnJUG^Ar^Og#MH;U9sP^8@ZLaHqXZc*$AIq-H%CF^g*4OLH<*<=-tV(*` z$K{}To)n;L4MlEWVY~MfO%uAtJs_h67HYP*4Xl%s=H`1)o8~y^G3BJ^2ZdlV<#W`R zlzlO2dj%A2!h5ezJ$Ofj#+^;Ie^+oLvk)NDk}^ux|0}*nsKiv4VP5E)(bhBH@4IW$ z$@q@+^@9a#;r;LX^X22Vwge11wYq!P0f0L!9{e2u3{*RGNO!oA)i~iVPztzTA{Z6h z#jTJS1Z3Cz{tBVfT0&y^cR<;~Y9rx;)5#~ij&Xj>*ALA625fYS7Bjat^ipuKSgqV=EW_jP z|IKPKG$9sYftM(jUwd6xGN`I5en8#4ce_y>Ddg{a98Zfpx>>wScz2gjEabm&@WL|0 zY@V9Cj!vjAZm4bqev$l?}60&0Vuv%0P*5Amsk}TZ0c`ZtoGjnjt-44OqvirSPuPydDf?e{j;m)$*I zFaWUA#bw)@omuf&d8C$aCJTd(za^%3zICpF-t-5Y3OiI~)E( zK$ezpx1ULBHs;$i?-910IK|nX6qRu^;X@z7(S2|LPVC)yyL}#rT~Q>P8PLte{j*l@ zoMfLF>;-c){J|Sps8o#&{*Y3nEsLT1aq(-*sjBU;!{PP5SRoJdI3S(60V0#*;vcN% zziLYtch+WX)+JxjNs68d4y1!xGax%?h%5s%H0OcBYQDVjw2JrqPPpU#_2m)Y*Ouu#V*uu5+tXK4X(8PJkRZfJA3mRg@5b^$aS_2*cC zwED~Irxv?2A2&Jf+BAs7w~&skRR%!2-R;uKs`-C%Al2}X3rE6>k-tbv(d$kwq*^0s zgEXY+hF@nBh9r;6yX)u~;1dd5j$Z*v0hKZu<>4IXMesFpyDu{5dg+$+;^JazYN|x} z1K8)4Py|s?(V>TwE%wh|+%4;DJM4DHUEeLW5@n|aIv=EwjnmD(FEyoVL3hXOwrTd@ zCp_u-;gzw_?TcS87Obl!<>*ke(dZZOj|RDJ;!UYG`g3l0K&%Uel;pG<6VQ}KWtZDo z)bYUo;s{|r6wHg58_%|qi9VxYc8kAm!b@{Un2H4312CyHQ9ml>&%M3=f!_iA)3C)` z%f8VOb-y4$&8-!wt}8Pe7It=6*IE#a8IT7jTY3RAn#i?1)zQz&_s3>UDc>nOa903%8HE1pn z%cIwP6?xJH_++7`e@KxBezp01d90l`?DCK$a z{Kg*v-vO*}Ti}F+Bf)W{PJ6Ko1vi2T`APgU^z3n$fdOy8BDMuD0U3!8jv=L)aOm#O zEr~)6>=k`3vCX$&1wMVrkp}JhHb#C*a?A|^q6?rqOL~Xq*y8jSk?ZR5q`2kS9-~&- za?|49`EONAdftAgSUSbyC$mX5-CT|i*v^jnuD-+@2s@4l4PI(`_JFox`#0m^R9_oU zIZut)7!KN+4AXKqKy`IwQjA0Ow!um#|3K`zw1DBsmAQqpwr(U26$hR8p<0-QUOhVG zz+(DQ<0-ng(GItISYfg1)V>hvV5xaS28@wx<5`kfHgE7P6ZBR^)5OK1&ucZC6ZKo0 zVhDy0GJrC$%6z-Y;Lm!S2AkqG{R7t)SStG6=piJ4n0xnhXssU)3^b7+5K{5{MvY%< zbRG)p(Y3*Jt%d=q543ZZ{E9CyT}6G_>+)4Dl5f?odSUw@jf8PvWMx*4lo*Exj;aay z4=k+Vwg)C25P8}nUe6Zk&BEOaE_5szE?SDlCw$uPTEzUaGAx2bfZ&l*vp^`h2Z&I0 z_84c~Yvik@07wB7NxeO|`3CglJ%+`NpPs_uWYHjfk?TU5M(k`H=f1Cm_pObL=$#OW zI%rI$(~|pwo^6#DM+W?>o#jzku1I`_hV}aS3F@EFfhqa@9nPEwp(}R+bC;8T`LBk^ zAaz=D;`;`q@v$K*TN-kp@2He7LWi^K3awMhAz+2vO8cKP9#i}HqnYvoB}F1x670g5Ym~ptZZ0tS>VuL`3Ut1lZmD79#?g1c1(5qlrBKH?2Xfl5JEFbU$vu+tP zCVvv-%F7QzT#Pi1xO9dVeyxh3uk*n-yoDo7i6Mc-up}0hGpD?9{(&k{fzTJudKr>^ z4&XJn>NE57Gw^S<&jGQiQL%Ci3Qj5?R7{I_xBdn|MVU{RIs#_@Ap)xB`hR8hp@E5v z@BQPBUvem8xSP?4I*9D+0=L*l3^ZnTXUZ!Lz(Sv18^E4}Vlq%k4gFV6s4`DU^s&LE zI2D9&z)!rSds+)&TbY)O3=XJL7AvQabQbWB835ASQ>T z34_P3DQ}^J_z!yIM5mvAvVrZnZ3QI1t@W3l$Rx-ToA3gKHB>k{cqp%2b81YnuBRXD z@BTji-mlX>A^%$xtn}MsTjN4>``-@9f0p;oFEAmT%bkK+u1IW6&YGb+>n-ZB4xX7%Q?shF8;MaxWkG1T^jvobB#ItO7v7eB5m= zwF|KI>+{-HzyhcKTqpUQANO`mx9si1M9QH7Rkc=8N}thz-^WRi*m?s2QAgds%2LZp z?thDQCdk&Y@RiA#a_-4uv>h`1FI;&SVB`uzX7fMD=6^AQ3KMKv1TW$N;(sFpCQN&H zIs_eZfVyZYS}5C_Spdi0Bi~ANYI)`+=M5200Hcc7?A+31OBs;NGEU1e%f=W-%{xw^M9FUD4)|*S=Yp%5`C``l_(>ce#HEhX1 z3BL%07G(IZ9oKC0nF@H=kjue4R$R97>hRAnvh->SRBDL~J21kSrLWGhQ`hO4G~)CK zsMMcz-&F8Z?7oM7O2iW~sp+b%%Ss5iF+m5CM@faCh^#D56W^}5vpev|SpsDe-3&h_ z72>3BIeCWK@O!?$T3g`6N2TJItW%-tE#3Lp_ zS_mXeOj4U4Q_#L@KZPPdK5vo{&;exorpc1lZGzj5u0%Y-Mi3jDAzl4TpUF?JQ7M~* zh5g^1f`+IA?^M14IR4`3*TpEdw?np+3bN;y4pMvX#!n>Udw}J2Km@d!1#mR5<(@d7 zL9M36UFxyWFEgrnwVS^*RCMGjCOuQ&M#<7)uTQ}P4v*CG6y26rt^yIYkpDzR;yXT} z2#W}JP`wdGXkG!qt&RRhuWrbhY0{_gt!`&pS?f&WSx${yiFmbj97x;sTu&1E8KI&{ zdeJZ;wg=aPPrG6Q5kf+^{bz*l&}y=pL<@z4rrE({I)##sV=Zdz=ziFz64R?hc!+UUBKJJ+kE zor1E@GFQ~<`Y37op-+-z-WEHs*{eWo35jmdXEw6viTaU7^K4oaYhxP7CmMLJ=60?H zs8b^p*5k>_RNOraUuXF5j_oCXqm?_tfE+}9eDnG*C|()-#QE&rh63ny@cr*bAaELU zu6s#_4l8(Ip6@YCw z^Z$U{)_IPRvO)xD>YfWLS%8+c{Ca2!c6N$hb;rMi1#xcug3RnaL;1^HHJ?P!9B2?5 z(L=n>@+tW&`5xen^_Gj|J^O%E!EFfydG z1=LB#b*i9-1F9WXPK((x+kU`H-&cx&DSk}wBo^o|gx4nMNh~x)kcXbHD;b)&X5#;f zuIryX@9Fm7B!~+q=X~1I%jqy*;Fcthi3ovaa~=SE@|-s+I+l}Fwlbi%q0sgwiggR9 z2YvxsHnbY$C4c+ea))5OwZVZn4dTZv%n=)a@nC(o2Bv-S_xd3TqhdAHF}q(rzDOPi zR~W6)s8GceXes;6;R<-1DS(UrrTmF0HI5nKVgpHt?2jHZ9Ig0DFW!ZMC&z`S=8&|K z)hXpCLYfPEbNgN2%gjczGuu1 z1&X`|t-T@A>-$lA4?PIvkI~zwnd%U%yPfPe=~%Z%{T$r-8ZzAnQK-4?l_4U3=i zDdD8Y!aC+jYQwqg|++NRg9XcXuGIWtgQ z-E)w&{SKJ)RJu-z`<3s(<%2-XbRd1vPc`r7_u-U2iDpxQ#JAaF7zwK(S zem-S!0VvTJ(Dd&GB6zQo^bgmR&|l}l4X3Xx%X*!5`NV8@+GS$&aK4pXzKJxc#K#Qu zRl7(FZ)+8G92wAC$>8Wvz*p38+?$Lpb~NoH>t4hE39vrO%v`m{yfzr|n8XAM{Jyh7s=Q$_4v79TsQScoC z6)s83{;}6S=x^K42$Q+BTsS!r{26Xj{T(pliql>NZzQMC5^&jqM>$U~3pSSeK}@-_Ldp27I*1BU5VSB52vZD)m$ycIG?u-P6+E&v%q)g(+S?J>J0=6F)8 z7WSgk_!C1K2;oOMJ@V69~{j1Zbdl>J2nG_X}Jt;5?kB9u!0tiu>=P zz0mf=E2cR_$n%%#=TM0Up%jRh2(O^Xs7Unt95d&UnQbDT~lV$`<sD0mHF73&<(hofT~0S8aEOYl^2G7 z0-(qVQ=Ucu*u1hS)NL$p6u4vZ=OzoM$;7_#Tj&ob29@S!A z$No$7X8eN(0TqG>2eI|r%VKLCg75O1(iHsW^?r;HQCAaF)zkSLH0EUc7YqRY`FZNc zCqg)$V5pC81z<<9 zcKmcj1;1aAUws8fl*!oTs}LYyB|xwF|M{%+e?L+D|L^ZZ?~%c|4Dh8?1wI_2!Q%@B zVrp7iTKfGLt~VHedIldNpv$U0Vt}L9@qf?25o73|^TpuIuvCPFXS>;?hvw!BNcN-N zajLqoLaGLWAj=`2-j*vayi>3#cV6eQ#u<5fCYhK*?K^s@*&?_TJSJbE3ZH4POM&i7 zmg9gTvvoeX$gZ9)IEmow&IV5J3x7!@?|9;UzlseCY@uI~Hi5A@MT5`6pr1u99cWRF z8AbaLOq_GE|9RRz{jQIfu}l`%T-o;6jLWis820QGo{m0A8`(AeD*cXQ`W8vn$W-el zOFow4>MKS16d^8zitoX~Lupw|Fr6fo;?C!%x4oa7KL&9yJe`wwHRk?p!r&Q(@Q3qD`c$5kJ z__=a!=`?QQPD9YF_m=ZFbMjdeQZ3lbc#y5&ZGRTyWqaX^y2#P7PqfU6(`jAPJJ)B^ z?&BHo@UE)ld`U;tMbaqzmRc%LDJlwMCWgp*}DwW(+{`V`7*ZUo}Mm}sR zCt`uYtoOwMhk`W0@jbQ%GY*|Pw?D)brvd){6?U6HhjO8XC#*P$2*}=x7l+G$-DFzy zKpQ{<$N8WE>VG|si6hzNx*q9Id;77@+uGEHC(t!{OUW;S&uwu9+F~6pMb)^v%NcMI z-xsIc!6H6-pvqM-vG^E%9+{t&4+pu(J)xM{{O)5a$%BRjaPAK-Cu_3_6p;~1T48w> z{EBzrm_0r&cX_~)@FSduV`lZitqm#!v(!(t&DZ&9!E3%`t|yLadf`vo}0k)8Ri2|$;g z#hXO}kFM#R1@7l9s}7oB^WsLE^z*%r=kj0QSTm=OMfmvq1wx;IE^XKi$-rV^6{r>$Gg7wi%w}7RMNg6OY1JD0izj9?_hL37e zQqnB5+*_+cSKrRxANz6}!wPm_nlCGW<~dma`JLy9rox%uutMaKl`Vfx$lI=DzD%eJ6gmFOk0~SNPcE<-;fas{5zj z-CbIj@AodgZa(kJcc2P(L1O8(zc}Lmo^yCT=ZR#y=|wi?!zn=C;W_0mt_YSanSV(UXt&9c ssSM8P{GjZ84QLzEF*tbGU;Z;5n89&W_k!FuU~7fJ)78&qol`;+0K4@pN&o-= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts2.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c91a39ffac43e0867bec1df89b73e10e0b28c43 GIT binary patch literal 23016 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 PFatGZEv0+~v#0+BCDM7e literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts4.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts4.png new file mode 100644 index 0000000000000000000000000000000000000000..742006adc9cee3c07b1a390da6991a84d1da99d6 GIT binary patch literal 8344 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts5.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/charts/images/charts5.png new file mode 100644 index 0000000000000000000000000000000000000000..c49a29609d8e8f9bdf101e91021d40c1cb3d4175 GIT binary patch literal 47084 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'*4h4^s0#X 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 g*Z&=uhxp + + + + + + + + + +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.js new file mode 100644 index 0000000..2978faa --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization:false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "//imgbaidu.b0.upaiyun.com/hi/"; + emotion.SmileyBox = createTabList( emotion.tabNum ); + emotion.tabExist = createArr( emotion.tabNum ); + + initImgName(); + initEvtHandler( "tabHeads" ); +}; + +function initImgName() { + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } +} + +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 ) { + return function () { + switchTab( index ); + }; + })( j ) ); + j++; + } + } + switchTab( 0 ); + $G( "tabIconReview" ).style.display = 'none'; +} + +function InsertSmiley( url, evt ) { + var obj = { + src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + dialog.popup.hide(); + } +} + +function switchTab( index ) { + + autoHeight( index ); + if ( emotion.tabExist[index] == 0 ) { + emotion.tabExist[index] = 1; + createTab( 'tab' + index ); + } + //获取呈现元素句柄数组 + var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), + tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), + i = 0, L = tabHeads.length; + //隐藏所有呈现元素 + for ( ; i < L; i++ ) { + tabHeads[i].className = ""; + tabBodys[i].style.display = "none"; + } + //显示对应呈现元素 + tabHeads[index].className = "focus"; + tabBodys[index].style.display = "block"; +} + +function autoHeight( index ) { + var iframe = dialog.getDom( "iframe" ), + parent = iframe.parentNode.parentNode; + switch ( index ) { + case 0: + iframe.style.height = "380px"; + parent.style.height = "392px"; + break; + case 1: + iframe.style.height = "220px"; + parent.style.height = "232px"; + break; + case 2: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 3: + iframe.style.height = "300px"; + parent.style.height = "312px"; + break; + case 4: + iframe.style.height = "140px"; + parent.style.height = "152px"; + break; + case 5: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 6: + iframe.style.height = "230px"; + parent.style.height = "242px"; + break; + default: + + } +} + + +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; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[tabName][i]; + 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( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
    ' ); + textHTML = textHTML.join( "" ); + tab.innerHTML = textHTML; +} + +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'; +} + +function out( td ) { + td.style.backgroundColor = "transparent"; + var tabIconRevew = $G( "tabIconReview" ); + tabIconRevew.className = ""; + tabIconRevew.style.display = 'none'; +} + +function createTabList( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["tab" + i] = []; + } + return obj; +} + +function createArr( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; +} + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/0.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6964168b947afc2cf76780a85f43d4f77c257b77 GIT binary patch literal 43 qcmZ?wbhEHbWMp7uXkcLY4+e@qSs2-Y0y+#p0Fq%~V)9{Rum%7ZDGCMv literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/bface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000000000000000000000000000000000000..14fe618ab58a9d46fee90074386b5581d47b92c9 GIT binary patch literal 27167 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/cface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000000000000000000000000000000000000..bff947f5216a49d8cd7fdd8d4e825808b3d14f6e GIT binary patch literal 8603 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/fface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d8a6afeb1cb2cc40c5d76f90630d8a9c1323ffe GIT binary patch literal 18479 zcmWifcU+R+7ssCmcmPEKH*VZpahnrxmX>I0T2?sIY@k`0Sw4WEsVSD4_D#c4*+#P> zTi~v&(3Wk~hHWw{EsI~j``7*V-q$(ze$IJ+PWa+5pG7J9z$EG?@c)I05Ucefl)-@e z3Czz2$Di2gzB+SE>ju9^LscXa>GsB)1VLfz#<_62S2`<{SJjAJ53-Z2lpi~luhW&M zf%E@SKVQ|qQH(+r4nOAs^GASmN9^p?%{8nDWh3zE!^n^GE-77(PfM072kkFpW4>N3 z$OK0C;&aLep^YQTsrK#juWn>!WuKXCi9RK~6;OEy5 z$|A2{y`7$!>1Y%Ws(gVWk8*$ ze#x~DqJeV@UtYeUtpAiHz@)#9h*)fCpnCfD$KGRhf4gFT3~W2sS_h0MNfm#TzxZ!1 z)O?AcY>L!YX1b3vwkRincYM^;=gDtUr;KjD4?`!E(<{FmA}wFOeE#;6A6-#jx|6n6 zT>CUTr)*5mG%Bku`E zH|l@s>vbOi9^Kq|okJcdDevH<-7-|~Q#{K){reLOvG6kIY%S$49CoQ~v9cSv)SL9_ zN$#YV*+?e9$QV|>-dB@u{3y)-Np|KH+3oK?7ku_kG^^X68vU)@O8Qc=c0COQMn;;DS_+iA$ zd`d;VQ;dXl{Z1<_O$Enh){A}SFS@6TiOm5g<(xQ>4NYH?Xhfgg^`Q#F5x09Fgv` zbeG2l5f}$aMIlh@o-o4cHCq0+N5!~%=2-cObTfwOX`i=COncI$D79yKw@{X_*saYO z(L%dxdM17JQ_sg5HOch#9s1p?&%0)*mINco=gVJJ zQ4xfVWj&j8u|X2m%e&$l-UMx)jbS@{>eAfP`?0l?M%e!8qV&+G3;*%#9rW%Gl`UL& zc3Q|tEUrA5tBkp}NCoWfPVGVc!=JTY72adGq9)8Komv{a7$iSgKz zPA42etk#m7Pr^@UH2@L&mR|Vu<7viqDZT!uLi);ZV&CG-@I;YPT?-cn1P`ob*HCUb zmYHd5;ddl!s87fSzIVPh2-q$$5_x3G9$GsnLq=I#u^A zK=6p;y-|TBxwxN;Hqm`Gv2)c|L3^YB1hI_2JFB7F&tQEgO`cU`ZA>ZTWq-ag$jx^bCd#mt$YTRV#>$BMU4+!!*?P)Vf` z@`;DOz{iSzG`>VT0Yg$A%zd{b61^QDYBtvRw7H2ywVTf>dTvnyeVk0g3XMU$);=*2>W8 z;g-XOB2kHnlT61^xSz&^y&VfQh)E^?k%l4$ixq6bW-10J`-<*z+M`lCHXK&Y!0L)~ z&8At9&Wi&Gdm@)~8rwE0AtFvYrs=O_N5WnL6<>A>;}*d6`WyqLu_tQQrljwY#n=`t zv_nh9i_H#-_y`{>$76d^?DM|gU<|eqo#esRJ>f#jPB~%8@p!O7&b8kF;TorPzG7?l zuqkF*S2{RrWUPpg9-f{hZ1UByUDdk_j<@r9=$6N;o?&PDI4&WY4TJ}79t`vU)&>^- zr427!s*c{g?~d}J3O}h}UGWHbcYf@+av58g27fW5IV95r*{HX*JCx2CRSRR-Ba8^zKH9N{m-b9Pw*w$dvxD^+6mirb=ZktgV%~_4V>9L-{+)Q z$sujnN0Ny-M;?ydmZ<4=S^?RG_I8-84&;`-ygPbAv(k4Uq;>_12(q+&?0rJ3ri|(Y*n`iOoJv*S+(9RG3b{e7i#-o`gF8lXdlSka&sjONb@cM{pl9rB zPa*O)^zT(4UP%46CvLW~pKJ9NPUw3I!Y$6=%D3dQkaZjTJ(J5~k4HtDcn;rTeti-! zyJKpFp}Nv~s`#zL!S_aCbdeam*@DarDmj2F8jmJj+8(B1K8c>L zS>6Ckuh!P&@}@^GcC{c+G%8xjr=MIX)@@vzBtlvjwK#9}+@k_@uvH{XL{vzO*_M+u z^&X0ck(8{&v96`*t(S3sy~|h6VX{>Ug>S6-Qy|A-1XTgs5uy3e^jBQ(5Q zhqMldK(88+A{(bU^{*+I9dmT_@`%^8Lu#H3aHFGX`rE7{bRTYbzi1={ zYa#MHx%$t0uN9l_ZW~6mz7;qwyVdeQ*i6??1#7+U%ME2FY@;wicJ?DP?eQOcH*AZV zxb@9rf4S7VN09CGlZu;o!}i8XH$BAnqdc?tSJF~S3)47vJ!Ks4?%SK_{T%W(#yJV* z#rhSSFTacgd{!rj5UV^ECJ5W-us0>24T$|HH!@^NPO&l_wvRL}1?_E@l{phpM1AGU zg5j-T9;u+{RY?Q=)HyjWW16lPSb((eg3JGFqrdfa>C+Y`3lL%nCUE+aO+H(--C?y} zGb60yVivCM^1{?+>>~TxQ7#?Vua)rA=hnI1TjPj-$Q_Cjn*`CeIMLNl8`iQfZY|tm zI!@Qm7~ZL0+fr$z4QOUAC5S~#gx$`jn`KIjR&ym}p(Cl-5esU8uw@!oIY z@453y7D zX9LNgJ-`+;ZHa!MqiMG=&y4t5G0F{cR4givGIc(GY^moFP0q@8I-yR6RL&?TtCvW) z-nC_`6~DvWqSx0^3XJQ z7*k#MCfb-08u38&0LGFcDG1H8Ja(WUJ&~^iBIhaCcLFGB27OSdGR7f_#tC*-TIp(t* zGs?815!KHp;yAhB^KSu4IX+B|-o%7{u#hdsba!X$vC9n%Mk9C2(N&7Qn^?$TA})(q z2-6BrkO`DDvuVX%dqtJK92-m~bP@?~%PNam;I*zQLk6J0R#yq}L#bsoW_r3M&}TVz zw@C2gpX6kg%@r*Bn`Ray75rclY=sGTHKLzj%}+r{dpU-*7((Y$jYb!3VNyUC&b8v7}%_#PzI#3kYX0`36mg}V}6m*g+ly!lD|wypa=<7 z$LoK@oHrASWmanoRE(?~&Jp+D%!YO=2=}JZVi;+y zjDeP)bG9l8^pF9+ME~8&hIR;R(nj5)D7bg-`=0>FCxXL2UKykAIa>$o2Vs$?8EecK z30@XFoykq87=WOIczweeBAZ7oI{Y!W>4RpA&A635uY`(BNR+r(b??Gzv}6f!S!DCN z7@$XB6qQ7bbmy6Mp`6welLRU&ZOzR@aZ9=im{#=}@%2=L_9%JWN-JVcmc}~@KT3qK zprD!+gd_#ulZQVjLg#n2TTl?uCsb+?5av6=0wBcZ5fe`w5l|sBN%(dm;+zb5?I9z| z7sY^)G?@wwSagTIVnV)Su)m!}g+{4%E-a|H1?9r(SPOt(GP0VL0K}j|Y!)Q$!1D?* z;)agMca|bCOFWgUAf#;m3Oleq4x93#t#6%E{D#X{tf6U)e;%4vbB82}lJ5QF3T z=ZY?Tn1~pOaV*jf zYN3^Q$T#(*P!0F&I`d0ykzen09m*bd{F3?ql5s^R+kBL$2A*fM2Hfp;bcy6h|vq3-V| zelL%UWLZK?4@nO(c)dr$yX|QW|B8zEHM84Ym4@v(d)9dzKbPT-<-%dp#O}bIJfsw} z9ZN8zA!<``-vG<-K?4C7nLCQEXfT5Wgyayx#8 z7g5N~Q%Q?2_1gTC{R z&IetNtXiZm)_B`h^Yxy%wsTo^PL&;%Fn@6OtN;Pi2q93tHoWLuIKhYIGdYSzq*bq< zSZp2xJrLVmVL7LOy0b)V>?+(1r5@H!5YPCncOI~r&8DXr5+pgA&$J1RFg~7fhCh{h zuhaaC^mMU8%aO6>*Q-wQ7+QA@vr}M75g5#9=q6k;H@=TvWaYhfz&tsvZgHK;8EQiL zHy9#&Lkxg+%Y0vGSCFRm-jZ{1-+7Gq0+XV1{G;pA=+>u&UXBZd#<$jWk%TQAi(%S| zJKwHbvkF&yAO$!Y1}wjD;M@s;SxrZX#~DfAI-LJz&NA#tvY6|8+r2;5(N;YJVJFnt zJYSzDSJRfO>ZyX}w zpg&tucoXUtCkw0@V5Hn(2DtLa!qkI7V#(EQ-H8G!k|;a*xaBN$G5MNY{cwGsWgOU& zl4_iHJz(E0{zIhmkJO(zoRc3d{l5h-jaV9cya2mIKe;XB`mdwt7S9t@)eCaf<|t%< zuuZ440AeCgJSZovH-XnH(T-o!Xu=ezxI|eu0_faEVvkJqlr+5kV5b#g-Lo-FF=KCm zJ;_%Rk-kG>Q{(6&z;wR#CmN6b0W_I1|Kkdb3k7rFwccS3BO+xC*kaTg4*F107rZJB zjEyXmOVvEcPSeyTyBc5DfP0?CxO z|AA}2YK1P=!y4kW_MAp%|<%tO{X=d+YHKv(u%1LJrnW}}FWfIVt2&=;KjM*#C)3L}dB^kFG zjT9)J&!57XP*9`^;4O&AL>aO} zFxgC*w18EuDIP2D<*)a~N4;0sB}2LjaZ^O3$C)D~LqyYSlNTuXs`Zn$&6B~OJ33@w zyKL2No5^Ou5epcvcMaj#e8hXO^22g#M)<@OoUneYr~BX65%tA7VidRrNSibwHN0^? z8TiX)X(ZL!K*ePG(&lSa{qGjk-Z=K=WYHz_)*m_6`7ykz{Y&T6s+vtA;lMx`zbu=UVs>VO|wp=1~R7V zcgUQQsE}{>ZQ7V>yBufPawf|}=HphdrUY6(_<&+ za;2Ez{zx#-doi!cxG1tJ-Q)8q>a#zxf?2Y4e-a);4teCPg3*!*WS|x8lCJ`~z@nrh zkqT!OobO2*3;HA1{VG>0q@M6lw3pj_{##{GOvKiX6Wrwng%o6J1tcYZ*0slCs2*x3y;bmjezc%@#Wd?vu?8@;``?9dRmW6^M?{qRK;0Q` z`3nE=Y>o%wCk9lxeZst1068*o6)txWW+&auQN}W`nL6K1Bh+t>I!=>DdG(dsSW2`r z1f?G{@~v1G&<80;*EHZ_@DK}tgbd63l;}TC9%A=0)wuu;0#(L~(bI&DcV4Q!IIAXqiCs_q ztD1_N;bW$Y(StYt{<^TK1o-Pmtp}tbdWSX-rW@BDdG{2XcF<_O+l937MjfT&o0Tn4 zRcDd$w`>Df`tobs`O3OQ+s~+JRWu8;vLAkY8g=ltToMx&vF>JVkK-A*4a$sab>$U) zyRhHJz9N{T>hvV4L$`hLj-%)odSPYCbq5_)QUN3dH-i;D9Iw$?b@?# zl=j=z=cw8L{d&ece8ki}Nn>Tc^3BCF-hIQKC9G*T24nvGCxd;?(E~BB5hls=d2enX z=#wL-Hs`&qHa@y#IOOun*!vsZN8Q5-I#x$JruS&134V@IWOk4D+v{lj8hJBf$5~d$ zBJGOe=|x|Q{QO^Vjmxj`vsVLuNWzUV52QAA0nRN74(SQFZ+`N`SAM&|Y)>h_osBDVkIykH_jgXO3ubG<6 z)AomNC}>||-{O&{W*_mp6j~nAZ5HJ^r1lMCp_7XsRxD`cE^)h2^eQ4$kbJK;;D>nf zws)~$i<-y7g~?@G1!mohV5Q1c`Z6`A)CnA}*vBI_ee%$^3N2*{LLGNj;4$X#CIsoD zdx*uk7rQLf^Fi#hiF+#fn}XZo;@7P{UmGclkeOSTi2IG#7DKw@DdXG{)xd7HRZ>RX zgQK-1@q#ltkU4sEWlqia6jIiFnpr>~~Au!zK8U7Z*Es93-%49C6^&Wq6w37TN|jQ# zOt94F;Vn|r3T|2oU*C;yrd1btqadY9*=t_4qdORbGg5^cUt6iN)cJz1(shka^(`>M zF_Ay9Hz`Y8>u#+q6e0IUA?AsP?O!nUar#+_<}{Khk#jWaNwy79b@CmYLsAvr&@=G5 zfNlC$+#Kgp?=SP^Y5Qiqw)T1TS?WT`mq_t`zEt0L=l@vKN|Sn3)^XM2z`oX~2!&s> z-s_5?FG1#yCK^?}glx1>NejlT@vXM`AzMyr%D)$L48+|wn`_&Cz4%xY>S=WJ>a7)$ zhS0ee2fnN>FkVvpCeI_Q;q{nzAxyGpuU3+}{N$yAr{mx1agb81$ zlPFGMy^yhq_sw;>J~X`&$<7oDEl^*_SB<6G_!|E!@t!_Wv!qkmS3|$%N>8@hbB0S2 z+7US><*6SJuJCn;#o+AZllp!dd$Slq-5k_f(>34t#9bwVnVMUTMZ@+x_4X&+?>%rnf`-l7bL0L*Y~AVcHCUG7^6SyI`ip%{u4ZfqD^S8a zZhctuo7`a?)slvMKV|an^EwG`6U<595N!8U6o`GM!o@hg%mix6mob=xX|4p#B9;{_ zfE*ocsp0D_;aCQtN;?8nVQuf}2;kQ&?q6;AgX(9T_&NVsNQ^_i3>{x0KyS=Kq7TRz z+AT=U&C^J1z!PpDrPE_GRZqPWC?hAV^K*7oH}$BgDg?JEgP=BoM2L47&d%#sY^BgnxW z*Y1@Dkte|Iy8!)35Od|ld9|;O>bSpfbU3wCGNV77Fw9!vHVc@3 zwf(sIY|J8qd_hh8Kf17C^dX+;q+Z<8T>C90`#+V8lijLZNI2GwFnsYH-S;0rps2M#RvE9 z@ajd+CUgaZBZ-Cqu{bQ=)0+!kz6GT93MXQc}YMo~Y`I^Q&D?r|i%5&9KMV z;JC7oJ``NlnNTCthSoPipZg5-&^>lPrYP=e5O zd%tJRq36>xjVhYHu0$F&pV*GQ^fq2z?DDB?^n!@z;Ao+9T8zXOL{v{ZeHx)K-3{_x z*RRe(sN0cBt;3pd(R1cTO#$w{3NI~>h(g?Pp)C&Vuhlq>-Osm~`cAUV~sy-b#PY0y=M}jE%OcAeMbDMB;u?z6DAy-Si%s z56Uyc(z51P3j}|{ok;_&KuYRjOTX-#b zKkrUtfa0*;PD&n)E;;=7TZ&%Mo0`wc9a5J+29N%=f0uIiz9{8h&HZj%$fVhRX+KwxGX;wDKqH=E5pzI*ub z+h>1&4rNmc6e<%dY;ZA$uYZw{Uc)6!EIMMGaOIv(g5YYNerfbLZ%hkSKMY+@yDZi6 zdk=#NtiZuE1kxW68TzArN|G02HVChLFf1*OC`}VzMMVH;^5vldiFPeNc^F|y4Irh% zCwEpVrmlRCyslSCGwsHbUtL};<}@wCQ zE8v!euTv2n%>*9Y@Sl_$9<%Yt5#Kk7XbA>VQ}XP9m>-b<>bJ!L|AMOSm+5@J!G ziKW@kE%esQXy=l?ZD5dSip``VLM>?rQV}LF&FB@~{SftSM+h2=w)R20hj8?}?fe!n zCREP%itD|%I6(jP6(s|SMh=yuJ=evhNcr(M!+yar#;B4TK>C3h#IDj5#H@?>y*zyWhSB^G&~+HSop`Ik5juG4<}M;q)1J2>BGR>> zq(htAHNrlVZl-N}(};!93v28~99xyTSvly}3(5Ucd& zl_-8b(hImP%jXV$dVN{*rHH1e@k;M3o?YTzogGjJa5scnvOA*bfsmar zu1lh@wPDAiIS`t=n~7g#|U*%Jmu2Vz^PqsRVcg5n&X=69i5gov3$C` zeMYy)N0r^;1aiw)Y2`ZVSjaH>mels?Fbe-1c6>lK5Z`fhW4j03Q|@3a_wWSi%SXI< z%ac5=>lPxlrorWs<;$_4mXF&b7GxxZv5TR#le|?~$Q8^gZweIh&79fVv`WlVC60MZ z_7fIcjLvhtSRD0;MMhWzLk>Go+uF_Im>npWGK7Ip&oP2WZm?ho;4FrRY6Q=W5F(|4=fr0RHD%0B~hQ1_0mzzGVc$M!=8*T^ zs-W`OByUa*nav^A&KN2sP_{sP=2a(_d=w)%~yAo~1p@Tg_Vu6~YjJ-+@ zsf+zcGQJs%uqA=a4J6x$CRI_4xPiCN3TntOsLuuUv7NWE>@Y)iQ-;1S3)E~Y9fMIt zd0^Ak%e9}>RQAU`B6WVrWncD#vx|UJTiIV0TRr;sTRw%4X7DcWLy?BZzZ_4hwX@M< zJ=S0*sXPU8S62llBC5NLwB&)>Ah!|8b=!MSvUTvy#}?u=V0L~lew>?W5vSR}b3QF3 zN=nIOgLU6l1XxG{upH+}!?Qh>SaRZ1*|V!Oi}Nbo!}BJEPJ8jf<_7WJjE#pjUJPHsZ7-jY|yFi8zp#nlV%(a;i&vG0N>cno21T7|4JZZtii+L(J zyrD#dVxM#Vho)6BIEi{zz2LNo7|J=3s90%&Xhz%E9>Z!r3M^>;blfW9DzEb@W>uEZ z?4*W4geiiLP^V02i2ZCuXV*=?yggi^dCpWF2iv82+2kDoiq&p{wQhgiT%T8w?8G@kAWjP0k=2S_|&hi+J%1LwAX~% z?LgsgD_CuJ0%8IXbNr=x$5gQ`{O`&ZHGomN@k2F8mKe#nZ5sbv?e^&e!XCc9+|a&( zz0x+01@M=-?+uE8SYpoYPpCyAcxxS!*};38i(m~OlO1{W>or_3yc!2U^8m(P&U^b9 z))z1hNJ;T%=>3T^1wzEyCFX?1v87A zNmZ>V6_GSGTHE9uKh{iau^iUIXZ8|5uKFg0uX z!2~j9DYT{mQe$zl#k_#331eGOuK`*kv`G_TaRsZ5gr#2N)7iuc@CiGc1!AW&BbV`t zVD@alY3(d7K>`?zgI2oh^(27)9B^kbc-OA9Sd3K6WXB8G*&-vo27a~-CN!Wk=79L& znCsc=aWeVBJgjNENNo%_amOTQJ@?2GjN0(wb#t)gFv4Ta@jRa=AU(Sx0z(k5C&;?a z{4Om5_?rJ3z}i#&&2H8bj`3uR>HB*>=9UlX$CXc#-;5JO`Y@?!E}ss*y4?WaGBiRf znpToQHR?t+QS_rkt|f!Jn}G~q@^91;G6l$`iCj+^N*NH*aC_SAXcCgHioj>F`J?FV zSq+Yg(m%HRCAObw4DL%ld$+hm7XX$DkeS~Ro>>js7D{)^N|y5wenQw^{D~$mp(!wG z@O?oZ`_md^1(RnfL=2d14rwE*fG(O@+^qdzEb)XR7K|$6C5n(~+l)4DYfhSj35ujm zHxb6-{Tch3sK1}7L|R$1j62ZHyU!adE|Dvjn4tOIxrnd0Rx+fE(3A66v4=nH>ohJC zCPhU5e#}mq%i3lyRHaU%556*qcwl(!xp*77UZA<1E3n&P;ChG%FYj<)j z^xn5v^Bga(*RM9A>{d6gcP+X0KAY*N)DKQB?OCNZBYtqE%3H#5WCFwCe_qqbG~9j37g)MO$%W)*0vVCO1IcFJe=tbP9FF?i)0_(_36^{Y4jX&%W{ zU)BcN4nr3g&m-Y?UuwSJ&f=-g0eU3PPUd+tGXF}|);G2=?n!448Pcmb{C-Zj;@lzD zG{@6tp{qV@OIWQXm)%Oyu_ku!^HfM2_Aqst_a>k=D9I z{7JHkQx=l>_q@636izyMmu}+vNId5&1X+ns5y$`hJiqh#hRDvNY~r5O3mMY)l|{;~oLry`d#I6*{>UxKNX>yav3 zQ96oZ9iVJem0Jrn*8%D+DUP7r2f<#x;qIQ8?zgu8={V>`EW8`H`oKfqbEX`%1+(A~Z3Tub@d@6xr-5e)mqmnJ?RUc6K6<-gPC zoBqR^)Kg{pdp?^cb|j1E9#du<_i7q?`NU)osML#?e zUF#~s9=+YhKHDvIqiMA+IkB>L@rWDkax}Jx#*su0Y>0N!^!3taZA7d+wrozmsBe2H z-kpE3m2`GP>b%ZYHUg3!u%9z#$tfXw97wC}3xFRh${+p>@cI1-bH}}h7Z15FwI%am zwwz0FKPhR2;l(9nJ>Tfs)Jzg$+3duRAh5^e4qVN*yg(+a|M+w7 zW_hh*!VIXpf`K_sabx|vJ-Rg$uvf6d=4!PgL?e&io-vQ?fjCh}V!(Y(D?r@q^3)hLfVnX{2Td%g2AtIr|MAPKvj-WUgHBH40Mj?0Xi~29K`%~am1%l-yfolx%J&eV!YGwT)!oDqD1R)Gg{ZzuK$~R z;K%df;BZX!&ykg#sb+^X^Mp2-K=K!GFUxEHRhoKA3!C908&08F>7q)BKH)1S`=6Z{ zUwV$EJ4_3;R~e0p(wvA>NY8KEazEI;bG$`Hw=5A3*!UOC*w+XAwj&T)f68NmCrX@s z?R3PNx?1O^snN$hucS{$nRdU&U0@DBK%zo4zRQvf$GcB3qZk==@lW2DZ-jbr2|)bC z^`diWkE-rFWsJYgpsm(rEc^5EbW7jIl?JuTtI#`kuWwW4K#nbsGjm$lUp7U-Y)Cin z-WgC+1f#Xp)l}u>2^0~sI&TH$FHuy0eXC2KmTX95AOZ?t{m*;CT|NWlwBZ(%W7blz ztObp)5gCk%d&}OpqSgJ0!RH0YJxn2=9v4i=A&(mDV~}rlBTQXSMF!m*4Tb<$6(Z$O zauL6J(W^G+cMW}%E+0&y1XkGsV;-*`FJGhGtG=EQ9P~!m@92xv{tNRhj5_Pb{vgqo zawsTHj$TJfBRv>4C!du8Ivo;{AsOoV%dT4GAyMCCiwXRT9d=yPqC+g;sa8_U3Daof zjsG6QHD-rawjnYD7WyOc0DPIgK0 zh+D&1@qlSTE|?~v8r~^kW4hK=rdkI>nG}TAZTYbvY>UyNlA}rX)T*4+dm3fK*5>6l zo}1suNSB@f{>0p+?$g1hGa>!PtqgzltjYgg7sQ{bWMe}*$c|6seMw{?+y0Hn$XRHV zFc#B@VBCe&tZJ;2sXFgF2&=5-Qt<8ukij8_SEDUE@LD55kIC|$FEEX|l~S49Q9*bo z&i0+7-b2oGA3Hb7LwV2|^RabaKVh^-l&sv~KA;74U_Aao!<7q2+|~v*>LaWYHH)L zUe_ccUnzmmPcoKVBcsexGraxsK|=iiC*hMM&cCP+eA|G?8c;p{PY4pmeVn|a1S+Qo z&9(7VgeKh;qL0&^6Uzn?uIE14OpQEeH4Yx5;*$P8ZbgfaoHAY_+(WOG;Legu_0q}7 z!-0b1g99a*A12VwwL+6LGfdVx+~dUg-k#1fNV`%3<$aVO7v%=49F4>(=IO4R)rTC! zLQb&A{`wCJU7x%YPfs^@^z7j3cT80HilrvpIjVY~uyVzr5~H^YD(8!at`@_h;Zb+E zo0sw(ZXz}jno`Sj>z&~z`Q}+|6|iyJh-rFbnS?@jmrZ>=*4jG<*_T zEY}%iNF291HY6RS>CIqS2aX9F6D@BU|03@7imQY?##=F2wt%we#B}J2Fhfnx6@mTa zh9b4e(Q_%iJ_#aJ;o@VMso|kbZY|)dN2J zdsBp!JfYUwVb1zY5m&!f1&tv?A=^$L{a!QyWSaB!8n9d)+u%G8VU+2lG)d`SD+ex# zLY-1?m+O24@Q2|(^jN8-D(eDLd#+cH1y`@>=!KjcLXY>h`2X#s=8(5M=2Cqq!6_L| zUN=ivlV3%=V=$?IE+Q(VtKNe>prZon4;Q+sCyIKZV!@t%Z(yK!7S6OIWjH-yl=R$h zL1-NQZ@6z#wc4jjd#dA>PlU$4=-1^{y9#fFCkrZ)E;FqU$F6}^?!`ZyKW=7tHc~g4 zIFlSNY-gIS`I_#gj`v*Nc5mvzE-&Efx{vS&k*wqAiDmkZuZ|%6m;!6$R4W!E8&u)_P9)~_oe?$Rls~yM9YsvM8Ot$vTahm&fk?smhWue!!4^^XFhB@ip z^DQNYNuYmG&1=M|?_|vFM87~^x`{TvF@Mmm&8ul3Ei3I-5@Fo@f}l*V!7XaM;TBW( zoM7uROiFvDalKZ_0jc9pk11$?RhN~Yj4;`O4cR6i{nsQ1!)93pnlQ~vVH~E?4-cum z0tkyXC?S`ulg_R%*nG6dHC`vg0vA!*S?g zd#{NMDJ9Ck$Rus)Z2W@MgxUL$d59&e%kD68uXAd|I z-*YHqlO%n{&)9ke;FpL)og}PvGOR(=)bI*(f|bukQzFlnK)xFQ>*G}KS0#Ftt2OT| z`NHP;!21lTDa$%&F8a?Ov6m!DIF9OO`~T>5?*P$)+vm$d)Keyi+qkM_G?gsi%&R4a z36jZ6T>q5)sy%&PLWy`^mzVoD8#~95y4btUIbzL!i+IZ#b9nIF8 z%x%^O2S5jV%8PV&JSr99GZ9_o+FeTd$!3G>9)~sF?+o>R#xlITRv`cOMxoY|PX2Y=m z*pzFpxviIlH@Y2G2SVr%-767`UQDSZTev@I1-hp;(AvZCl69d{7p%m!88FtKRGDo9 zM8Oad5%PY}umlmY8wh>UMxU8-ui~g3>I0IOCjJ|hiK1!CrmR1vk}4;?RQqhBq(BKG z1Jwr*d)+J3QSvt1W{KBPnl{DCBn};t0Qdw!uV8CprTKZ_ z7W&bw@lr1#-Olz{=9o342KqAx`d1IUdXpR2 z_p!wKQ?0d6Pa66D06GL580~c{Il3-Psv{hCx(|^Vpzne~;s)uuO*GF9G*yX(Y6Mu7 z#0kjP*sO>y8BEhohIQnm^2fnBRD??Zl#U!x+1g;yVv*rv>#`uJc#}n0ir(m<)UWKJ zc`K$j`Rw0!@RpxZ3m(GS6zYUU3sv7+ zPeixe(QOTruI%SB`;m`tP-iv(?MvRDnwG4;M)SMh>m(b;Sb{#pJEKdHKDBVx`A5Afe!9oqMrq@L)cp6r4St4k|$Y2g3+_R zrw&5u!%eB_caPbI6?{z}9SH8a609m$ZMjK3$2yT8sxM9rb*fb6sBVzpVcow))JmQ8 z2bZ2ihtQg}9fWrruHKa3Uj+vOrw$t1$Im(>#swd*2WyS#tBrc$Q`o`F1G86QLBFsAHERg z9|xRP(EXwSNFYHAsN>~fe%QWol42 zed6YTVLvi;+elD5bxJOAqX=9arG@=myN2E)Pd+{V%e``h?#BRiqfI5i+_d1(joUN@vhc%t87!U%dpQ zM-X<7io^S0J6WGe91VMFz(kBd>9H;(iDz@@CV)h&}OXMMSG5_)(_aR3VEnsI! zJ0lsNNKo=^`m03Ad5*_$+OPJYnK(N|*K4b0T)UmoDV!;Z8+A20=6J>7j6P1p!JaHG z!m^v>kGOn_792g>Q#%||0p9Jvt$BRIfG9J__pm7KjzC&#%>nk^uJ&_OzuzV%l@elQ zpMU?XzjiOSl1jQb2v$nM|FNQPvj&w&qr`(uBZ)T|>2`|k*dMoOnEnq%xe0smWqeNs z;MT!z9Uj7Gp7$K?1xb=+U-^WR@7^T173L(ZLauE4j^E8OEaeeKxCFVj?mrjKeb4S^ z--VMjUzlnJhx*O|q9eg(>0s$I8{K>`bvvjl0#b6ggxX*uciL)&)Y!x8(Jtk3y+tdX z)WF17-1I(}z>qpc!S1f??89FBmjQnF5$Q@KHqIdHw**Dn_|5IOJB{uMPodhmt}vtq z!;WekgIB@2=`_#$lhr?|eQ0T+@fG+h|Z=Tdzoy=$VqxAq|%Um>vFxf!)cdl)7} zc`sZ2Gv6>+w~X&PuD$J|wthI?Q+RhhO$eeOB}# z^Vu5;dTmMuQ0*W{^+>!AnwRo?iB$8&AV}e8!viQHwfeG>kEPJXrT0bJU! zKsRXjo<0g%49`_ycH}G|EZT!}|1k}PxZdSb-MXltx&H;*2PF8z9LPahHv*cYxuPh_ z9H;@5hlM8CLKiHcEkJ>tzwFDVIRh|&8VE)|Aa*Q3vYp>~p6fXS%z%!X$tq zA0#;poWd^v!OUAiGPuLla{|z-1lLc($eTkNltNuZJrMi@KOEU4aQ#2H1IF`v!T-b4 z*F`Caz%LlRJ_!6I$QdFC{3JdC*e?PQNPQv&eB#UhMLo&IDeOGqll^YMf)p%*6r_RC zi@?tgNz=FpMm)Jm~2+1Nelrtw?=fj6-Sss??Ug9_DLZm*B8a`CRc-grybgzT( zI>YL+fpy0KUVQrXtj|ji6&T|CU?SbJn5MfTP-*Xj{dD_>y9bN=fT{9G%Vh{)XfRN^ z#7dZnHJ_U5j)oF2AVq`uM(nTz8Y(FN!3hW;c!maGL}aUo5;WK#vBYZmLx>tlxsNRj zWWeB=3Z^N67aUM50fGux)Nz9nOo2dy5^9m|nZ&4!Y>4UN;H82jN|;55XP!y1%C8C` z<`xW0d8P!$NSLyM4~+aOmn5<*VHzs%N#Tz*ZTyd|I*8GLm}uIepcY>8gaE?G+@fNc zPCB6=9!eqTNVYog;k469c@d(|$Y1~l2Yfs=6az(NE20ltXvu;W?INTJh8Ttzuvd~` zdJ4l{3t=cLT6JqsSq#z{_Mdd(6KSnpvmi#<1BZp_r)YZ}NLlKJ^+DTbp(D+QA~xE< zT@9GcYlsn;XnKpLI@rFC1Dm~(uL@Y z%Pu1UgAHix_?bRYDWr&tQ%J?+c&H!-MeOVq^&uQK(BY4gK}#j&S?F=1siyEHX$uHs zPJx0zI1Pjd4S+_gjW)i7u9|0pP6aeiwXJ~7t9c@60;ow~EENjCuH_39C6Wk(A&#A( z0-$Hccn=I9n8jfsXdos>glMrEEfW6do8g;UvNw)n|H;A$Vw`xmE*)mUKMDRM&+=3H(r`9k0Yn7nkr$4yID;q)XnoQokE+@AkDRfHIz0u?zLhyk>Z1){;{)a4*($qqgXy4^qO14h>5!gWaOmF>>BnTido4k0?D4-yl*2yurP4~c;r z9Y~Ta#0M%xn3eMX>WBegXeU_*iiie&C=?jJ;HY zk)%m3N>BtJz`!S8B;`b?^#K+Y;#v}-0ql6=E-!2h1Hn;FwCZrShcKZ>tDIy7d^Dc^ z6rojhBVdnUSA-2L37OOB5WKiEjpU^RX&6WojRNN`7k#Lfg>%9!(0L1hElHdV@eyH2 zf&pImjbS>_Q#)y}$%n+D78tANJzZ3oLf{}3{$mWo>g6sBm{KU|xI+-Y77skxb0=z) zP!NKEkAfP?o)Fl8K7~>Uq6H#W2;BfM-jjz;KvbfCxWz0$$`)dDf}|4Vg(_CHos3E} Z1*(9jYzjdPQwkU=rV+{lAZZd106V&Waa;fZ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/jxface2.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a959c90f7eb17adc455982b040244fd583eed888 GIT binary patch literal 40706 zcmW)ncRUr2_y6y{mwR!!cE-K-cFk<}+T+T#ciE#TBFV^Iwz5M>W=7Gq%Bt?QvWg@m z6;jcgB9!L+eZIf*IDeh?QIMUgJc1z$R8ZQ|Kfb_r_e{Z9w5lq*XQcc z9jVL6+Z7d@0e-Xx^soxJ!g&+_IKmeR_|x)cG)v5|>2%*>(b9OMU6b@q|En{{Mc>Fd zmAqBv=v4OHAng6n6B89pNx4*7QZPUF^6&SRMFNih3@mB5qAAnw?U?%>hx72^!5P}kmX;QMmWJ{1@n2Fw;g#Vtu4MMN(f#!H zXB|_tz)fkBO&l>)6C=DtUUmnTxRQsRw8{4rwUKskKS!E-V3Yyezf=Q#gm%1l#kzM{%aVio9lmP6|zV{ z1>aIGIoEb=%4a$p@b5!lSs=M}SM$_elk9Q7Pd`3|-f`NRs_Yo;XG}(LcK#b)n`mro zc=hFtX1?5;H*e0de0q9%6fTQ6HAO7|U>CR{?Y22qj_J`i2Al)bFf* z%b&fIpP%>d!Fx0s&A40oHE-%GXT_*Sd2V;IxFfr8y!=A<*=c$|4u|{jZRFn({oDOu z#lT}ad9r9O{_DX;*uC7&U-eFzj_4dp{K1_Vu`H_*4oEL+fHy*QC6WZWL|i`n(4p{rUnS@N2ks{X2mo*ZYX7H%|I-8j!2$f`lCWd0 zvV0`lMg5P?;n>>$E)UW-3x-P+LCQwaoA`QjV=E)8jn#r|i*#|G^Zs^wa2wvPaGw1i zRzZ`c|2z}bx~8PnFkb`9*h_IWC$h}5OD{c%@NR2JY+qGNn#aMVyArt$KLv>b&D^dC z3vE&?F;Kv^JG`a$R>JLKw!=nNx#hDQ&gj%jE?s+kXuubtR5(7Hy|`URc$!jY>Ab7MVNQ;8V&Gr&(FwV2RfwG{=fYoxhVN(QR05?( z?8A)q?$mD3!vWocD)5;OTjRS1;l}^2=+6ob{5j;a?pn!wg?HWzd!kWI6kJFR=CQJ( z{M;$N8pRux08KXfxhmodidzj3OFXzwrZ)?@JECT}KAut+&;2y(tZudegrgVgZV{Zf z>lQU~)i->v!UBS5Tn=TxsmuT7wM#6e&>kK{CsS%|;A`~*`b95+4NH_YZ^MTZc18)e zi9Pdro)uzofLn3h7ZOJCL2Q_!gH?ik#C7Du_n&U1{A-yr&sJ#NtjpJ5Zmx}-yY|VO zE)|MxkVJGi`dT%VTusmDbgzcbBp5oP(r64{F|QVWef%Q&>E}*h6I=nXsecH5%kzg^-JTi#qgd&_tt%giqOt#R5{gEGDy*K*`I}~d zM3FT!<=1Zsy}t_GF*E2?@%s>y_W>hfmu9U3bj|ijqU777R4(R{-Em*3NbUz?QvAA( zMg|#Nd0SfvtCkKPDmPDzdtFCc-kyn$O;+#1i`^qC+)ikOZ%qeB!v_#+2Jqj{Pn%ki z=_mbA1535K7FvKRPn03}*DM`VJ{XhqW2eVaT|8s*G|2)zfL41(l!yj+mr5gW>0`>^ z@!a#~_4siakxLdv-$&cytqZ}!2r#q}%2w<>O9)sBM4>DwJo-3!X~A)b@)4@)ZtN-G zA0Xh5Vh>Lu@GOXb2=-TT81LSSnpwg=;#?=Nd6b-dxwT)wT&@*izufVJ6a|U≶_= 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/neweditor-tab-bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8f398b0958cdc5136a23b9745becc23a833aa325 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^96&72!3HGF`uUCmDVAa<&kznEsNqQI0P;BtJR*x3 z7^L@rFypT63w8qqANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/tface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000000000000000000000000000000000000..1354f54b961211fb0253ccbd27a81da5dab5a639 GIT binary patch literal 19805 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
    Q#B)e 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℞!!p z_Z1>dsi7dm6Rd{4R3F7@(Wp*~*7M%cCmAFpAdRZ8|cn2lHIr8j56i z%K)ZY6+DhNq`--`BsL{-(F>4&%-T{!_T{b4n&w8o3C~jE$Sebx8PRhuwMl~ipk-`S z99sSZ^zJ(RtB(4W1@q0f-S`4@GeVMEOTV85ZryNPz$tsTi$m!-_y`D@S&TQBUT8Q9 zH&mkKg3`Uy;PTCOyD8Xv={rnC;fvX7WGhiq-eCR#=}94HDyxqEKzr5CJ9&)y zLxRr)6c0ArHV(P%hDckX-Ko?2%~Zgpf~qm!S_%NmlX)3vshcS9N#)#Esp~01RF4UM zQ0Zr&J8S{dpUm(F$L3PE5Z}|Vb(IaZ_oz((k|~D&EZ-AavFB~y?o(<&Dk0gN!5WC+ zJ&3^QVz2kngiXrR_Gj=0kU`sG^^YHaf#B9Sh~!Qc9D)p3qwt%-)Z@a1Hf#dYbgil8 zjP)7h=J>pO)5v#9`yrgaqaI$SDDU&(#7xA2FU#g^J?m1^W&%4q&!B_t)&c%&*acxZ znQ^NiWckfKR3>2`#s9u=*5D+6qoI_=PX)SkdDo#1!@;xmY*bbWd6gR11)>s^z^)(E zA`CrpxiUcgiUrKbWv2tO28q_??3I2CXckBT%uJcPw<-GHQX)21tg!iOavoLEd606_Ofipbt6-WyxN= z6NxT_GQ=9%2h^>6vR>SOIndyn8Znoz$zTvHYO5cMyS}-FRsO)fNMbl8 zGJyVqonxDb(~iUpHFkxYv!#R-_UQQ2eB!yESs4@}V;6NF2>T!*NyTBn(YY$hu?%fc z^pmpBjZ`J8N-Ej&s(4Q-5WKp&A&dgAV&z$~VK4C;8!PslR-l#Rh&vMqCm}LHOEm*w zRnu7=95+c_gI;Cr03l!eOFd5^u3DR$QE{tEe94{-%V41=)j+b69IBip2Uhj{JWiEJ zSdsq_Yk=F;O2OIK+h;8o+l-S-ia2XOvQk`2zbOL zmjdV@H5{wGlc*g?RKPFjsD*>3h2D3tYWRQ(Nm6R(E8r9j^}IM{oA+H8G3@PI zNaO^<{Dm-u8rdp_Ic&QIDbYu@kvI@9D4eAZgT%gU;#YlKq{O$fh73-&1RO(!fOwG* z$q%JAQ4V7%sA~{fwin?d#3zc8uWIqD)~|ArkU~?bN(ku}U7Wd}D0_poTkil(-wzRz zx9G4BB@Ydy_)ki`8I%z|W9!n&`Nkr(PA9i2;9K;JI0!!#_`py~iq_$$oa7%7ZObll zq7(>`LT~GS+^Uo5ZK#p_sKa8+p_6z{pkw`&$6Pc41E9MnfG{QDoguYwE@qgI3(ct{ zeg+FE_Vs}M4k-C)GWx@ffAp60UD_v^l4EVoB)|A_kOM!xouqGB4-?{OD8w<4h-Dm4 z>8c`ABDOxrBq?T3l`tBqe5!;6``~e0v-tVt^r1-|B1inhSoILT!@-NILneSz6fEK> zp~`|P(!m{(wOKJ2fl7A5MS=uK1!guLIkeQHux#2J+;bodQ8nGgAsdLY59 zcDE9V?>^}>#bQ6ZMPr|Qef_3Og+rbsxJ2=+PvZ54v7>kY7o6h5SbepLP;FLPLqy8bk)G1@L?n_1vSGgz9A^zU}6K52X{ zMHjpd9(3K2@x39Ig~{Wi!_<*hY=ho2zK#OIAP_!tnC%)lONhKE9f#%%mYA+7+91Stc*!8juo5D1}u zD<8Q4$UFx5pD=1N1L>eZ462b&d+_(Qh*kzNK>^@d@B{{u!-A8p#|AURcUIo{t<~RL zV7tJ9Ca^hziEU+IKb^W?D#X6f(=4FBLfvjo8A#EO5u%*GufX{7HwQv^Jow+6XNXS& zs2Bx&%`3v|-LPR0o5w(gDv|JMWPI(L0m-!SDq_<5kDs35R|z+<8{XWO10*G~^8TIo zINTNm;5HAjgpKdNo-9-RH)rFf0R^x{Ybpmm`J6`nLE;J&F!sDz1Wt({ucEj!unBhL zz(pt)pr8D7hj;q3t;5GOC*(=>CmDm>pN2gFe6~FRxTwFZAS0gk=lPRYi%uf~8Cdmi z;uZ+rDg+V~7|}e$hDE6NPY?y#JLXVffq2^XH0Fc?F4GyXrim^PT#pvaazB{qOj)Oq zzt!z|N~9^+91Q(uA->=)2DT_j&&8MoGWyT(qQW!NxJtAONSsxW9E3yWV&jN7;^}Qb zv^M;U7}m5Oj%FCA#t~oh(Um!{_7A9!5c0JUy+{G`S1&-aS1RW)}XEV{qY0v=xGC)>ufzlx@G-6p=OrK0uU|?avnfn1C&R|b|&4P7Z6?l=1hzN zv^Hnd{#nq<^JY8v$93H4`#PbYhx7=P^#{DYb2p8ala#T~hAVfu zitZo#GWqW^ULOH&aDP`jGTp@o$9ArloY?U1Gu7>wy_P|4U*az>wl%+WP2#oSs?nQ) zw3U}lKIiUA@s0?M^mDee3aEe1AIv`#b&s*#aw#=zX~$~rqiCB8fBh6_m2CO0jMh7c zolnBNhTN!|rfvnx++e2Vv$u74>7iLHRdFe4OXoQUzsr;p*=3uzrKI@FYl-j`F95am=3eZqKmx~1>O*Zm|X^^Sv5dq#s#@rHiTeG<@iKD z`D%_UsRPCdAwaF+*yV8!4KVMx>nNN{Ygsda&vv--`zrrX-9m!0%(#&8NRG>U;@yQ! zcz34EW=v3BVk2znhu07Tpzz{#C&X)O(pw&d@1-mRBTfsN^|ID#gfvh8#fs80od5XRUWVhw7=3X zd{TQ?L*duFbTAn_-9>kOKZrlGj*$Pg3Z+Ot5_Mz zxxd6D=xOAY30i&h(UE4y*njTBoJ8rb@(g_Yd5hga?V5` z0-pJ+QP8u~TNV>*KKqxuXf?=xa$^JRE1*)bD^~`=V7@b`LR)_FjBj!GikyG4d+l}? z=JZ*eD95`tC|}ti1dNxP;swxMU}0Noli{#aiwtG>>+Sr{f5$dr!z+(@gI{0sUeA{< zk~18f6QlDoaHFPgU**5}soHO7VI*j=wTPs&R%1|ad5A>E28b)rKpox=3HVe}q z#*`OnZ8Sh(7@JzR$gktN1j+pVqNj-d@c033=znVw7Ly>`j>Y};V-Szc79o>`5$Hd~ zCh_#Kf{|`(<4JE@gqV#-wex`s5Xz!Z#;*F_R4kW3nUkPAm@Xv-``N~(^I<>i7TPz1 z#YADsEE4%k4*Q|0T$GTC{LMms%My`4snU$g^WjcLAQ|AKARBpQt|MhQLy!aeDJZc3 zye;N1IK*Ro3CwR8Z&)ZJzgBiRA!l%|g-k0fi29PuDPA(-jN{F4c1`UjWfz7cU-tqN zZR*N(mqpf*fZU^g5}nYGz`3RG3cV_++_?Iq#kvkru;T?;=sS^hY-6}Q<7sTDHp^)f`^2Ls9#+dF=ZfRnl;Sh24n5%NDGwJm~l+A<|_?DBq%|_{L|QODvvH zYO;q~cTW-=y&isdNNZ)U4r?rTZIj}W44BKtwkR*FV+*C1MJBsP5LxD|9cl4gEY*aouYh z^%wnW4d#$DN_1h^!G@Qb(4PSuFgc4|*?-W;E$G-9)9lA+)>?<7SB}lDM0=MCBaXp4@Rr9+@u_#37bXBP_~=M?H>Z>zTk-v`yE1g@C>N zdkVthmojqOnuCCgeW&?(3Ct}(yDCvoj*BX%l}NpH?-oW#re1Q3rS%LLUPL1c7S{)B z$VG+Ou4ulbWLiJbB1&}a*L{kqBULUx;exBpDK1!Hi*(5nMutDT={U(m5l6#e<`j*J z3+(hiDMTG(ysTNLea^_>VI*3OA7QZATFkWC!x`p1m~GXs#ZiNK0Z^%-yuw_q!DsdK zIKGRkDKNq>wq>lLIjRT=$oDs2#;{C}X>bAdW3ZF$T~yMcwXt8e(44T+Q?mBa3|+Xf zo%Jo1O!BHgSV`NYUiX*k807A6k)`eIH{2^R){SVkihTLZ%!+3WS zV38!yc;)^E6z|Ly+cEvU&#}v&2)a<7I9R|F)*Ce$#JF(M4iHYWT>iYLzXA~V?G5T&4Oeix5{It*SDV?59~1!4 zigrwq625odom*$5$B2J_v`)H=k*uJ?HhFNi=+2 z{oSYJ;=X%Vrt0T@Sq(d_=Kl4scdg;{;3TtgzF)c&=|QpBi#k$moK7X4v2!Ha@FTE^ zx(`1JA!FXfDpyA#KNBl?8_^QMyfJM)qMxv)=Q*c+Ldrr{-;DGG{zG_@92mfe6aV2qYy$)m+D>}e3g_Jrg%i2ETL`%IY@Wvv+lbG=XTE{Y#mlsN1QP8 z2+k+n4*E~FrC;<;m$`kbyT<%M?Cie|Xx&w2B!Jw}4WK=N9!wZy{k0IlR$(7}ADp{# z=H{wDpN`Dt?hI5;#J%_f_-M9$O9j%MDKI}^xd27b0VGg=M4BsMB1-8`g>2Cb5*OlU znh!_zLY^Z?p0X@6kcw?0#Yzq^a-=lnMceE$%pj#eKO;$5Mq%#AXk@!$w;MucP_NYN zEo9D;+S%>rDa+raz|64V&a=YZZ zh0-q1avGP;yuyN+oGr;Nw^%ye#h)pW=XY?nNLEcE=RlHl9k4`j^-mx0_)W#;8H2!% zb6g%)G20f-6%zD2CaIFH|aIZYN3^G_<3R zw6u3Szq53eBz#SHh3B%8C7q3xZ4|3EMfezD%lE2ftbi4ljv55Q>;xsDm;DUR=;v9$ z1{CNttemgDkm%=c(`#&}y{c3~aVO9gYLxg9AwwJqja05m#~iaOy?L}eD_Jo=%NkEN zPD__=c1DVus@Ij1s>cAt@$!rrx!Jp$xK`Ox$xX0#`s5D52?qb;CE~E?doa zSD?!0ugidCG@5$#^KwCyUQ`)<0xb{;Ir?j)~Nq9T~3 z*CB}kwj|;*IYn2pDY<$9HfC%@{_Xg@j@X!U$uZ}%ZvPD+24RR>x90DLnm_o+VYduW zlhR%@7$p@Inr`{(wHL2k4P}+4_8a`>N%X{EmmHa|^XVdJehFon3b-MJItN=kFtJokVN}O6==o>FEcPr!_|yX%w2}Gna!2v@?@CD|*qMuz)K%ph)5Kv*}!c63HGb z=I%Sk{f@#q%PHk|k4_dZESIf!JIAF+`S;`n09wJo2Jp(ZQng1JtnC76{H430pU$t? zRMsDlzQU6GMakv_!dLimO`o2dBZ*r&g19mXYh5n2>#g|90#~$Y&gHsNL#+WzjL4lV z4&xp2XFA$1h+pP{Og1BR00?-vLs9xJOZwp)*K>7^4%M4b$r%!}my)pZIy-I8;la{5 z&c(qcyS8SRq-%#R^@c_wOTrqFr$1qXXSeUV-AD9af}ZymZgV3hM2!h)#N>|LI$RLk zhjmEfo$N`kIm*Lq7V;cH%q7>Ihh6W-zYjVD+Z`&rrz|hC)S^~k?;miNr}Nl(6p8I4 zL_ySjEC@Uj;~XVRk|ESqfqZFW*}s#xrwos5+$prOBx3r`-&zD*i%Qm_P&`S9r0hVe zMUOV&R2(K~MiS9E7k?5P?tCyqi3wL=@>tit@z{WFbQ*% zNbEaH-?8T9hk7_tO0Dxz(Y+==0fA1x@y;iSDl`>B89Tq^7fZf*g&Yf=&}wg*^1uf#w?gIy;Q_c`l*u>B;JK;z`L`=LLWH< zMn(#fu3jlw(MVdTpcFczd1}eE6>uvFg??GabY5}p_oGMZ2<&UGP?l7Czy11(f6tvu zHf|*TdE;fplAgLQe^}ye(EE5fcIEB;L@Q_X6BL346$=1_r?&sjNtlkfa_@d({}aY4 z3B`1lh2lX-*2v0O9rB6;;=?(~<2!xkZ95%UutI^%m;uvXm;dQP5 zp*l*P%k|ez#MBQAkp;KrIoRw-a^5l4_Is4xSr+AtO3N=fN~ladbiuh?YNbf=ZXR=O zmiO;0^*CH!AAJtji)C4-x|E^>Bho@vNq4$5UW^L?QE4B?<}{=Rt^tB(cSwUb?1%?Z z7hhb?R$j2|Eh`*>1(l+_8^&##kx3M{rTI>aXDljN6vy%k%g(a-e@1zpFN2;*>8z4; z9nl7huvj+ww-9N{FQzogqv&b89jloGWlJWiFR5-<@(=_pEKi*_zf_d41Exp#ueKXZ z%@7Q=!FJ9Q&W-Y|oonI-Fu{U$Po}|*z1t(y+c&qMuDY(t!@`IVqHk<(+%iBw!iQoJ ztBLe6^RfsnVpY0i>GVXi@cttmYFiQNQhH$T;(ITrxA*Pck)1A$U=RnCR}R#bJ}57> zbgp?+j!Nr=EuJQh0;Z$pp2stURe!1}!b_#Us?n|gYv^43ncn|6{@r&MV`FodTO(#z zp+3ep}JP$Doqb} z$6WW?S6iDt*co3Z29t>Sm&F1r(ue9^fmIiOx4ZaGFCu9UuIknPjly^$(pe67_X=Vs z_6_uYa3y}2(~r~b;u~-f9$1WNq<8~XtTGUDNv}2xP7dDtP@xZ3_aI)xPHpJoZpjmFchF&A&6tpN-4xuay{(V%z-}Z@v3)J?_9)uMc;;#Jjte z3Rg15c20GgE`I3+S9vy4&T0VVSTDBXUDvT7nb_v?e;;TG) zcmfR2F}4KY<+?1AlW^4Ze<^ZcviUQ3XH^Ot3^OkAZnB=}JD>O-ly2m%)P#}t_~_(~>=s`E$I zU;Z=v%HHZu_+IU)1SuS+DNw!4VigEjPj;`5-2KCIT-@ESt&tdAX-;M^ZrstpgCj~l zXC0rnH|K{Vhl2ldct#-bQBV1zM2a|uF4e&q`Kv`gJ(pSnQn$2x-9q;uHEMT8{?)ex z8#%%ltL?KCBuWOqgG5xwH7XB*Q=sg8bN^+Zwv-ik0iqr3eBU&2stmEW^K=Y^I-!Ak zs1Rt##{T3kG9DHrw(xaSG5(TrQ}zwAYq@u^4sJrnl0H9>3$ArXJ4icgUzGN$1wJ$q_u|kD+P-Ru{z!{h;+zBv*5F(W4G#V zi}3HzYa!894OrfxvzCOqF?vg(EgO-*JJb<5HVCcoHwD188f^ahTtMNTZ|sgb_6-VKIeD=AxLW`= zWp(JI00^rq@;x$cSQOD#ej95T+PeG8fi=IK694?g{p>=Y&WWROhTr5|en*Abk1=;r zPaBqsVu3eq$c80<%7?rWi`be z0{tl}^~JT+C-vL@IbCL(Ydqfew635*AI%$??D5^nukE(UoNs!#rJ&?Eym3-JUKFCv zt0c_`cToG<@(!OgO&SPsb7I%pz3#hs(bRR&XKqCEx^WkxdH9UoJWQ+a*fUuL!CXYYU2!y72;CrMz{DWNb(2tW`{Epp#j-Y;Jnl> zWf^_ush{ttNmDBIOu;gizrFknb~S-q+K(i3pF#P|?PxZ2`f8C@N6wHl3dvP9x%I*- z&b3*q11;hA>CrC&m`{xrVcPNm zaQh`y(>ZRHcT;(4x@y)cxCPM=*3DCB7=H1pEf-}~_`mN_y+ue?*jLe*t`56Ad`>1X z@IKkJL@C3#S+}l#Oy8e|Xl=UQPMjaX*p9Sm#vsW$M*uYj4@Jyb-7@o8piZW3IOAiSuSJ>Cx;O$WY)b;VbKGZli`Qt$ zhZ5QYi|_!qmK<7%nL2L0)`vRlyX495zSf%JeaQ&a!A=}K(EBa!bqV1LrLAlNOE z&v9a|Iv>F&7CH)1vta}0y0Qyg4Jk-r*#9Woiwu#%8YamhD%sG|;iX5N?@Z(8BEs3h z24j7wdlW*RB?@5QrlAat$(A(P=QbMEQx4b#houlKMU93AcDs#dOPr!+u!fnGuI!2SvS$Jh-#U5y+7$npY5HG*Q<9j^-qmG z4tKr8D_5Fd+rt%r-;(Q}SZewYo+Hw8l3{IcZv@i%mpMD@rPNEH1V`fz`|-ZO*X|jS z8&hyzB-xdLPnwoeMCyevyR80B4L96kJ|~3r4e0#>gh9JWABrsd&1pH|_Vr3a9!afq zahE%Ay8z_8Ov6tlCGh|Lmx;}kpv;>=y`wdRj0j)-D>cqipJR6SX_9o&VNFY1)HN7?MA=Ul(0@^5Pn>YLQI#?Yz zjL9nS&?ZKCTba5g=9T+glJNJ2F4AaUeJrJmnU-VP8YyCMPrp6r#A7beBTf}1(i*s} zVgMbfUvjvk!Dgl<8kGi1>&F318lD~QGI}zd*1Z0_^R|8IW7V^?i$3RLH~zdZR;x0w zJV6prlRe-dS|Wgy4y>+P*m1F>p1Na2=ubYBCdF;zhgOiQ21yFv1qcNa8J81cgN?s)bS^(oTW=pMG+E${Z^kPK+bKG9 zEL?n$C^Oi;EKIYyI)wBv*P7<22>=dWz;-nuiJ)Y%fK|H-6kSn{a% zHR0ysLgH9kv_1Z?&3%YLF1{0!U3>&!4YJn!ZYLyvud{wj;_ZAjQxIC-VED`6B_}_= z?$U6B)slak_hUQc#|J-RZXVYu7|~1m`&)zVdkYug3t#jxO-{qFhaO!nR)*t$__(X% z9SKglxo@}q_XfX3Di0=`@^itDp-_<)HibG!7a-FVzCCK0MrSVdl_Bjj&UJ-k=_$1_oz6nJ zS}3s#QoWCfBPY!w?PkTU`GjSeSwg?PnJTi+Jah)|9^~&hkXAtG$SOQs!#$qzQvj8A z9kst>jnzetfKZ>}renf|lJCPr{PHSx#;noL<4>(x0zF(!xVFhx2kzt<=x&fRtY;NZ zrS}f$>QEK4(RHA6s5*x&vky+Hx_!QA|3TM|HTuiXirg!fSA|+|k#k&OjcSK;!&rdL zSL{RcXGE)G77E(~ir4mwo7R>UBqnTcRboZTQ^mh&_X-IygUcgd-^T>EDYbX((^brn+;|{pc5UsBS4ID569uTiVbyQ+I-C!@ww3v4L`5p@>&YMJ z8xbH`G3G%rCT0Q77LPT^?*f3T(8-O986!R zQC=UN0dAz~IP|N?tVrbu!*6FBZ*fts76SKxy4&W6E1Qs;U zSd+o)TPr}@wzD$W41yfCpo@0oO-=}HCu$@R{6{)lkq1{ZNWp4oO_he57 zq+6p%`d)*RymIRhKAT55(X^K!1hg3_7HG;YSYxX+973AbMC$wTfg#m>Q@|q)?e|rN ztT}1)k?%jjG^0Z$)_i9XfZ-&2QD;NkYr@og>;6}`O$uccV}3r)U(Sg5T3x5UfGk!{ zz7^S;z?|P77WrME*Tns?>OqSM{B6G9dIcJg;%bQR?6;hkMm}(RQxldE!0@u`v@Ycq zF-^CTPqLbf1{u)@wM^7UAouMpKb-v*o3zrG(qUCd2ZT=LYpgq9qi*hXzmw!{a*^nr zR2GY%FsS$oE}}lXnV=^!WYypA_H4pBN`$ss9^$_N-4-L*5{4ZIzsI1EJNtV{yQGQp z5Z%Z?bPoho2AH)6_~yL7McdlSA}@qDkDOQNR;n~9kSmXw1SVwHKFHp5;j$F^R43bf z2xa^I?a}{{9mkpe%M4KvrOo0zvKx#)*l)QkAczD>wGR;`T*(c{cgKU7OSM|Y8I;N= z_-M6pa}y21WsG9IAVhR5W$pr!#SH6!t%3N0-iux=g=6_kWHIGk6k;tT`|r=$&D{Zp zH=2^-0+2-K1HJrW+qhD*IszTCe8Zx`(?y`@0?;+biI|@`kJAros(2i4cx|d4zTjgL zaPrw!3Jp>Y39QnYlw+^HJGLGjkGmRa5X|iqcw6Ezn09+VRJ@a+_a{bAdP@fe5rmy7Bo&UVg zM2s1jzfaqF?O^(y7DdbW_suQYV}Jkq_`9cjU8EEW`?RyE|LeOWu}t~k6`f8uwa;?$ z{lMgzr}=Fuy5q;ko*ZfPu`6yn(K7z@__Mss=CZzt>x#F^zomR#Z?EL^u9)kr-rnAC zNr~rAA1Uq4`e=yyp?jyharsO~)4!(Cl9+|>=AV2G@Ow6Ly6h2K`n>)X9NfP&^h#3v zt^d@+_O|C<%Fmh;-onsZu1IuygrYmilWSLBdvWf{)BCe~x60mq=Ru)^A9}jxKX-n5 zJe_u1JR9F4n=x5#2x$jpl zeR(v}@%)IUOp*HJto-?hUoWN;5C3oOHuF#r z0?+~O!2jz1ZvsH-03FIALM~GZkwn+{9(hfBVN2+rUpI;#)`sl87qVjRGRwv_Iwj$t z10%F1#2i26GIM41S;nn_TPZ(B;vNbLxviJ&4OWydJJ;aRwp2TM#O#~~illWOcF}K= z{M-9Ht^d@eV*%xF7G_CaktVWyI87HPTp?#Lq@L-Elb2R{nVn7fUdMY2zCdce{bB0$ z4ZQUS`PTlVWbXi#LARMNLXaFIwF^A>MT(#XB&r%-182j=o=S(Keg~FejuhTU%cm75 zuA6sP*g0+JpEyur^+I94BBSgEBGH^e<3L`o^$Gktg&CfK3`vEyj{Cjgp=&S4Ds2pl z4q{X#mLXJ-&btd`O3!=IlIa~rms$qVL>>yw!}22wvc7HLr&X`;g@=d|dmS7x{f{?m z8*LR=n+PGc#B|W2lb%|LZW@Rt_&?@>R(ZpQ z2HEaA(-Cn6s~7aVNLhLz@ka-1$7kn{o3|_UN9g;a*YqY< zd3;EymxXwD+onv&9^FSAm$xg5OsADik33h1v27D_h-v9qn;L`=5W7eudoVtDFwCHM z6JdL3Cr%0NTj6_JBCCu>@cRv)(hwdq>QIvq0?tCi6FviHYf8N$x``Ei%MpM5{9@vV zA3^YA!uGz^Yai25abH#RMd62ml_>UkKZw4Cc2x3OJ*QfQT0N@B3wAl8qjUyWK(8t= z?^X<#gC(nKs3WYPTnwdR&i84s#7)*3Shbhg@!=gu5y*T3_~Py2=e|q8*&Ry!;(6+5 z+ZTt9(|*kP2;2%X&pJ7B;s|Z@_SYc#_npi?6rTke^w{Wcqx;FH{J-DMf1>uTvwO1V z`#|7RJ~N!MW5wrrXZ+*HvD@}{yl(rAl^TavjsBZ@>Ra(Qa81lzH72_%r{muf`CmWW z{qL{4+nJ>G}!=okTrkNEszH_I4AJAYnMX15kiZC-0Qf1&g zDfk&Ao|<`epU~AVqO#xhGT+Dnym>u1FhaOrf=@0<>U>#yz@OsIA_aCvqX^iF=Pe(48=#bTgmNqPr_*Slr} zlh2o8_So$Y=kfxZ$@i{(x&ocA;uF#o{%QS{)_bEh`Uj>}H|7}`(R*zXsZzXXVg&R@ zA~gGX9!AG`=RHogdTy}e!HNun9DEhX;(E)SxnhGt#B?XdqOz@j8q6JQx5C!7NS(Wq zcW&8x+VhMUk7HdaYpe!+88^Ot&Gb;l>fu6Ti%NXldcq0jBd||zdvn&F?ClM&Y3<+pW>OcIGAu+FO!H+&0)@85Sko&Q%eSN+j(XyL2DM29Zt& zz#F}x3HBqXw)8NG!82htas=nrxa;}Z(%t_?X)iu0Lt)PmPSjyb&c1GHf%cdayMfV8>LT`V5X34O zqKkEe^m19DO=e-l#Vy?=M|!DQKN}XuiM9SEmjrca%toRLE%TxYdxpnDo$Bx&O;T83 zzbvs-`vrG#huvBuUOmh-%$v3IRIF|Y>=UP<+XbJ~qqu`{%{HH@1R@+Asv@gDKZYOO zTbdG_sNWO|CCxUX{*>HiY4?Mo8YwA>+K4h}tXSpYm?4)iuUNK*Z!98yNmf=QdK$VeqAk@KX&jJ2^|*QmbJxHp$lI4SWyY za-+ll+M$&VF|Ml<5ovnWfk|^laXFH5jVt3r#<35&x5t?nrE?{OVaT&QxSk6e*{gM`mWm!9FQ@RuN z*pr!a_{sgbDQ3@48wYL*ChnuJad4ZT24*Hz6|1wmKKFFpG37qrwe2>F!pknRE1Rqg z@=HZ6Oz%0&9o2{MhU`d*3p(fDa^BHW86)gFG)>mm(&a<%7b2DyQb)Ic*Dy?h?p@o< zDvPd^Cg{@08K%7iN+r`d)eb^Awzb&VXV!LY%cEB?{`KV%(B*RvkvL`jAa_E zQ3l5(#`(;AL12*hvKJ0*5i-~|7m-N;Z4r1y;I|g%4{kdExp$p6d*e*_M#>m+y&_rn zTiddau!mxm)eP9I-F;ts{($udHalRTMa)HNOB12@?NT}S-`!vQZ-7^zrZFMoK~H!A zd+T9QMTCVjAxm?iJ4gK=y$YrR1$VpgZQ+Cin*B@bVRtl`-=lljhw*q>&>wOLoDVs` z!R$J`5H*fX7~S)C4S2ma$L5RZy3)zwj z*M-Y+q4Q*c@?(%+$_l;V1-KrjEi$Z;xwFe~AEa^7=AO{|b$;stC4o`ka2-1@T$cYd zw2&@@L{TAY#&S=z7FW0G|EDc}8y&>~GQ8P-Eo8lZHu#(Z=gl(sY-~IQMLd-gC!~6H z1c>{AnNh`iRC$z}G zN6xus%0W{a9E%5nKggb+2K|nR3elRY0B9n|{?W+)h#+Z|9I`NwPzvC9?p*?lb!sez4aouU!?lD;9eZ=1inNY}eZc|qYV-nl?o%8< z?*iei9M;!FN(K&hjNk$^v2J$Wn9BIeHW;@BaF!N?{m40Bgj@Shl-1_xgt zxE`oP4(>=gc+mQR1_uLh>o|l}ER29=?_`TKWJ9NT?!!t{H4EEqikcfnUspq1f#a}7 zB+{fpz_HY;t*(}$om6m04md?eam-QgKsF+a5)tVDxa4`I=}p)R4z^&a5ju>J!m-O_ z0TTZ$cfVQX$zh#rNS1U*boL=A9k!5#xnocf`Yq#gBW#VTnmmZtQtUW1mhb}jTELb? zsnA+Ab{!j{)p%a#VE?6>na-#GRsf5or<}SruVR@60f@&0NU*dP-iUm`_UT><7ioOF zZc zll7MEA}+95+`>U6vB3v6g9BWR?!e*aD3~KRP$%X1LhyMG&9FyS#w|I&O=)cNKB}!z z-`wTEs00ev@!(%M2Yh}Qzh#|4>#zNqXhK$?(kU@(e4xL173(y(sLuqa3$9DNF9&&UV)l zP`#~?N*TDQjo``xxL}LgHb|XR@0bF>$iORFklu29#6`k?Jm*a#AgnFAlCUbKrtG&I zAKQq!r9O|YNeES?U0`9AN7vY*@smENds6t14^WI2dd>&;-N;(ShQ0+5r+JvXwKkQF zdiSKrPKDznm#~Y1yFkJAkufKyK|S&V}_NdX|gk6QhU-tm@5r!Dh2J~z~7CaSuE^HY1+th$gg>;34IH}QR{^= z#7{DQ4}gl_Vo}RM9Nj^9#WEpNa9_4yzT23KXy_;o-js$msk5A-U4VctW%5!tuz);r z%9%unR0{e@fJtfa>m$bz&#)k{^*#MtT{ZS;GK5gpcKMR!bxj*Q8+?G}I#+B^X8TRAt< zIH)?Uw}-U0lw-a@0pBwc?>~re<-pTq;K(Bej%q}R9A^9-6rk~`lv#Xx2=pH}h}P)Oz#OffyvJ8iTTiN1n%&8bRzLz@*9SR8T6wG3dx_*kFq`9B*RnMgt%5#7x=Qt| zVMs3p?mtTOCQcUgn1L67TlT#E{x(3zZux1#^CwuXj-@aCg7#pO=}MJEg8K@rdNEM5OoCoL6y3GcMP{0 zgW%Kz#b7OcJTA(C90~#f;H@`OYjvqsLL(?_aRnjNTpD%Sj!w3C>ER+$xS)7QSfAoT!GKVoMR-d{c z1EZs`U$!8M=_VQ$hGP5pMV151Bl?JNeZo*^e_ zFyUWbiRw_G1s$wqVIAy3uN_vN@E-n)=Ga5Vv5 zJPb-yV@!CsaT!w8>UA?y&zplf#sL+vH^n`7d!YsYdJEMzF`b`2V$H%bDQNuy!gZR0DRmBGdx};<=c?dxK1*B`33@;0>u!ndC3hYG_gO1;fJ(2zb-)@9z^musAxGR zVk5y(@hw%9&$_qAO%rtrpjJL!%fgQ3 z0cm9H{wL_e_dcxUz_n_`MU2%VI5bmTb!Mk+^)Ollpq|S=WO(8)dSV}5(v$zi4<9+G zQYYN6cFE*yW&xmuQe2e!%f$jTUE21EgFU>2uufxjS&3S}0{Xr0zG#Bilkv;g$o*I0 zbOJO=irYuS!rLG>hoR0CoYWoDCwCsw|0L&3?ze(waL~_b=r-vmI31oD>=1LDM3a+p z2%o-jCh5Qg9ng!Sp|{fD_m&ejPCYXXzssWNRh~wi2efqg=ePnyKptUQFSd%m{i4~Y zR@vvf@4kF~v*FrCf_G7J2-9>}1`#i9E@ejl_=EX|C2}0&*w2FS{$6n6aXu08` zXUO<723C#4Rb==vX_hkYTLmDHrR`Ut)yZ5$x%V9ahyIR zNxfqefZRT9{8DoMsg3c85-6w8IQs`KLW>$2fH-juW0b(5b->Vqm=}uiN?s|i5t8-v zdZ)%FQ4S;%NI7gblCQ<5AA|$FX7EwVUn;NJhlKw)rnXxtzXTx4!+DevLfMLF1YkFV zdz$cWgFCQGVrJns;AI!$9xX-$$slby8nRTj&0w{e=k-4Hw4Q*VX`~>mHJ{J1ay@A0 z{5h~_4&pIKd)dVUzXi%tBfX{mlly&v>B$loV$-jg`D3hMMxiV8!fIGbJHniOHQM0W z<+wA(M>P3&#M0piZpZ|!`8ueid`Zl`Pi8OD!tK_yH2kQ2}?U8Rd7G6F>C z8X)X^vAxKXVLfyih#$RX&b8f@S0^_LO(0KFS`8+`zNI|4>i%?acs4YNUdDIlx(_s6 zO0iy4)-tr}*axdj8Vdkt({(=mSBGMwhM$ygR=DM9IPlZO3Le)o0N7qW__`;CBiy z>b5ByH{U?6J8?xtV&0$3SpK2d=|k)_JoR4XS8Maod6)Yi9lv~pa5cr~1D2|$vntWm zr4C2_kU7b?5+uK|V(WT}vg6cxiECRb+9ec<-sU%Lt{*DXkFcu<^;zn0EZCqdDwqE) z+|l$k(>TwyvG5dQU@#e<*HHD%ntGtEc7=BbFS&xD0S+vU%cP?(tn~D*5u4rPGbka_J8uJR4Jp%iSLgAF|lE`~9Jq4^aCDOQ`I#$m^Y`vmt3 z7Gl(0i5*&Ac}7Z9is=%=xV!@kek~PABXY@5SBhIEe^bE5bd}+n6Vy<{@{?Z>r3wb}a+7W|wlE#pO>vC)HUxH)G!% zfjLKX7N0sD@dn5FTx)!-HDR77u%57bAbL3ymb@NstoE8R`=uXB;1sOv;RH2>)$z7y zg+SJMhrWl!0VaED5y@m9xCs2Z;POp5%Crb{X^&>?Ui4?QFx&Xq&Ou9~)Z>TZ7db0MXTFDn$k2?gM2h;J8rR~z`}u$2DJ;zqrA_7Sj4U1V=6h$HH`%_>+NgPma>`r@~(>RE#rmPA=60^$t zwk%G~F0YtKG|d|1qYrQ|Jwic3{`=HTkwqgD7-eRi()E`w-@JVPGMg0C+U^{xStVHl zuG{>Zw{8AH=_2jRh?brd{Kd*Q5ejDE)55IWvq1@;*S%_cRqkmtE60b$jhrGk!$?Ww zQnsIvb^N$N&@T$w$uGltS8Io*LPoIivju*_4z8@0Z~7v$LBL!4EjLOxgeD{zf+&^9 z+$c=sWiVFNBsA|%Yzi+PHu$ZrEbftkFPydAdC@LCXehBTIbjr+ctbzYrJZ$!5Cq*rE)>^|0DG1&Ty23I6XQ13xD6%DKtIwvL+h2lIn6v>>-o#-T{*sr;-P zu*9`nF?wBn0F8SfRgh&HX)!O>9)Cv2^Zzz2axT<|(+B9JWVv$X zkI`FWWf6;3wF(=Tx?nQA*n8ofR;J(5ja;LduP@4GE4nGYPx%q`u7H5j3#p8)g1;Hq zTe4w21?qk^NdG2g1Ga}F_= zI?|@!W#*94RZh{HRX!_i+Pw-IB`>Es`U=Bt>A$X&gwC{MAFyv>ZTW|mkajse)f{wR zR4a%YqT4lTS0fWzk@9|v+u`ARP#5$8-!56W7;R%Dm@Wi(|MSafho7!(u|K#b*_uaE z6~0;^TDmRCkWJ~VoD02|{l^5g{cEj_zP5Pf1OyWh)3bb!Mr6%Xtcee0n5--WO^WX5HQl!1m$!--zgo`TvDAbZbm14> zdYj|b*9&qtGAo?cHK5;`Xx)mrD)&eLiB{Q-8Lj4z^b*Bm8~7khPwtjTnP92=mzHn4 z!@T?P`bY9MVY=V9{C@s;Uorem6LQ0D-PRimq31i1)S) zR{W!s2GRIYth<%zA`dzKJNNGWY~fZKKf3|G`7?wFMQ2=ccOD4&5yux4i`EZ|J|rU( zCx~K!{5YYH zc35WSK+-M|7}VyBSXhAO-px4B*zVSRhS$8Jq{e+YTNQY1wFy#&9XV8yL4jxNEdoct z>=XdZ+qr7_0b7AV`v(sBAUMm~YG@6k2Jlc8!ajdg$iqxJR6#xH{mvX|ZlQN8o(tM*LO; zr%Kq*U9m0hD0oNV0@+D0i+@VP*Yw_nr59OIpFAR59_vwppWg>-AK(2IoWVz$m_y!k zq(?cZZs~QQM~$rVHZVe=%g6GdQTQ~rpDnC$@k{~HD zR@^2}i#BPYmDSygVg2=eo>tRq98C{0kJRedf&+?)WV7Nl=ji!ZXdI=Gx`oe(K<1@G zsp?y(r3V?ZeyR)7c@O_+6O5{ewyzOHQG=|a?u0jrmeX!0AbDSX4B({tz!BRhZy;LV zkS5^=_*X`i8m%%d+9iLmN`BY^fCiQKL#zE6GmjW`vMkLiZdGCCTaer2osQW1FvY5! zbZpSAMdpK$0X1#&_h-){M2`+vu$3WGYh2DN%Yy$Fu?HRvEtkIIoXSnC+|;bknYPRD z6>L}?mg-IV+W<0W_ne|w3_oE7YmadQXN{B0Ap;^1yvDx{j;sm- z&1weF{G#lL6*bb>2OPws<@gfCq9{cD{RiUs!nnkc$Tw5ww zDazs@j$JPss9Wts1!)>fqG-gK?%rKXI?ff1|RWwYb-ys71FmMl1mo-L*hfgMbYCyiN%GK0l~iUc(W_zc(P~# z8M7-vg7}3RX(){z0PF0=ji3IxICzB*;W%89pYR|Z#gB?INJ3-K#&=xsqYcoEIs4Ho zVh8sY52O%6cpN%V1iE9AC$IA&Rf<=-B}mL}Rh9pX9m-62YAG!YQ-_n|pl}V8KEV66 zp~5DjeQT`DWebQpCkPrBrg?92tPvPHAEa&8z|VQQ4s`8TAN1V4&U{$ks>UuubFi@b z;P!O*0lz{M02(JDdNjsdB7i6j{89G_{7QJ*Nq3(#=`6yj%3F^IMOU1T4>;J*AXqd#Uc;kYFX%6S-6}HcnzUkr7npC zQLn!Ep&4Y|+T*Ee5La8X?27Hbouwq8=uiWbP$hntQFNYxUK4xO3xE(c{}Te>hifGy z3Mxp;d*jj)ODMEy=-JM_7DcwJuqgCd2U;De$dJ-yyvB&D-Rtj)7V(Ocri3<4~dJhz(rh__nFkZ0u1-O;|UqG89kr@&*8U$T@WV59j@lB zi@*TFVly&>RMf@_RODBT%fu5R%==ircLXewR9K^Q-t_IHaK!QvPoTI0e-hMcSAxaI zZs~U}-@5mJYiVSk|D)|~pU!6&5hEg>Q&$!wOR^}+#pur)uYx)rD#J=oYk9gP6!&ZO*Gq3my(1U69a9MjV}>3LL+tRFFmsB{J2g~a>%VQTZ!AE$Z{;cBqQz%+GkItdX~?+mi#&HPQBP5BSC z$$5u!1;j!=OHJIlsfy2fx^wC@_>x*+dq4M8OCG|Dm_7j8=CpH<0(6NZS{}G#_x{P< zh-U^IQ8+@J&nYbk++m5I<$2}lUccm|kN-eO@qPDZ#9p)1PcuFstpR!aycQPDfpWLc z;m-U_P=NBsGl@$6e+9cf8_y+ZVNW9sEF^gagggrcpL%U#U)n(f&39@A0!I}*2>4YO zzURyH`ISyJ?mZJL!*}7FwF$CcC#6` zlHU&de^NDw91ZN(?6y@^$Ie#bZMl0VKV*eTApI?~2t?E-#h+el)VX>0G(}cx46ubs{Gkf6R9=KyH{M@sB?N9%F z>@Gr(vYi)$SFr`}pTghhrVZo(SPtYX{uU~#cGvui{#f+*2_m1%nMxC2UVWQ%(w#Z@ zk5^N$-8mTb{73D7P0W=?kNXsUjjb*-y}o&a_$l!a zAKH{y+U;$%DF2ZaBhx2)u!&3Z@7hgc+b=pe)TA%hYLsP&L2YC1_`#$V1%8i@x98<( zAX)31;>fj~)q%Ft9K+3X-#{x1{w&j$Fh!C;kM(yF`@bp7-yoipEEE;vFLx!s>z(#F zzbXh(mwn z`}A;Zf60;s8bS{F`9WAxbN?v8qnVo0Rc5;Sd7_lOLpxG*C|+!r;s0-RZ1Ytb540R- zIB0#?%4hdkov2xqLq_y^7mxAVLi`*Le)&7vgBf{|EM|uP^Ihs=$&d_Ub~L4=`eda? zST4p*+nr`MCwwT|+%OI91t369FJz4~=VhEYv8M*Cpn!Yr4mG`hy<>hL&n0O-cecl_ zEErt2^P6Rwwcj+iJ?`j|PDf+A@{dpaA*e&EjQk35aJ<`wJfn*y0(c#9mU-&=9CK>#%q)-R@75I2N4ZXz1MS zQakmsh;0_*jO&;8VMk==#q*hYBIRw;d9RzPS?L*JPwb1BJHp*RKFa@`9Wj05y=k|6 zPuK1{iMs8k?{h5uEJz=lvTw{D`*!2oS|4k~10|-s_i?59x7|n7VQ;cSzUH~L$S-#D zJF#ZvX1KfF`KS8K@Ao{#bWS!6>Ceyot}R$~XhFc>?OWhZ=$7*#U}HOZISiZMT*+H# znIvm@lX<^+a42BFf_%yzWh>~q6k?y%?Fa5#8dL=xWcY#MhV(H^-7`~{UO1&mS1RVuTA%$^Rj zg!Fs!Ur*_+D#NefRE0t6-EHy_FJr&o3XpKW-nDMXud@jNs=gN4zdvjTvidwa{qHw8 zUAS8(HU`Kr+c(I@{Yb{l{lx&Y5gVP}Q?Od93K&A%|9Rn>g^e=;b2(dxnb#B`hv4uR zCTJVcRjiG4lTkArjkX2DDFb3?y}oMOALV}hP#7YMfQy$g*7sIgFdfnx56my%|6p?BAG(0|^U=-zUXIsw;17ht;baL^}*UrEWj*Z2z zGsN1;xp?R0I^uf*V*$WJua-~q0PSh$N>RjDC2gNUEW)~@=H9ky7O-EJZevx?zDFDR zdPo8QF77<^hND`1je?16Ni1Kvo{e1|Q3Nn#D?rkwy(gfwpIKX!kYzT<{}K~JsM3|& zG9dWh$se3h$8omggD1B6C6ZyleaOA3odyGN07@v?WD7Q&Z3YfJS3de0)o8Jwd&b<` zS%@n;ei47+k)_Z7L>U6O@-r6e7p|-V=Ny-C-v*@6aN88L-zK28}}R$0$Q*;+Z!31 zZpZ)bUKHTSJzf#ef8=4u*x%QKA(*z+1!iwEn14|;P}Q}@5AFZ0y1_4D&mhcii$1yO zw6}86G(go1cgZ4qpw99SNz`G8s;ENO^oqTf*fk$Em!j+`X#j^?s{(s5-l0gXfrxyS4U!DFI z^;M)_KgN3kj&mPm+I5_?$%{?0ZrBpGe}G>2HZzH+lzwG~Y75_QgyU|>p#tKHW6R?i zx1R0e04e&yM;$cG|46pjq$aUV!oMp?47c&rwX;zkVAw7SC?SQ;KFUiZ-jWxJGQC9> zv9->}xSejK{NkWHG|W)~B*?G1!s1Tt{iBL$H?eHYdizMvNm{lzj{=R1uCqk6b}c&b z43iK)YPOG}^t#8AtmM&|n>Yg3=tjObL4fh6iE+8wLgSS4ttVSW;#_Yiet>QiMpY88 zvcRr#JCljlL8BGfMNup}rj{f4->Wi|EKwN;UQ*hU{+3NNE6`f)RZ*(`r<@f_oC8Zaf^D8}$KloJ};Oh!MdGaYl2T$vUpUd?*p-mQOY%w01eRf!;szW57lM z(ABm2;=I;6eJ!us!hkN(5gRlZ5l>+e@JyH?9rj5X2f4ea$IUe6qsz=A1yO+Saq!_0a z$z}_jmwA^ZBItkE#IA^(`gRK3nKtsVw{@X2lK<5sQ;Awq(@KF3i(>v~2ru}l=yy|a z&YZ6{)i>#+DzeLK#{r8Ab0BnBg0{LM5%Y-+caN+rYCO%ba^1zW-pH%kFBB4YKmAc3 zLMXkb(^(qRkzhB^{rDq4N6p+k(MFnVY$S(4+7kJFY%zdJ?HTm0Q1L^&&;rW@p4$KT!E}ElnA`=n ziLS*)prEY+x0&`MY}y7Sm1{Qrc42<7Z4i-)i>{W!MwI z{<*f~GKO!NYOB=e6yGaPPC%1Q~#=Hzm}AAsw`%ois0; z(s>}so-)vs05>XAQ8}u<DU4I-x*mPVTvXzgZ{TA)$hPGkVh;kVtuh) z9LlCzNGxOGWI$*DDX2lQB|(2bI)lA&RFwJiPvDHh6_uJGhLGBM7hqHI9x< z+X>*j3*#Ehzv5T2j3VRwIrzAXWA_k!XPUk$il&?K`;nXQX9q` z#!uR>tLr}U7M!oZNq8&^)MexC+IeR1f{=fOY}{S`+@aNfP?bsKo!r!5Nwf>Ud&-T^wW?Z z7{1ZE4l4zH&ygN~3UJ7{-8oZ090K`sKA6lo7fsN-c@SzQoz%))oX<1EokTk~EK2RM zHEcIlSC5q|(Pd8ZTS|*wIwq81ml;7p$3OAlIcAJlFB6t~WU_7n1hRHX|Bh&Q*LWW?=k43uO>eF#RNh zK5|z9yDSnl&}fcnq)-N?K7$zh8co`Ol`}8a3hkOiwoqE&Yk}<_nk&zV5TA^3W?&~S zG%w=YN|6c8z^;r>&K-ami)Xn)=*p$}#|u5G7$=u)^=TEDlTDH)Xm~>%&yob8Qt3Cr zwU!;=;Oa}wZ7Sl>FsOlMuP*fDwO;{&%z2O}YwcKKC1PT$RRPVOqy$?i2vjA`u<+6; zn*HinBZvkbk;VHTYDH~~k5W{55LCv%=GBYd!qvs*5to9f{HAkYYFRs; z3JQ)7)0^RS^LY=zpp}t~o^M+MbJIZ8sjh?uD!BSP$d=H|Tui;}##XqClztZlmNT^a zMWRQG63#|$Y)jf^<+%+%!^6dkJ^B+!RhG9`TD_k7gve!j=Q8zVT?#a#^+R>fEs!nF zbC|(159Xhr?4oG4dCU1jPplmsC)dxmyU&1@$Dx88} zvJoB>%J4=C`W;+D4qOciQ{kjaTTI4&DV=#W(M|!fm;i$R_Z7LPCu5e5iTxz8^7`g@ z?VG39_kY64f6N%;#9|i6!uj}*tK0BY8-rMtLxvnP&T<88#E`4y0GM0GLej zN~%)eNuR+4fr-s}tU{?b!E{Jb=J&sL)Wq!1S5h@YBq<;Hhd~+8INYK6{!y7t2t0U7 z2fsK}U#BexdzC5&C?k;dMXOhrE9?hRDa)lQ1Q|;dE zDAHB^2wQ4{?lLn}Kt>9^W8b?m`R2`AysL8B6W*fIlY;6$;ak5i&TTj5ZX=-??rh-i zE&3we(4xAWlN*_B{C1Q))Y|==YdzSE#B^Vw3UOlkA3np}lwcp~2QySqdo7pegQ(mz zSc810Z7rGtaf@JD_0Zy#U^fagFyAwHOl7h{8}PfvMCAwXY4&S==OR~y#Gm$SRiN^- zLXy5Q2f+TwWX9JE=m<#Mrx^ z{~4OAY^Tq-!0OJs^~|+scY5G}BKXOV&7lIfr%J~IO3NVuT*LS=%rF!Qu|u}+|20xS z>log>;79r@OAM2mLW9@S&}t?$MOl53H?BXsIUm9g_>P)j+FS;1PB5^|E=KWS5|C*v z^7!0Tw;}bS5Bz7Xx2;8dR*{7d)@j#{FAU!ae(B|On`o1re5EaG=XWbFd@S3p+VkLq zqgcR)tOglu?eUV(@_0(UGPa#W!L>$auLbXRJmWr~%Cdcs@lONU_5Rp#aQ?m?z28+1 zGbZHRSkE!ASJJVfSP<2a*L{Uyc<$P-0+kb4=|I|5R<6PW^gI7(c&XK=niSj}2)aSh zSu5slw;|=GDGSe^Vem_tbeHpa;??x~o14rtE}#tsE~MFpW$${7Jli(vghwyX@I2xF zHFO?+Nv>}gXYVB{A}&CjIdEoa#&Vltj;yo;uFOoyEJtOaxUF!Nd9)xcM`qeOX8k%~ zW@ZbmOv^f;w##T)+3@E-@V@Wo{XFA-?(4d~4{AcWdP>so_n0IT;zf3E%yvHQAMofp z{q%LZM;|xG|7iDKA-m0Z_L=a`+}0fz-A#CpmwfLoT`RtC$>ryZUq5U$=}D%?z2AVF zh8q;+WB~7f1?)VesF{o>{}MZtZVl*GI>f4wu_{yLmcOkyu4EOyio2!LGG6qu^?KGZ zN0#gPEv{8NmYa$l#|o|cxqILHGf7ip#;0@h=isqyMian?n&7JBQa-?z*E-sbzdX8W zv(={eFAG@Mmj2K6j(g{}91~}(KL7gVe34V^H*ORc6}fHA__l+s$DQ_Mq9@|BUc4S& z@h;#^(o*ff*yBut#AO}bWF}Yy^p$e0uXuM@K6|#Q1eMfhKgelB7O7XfV?4NK^2@tp zHJfq!=Y>v|OX!Av^z=)P^1|1m!@qu-bV)8>V!IK1;@^qe2lBE;^6tEGrM-%QT>0rZ zHDER`xqiRcu*`nI`Q=ex_OSvn$N$93#y$I5eN@*6`airiBh9_E2H*KGr2kIb|1jz0 z__lN3fFw(QM%0m2Pg2e+ z^H%zfS1rIFFO&;MeSiA5Y9hrmFXDho-yc`OM78hFf&uIHKfZ62pPQTE?+VCti8Le^ zmp(wKqfr^uga;Smjy}at#CtGb6XFJdUrw3u3Q;WY?O~3DS<}R@r)JjIB)jYrY>GDe zQbW!wgNTj~JB`P!ubD-GR~;xsW-VvMy_InIKyPy&g#Lq!u>F*7YJb+uP~H9zqc!gp z^9L;h^lkEg1wsdL1S;ZM-;RKk()}wkUQAHGJf9+joN?OwWBlW>(-9g-uP~AtZ7(&4 z=xyM=2n8FoXt1YTMiy(V3~Yx~Ge0unUWqJ}n6Pa8K(pi1&?Cp^tqz}vD<-M*KBJH( z?i=!A5)<116v9S;$vOR#6PI>e(zJWEg%sm0vH}!6m4|2OB5QWnf^e+0G&XVg)pyY5 zfa8W98yq%#Nh0@I%uqfuuHB3!C#L#m!OjA?`)zPG-LWnoZ&oDP^D&dbe#OI%wj(I- ze(L04S$9o*spf_B)9J;DjtOZY=w*%Y4U50H@q5Kv!p&E%Uw~ zdDCXGoGNa&h$krywgi59dm9}6rePQh*7gom;AFPrV+%TAd?Tsj;Or)qUz4x(3K z@lJY5Sna%lzbHe=QkUJry`k1H`?OQJ2_0rvH7f4LuB9DZRIx#>{1*4R4Vt^4PA>It z*NK)5i3diNyx1|n5n<=~nyY@D3S}AIms~_}{t387a?$=Og?klBxQDzx-j2Mt>c?!k zS$yNAbKx#K?W7bhjmYgb`=7LvHNg-1Au{hd*>#A&ci~J#pmPPy(yKuA<(SdLrD>G@ zT&~c7sVvhT;5?hHMY)#r%^rv-85Ukymo==dU$dz!Iy^p~{L#g-U&)Cz=(U@G%$A1Aw{f51E2l^RCSGklFrbV@%G%C?m8i z35eO?l+P+{n@fyr%)*UAs98o_qYG1r3RAL{Mf=dm!g=HM9hv4I?iXC#m z=JuAnv)73z0*GD@vh9I#7?#GHV+*Y(Zd|qcl~KSa2mCc~qt@R`Xh`id;Y>Y0P!Pp6 zj@N16mIR4`gAntGaP7rK&VF+~%i%AVa_YsU9*0N!uk3a1a9+-lYc1 z-$4=YUzLie0wqEwKJZW9b$F1da^(YU$wp)U<;vdTGv{YkLwt(N7uSlB$y1;;d%kGM zLvn7YAR%=9lR~|P2(arO0i2GRp<5as5KW987~$WrGfb)oBzy!rs;_$_^nl=AV#u0z z9MV~4`NnK@WoT<_Ju1S+Yf!m)Z<+L7odgLF4rX!~qNkmjmIk9B7X6Si2Jtm#6?@a~iIhE~w!7h~gx>y8c+YI=H9K2Xo zi286}lc0+!jVLv|t=a@vUpLnc;%xX|@)Bs>%ppQG2+K8klyxUo6cB??2cRCkjxC+$ zA><7Y{%U&ND4phdx>PI3w8!`MzGW$G7M0gR)P|?^3#bN9WrMhh=Ns#MOWHQa4IrBc z^f_B~chR09*k8>nnC>=JM~dXDM0@E)s3s;3 zOa=^|jpd;?5Wth4kmiMD%MgL+?wl|7a7>wM$#jVjmcO5AAYT&CUI8cgOj6y6W31e9voz=@2UipZ<4F?<2 z6<`7Yc)yVZ$$Q9Eu8(V3#B)U)d_UU8@XuC?Az{$HN*2FA9**Kui{xGIm%a^k z=G73{NeRj}ohGbF1)*`hh8w#!mO(v(^1qYjY<#p}9YT5O=lc)V?{*veDBk1MBAK#; zcG=|G-G701GqbCjpldYc$+3M-R6f-(Q9!Ou-!7@X*E9?KP?pSE8sF{5_jK5vxl#Ku zv$6Kdtj{FaE9>g#qqll^`Y4nBZ+j8P?;W9Nm>H5{$>oIeGk~z=&MW1(UE;r+Y@$C@ zx*SM=v%d%slZ(O{yGD^-_Br|VMn$Z>?g})Tx{f@g8DvcTF<;IbKpyHFJTVl7k?v3K zt4|TfUpUoUAfvS){~SPeO6HkgijOxDt^<7vnkg8|7Su`=spsfvkipCr=YwU^1s6=N zIFc>3E$L6_{k(IV92eSHme#IP_&ZFeogI}_gNzLl4Nk1Q_8RU(Q7P;U|6>1_3M6-b zbTj-S{^_ZU{gT5fA-YwdD&_ue3oPu4#fIPSb5^&c17YSm)>u(O08O{}WS{#CbieH& zn%^Ft%ObT)j-G_vOxH#PzS zp^HlDLL(cKB|xMVL)K`Zcdf$5l*oy9vE*&He6{-7$@(d<@K8DYG4xIh4e_7w7R7M` zDHyr{`1q;|et_h(8TMo57b+;>&Al%LtZ(z(TREAyZZ;I8=8o@g`y;{~Rj#Dd zjbA7^PBf#T+uSHQVEn|sDuCZwUfP1ntX~0d)GoC*1`MQT{c3!%3gNHCHH2a^iYdyD zo<<3!Uxm8ZlaK(^d!nVxiOrNO(i$=4cq?9`MfR(ZtrfnV8Op3%L5rPglvV-z?$5I3 z7z_y!^F5Xe$^zM~r)RmzB|<-5Ch76gimXBgR@;Orm%Y&~d&4@>kOUBH!2n|CxZPN1s&XP|;fZHBxX-~8q2E@Ed4*$eG7bPISDneDT zX?CpVe@cG>ZX-KYJ72J%2;wD{z;x{6i$N5GM_ZRf#5Ht7FCil9{Zb;5(ZqKUwe1>z4zCchy0xmCVm6#>4y;=K zpYzIZQuw@lrD6yF*BL^mKJH6+^V}IiyC&kO5Pu-Dd7cWJf2KM3A7$@&+6;RoWIzZ#X2?j!7_|{6d6=mZ2QK3!U4XVjX67dFpA2P(n#r2Y?X!< z4O*j~1*8Bm*^*U@iZ?tr5+-Z8oE1PnzA6-eQ?6yhh=^Uz-zf0p$1}nE6ZO=$f*WUS zJ*nS3StS`X^wpEy_R{e|UjIda-;J%n$0}IHSYsETrO`tAfrsVXrrMIRk3HfDR)sCn)i@=Y^~P(H5l_N>Vl`Z zLiDm`u|kEY0h;p%t*jGp6%zdl+L>R{NGQ!VLAwtH2&mLj7=@Ib5Jq~0zriWmUw8bs zT4FkBm7XckE)CBAi}zV;ziZULK3^brDYrdNA@35eGM-Hk+1PeU2!ndBe5|pC;kHxH z;}Jrf6pTMc{pBNFkVUNls#cCSH)u+T?7=ZWX`Kp~Dj`iEjnm7?fo$AjCyO#J zMvmKo`US|9ER*v>6UbrXagD`Ufbm%YZb3>oq(uK>nf#(=EyX3rw3sLjh7QoLk%XtS z@DL*rG$+fOg+D2zB(RM~V!}<8P~UY~-qfuB36Ll(F+&_)LNog_j$h(sv1nQUsPJ)A zGnT~QkT`r(Cy=GxnfC~7YLrU@8rW+v`RSbnOX3UGpeHAb&BjrI#JehFloB@IYV64+ z>%s`3*7WEBGm;9DE(rO^W8~VCe8qbICE^f@O{WJ9cuTqxjZ~14IHg1-ef6fWjp#HO zD7~Q8ApM!8@h(lovhtsvLe|Ti)b}|d4&%XNua<(*g^Q1@NOG9DuV#~Az^qG?tU2u4 z&t{mWvwj3bCp-F90;mW==oS-!iK5&6`~*jkmmpux@6Y$>-& z?3i(nz4pti)!2s(IZFx)1)6u#oK}mi7F)xAweLcok}v|;zrXymwd2w+Mnf|X5J4zL zr3)M2&rLQtI7U5(%DM;_Y&gyuk2yv`$0Xp^jTRY36M^Y|Bku(_u^z zKvn}pAlzjc4MT8K{w2_FQ`NX>(Mp-TZ9_3B2@vH zg3}fxn%<@Xth^PUR!vzfSW1urp=qVgDDjmrDS@uQEfNRqkc1&F1Mb>(h5m2g2+<2%$sAhGMHPB zDsub2YD!h4x0da%uywk8#v`U~n z-w^Pof)GU|9@Tg?iLv>?&_fFrBt=JcW!rFN^lBD-`m}VnoH86}aMZQ9Q-w&kp-I25 z@|ByUNC;CZZ0bu259n2&d$mpSA&QplF{FP?$%zq=azmg|nx>!1q^#{9q_L0bg&p!i zGbxv~NTi_+li;B#z$(C{liDj!hEV=&qY`cKQ{|%1{g8f@*<)dU#ILUd`Q$0(^13{D zTK)=(7QN&tD0;uzx-i65-#lGo_6&n0}^OGk4yp;9dzwyLB&EsF$79%Q6vGTty@y`|k z_$$p%DgpSRrDtv;(tQnT;-|T63r4{-7cgz+3mJ(=JO)hukR$3=K_1IZQ~!q;X?{{H zcw)uYXq)j2!OP5e#IOXil1*d)XFkfY0P~kz`HMu~*Tr)EJ`MIA@Qt?w&)Z@Kk()l2 zW2Jw_y@4cw1U4d>`my(kH_O!PDq@66IW8uqN=!jQ=qs)H;yBxaaun7_MLpAO+oCf6 z1Rw?|Yf z&3@L^ljFxJi(JOQ^m78@+LrHH9H8om8O218?%?emysc(O`R*SzF5FY&h8`vP?+5$} z4-sh3QzzCxlt+455jn}PqFc;Qixj$Fqot+yY7uYK)LAo{U{{RZmtq7B*>Q|NO((5L zb-ro0A&rVsMW*?k=6AtP*TUBzn^$uee{IqD9bZG+_GUXWy1U8JZJX4%t)$QtIkPT4vWcJH^db|M|VUUG%VejZMVoq55Ug zWvO4s44_`GwYhgM9xMTE8`I{dj%fgmm zGCqF|e@cOj)!8bgk00zP_U`U?yQQDeCsB80ymCdAp63z#6yL1a_j8}{L{P}k<4#k~ z+6~)rwEwmCX!e#YV!u7{q?B1DyWR}U3xU|##vUuGA;iY-+pMr=!PX&+p>AbL{xQh+ z{Q=LCrwvocZtC-W8&*teX*YA4PS^}uwEhmD?wc&0hC7Z$M?cGHTZ7Q>3$j^=&9U2e z#n_rI`fD;fw4*Syn(R0pc=xjlf7l!l zO*16tArDW?`x{s1Nmw-lOJ&BInGzP<=)dwWS$2%ju_o{=`4G=BGndAO2Tnw^(A>Yj zoVS?062aSdqOO{U$Ws&VP>Uw?%P51XW4BOW$siPpH6bir)$@y{Vz2`R!zQ4({(k+dWQ6R55Vv!h_M7%EBht1x$3X6;33K z1Q+%I2Uq$9u061-TO5B)msUpyt_TcB416VROF3vg-yqbtrB2X7z4k2W0d^;(i4Q+L zZ>kz!HTobj#PNuReZ%oB`79^~vF-CfcaoJS1 zIfDQs)`9VU-@&WijUv~0X}mnOTx_bw)ki&Gn2eAB9&nP>GLE3}kVyNJWs< z0w*yMB@PV9hFR*3l~S2>6Vs|Vu8)Haj*w;@0g`C8lmT@EkXD5*7=0x`3~K?tQh?C~ zH!00pcyMRctt7_A@ZIke2brBT3Q-;4wIqTv>bS6EW{Z#&m zGkLE#@KECiGRAAVF~)J#__5C049KGuA$q_3nBoSG>}NW<&>13ZJ{ z(I`a&gS@gICd0}zt`;rjdj<0SI3^dYo#1=Xdmvu}+m__>BEY*AERV^>>kUI3r)B}k zvk`y~`T+Aod12&S71XZ18MQ#@z`7I}k2To3@rC=dS&N0u-K;|Y z2Aavmgl^_|P`nE~XNqP-H|x0A4k_Libkppo2t;(~JxKnwrIqK{8F8?&c;gfcOi~sb z{SrlCBaWLt8w0xqO3QK-!@f@d4>QhBC z!Ot_#R+RnI_?7){UCONy8g9eLI|rQWnml{|M$foX+h$v^(I+bIx4{eVn)V7vNy4Gk zQRB?Ffq{_~v7l6ucK0%73-ykN8*NIqsUq))FP)FXC4t}!O_`lRDhfW_;!V>%%EU-Z z!ypp8Gy3|@@BIE{>f^*;!#ped-b$AHiIt1b5q`v1RLRby8j@K#4DzQ<6$nAA|G_B33;}h$3-@*okM+!D9=~3 zeS%~v6rI03Xjo}Z5G?8p37pE%hBa2xXbrf&2{hOI;G#ln1qG9YnqHug!`ZvgQp3IL62jWASXS`mz#Oj2JxHR|f9 zP5M-_M_mMarv)q<#iVq2+)f^$0rDW*Tep!Js=2FJXNNjYvhADo?~oSA?+Se<@gVUe z5F!k)*9`FDSvSaw|q?dZtI} z?GC|*q)&sFip$Ez-i7gVM-4XzaXi8V#akKI%&xy0a_HX<+jvP5n8T9j)>}aDFCCSa z@AO-p^7Xf!-_BnFcOZpp`4RscyWxuk*BReEQ)-{9J^gmMUgb#d5dD?T;=@5PZ2GT7 z=$9NiQ$t<)xJov;kmuAy!+n)w6E76(_T#r{Nker3s9X}U2u@M1o7+x${n4xqfUYk# zbk_szlL6^7=C|Dpf_iXU4S+Z`%isYL_7&bGH}7Tuo<|sN)4}ruu!b+jb_DO=8h}LS zTEL!QM zW{Oa)C6om|u34;~Ou$`cq4U0P(vQH=ticLaNgM&EWr5a9ka{dikUAW(9r|H2{sJp$ zAHn#E0@5u&I4EGt>)-?eM5{slJ1@xrqnG#auu`;hi@AC2B4m#arjCZiR6~F<;H*~2 z^=#7jmw-W$(ck{?ww)5^`&%XQ4YLFsj_(EMq4&sRE3AM!*kHF&q^CcjDg_zFw-`e{wOa+2m3_8rBH)Dd^XkvQYZ@8IsiHdu=V66Ho$ zKGFlQW557G5besV4Z3{}mno7i2ukzhl(UxLnYFNyWZ1tzv?FkH5P+HsKr;ZrJr7{6 zgpiF!A^QY~6h68eU|~bvA14Ej>Vk5r7b)%nL^G4dW0SA?g&wLm%BX|4@zJnPutpJT z4>i;+BK#rEB}Zj}T4!7%!;A`GvRR6Vgqm3!uMiuyKXkc%LKG4}PE|oAJ-BI>6Ts5V zoXh(dW9&zWou&dKn%;= ziM0e7=C^L|SirJnOh|uE(-0$flc+FA6Th~mIljrGtEsx8_4NXR5$S`-8?s}aD*`Bk+5Pc2-^gm|;C8T@=30q7|o z(>t~{gMid2o1b;i9v!yi(g68P*tt(@UjHHc@@EY?Dz6VvwJmO~J+SQPuSjcPdi%cxfLv{XPZJ zqdc>mfnP7j?-8Nca@ZyI680phS%ey;7QT!{pAZE%${|4l#8cFcTrqmR#^r|)5hwD! zp1r)d99}}eHRuWY?6*BQO$nV96}m5Z-$kxR7=gx2r#87qpfOet*c2FvP8%|madFxFkeOMtR2udz z6?}r3y1+zi;8J#;>&sTc<(K}p*%Z@Ya9Ni51#MlV}^tp(e z-Q%+$itDvE+nH>>c@#+!A=Zeo#w>jOvhd>VGzjDJmxP>VG1`s*Skr?k?V)YUGdk_j z5o1a0B0xq7z)TjBu7>>c5VA&2JFJ)4s#s)hrV%xl*XZq9N{xUoGXHn)0%rCn{$W31 ze_rUc2&L!W6xV6$AxD(-f6d?o1jIl%Ompv{Ap66e!5TH)-uinz( z`$Tw(JmNkTA>Ry_@p);2rgLL^cZiQaWujU{i2J+$r4;IytHFf;$dJZL#&jwIK$m!= z9%gBX9P~F6vVd@9H>{hz$#6~S;kc%5CffBZ z*fa}1BUZ@&@j~)(3;e}_Ay;Ha*GOl&!w%iaFhB&w71acQET@m`B0&AJQ3Tlt!n-Ux zKkYmKNT#B~me|aMwnaJUd^#Mev@(~W*eq%fQ;B1iJ@P5*e1}4dK^;t7!U85tfRS&; zd{`1{moU7nVpkR@I~eoU zN51a4x2OdFyv;CQq7w@+odh(JigP6t;rMD;d=;+8@i!B)#LfNgQ&6w_Yq@5hVLfp6 zTiaG~!EJyfFWTY>6{_bKZ6}CkfF#?m(`yi$Qgrkj)cy5_lDKHxM`2J(tg*#6dUbxx zzv#s^DpetffOU55SP|gdf8?rXgnLw?@v`5|vx?YR7lS+&`~(X~EO0~x+i5R_1Q2N0Nut`V94jO-jSezFis%T($fI|%nepwECD~C86#Xf!*ZCZ1f zmo0Q<;Y_vYs{rg}C3FoNeEu=Au)X*p3CE@azA9-)SpEtY{9|m{*)9>n_q+-$>o~FOubdo z7&FekxuwLOnwjBALAf*km68 zYLf6ISwKo z9DWKkaRxhl;8Jy#ragLo+;fzd-UfOK%A~^F(Q8rvxf<4MkZD8*KGDF(W zW>JsvgovTDAY{exh;Vpq&F;(uIP^{JDhKNf0{D;^bVddig(|Ey*0Z&M%``AUhFF5h zA9cNPr3oA+0(7t4`%?ouq{L+mFq~wPhfK&4vO8RZ+ss1jP-9oB@skPQIT>apYm7Gy z?9|M4L;xQFbiaEXZ!+PZ!#?ivA*pRaCk+6Ao2> zf}1WYn}~z$|6kvkza^C>=6k4M-;M8~mOx28WZ@AjrT40*wP_jtL0`FOIEtC&rTL&2 z+L3K!w5o5{J(F$YjmzMxQ>qWS_nK8)KlGBwTvzI@>rF2C3Hv5S{|MG^R%i6-;O>GA zIjUdGme+?=@O_qBg4NsG#P0RiO!5SHJ<-;y2A8Ec)61t|&FV|pV)gX_om*;P;c z+++ISUz@-)Q-Q&Jn0Yc`5qm)ntaQfD^IMObVPjwi?7OyZ@!+A=T-BVWUdR z*8M(Cl9kWP33GQ=N^?2Cs|joNOBpDxZ1?Ar`pqRJ!LRQJSO&T~wYhHzRK0m%BGM@>%rDn6yaclM zL>~_^kag-|7^jruM-Em?~Ulr(9P&pB{*QVZia7oo&tsqYq$`~4*gvIPmhI63^b%bN0QhXy-e*w=wsx&%hV#Vu;(m>-RnXAng1 zC2Fa`zb+q-ogc5(EDMSg3Cj&v?0I3lYi(S$)T&bqA)*SqKJv^fqI$WUyOSJ(draQu zVO%6{l((ydY*WAGWDs;jKf*v#y4g#5qdc0$ti46~*KRGuy6_`J<&LtOHFUo}%a#hp Yl`jGz%R9~u(Lcw{+`;~ZL;$@14{R%g2><{9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/buttoniconex.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/buttoniconex.css new file mode 100644 index 0000000..cc6812e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/buttoniconex.css @@ -0,0 +1,272 @@ + +@font-face {font-family: "edui-notadd"; + src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/ + src: url('../fonts/iconfont.eot?t=1544182120898#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAADI8AAsAAAAAY5QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY87kkUY21hcAAAAYAAAAMEAAAIOvSWzAVnbHlmAAAEhAAAJ1sAAE3sXG2CpWhlYWQAACvgAAAAMQAAADYVNjhWaGhlYQAALBQAAAAgAAAAJAmVBYhobXR4AAAsNAAAAB0AAAHo8JL/+2xvY2EAACxUAAAA9gAAAPbwGt16bWF4cAAALUwAAAAfAAAAIAGmALRuYW1lAAAtbAAAAVQAAAKR8lzSlXBvc3QAAC7AAAADeQAABiPUsQ9jeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkEWKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMTznZ27438AQw9zI8AMozAiSAwDobwx+eJzt1WdWFGEQheF3SCYEc84Rs6KYFQPmrJgwYMSEWTCuzpX4q9yDf/TeuSzDmfNwmqrD4evqqmqgHWiVzdIGLUM0dEVjUNFGM97K1Ga8rdGj3yfr2wJ1r77/7v77V1fUcK6an4byP/mjq2Oc4zxdzGA2G7nARY5yictMZxZzmMtKVrGGTWzlCkeYxDzms5BFLGYJS1nGclawmvX0cJVrbKCXXRziMP06UTu79X+m6GTT6GaQ69xgATdZq/NuYRvb2cFObnGbIU7Sxx72coe77OMe9xnmPQ/Yz0MO8EgnXsdM3ftjOjjIcZ7QyVMGGOEEp/TXpzmjs57lGc95wUteMcpr3vCWd3zgI5/0HWOcz3zhq2vT6OD/p9M/2n9N/PbDfRLqC6oR6hCqJdQrVGuoa6i2UP9Q7aFOojpCPUVNCnUXNTnUZ9SUUMdRU0O9R00LdSHVGepHaoI6k+oK9SjVHepWakaoF6iZoQ6mZoV6mZod6mpqTqi/qbmhTqfmhXqemh/4PhYEzi8MnF8UOLY4cGxJ4NjSwLFlgWPLA8dWBI6tDBxbFZo1aoKmjloTmj9qbWgSqXWhmaTWh6aT6gnNKbUhNLHUxtDsUptCU0xtDs0ztSW8iWpreDPVttC0U9sDP+cdgZ9zb3hL1c7Az3lX4GfYF9oU1O7QzqD2hLYHtTfwc9gX2ijU/sA1OBDelnUw8NkPBT7v4cDn7Q983iOBz3g0tKGoY6FdRR0PbS1qILSBqBOB7+Nk4LOfCnz206E9R50JbTzqbOB7OhfagtT50D6kLoQ2I3UxtCOpS6FtSV0OXI8roQ1KXQ1cm2uhrUoNht8idT1w79wIPEM3w2+euhXaw9TtwLM+FLjedwLX6W5oX+ttFN46NRza4dSDwLV8GNrr1KPAdX0cuJZPolnzp4HrOhK4rs+iuQeeB67xi8D5l4HzrwLnRwPnXwfOvwmcfxs4/y5w/n3g/IfA+Y+BY58Cx8YCx8ajef05cP5L4PzXwPlvgfPfQ+82fncHLf8AikFk6nic5Xx3mBzVle8993aYntC5uiZ1z3TXdPdIk6c6zCgWiiMJJcAEScBgQDJBmBlyVGEyDwyGxWuJYBFtzNo8P3ZBmDXU2vswXiN7/dZ+xjbY4hknnB6LP5vQXbPn3Ooe9QxKYPt7fzxNV91bt27duuGE3zn3lBgwNmUJSxisgTHI+sDrA9UHRRDWJnuXvWsTbJUn2IqX/Bd4krn9NxhjHmzjajElTOZlfpZhg2wBOxpb04Um9KKeLRaKsQ6Afsgugmwhk+0HrxbSY4WivAR9WIl5vJ6spvohq+WdyzRVK2b9kABVKWYVeOrYVzf+eOPImz88wcOFZxO/JDLY3j8K0BxrW5z8whOZFYnWduAR+/drtkMwkBlY/k/R/pZNa2+CYMheNJQeUOKFdlE8dcH558NCvrT81c8ueTOK/960z42o3L9mID4cjkR4+augNquLu9p0CByjZPxx/n8Dfr73DHVOwPR19lw6Gs9fdO4y39x163QcoJw7Vpk7BYerJPNaRM+Dif/kSRhGmRmGYAbOkxfrPye+JpYwwQIsyppZnCXZHHw2lAx5NUXL4+jzuqKrSSwAymGBksQTJBU9hH98BG4ZmRg5//yRic7S34nrSl9+/eu3vAbtr79uz7cvfmzkMbHEvhhueY0qTLxme+Bde9Fr9I+fM2J/CY5hbuyD6WK4Vi5Wx5pYiLXg++X78NA1PM3BXPV94uelNhcrLQDXT+4HBsvsErjKJduwDEuYZYsbNs7CVOWwLcPGYeO4qu9wM598h4JvobFmWR/T2ShbyI5iy9kqtpZtZB9hm9lpbBs7h13CmJrXFD3vxv5ASJN/70t1qpJWKIlQZc39IZ6hEbsVXalOumFYwLiBI2I4NLCqJ9swLQPwrompbR1RLROwAJhpGvSzDMPFykZ1juAAObv6ZCX9QA8Avs5wXoUkxsTU1JSFc38Ui7E2nG8GKkRwLZH5kn7whpCdBoeS+WRkcMhTABw8TgHSGVLYKSbU3WtAIlb6fCwBEI/xo+22Tx6XEE04QhrpWRZ8aYqp8C26nYiV58TiYPCbtHjZpvsW47juU+J/CkD+38RYMpX1QiYbzReKUCimhoZjKj6hD6vYB+eXzSlRr8eLfXN+hUwPKDEq03yQXwTzuaxcuatlUl4t1Q8LAV73Nwr7DoWDAhc2RqAx4vYmcoN9G5PRBUp93C0aG8P+mDecT/KFc+v1bAH8jRH7czDqScW8oyeuH9jY2RPeMBreMMTrwj5/oDnkBVgbaAXRHoKxRmiobwpYTY29nQ3Hz6+bWJN1e2KBJuD+xkS/39vsBe8DbndzqAlM+xd3K23toWJ67oqPdzXEAKCpOfQZWgcuF8PCuSiyExhDcZYr5jWPF9eg4KFfKktFJAOLngL+5kOeLvWYCjhLHi9onh5IRRR6pAfmgjaopeTj9EQGK+J0KgDvNQEUVi3JLGnlcX9dyB9qCADE1vs2jNYvHQ4k2+PexhgPN8FkTETtT7ka/DzSDz5vc6CxLlwHQydl8ivqg5nNeuOigVE16YF5gbDqce+GWFNvoq6nKwq8KdTscd81EVnaBooHXFawMQTQaO8Jtbta/fZTHn7XrmBTfWN769yLVnYnuuvAB23K30MrYy6kRUcOxNl8dhLxN84DkaGSgPng9URjw4sB87qKYwrlshEk0x6g+9lMyhPtAM2pqyaHCwvBHVOTWC9PpFAs5DKpABQpj9MSiqoiRG0OF4pZNTZcyA0goRVkXfk+uKQ+aP9bMAZcDT76bCDe538WlECHXwGfD6KBZECBPf7euH/PQ6Fm4Aq2HIyAr55Seib0yLOBRG/gWYBosCMQdR5KBHH+vxLowacexqcgRm8Iwx8bMBtqDsae9/clAv/8uQCSRcQPo/56WAld/ii+97Fn/PHewB5QQ23BKLYU66+nx1uwwWcD+NAzn8NcNGC/6K+3n7FfDUSU4Of3UKf3qOE27BBE/TEiLylnAee3hSVYD+nvfsDZQOoRSkyl+Ugj7y2CXAbcEVTqXigWhjsgpg4HQPz4z6FevTdop+OuBdDWlIqG4MR0DF4ORaPl79kPLYQt0LnDsF816pp9f67jIDz89HeDkUjQ1tSM/Zjo62wKGO44vBzs0XvK3zSw/qn2a9ethA7D633X1yg8xAKkb3bIPsZYivWyHNtA+iblUQaHQtGYnhwcwnXCfD9obj+kMrmCTiofkkU1oip+0NK4wNHYfJTluJghJIAk3g/NkGhJ8Ur5xYCiBPgoLg7N3LPQt6yvL5XqA/DZvdd95MtnQaip/NlxfzjsH7faugC62riJqYGZMnMKUMRaSsCuo5bg7YDycKq3b1k/9KfAfmTv9dDz5ENNQTPcHsZ6WLnSCspjw8mVqUSOeWoKiR/4UWwxW8nWs2PZKUj52FfsMuoeHAL2uVghdbxcCJRXtKyGIED3ImRS9SwKZSLgXJamAx9Bek4AioQ0XlITqlbU3VEsyGOFOIifhfWO4jLX737nWTHS1hdsjy3QxNozfWdEm2H9UvM8Y74xf65RmHtv96hx6k2rToBovu6Mdd1LYuX/YQzmYLBg2O81RBtPaIr5DNN9GXxiYXHFPcHIvlgrwPqVuZXrkUAjXS3tsO0U/9wWMTpkWVbeuvk6y1p8lNBax7cBpOKwtvPo5G3psS5tZeZ7gUW9c+70JcJuqRccOdDNluL0ZGnYOBfeLPFvPoc8W6QhDtJQi6qXxhP1eFVIaSk/xzzR8jCJyoVIykjjmvjK/aOf3Ni0/taR+1c80D8Mev8DK+6ff+dGseG2kd0rHuzP5QcetplwjV11Sn5kcPDqO68eGBwZGRq4cszcPZgHyA/uHrsX69evvWXkvrHdAzmA3OADY/cXb13XsPH2efeK5uL4lWN1q64eHMLHBq9eVT92Vf9goYJ1nbE0IIaLMBW1bAdSdD6pEGRCCJVPY1YgwCWMAZjmUd1yyzYRPgjTKJukw1FdOuocmGWVkZMF4YUS4nD8V7IkxpAHaXXi82fFBOr0FpzBItJSv0AoTfDZmQ58kUTTkCzQVHmjpCiySZAp3ZXFYrs7PrRMSw1H1CCkk92nDRFaG92a6x0uPwEebUWiucWlNCdWaPa7sC+dTC3P2G9BJLsmmYp/JbNq/lx3fSYeX5rpPVFrV0umuy2uncW3QVCNDMZTo83NEZf9bnZlczQCa7FQWVKRTzRXHUxjBJinGVaRTK2jXM+hzs+TXEeGRjyiE58kazhdWCWzwp6GZF+wJBNXuM4+k5B2DRMLSoUsoRrEr/ija478WTrKrLTGK1zryFE8mYJV8CqLhNpw8Wgd6TC374a3aI3Kcr1w1Qjf9dn/IbGfKXU92gEG2gECkS7T8RkIOeyO4NNh35DFzbLJGT/n2PUf56br6euvf9qF9GCbeImFiCXMW54UWA5mBT9IHGcgTvcxhkZZ0gdJ5BP+ePkjj8Mn4Rt20N43aOF7ywbiUdsc/dnr07jjGrEU0X0IKSWk8WLWFVKS1Qzcuavhl0vs3/HnZfp7Dl3QYi193r74z/tz2A7q7ucljkyxfmwHbTNvZJFUuJjDMSGMyBbTkWJF66oRcOSaHDf/j6Nz14wlRlcAP/eYY87lsHwUVu3Qt9rf79uw7vlzA+c+v+74XuSEVYXCKpDn18d6c264Wxk3Np4rxLkbjXHFPt9b7F3UY/9y9YJlKxcfC+0wUa2NZxymq4YXVaQv5AzwMG+MqQVWzDAhDU6nT0JDOFksIB7QhlJeKh5WY9RXAlRoBnD2I/unbjckf/QjSLrd9k9/9FzZ7S4/55wN19zkQpfWsjZybtPHxgL+nU0w2L3glM4IGngmVa55uLR8+rHnyjC/Pbso3N/TnDxRWXES8DpzYHWk++xFXXKNpbJwITkRBYaQatDSwiuTVcbmrD9HqlRYmrFiG+htIKZ5yOEZMYtfzN27l9pTRpVpRJV5ZnEImis2kQ2+etatMtSoR8kg7um+kN3ahjIoT1gjlAbJv1qSeDkyK19E0TTrwg8xgdzKSp3CCoRCgZJB55r8AGctGdDiNotrWnz6ghLYN26baOyEEiH8lSwn5UyL09152tR0jiHl19KFxgYQfa5ELXyqRB6EMJLDMZSNNXn1A5ZHDlIu9tUM6jtlOTROJV/+K5ULwxm5dfiEz6zq+B8ONC8zZsV9kLw4SPnBnp0xE/ZEzRBg4n0Lf7haM+4ceAps85CDP6Kxew+2qh+0fN9BRviX5D/UsP9fjrtmyQ46voPV+UuX29GDLsavQbsDkUc67+guzUHcRd3RVMkexyuJKmBwyNFrg0M6XeMF//PIGs7XjHxm5GiU8ndtv3/7XW5M7Ic/7XJyrsr90aO56b7zPPNKvnp0ZA3AmtHtdwhxx/bp84wbjm43hYVrokirTcvX2jKOWM+GcGYzWTSMCsUkWvqkZmNqSJgW6iHb054VItvO/0hpVwt4y2EfgBd+24D6ofmZes7NF5s7EE+1l8x2jVJ+Y0sHlMe8aA+J8/BcbyEirC/fVbXRHBppk0gtg3YaIlqJzCpzRnhNkfaakiyGADWml1BOXi9qCC2Swgj796GuIJWxT4K0TgRHZdM0pY7h5tZWi9QNN3b7wxXghY+UTX/YwmJgiHrLm7YikDGm8dhe/hSLsi60GJ3Vy2U9pLhVZ+V0JY2AA21ZNHf9MACZghuXcjEg0oUEBMCT4Xvrb61P9nQMtCxLz1sI7o923166Av4Q6It4/a6wHcJMnd/NwQ6F3f66SF8A/hB2+b2RvrXxVUd3tIK7Q2+Po13QXSh2rjodfi9rob0cdjKL4PfBXmohbIedTI2do7FVNIN6xV1RcXmoujR78hVNrRCkSlZL8F7V2VF1cuT1Si3e5snkXa58xn7OST3g2XKV233VFli25UoPpu/Y35QlV57sBbdTB5Zkcm6q63WqILCAwXQ0PQiYRDKDYPLLNkc3X8YxiWy5jKO14WTMyv2aalR8gHWBA62L+2+1LmAmxmhhXJ01C/PvR7IwFV+Jg9G9rJ75ieuEXkyqOrSh2aQk+drdv9s+CtHR2+wV27ba2wmtE7R+9FFoglH7G/YFhmxjh3gb17cJObfZsekVB9+jGQberFf1ccTp4nbvFi/M7+tbALhQdl3z5addbr8C98F95Y0QgcivG/bkfL14c0Gvr/A0X9C644wd9vft4+EL0Gb/XPJjyQWCpHcA0dYQW0QWgNNdUSwUo7EOcOcLnV61EPN6iHCk/RxT9Uy2iMuRKhT1QjGi94M371Xz5CqEbvvliTUwNnah/fIjW8K8wXc8V7n9p8iyursb5ujuK+qvaErkIxBegfOxwnvSqGsJ79fU1bEfr/jmi77FF+bI/EFrg9nGe93D6YHwH3574aVbwiN1wxFofFIAEmqzPz7X22vUGY3QDKevy3GEopcl2tlfazyAglvNq948efw+3Hjsx+WAvln3Fw1I1GDzMOoXlvahPT0LlpPxL019/j4sXjIlDEbTfxb0Lv2LmCmPSWd3sjls8OCWDZBrJJdJedzVjHDkyyFNGnsJdBW68Ac7KplrUDWhNXDHoQ0aPr+NKne1OYmdlgqO1eIM2u/Jol4bqFhkeW2/ElHI1iKl0gNy8yUp15JMH7n9RIxIjr4QWWQmuebIpWaYUkeE/aeikrBO9YcBZRJtPqHRS1aMST4TbppVvWJaxhRDLYSlFuqYzmplBibe4Pvtq/06mHYsP5AeHgDkr1qL90gV8zVfDDWcYffxTcuWbeLO+UhV9dZ/UNvsP8L49IN8k+OPel76VwWuAenvPkR4jGaS/nBMSQXnXsEphWRID6EhlnbKtRDOPu3/5JPFQY1A3HBMGYp6NLQNTfIM2Sa/776yeV8gaiGxmlY0UNYcbT660v7BD5YtEKwTUNm3R8gpg7MNe598EiIBe2nfFIM++GogAhdcYF9wqT32jTcvtY4lT4zfH2YsJX3CrNLnWj+aVkM589lithSx6hrpQT2BbUb77XS5T/hxdgG7hF3BdrB72ecYixS1AFcWI30VNTzceKZ8Hg/AvCZvF0OVS5idYkVUW8VqqlEenxbFfIDrxUhtMebpWsMj79UX87w3HdNj5Kcl5U4OEUeIqQWSYh63gqKrmCHZtWeyezIxOZm4Y8/OjpXw4mT3hH3LJP6D3ons5Gq8eSdd8Xcn5kyUBzBz0+ScyfIDmIlhBrCk/DusBL/BzBUT3RM78YJ/mx55HnN/PzlpfwfTXVTlisnJdV1Hr/70c9hwF1af9D7paxg8rgOC/vMVFUDYx7Rv9196fv3SY+pegNPqP7lFeC7gq+YJP3YPG9hzR/eeju6V2LR9y0T35M7J7AT00pvuxJvlX2MH+buT1Lc51MtJO0KZWKUH2MtJfjJ2sHyFHM+fuie7cTzd2M1J8GGKtWjUV1Dd33R1H/3p7ufwugtf8tItkEmGO+tjo8mmZ6y74pu83pM7INLZd7ZPX+iDzAwZM5NuWAuQ7EB6rhw6Cd9KvnYvlQ7DkcnkW6VLYZZQFpQMeUPeK5scSZlkhH/GXnljzT52F0sjnw0xg/zZJLmSIq8rdKTpQm7d41FN3aiFi0iCWkhdyHUlUkSthtIwj3gBb2T1rEt2zUK8bKM+Asum7VySbKgmVqgDBnLXqeM7zPFOq3Pc3DG+Y3ztWn405MoWGJY1hWrspeqFc4n/li1z/etNKdhq7+6k3eGydfLlV2yJ7trt33LF5Sdf/sLqDzA+ig5wIxqlQ8hQAdoyp6iEShrRVA1HQbaBRrA1nSUoREaCWsTxIbNAzn6Jo6y2LHJ4v1S9cC4ta+/y5b5nTc3eBeOdl6y67jpuyN7efLvT22dWC/OgE9S88viuV7r6nAlSXgnICVq7dq0Tn3GtHJ/EG35I9fOc3BAbTvAo7ZOh1CtCFu9EE3zY2Srr5ykJXRUsIs6GrHip/HbH+i0bFqZSCfiekl+YnxOLKXafsniuAg/k7PGoqnbnF+Wj8L2OVGrhhi0bOmylvbN/41kL9C1p3pXjjTZLpFLz129Zl4C90VisO78wF7UHo3MWReFe3T4zim1mVTUK30ms37x+Ab7HVtObhheevb63M85V3fEVVmRmN2mqTMrrJqmeqXhjSVnFhovpUEbbX5DLiJ/WCZ+rrDQG412FMek7HeOuehf/Yns6P8b5WCE/JsJiB8CNPNhUvjsEWOQ4WWEK4Eq7GIaxIj7Dl+dFB8luMa03k0gfR1GUD0o5NGIqRnV1WytK9gDNX0iDw3gseYc5p1h35tlw/sme7LKWkfR4MXL1YwLEozfWj57Z/RqcNsNzWXFmmrVeymWfQoPgqp9cDhBvNbq6xed3NDZ85lHIaNAAv5WIaz8CK10zszGGlF8dUwNKlCTO8AAroPZZwday49hJbBxHOT2r/aDGot5sIZf15vK5IoU04GUmX9QyWYpVQKyNONWxiYpe3RNVs0hkqh5TcchqKpPV/aAWitKfTrzkJYGBIsOq8RmcEAqPe70PeS/w4O83G8O989YoT/lbfOO+lq60b03ryp5Hxr11p4XCzQe6d0n5DdpnYoACgbMaP8TnM6d0Q/fmnhOB984RmV6PPF+7aE77iLYhlUikAgOLO5K9nquzW3pE9uTu//2+O+LYEuNPtZYfJn50/Kxy3lxoU4Wl7MiyEbakIjOEMzJN0WPZXEZFWDdczKSl/FDwokD+VUqJbqJe6Y7XqLYib/Pja8ZRPn5w+Hjo/Xln58UA5dfF2eXlhdHti9es/tpHT67zLdsE+I9vXtYE93/2hhtGf0BSnT9VvkWY9qv2e9fDSi3utd+66YYvypClz94MZ8PwpSOU8E1LGxp8jcs3cZj38cF74OzpfXUnbqGPLSTsHQAtKzSBlJ7BNKLTVoiuxlTMacXD0fe3fd6gq2vdOWvDYe4Prrrg764z6oN1nlBd/cqbbzvn8cO56uGUvt4TvwzH2F868aQTNsEx5TtA7900uKWvF8Xo+f9+WPKuGU8AMVaudh/uwD3uAcIvmQHQIkJfDDqaZ7rYvxF3sI7efu+aRNzd1fmR3d//xb3HGp6sNv7Az+VW3KE6eM/io5Ysusf+lP3xB29euuJBMKdlzDXIh6sZCXKpRVSvDBFC8exBjDWNvJ0NZD/EwTGPEOG6B4ewluKnnWNFbh3nKQgii/heeN1iTOktmMXe2OjtG1sSi+a6Niw5T1/04Msu18sPPfSyq0Xd0JF0g/+ll8DvXjxq74y2gj8Y9IuWdCv3h0J+3vKn8yDCd8Z68mahV9EXedvS2XigKx8C1w8fevCHLtcPH4ThU+bm9EuXiJfs/0RDKvCtzQ8sbm2NPF3fmemsN8KqGjZk9plIM7D33LVr5JZamIE3iwAGJEqnGC00khBKEPfwXXv3ks/MLBuo2LllmCWLm/Dne35tX3Gv/ToaOMg1FBBGPgxWwU21MRhjbB07hmISPlAcRmSaaPLvi8QA4olQmtA2LoYeRXrJat4ji8romN7fZdaMDaqu8pnrL/5MH2/rubD7j24uXK7T+i7sOXyIhrCqFGfUkJkTp1H+AZxdNqH+KcuKtIeiimpZ1bmfI+U/zRBLV0U9aVfpiCBRlkGgh7SFK4DX3HB2NuX5E+KfblqxgKOo2txqL+bGyqT9MWGuTHab1Rp0vukfXdAGW8psnlhRYoWNK1E6GYWN/EZWiSu4Btd/B+OYJw9VmPaS00mVzLXQ/mMOz8JV9rXPw1HSFqs5bAFXPmdOTU1jWQS4Nb4Ejm22sgwbplbbat3/xZp8+iB5CmCwdpdN6ZY35QaVdNELQ27P2NJ3D1QEb9Y48gm2mQfy31cd9QfsHyQbQL5Vkz3w1uTdB8mT0Wrtlj0LyF5+WTibCrJLt8ueBWQv7dptCOQbZh+yg5W1qXO5BSBCbmNz0DpdyO7BXma0IQkV0SikAJ1FtJtcsaPdg8gjVYuaQvaopylECdM5ZDIvBW8M8Ew2lslqc+npDIGGwrCa0mWYFvkjYoUsQSoEfM5udVTNKSjWYgiuimqBMjKWcj7IUMIYhRIWveJdj689aF+1+uz4tf66jUG4salxCjoHOzuHOsufg5ZUajjZ2XxspeRblRS+0vrKfUvmt7YLwRsToqMFPH5PtD8noPRYQ2sT8JOPnbM8m1g1t5039H40V9eYCJzz9Ep9OUCLMqfg6YjX+ZrquCswkmlZmXWPH7dwW8aTi7oD2Nw5HnfMvvr0X5lwnE8U/HB9Q2p7c0dysDPZ/B1c6lSqpaWTf1vt6KSSBZX0hc983QPNDS31jXWFuaKJg4ur2Rd/FAHojKaM7fG59XXgDoYBGjeNDT5yRlMTwr9hlFB12KFUQ6M27GtoAq312Dz/6MrE8nnK9J67eJj/mGm0ggO4iCgDoyqquCTpDJJvXgRtMXWY5rOQEdcPnXVLuDWecUfXbSq/2aoBz7RzzxfD4UiiOdzx0962VngUqwRRBTQ1H3Oy1iriaf4PkWJEgUD8J33avMo77+M/pHdGCouhQB7ZqBdRBVJwnCgoSaCSgkJxxTOFawbPuiXSEk+DW1l3Em9s0/CV5Xe/tP+V7fDw9Cs3btHa3O1p/sX9r5zPKCJ96gmxV6ydEX+dZj2siNS7TPrlKtHPWsWiK1Ysuto0TTInVJRR6U71tBNLnZdhw5zp23Zu08Wu8g1v/oG/+QfoeftP/O0/QeKNX/E3fmWfDXttXd+l78KfPbhtlw7379qagyt3bdP1beWdeHfr5/Vb7Z3VE977X/be07D6zp0v6TvP0vWtM/2hf2nMOlizY9Z5JWb9/9f94bqD+FQ6ZnpVZqezPSsHilInN/cM90rZqk0cHwvJ1l8gnbbOeD+LVPyXs/+Q1EpbOdLO+9LW3FZ9my4PRLgUM3WAdh0fo2w9dJhDvumwR2tuiun44/I8xXIiVyk59NjcBzjkG0Gn0dh7D5yfOUrii0+IU8XV2HYzas4Rydd+UgfIsRpmtH6BUkzV82oE9VExX1TkLV2kstAvd+/I9CJPiJCqpQ0oRAou4S7hi/Oe/mBwxzmpTle9KzwqRge/eaUWhGERAL3wL2Gf/Ru12fXC3Xe/4GpW7d/4wpc/JLLvvJMVD/GcW21saYSzPeGrfJ316eRAM18JdrkhBTfDFfUeuLnsD8BPuk/qv/sFIV64u/+kbjsVEP8sHrp87RJ7IzyxZO3lD9XG0DOJDeQuC3mzQ7qSzOshYRHjlkywLAuZexEigKPAMMombQbUxIZV515GWNGXNd4KLVG0lUm7QCbl6BDkVKKPKQw5t6+J7wqlZu0qVBmSUYG0YuRlz4udpW2w096GkBzPNpfXNuWFom+zWQ6XDLbq1Zgu+a0V7UHKFtMU64uGZRto0yYzbOrd17fdMq23jn0U9pUsaQQLZuzaJUMII/Y+3kS8VaKZIf79hMT2WbSVNrDj2IlsCxtnZ2Db2QJBWNQyCsXSe7MZynvIj4HQIQH6EO3eZrKod4ZQEXo9BOvJozGMGio3ANIAwCdQNVUtecfdl6/4AlXyef6fO5pA3Lg11xsU4oZjrnV564U7TCW9mU/607HeeRD0a8HmluAjfq0XgbDnMlHvMoW4TG3buJ1DxPNw8I6S9FSULWvaJWhYA5/q6t16o8AKQjSIGzZe70Kjob5HxzL/Hf4gzOtV0v7JIEDwEU8I0XWzepUQpqvBdbmXb9/Yn216KDgg/nuJNn5I8htO21LO/1J8R7TN9iEfcG0rh37wNa4eoi231WaosHKwTX9J36sfyl8dku9w3qXMkjtEh9zB8zLQ1IkJlD5PeRCNEo2beFWB+cQmdTU4umo/xBBPJ1AUCtKUeoiMSHnMyEtRjVyAvORMkV1ZBo7Ynf4kY1hTZE3gjxw/Tu6Q70z7uEQVISQW56jNC6khyoybduWlUFkfuS0KbKZPHnl8WmF43jenGbRl5X5XdQZFSAsJJzIBhRoi6vmQAEXGJoiUlspk0Z4bLuRzFDpPoYmVWhJNK/SxDcWf+wFJ0ipPH2hOU9hCczbQox6V4fMXU9yCKVxdi9SheE8k2tXSEg5DNppsGIwt6vIVF5LN6cokxQph4JTRjyYRtZ/ZsWZDZxsIJTSvLQGFuSPzkkfbZnvLUDsPB1rzjYEEQMg/1BpHq3qoy93e5elqFXOGD0pPHc4OBMiI8/z0n5sW1wFEeVpgG7kKLGdfzznKlmFIPzqnPY/KHqkpvyXDdTYkLjo8bZFcoH3cylGbF+zQFMTNg5HB4WhL7rGQQ8Q5ZuTZoUnIPBi9O7Tl7Os3sKjcd8/TzkEtAkw69t3MsMdDFwqkHhnOauG5dDqe5mmaOP1IC7lF5+rPNg9+JTHPfvrYP2Mp5BGJ5tySPyiEIilqgBxUjpAD6uSq0ErY1oyds8oHC9NlDrbDS/n1oW3WzrWsiemsPhHNzupTLaKMZCW9hg4BNJ1tIMOc1ZcDbeWViJ5s+kByhgSZKUMc2ooRF0mpH0qTIqAjKzuCOIPsC2kjmVIqU1O0fyg3Cy0UDgYsLhsGfbkhnSRA33gYOHnONHLL+TQWDPoeTsYkMrnPoNGXvxFNykSdRLHqMKvm9mbp++i8qqtFWU4BEfnHJ0dH8TcxOjr6OHzjI8eJ4ujAKjE4UnwMr03aCzMR/Tg7nO+VwP76rbfBbbfCQlt+lzsD58/cbZfaKC2/k01Wvpd1DCsN390CznroFcntsDKuNsMloF1LW27Kofa25OfOqJhsZ9blQQtim84CVSakugmL/+oPanto8stV2lbF3kTkl7y4EJVj9p+D3pAGTYRy9M+o/MldAHM2oTj9cM5Yw6wedH0Ee8yHsoQOZAWRwVmlTCKb95tAjn+Afxv+kUgjXUxyMox/sdehU7m/Uu1LUkZDzkIMkJzhj0VtRh9OechXSx/YFOVHlcBmuwv5eNlwp4ddruE0/zcnLc8HoK87Q438Xyupud+bWGYwkBbHdw0CpqUvYCqsYGNpT2Mw2CjGGoMHnDv53Q9tdFHMKPkQ3NXIlMPsQVhSSTkSWnqyZUQeO9weBCfGMyoUIIzDbo7UftswjfNprUlAkg5NU8QSpkhhRCco7aYPYVRhuCm1K3a4JgaU/AgzorYiXvriLVukT9zeF5y1xLz3fvP+e+X5fSFY5W3VW/hjB6CLdG3MTwVRzvkg8UwzyUOGSBxppDGTU42EcsQRx3U1enY2z1e+oSMZlNUUtYrrBK1CJR/RQkUUNCV8rYvJgIcqa5umuf/CouA+g9Cb813dFNgOMVskvUiIy4qzeD4gvWRzZPSDxFWiZtUiEtfQF30O34c0mKVCOTYf3TwxsXlyUp5XSKBj0bSWccioGQ6kTWkjALHZE9Wn8GyPWxUZgTJMeqwqYqPS51m2cdFH2E+CeuxjSEZwUauE+ei/JgBj2jKuypuP8bXUClIE3/YSmChyZvraaviB5iEtR7ifwmg7EA+Sa1aVPaVIlUyBvRYOFx5pm+6ZbX51us1rZ7Z61H77/LBtqgdp82szm1xc6WjgEPqoS+4E077ZR/d7p0KVlGREftbh1qrxmOlkNXYerY5QLkME5UU7BPMSKypOt2dWGheSap0Dbrcn+Pi+6X+2YVTDN5+3GcXbc3kef3DdRW3VbyRhvGTgwA26FvTNpOjsNDrLFp72dZrVPyeO8/qw394tHxz3h0tXfveU2yiE3ymgVjrD/v0NITY+lN6uxu+NsKPYRpytrezi98/Y7NnKSynraIgPOYuRI5nF8el/fN/+/BHN574jmM4ptv/yw8xsJRblfXPbLKNtlrAV7PiDU1/6b0Jxfw1a2/3h5uJD8+OBqOuvTUn7uRF2H8EM/c2YkR0Ow0gKQRwjfUtS5iGQI3QukRXlanAMFjEyhUlHTOMYQuKaRJs6YV2707A7YZ8BOHLYV7mqfmPhPBOUyI8B/R8d2YyfvgeRTkXqk9eTGoAMfSNSLCTAK+6sb6l/daIp4wvcWN9a/1Z96QwXO+8/fW2+m/y+dNPEq01pnx9Un+/VCb8v03RjPVZptS9AyH3WW/X1N+Jz/olXqabjX3Vi5ELyi1n6SlUjPJxUHChMC+noB2dxp7Gns4s8TQDiu/3QGi39Gk9iebStrbRaLC89SwdeUFEr4K3WaFmNtrZG+a+jrUIr4Rn6q/cHsPqFbVF8QFalVkpfqVZujVbsYvfTB6TtGWsXqvohkYar9C315dPxd691X/VeDN60A/CUvVr8t9JFb7zhOuG9x6DLfoW/Xa6rmB1x8cK2efZz8TvxD5MT8a+yVjXvn/HOStvv/hhOtR/Y38pd+FzTIfpdlf0z2qr1o9biB3IUpeX/wpSU/2PCjPHw3fC0vap6lMdpVPy58hJ59JT/k/eWn+arsOY7ONbnYMn+Pp44376udqR81d69cfudvRddFH9i2pd1wP7P6LVaY6nMmvESvTfwwBNP2L3UrdqjZqrmzcc+nOhM9iHXujoPEJq55rV/rjfe+5lrHr3j3XdmrjuuT3VuZHqZHC28OWM6Kt34Lzlmn4gAeJxjYGRgYADiAJaHxvH8Nl8ZuFkYQOCGQVUGjP7//z8H63bmRiCXg4EJJAoAI2oLPAAAAHicY2BkYGBu+N/AEMO67f///9dZtzMARVBAFQC9ZwgmeJxjYWBgYMGJ//8nzCZG7yimZ7iwbsPEAGenD3IAAAAAAAAAACIAngC2APgBKgHoAiYCrAMuA94EMASqBTIFmAXSBi4GggaiBswG6AcMB14HvgfMCBIIagj2CXQJ8ApsCroLAgtKC6YMFgx0DJYMyg0yDZoNyg4kDnwO4A86EFYQjhD+EW4R1BIYEoITHhOKE/IUShTEFPIVghXEFfAWQBaSF3gXshfsGFIYhBkAGUAZbBmuGd4aThpsGowathrgG3gbrhvkHB4cWBzWHRIdTB2GHeYeMB56HrYe9B8+H4gfwh/OICYggCCoINohOiGCIdwh+iIIIjIiXCKGIxojyCROJOIlDCUmJWYlvCX8JhgmeCayJvYAAHicY2BkYGCoYljBoMQAAkxAzAWEDAz/wXwGACieAlsAeJx1kMtKw0AUhv/0JibgQrHrcaOgNL1shIKrQuu6QvdpMmlTkkyYTAvd+AYufB6fwhfQp3Dv33SEUmzCHL7zzZkzhwFwiS842H/XXHt24DHbcw1nEJbr9HeWG+SB5Sb5yXKL/GzZxQNeLHu4wis7OI1zZvd4t+ygjQ/LNVzg03Kd/ttyg/xjuYm241lukW8su5g5j5Y93Dpv7kjLwMhIzLciCVUeq9y4MlonnVyZIIqmcrFOA31gDnAmdZmoXPT93oGdyFzqv57lZjEwJhaxVpkYs7lMUyUKrVYyNP7SmGLY7cbW+6HKOOIIGhIBDGPEZ51jy5gghEKOuIqGdbvdNX2HuaIJmEeY0i/oU+b6RM3/dkavUdLvbhDow0fvRO2EPq/qj+csseH9A1rDWQWX5rmMNLaTS86WkgWKam9FE9L7WFanCgzR5R8f1fvVC2S/Y2l2a3icbVQHe9s2ENVLtEhKTlwnHeneM20zuvfee++C4ElEBBIIAFq2++d7AOnUn7/y00c8HI433jtodGbUP/no/58jnMFZjDHBFDPMkSFHgQWW2ME5nMcubsMeLuAibscduBN34RLuxj24F/fhfjyAB/EQHsYjeBSP4XE8gSfxFJ7GM7iMZ/EcnscVXMU1XMcLeBEv4WW8glfxGl7HG3gTb+FtvIN38R7exwf4EB/hY3yCT/EZPscX+BJf4Wt8g2/xHb7HD/gRP+Fn/IJf8Rt+xx/4E3/hbwiUkKhAWGGNGgo3sIFGgxYGFjfh4BHQYR9bHOAQR/hnNJHaeFp6Ek7WjqwWkqYqCK3kUrWeXJDCBmXac/3OCifWTth6p98HFTRJo4t+qxqxpoV1tK9M530gO2/pIESQeyk0lUa4alK6ztd5KeRm7UzXVksfnNpQqHm3rufekqyF87nUXFf6ZFwaXeWrTmsvHVFbrIxrROCfrDOOQE6rlhaOGrNP/VleaiM3NzsTaCpaWRs3rknbnIE6Mi33uPCqsZo6q42opoqjtGF5o/NBrQ4lY3LFsNO0CjsDHpbFsDq1rsOYs2/mqdzKyGnlxCr4zHclV6tsmHZtdCh8Z8n1poyLjMQZl0UeEiqC6Sx7SOGJsTbbAffk7quKzIw7jHrkVkRWtVDtLPFN24l1qg2ZJ1aEu9N5Q25NkpizrGJjiPkG5Mw2FyEIWTfc6KTpvJLjdSPskGvlREOZrVY9l+OtYdnogIONWWTKfStsr0QWj5LuU6pUCFUelagp0nKe03grpGrXpQnBNMv/DMHYKUcQWz12VJkxi2iKE0O1d2rgguso57lcs3Klpkl676V3ssY+LkedLp6y9UpeOGVNsp3lhncrxUJESvkwHLrAsxy76T/LEm5NS/mKZ6bkXtmYGo3x+uOYNU8oRc2Gi2P08haKt2C336UQVGnlw6VTPZZxdGmInI6Yr+UtFIMMtHTtiTC90H3uBCv2zSzXUzoSm6k3nZNUeMsNcnqW4BhzZX5xjOOgTITj81nPc1WILphwaMlTmMYrGeKd5D8MYi83lsYejisRqOiHKhV+ik8dXJ5i9uUll8RXQslYJDjwnYY8OhQJnbQmFRJKn80D8e3l7DNRVSulad5PPlVzq+RGcOvxZih2mw/rlWNw9RhcOwbXR6N/Ae4UDYMAAAA=') format('woff'), + url('../fonts/iconfont.ttf?t=1544182120898') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('../fonts/iconfont.svg?t=1544182120898#edui-notadd') format('svg'); /* iOS 4.1- */ +} + +.edui-notadd .edui-icon{ + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +.edui-for-close .edui-icon:before { content: "\e654"; } + +.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } + +.edui-for-italic .edui-icon:before { content: "\e62d"; } + +.edui-for-insertcaption .edui-icon:before { content: "\e657"; } + +.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; } + +.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; } + +.edui-for-insertimage .edui-icon:before { content: "\e617"; } + +.edui-for-previousstep .edui-icon:before { content: "\e630"; } + +.edui-for-nextstep .edui-icon:before { content: "\e631"; } + +.edui-for-scaleboard .edui-icon:before { content: "\e632"; } + +.edui-for-brush .edui-icon:before { content: "\e633"; } + +.edui-for-background .edui-icon:before { content: "\e65d"; } + +.edui-for-strikethrough .edui-icon:before { content: "\e60c"; } + +.edui-for-spechars .edui-icon:before { content: "\e603"; } + +.edui-for-clearboard .edui-icon:before { content: "\e634"; } + +.edui-for-bold .edui-icon:before { content: "\e604"; } + +.edui-for-fullscreen .edui-icon:before { content: "\e656"; } + +.edui-for-formatmatch .edui-icon:before { content: "\e60d"; } + +.edui-for-underline .edui-icon:before { content: "\e605"; } + +.edui-for-removeformat .edui-icon:before { content: "\e60e"; } + +.edui-for-blockquote .edui-icon:before { content: "\e60f"; } + +.edui-for-anchor .edui-icon:before { content: "\e618"; } + +.edui-for-help .edui-icon:before { content: "\e619"; } + +.edui-for-horizontal .edui-icon:before { content: "\e638"; } + +.edui-for-simpleupload .edui-icon:before { content: "\e61a"; } + +.edui-for-indent .edui-icon:before { content: "\e61b"; } + +.edui-for-justifycenter .edui-icon:before { content: "\e61c"; } + +.edui-for-justifyleft .edui-icon:before { content: "\e61d"; } + +.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; } + +.edui-for-justifyright .edui-icon:before { content: "\e61f"; } + +.edui-for-link .edui-icon:before { content: "\e620"; } + +.edui-for-cleardoc .edui-icon:before { content: "\e621"; } + +.edui-for-drafts .edui-icon:before { content: "\e610"; } + +.edui-for-subscript .edui-icon:before { content: "\e611"; } + +.edui-for-unlink .edui-icon:before { content: "\e622"; } + +.edui-for-superscript .edui-icon:before { content: "\e612"; } + +.edui-for-forecolor .edui-icon:before { content: "\e63a"; } + +.edui-for-backcolor .edui-icon:before { content: "\e655"; } + +.edui-for-touppercase .edui-icon:before { content: "\e623"; } + +.edui-for-tolowercase .edui-icon:before { content: "\e624"; } + +.edui-for-insertvideo .edui-icon:before { content: "\e627"; } + +.edui-for-emotion .edui-icon:before { content: "\e606"; } + +.edui-for-pasteplain .edui-icon:before { content: "\e613"; } + +.edui-for-preview .edui-icon:before { content: "\e63b"; } + +.edui-for-print .edui-icon:before { content: "\e63c"; } + +.edui-for-selectall .edui-icon:before { content: "\e614"; } + +.edui-for-mergecells .edui-icon:before { content: "\e63d"; } + +.edui-for-deletecol .edui-icon:before { content: "\e63e"; } + +.edui-for-deleterow .edui-icon:before { content: "\e63f"; } + +.edui-for-attachment .edui-icon:before { content: "\e628"; } + +.edui-for-music .edui-icon:before { content: "\e640"; } + +.edui-for-gmap .edui-icon:before { content: "\e629"; } + +.edui-for-insertframe .edui-icon:before { content: "\e645"; } + +.edui-for-pdfformat .edui-icon:before { content: "\e62f"; } + +.edui-for-word .edui-icon:before { content: "\e646"; } + +.edui-for-excel .edui-icon:before { content: "\e647"; } + +.edui-for-time .edui-icon:before { content: "\e64a"; } + +.edui-for-snapscreen .edui-icon:before { content: "\e650"; } + +.edui-for-wordimage .edui-icon:before { content: "\e652"; } + +.edui-for-edittd .edui-icon:before { content: "\e65a"; } + +.edui-for-lineheight .edui-icon:before { content: "\e62a"; } + +.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; } + +.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; } + +.edui-for-scrawl .edui-icon:before { content: "\e616"; } + +.edui-for-redo .edui-icon:before { content: "\e609"; } + +.edui-for-undo .edui-icon:before { content: "\e600"; } + +.edui-for-inserttitle .edui-icon:before { content: "\e65b"; } + +.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; } + +.edui-for-aligntable .edui-icon:before { content: "\e662"; } + +.edui-for-table .edui-icon:before { content: "\e664"; } + +.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; } + +.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; } + +.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; } + +.edui-for-paste .edui-icon:before { content: "\e667"; } + +.edui-for-map .edui-icon:before { content: "\e668"; } + +.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; } + +.edui-for-imagecenter .edui-icon:before { content: "\e602"; } + +.edui-for-imagenone .edui-icon:before { content: "\e607"; } + +.edui-for-fontborder .edui-icon:before { content: "\e608"; } + +.edui-for-edittable .edui-icon:before { content: "\e60a"; } + +.edui-for-imageleft .edui-icon:before { content: "\e60b"; } + +.edui-for-imageright .edui-icon:before { content: "\e615"; } + +.edui-for-insertcol .edui-icon:before { content: "\e625"; } + +.edui-for-insertcolnext .edui-icon:before { content: "\e626"; } + +.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; } + +.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; } + +.edui-for-insertrow .edui-icon:before { content: "\e637"; } + +.edui-for-insertrownext .edui-icon:before { content: "\e639"; } + +.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; } + +.edui-for-mergeright .edui-icon:before { content: "\e642"; } + +.edui-for-mergedown .edui-icon:before { content: "\e643"; } + +.edui-for-inserttable .edui-icon:before { content: "\e644"; } + +.edui-for-pagebreak .edui-icon:before { content: "\e648"; } + +.edui-for-source .edui-icon:before { content: "\e649"; } + +.edui-for-splittorows .edui-icon:before { content: "\e64b"; } + +.edui-for-splittocols .edui-icon:before { content: "\e64c"; } + +.edui-for-splittocells .edui-icon:before { content: "\e64d"; } + +.edui-for-arrow .edui-icon:before { content: "\e64f"; } + +.edui-for-aligntd .edui-icon:before { content: "\e651"; } + +.edui-for-autotypeset .edui-icon:before { content: "\e653"; } + +.edui-for-charts .edui-icon:before { content: "\e658"; } + +.edui-for-closeerror .edui-icon:before { content: "\e65c"; } + +.edui-for-copy .edui-icon:before { content: "\e65f"; } + +.edui-for-date .edui-icon:before { content: "\e661"; } + +.edui-for-deletetable .edui-icon:before { content: "\e669"; } + +.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; } + +.edui-for-arrowright .edui-icon:before { content: "\e66b"; } + +.edui-for-tableleft .edui-icon:before { content: "\e66c"; } + +.edui-for-tableright .edui-icon:before { content: "\e66d"; } + +.edui-for-tablecenter .edui-icon:before { content: "\e66e"; } + +.edui-for-videoleft .edui-icon:before { content: "\e66f"; } + +.edui-for-videocenter .edui-icon:before { content: "\e670"; } + +.edui-for-videonone .edui-icon:before { content: "\e671"; } + +.edui-for-videoright .edui-icon:before { content: "\e672"; } + +.edui-for-template .edui-icon:before { content: "\e64e"; } + +.edui-for-addfile .edui-icon:before { content: "\e673"; } + +.edui-for-selected .edui-icon:before { content: "\e674"; } + +.edui-for-pickarea .edui-icon:before { content: "\e675"; } + +.edui-for-overlay .edui-icon:before { content: "\e676"; } + +.edui-for-preitem .edui-icon:before { content: "\e677"; } + +.edui-for-preitem1 .edui-icon:before { content: "\e678"; } + +.edui-for-preitem2 .edui-icon:before { content: "\e679"; } + +.edui-for-preitem3 .edui-icon:before { content: "\e67a"; } + +.edui-for-preitem4 .edui-icon:before { content: "\e67b"; } + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.eot b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..45c54826615b6f7919a3b65666c9e8c877c83913 GIT binary patch literal 25672 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�Q-x8Dm9|h%E<N#p_U>ph?=$E|j{7p-*D15q{Q#yulGpPRm3zy0Fv%kdo57uwUk;_~gS{yNEr^{X}( zU1m1pfJ5O%mg?cWH{&~{~JuLQEN)5`QL`mv$n!3akSzEOv)Sqx&`=m_r z6Sr7z^Xc8;iI{s3 zvFDTq9EM|wU^s#yM__BiPK6Q9PG)n|!w z%)GZizUu;qv)^of)I4p%-%ocsTbFM3JZ-D8^joT$LYB?d8(JRkH)=^(+PoA*O}G<<0@HDBCvAxW)^ph1xyW3)Qdos4`y9= zBFq93RXB*l2g{XOz}Ico-0?wf4Z{%C((a;hmMOyUdCJxKHS9F@L1kLi}*Nx9>+=todXAf*??$NX#r##V#a#l2Ntfe zvkR@@UqR#;>vKpUI4V#N`(8F1w6bVWop15L)IeE#@BS{^Q3bCCUI zULT9HFaaV)%m9w1q#oJSwl~OsckBA)5=8FB)#@rKxgntLmz52HW(Bd&`F6MdtpU!a zy*aT|UOy}1J2yZ&CF47#TX>Fm9d|wE|2iR|%pNKy=s<)5K3=YAD`b7YNQ%%k>U&ugCJB%5?Sf%G_MCV9O>Uqfh!0B;2!Fg!zqzPyq4mlYy{AQ8{#mGAA%(j^z}N z*h#$o)NDqJ-X*bB530Pg6IapeMd2N&i9*cow4tig_m2Xl2rWWA1hw9ni^|3`lzGvb zIi~f@uJ!U$veqT7mvpDrGrQJHwK(Dkz7eNHju!T_FgGOzBXap1SYa=MUt@*%5V$8C z?9xm{EDAv+uz(Ov&ab15o#2teirS3RJeo#W3G*eGZ)VPA>5#$^Z#WWM%vXomXoz?F z8lzg87W*T-aWrZn7<{+@e{LU=CXq=A<0=979||B=jt*$4gh&HHHlbO5(`2cwP_Nl^ zdEI+#B|9tVmh!SW@^||EUH;rhsH(BCJK(R}m9P27{GL8r{mO%@msQuwvQ$j~u;qs8Z?t5*)rTJ$*D1Dos>53yr!5&#;x!Re^>)5souu;iLp_uV- z{QAz(+g(+4Au@WlT_ly&1o6n+o1Z-S$Xa@A{*gQP25XG9A?Xt*9|;E#viawpl8?(< z7vx`u;9W_8de>s?np)wMbI$qZm0TjfqAT8qSoSy)T2?xnWwBt06R)Eo-gu&th>qMh z5|!`I-TeA5rPqH+Ex&(5`u!VJ|C1j{Klzb*IUQG{(fgzK<4^4zxj#w|-9OwzSKmJp zjgI8*!`b1FM&GO6SJ>d(KdZ+F(EPspUW(o~8jTL~be)u8|J|H*%4h~4W`viM3{ao! z>(X?jqUqmvh>e?zgky18{!{Bu6p6?)#zz0dHt#M@dNNmHp--hjEbyunyeWk}ds>P; zE2m3qXE*l(_X^w<>}ARCP{N1xUKVs(4GZX`FHpFk>`wOusm%^cpq;nvt9yo{BT)@t z;d0K@Y3{4XH?_MLsnlZiI$zeF#7}ugsP35)QT%}sv_g;EldpN_u^BPCQ$c$oMR|1U zaenIC%kqLzGGE*vUnXA*Zm)!9U!w6fmY4NdoW$S=@CDmtNHJeD=5s+GC1MF!!_3Tb zV+7Gsj^06eXr2&RQ!O>bDN=N$WRNX&QcHV9#dQZ7{cspKd*$BFuUs9hpl;bt(fHpx zE$UBwm4+AZz4t{!rBD5-#d-8mIr4`;MC3=M9;2_Us*El-Ij^z!t)W0irL=+6TxlcS zMps!)bX(45r|&gi)PC=avi#z`?H4txjduBS@}oz$u2y%_Q>(WgeUxbfAxFsSjLaqY z;yB8}-fXzC1F@(>hDAcktb#yu1}~(ngavR8-qgq`91MU@4}J=bp9^%QWmxf>H5|F- zFK1gR9M(cR%?T*5Y=%jOO;VFNKajs6dy42XPn8ZWE0AZ8z3eghzS$AFPaT0tj;$(b z$10a)Pjo~TJs?aPW*-jsDTDDOLFra4dsKut*B1-R8e}-3Yub{T_Oza88_y`2-|TvV zP9P_g7xS`6-hV$E^mxVTgjCMFg){mZ{07aok6^8|1OAE&@t$PA7y`Z`aW-M0Wjvfq z4<`keP3#?l>42>JF3dkxMbJB4P=t8t0xu z@zv}cm&j#$tm3ZO40|eam`MJxhcKDxcz;vt@GUYL$a1NC^Uj+LNL{eDL{VqE%T_^4 zTRkCLx`L?Uagzf!cBStcSyl|ChNEU_d}n*4{LzXI`LD4u6588JNxpL?1I&xLAIe{s zYl`NTb9hfbw>-aq=$Yr3=UJQUnx0`*Kw*3USxCVM6dMnMEMza>QW}6HonaRzAq9i$;q%vY}@tqTvmaXD^5=AyN zt@L%(wYc0(RaH(WMcjeXPVdSlO9C$`HPslx0eQWg1j_i2kqGUlG;H4CM;@ogv9zY1 z;)|Co4Qx@B+N!Qv$!V{SmD%xjmBZFm4UeYW)nu$~GBs7pi?C`Fr>7@qYRco9K&^$Z z5tEG|E59@tLzn~91kTb#CW}pm9HI(ZpaHC>EvxC?y4F=`Gv#pde+`jOqD)U7Y79MFf&q>~34}vZM z8etn~)*QKAk&%iX0&p@8mE7Wn{aFpct;n)a(S;KLLAiw$R;^mjNx^e`4I;^R~3DN@(95-8lgb0Sl=eg3-8l#&%k#GtD;vf0P#fRL8pruH`WpQ$lSU{Jka%I7J+A9IExuB)VFOw=B#5)1>v&IE4&l5%7TSzo zoI+X+Ogtpzb2d^7VWo??S^)jIq%qWOFm#8cuj>2UGWb&PcBi9E`eJ^sB()Cn7VgcC zki5I8ldzxt81^z=2AzGjtfHb!?klShr_)c`dp{iL;+#2u8jl67bZeP)Bn zAd*ZckaqJRYc*_!E1Gsihj|9`_6hqD7G!O?z}E=;ClC`izb!dywerA2%0mxm+qb1) zXsyI!-FGt7B83>liC(7|GDDl3|O|5V{BT&wm&duiQ-3`2*tGK-CTpFwBE zYvTl74r5~o20r@eNHX*AU2zjErU>68Yb7ueF4N`BerYRHD=0!5d5IK=9KPjAUt1AB zFdjk}DbGOR%i%zPfb`82*pqvwGer_>2AvDf_MR*kithRO`Fp-+;a$(s$nEU<={v(c zzp(I@tMpsKHYxD#$+7G2cLqh1776CK*}lSBQJ2Du50(*F3oig;kOPmLn2C@|K6f6g z4kTqTLE(oC!YFHRB6)Q5E^O2fJZ1_&cd7@a{uA>b{9r^Oee(rXaK1epB-r*pvh7d} z7x*1X>Yq&lp-DcLaqN`+{-i&b!R7>hC?@~a^EhvE+SFs(h5a_??A716^bXv^uUGJ0 z{7&1+8}V<6ow5ci*4u^ry(Qut{JO_JG0eZmQ}E}pzT)qx*y7`YhA2MwCt%T~5$PYn zV*mU{Ix%1DKP!BmI16;niIdoUH<-=mqG;>*Vj8T3RO%9|k&&|d?YJyZU+B+5ac6~_ zKSFEA-W@L9H9rnw;5^=n%F5hjfvc7t-JZ!PwVy(9R#yUG> z5EH+))L3q{SwiIpUo8(=;K{aFUOi~Dgv)QSqDi$n4U>EHH&*K{xXyO)Rc^^kt3qBe z|KdtW6rtK(?auk!)zxn4$L?x5IEyW{7tVK}`Am%)7idlSF0-F4G_HmK<@khxU)fcP z=B%J=7R(*vJ;neDS&*JAL5pu)j`B`uNVd1=EehRqJ_D8hQ zA_W7?FpG)T(2?&3M(-5gW6st-91hpZ1b>7lUzUVf`155M^^ttpfO2=fY(#lQzHCCd zFJHDIy1Xl2W)H`;plvc>^!Rnt_vgz5|Ic&zGDmg3kuS@r|9-w~K>5G&Wux#?X})Yi zIgl?~#coRE%cUYrcUae?Qv)-pA^*N3{?Wn7iQ&nK8Eb0j&}iGlOW7Q|ZaeQ-d?@ z`)6jRmUeXTL%F_vaB>{(jWzfg!;~1n4;At+j{9K@9l>@~3~IkfKCEqL(C+lVN51eE z%}?Lv^tGq|<@3|G-GHZ00Mc*k=QIqr5llM&B=9i$J&ZP!_#sC>%n<%Xbsp6izLTio z9}k|y4?(6dwi*0j#D49nDg3-<2fl@o7TULK7#L?V)YdWB!xwbg&r!lJ50Qb4WP)FV ze_YCnoZd3LlxM?Ro)zREC*G)Y@ar+uLotdYg=Y!%(o)0=mgARZR^n|^4k@mtHMEx2(R$iI zeYBA_(Pr9$pE%h@+i3^wq;qK(ok!=>Zn}Ujq>E?|U5uYXx`ZyJ%c!3QXdeyI5T$6C zMrc2cBIon~jnOzw&?HUKK}yp!&Cnsbg07^)bcBx5Rl+zpHaVRtpH2;=2luB_Q)2^z zDbwi8z}VC_dYlZU3KXHruo6RE>9T(C|L4veMtO%9}ojQi4uruSR-4GbO_NlzY{7%HEhNsk^# z&Fsg~$o`V)snp>9f%LR>a18y@E-~zz92>F@9~v8*9!#fF6Q#qG>G6RX{0;86;0~$u z*yu#6ES(ykydtHav+l$1+#fi2XmTcH8kiW|Kbbb{PmN7kQ5Zc6_8Ax}n;spX8cQ9T z8k-y#GL7Oc6Eo$PADW&S9X>LMaw=V#KN?F7&)D+i{H`p&Pmhl5pE2O+2THW=4owc4 zhSCGWGt-voL;KL%(Wx2Jp$TqKI(=vg{I6A6&`CzzWZJ@b&`PB%;b3a$%>iD zDHHB6aOIc*vU1XZNu10-Tq7#iDFio@K9sV8E=MqP`^Hj6ZR^suS}l*Gjpxa8N}WEF z?o(>DX_GNv$IvJyf>Daw%p6J2fR>qx^~)?;d17)RWo41O4`WTGE!sf27y4;_s#R;K z-PNM^9LO%P(Bv3%fkUs?Zjl-q8=ao1K4pyim~>NGPxChczVbIgiEole%b|&)+vpRm zKUD{W7~sq#PeGxKK2DeA>or0#4y1A3tmAp8bl}j; z + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.ttf b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..294ff8550c1495f68b57d5a98aefb423b32ed6d8 GIT binary patch literal 25492 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 \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/images/selected.svg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/images/selected.svg new file mode 100644 index 0000000..f29c5a1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/fonts/images/selected.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/gmap/gmap.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/gmap/gmap.html new file mode 100644 index 0000000..c8786f3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/gmap/gmap.html @@ -0,0 +1,106 @@ + + + + + + + + + + +
    + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.css new file mode 100644 index 0000000..4478475 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.css @@ -0,0 +1,7 @@ +.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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.html new file mode 100644 index 0000000..9e50060 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.html @@ -0,0 +1,82 @@ + + + + 帮助 + + + + + +
    +
    + + +
    +
    +
    +

    UEditor

    +

    +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ctrl+b
    ctrl+c
    ctrl+x
    ctrl+v
    ctrl+y
    ctrl+z
    ctrl+i
    ctrl+u
    ctrl+a
    shift+enter
    alt+z
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.js new file mode 100644 index 0000000..9a2272e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/help/help.js @@ -0,0 +1,56 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:06 + * To change this template use File | Settings | File Templates. + */ +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + 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 body = tabBodys[j], + id = body.getAttribute( "id" ); + body.onclick = function(){ + this.style.zoom = 1; + }; + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +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++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +switchTab("helptab"); + +document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.css new file mode 100644 index 0000000..4a36f5c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.css @@ -0,0 +1,936 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 600px; + height: 412px; + margin: 0 auto; + padding: 20px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 380px; + display: block; +} + +/* 图片对齐方式 */ +.alignBar{ + float:right; + margin-top: 5px; + position: relative; +} + +.alignBar .algnLabel{ + float:left; + height: 20px; + line-height: 20px; +} + +.alignBar #alignIcon{ + zoom:1; + _display: inline; + display: inline-block; + position: relative; +} +.alignBar #alignIcon span{ + float: left; + cursor: pointer; + display: block; + width: 19px; + height: 17px; + margin-right: 3px; + margin-left: 3px; + background-image: url(./images/alignicon.jpg); +} +.alignBar #alignIcon .none-align{ + background-position: 0 -18px; +} +.alignBar #alignIcon .left-align{ + background-position: -20px -18px; +} +.alignBar #alignIcon .right-align{ + background-position: -40px -18px; +} +.alignBar #alignIcon .center-align{ + background-position: -60px -18px; +} +.alignBar #alignIcon .none-align.focus{ + background-position: 0 0; +} +.alignBar #alignIcon .left-align.focus{ + background-position: -20px 0; +} +.alignBar #alignIcon .right-align.focus{ + background-position: -40px 0; +} +.alignBar #alignIcon .center-align.focus{ + background-position: -60px 0; +} + + + + +/* 远程图片样式 */ +#remote { + z-index: 200; +} + +#remote .top{ + width: 100%; + margin-top: 20px; +} +#remote .left{ + display: block; + float: left; + width: 240px; + height:10px; +} +#remote .right{ + display: block; + float: right; + width: 345px; + height:10px; +} +#remote .row{ + /*margin-left: 20px;*/ + display: flex; + clear: both; + height: 30px; + line-height: 30px; + margin-bottom: 20px; +} + +#remote .row label{ + text-align: center; + width: 50px; + zoom:1; + _display: inline; + display:inline-block; + vertical-align: middle; + margin-right: 10px; +} +#remote .row label.algnLabel{ + float: left; + +} + +#remote input.text{ + height: 28px; + width: 150px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -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 { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#remote textarea.text{ + width: 160px; + height: 120px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -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; + resize: none; +} +#remote textarea.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#remote #url{ + width: 537px; + height: 28px; +} +#remote #width, +#remote #height{ + width: 60px; + height: 28px; + margin-left: 8px; + margin-right: 8px; +} +#remote .top .row:nth-child(2) span:nth-child(1) , +#remote .top .row:nth-child(2) span:nth-child(2) { + display: block; + margin-right: 18px; +} + +#remote .top .row:nth-child(2) span:last-child { + margin-left: 15px; +} +#remote #border, +#remote #vhSpace, +#remote #title{ + width: 145px; + margin-right: 8px; +} +#remote #lock{ + margin-top: 11px; +} +#remote #lockicon{ + zoom: 1; + _display:inline; + display: inline-block; + height: 20px; + background: url("../../themes/notadd/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} +#remote #preview{ + clear: both; + width: 345px; + height: 261px; + z-index: 9999; + background-color: #f3f3f3; + overflow: hidden; +} + +/* 上传图片 */ +.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: 373px; + display: block; + clip: auto; + margin-top: 12px; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#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; + height: 212px; + padding-top: 160px; + text-align: center; + /*background: url(./images/image.png) center 130px no-repeat #f3f3f3;*/ + background-color: #f3f3f3; + color: #cccccc; + font-size: 18px; + position: relative; + top: 0; +} + +#upload .placeholder .webuploader-pick { + font-size: 16px; + background: #f3f3f3; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + color: #646464; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */ + border: 1px solid #ccc; +} + +#upload .placeholder .webuploader-pick-hover { + border: 1px solid #00a2d4; + color: #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: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#upload .filelist li { + width: 135px; + height: 135px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + 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: 135px; + vertical-align: middle; + overflow: hidden; + width: 135px; + height: 135px; + + -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 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(../fonts/images/selected.svg) no-repeat right bottom; +} + +#upload .filelist li.filePickerBlock { + width: 135px; + height: 135px; + background: url(../fonts/images/addfile.svg) no-repeat center; + 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; +} + + + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#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; + list-style: none; + padding: 0; + width: 135px; + height: 135px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; + width: 135px !important; + height: 135px !important; + margin-top: 0px !important; +} +#online li .icon { + cursor: pointer; + width: 135px; + height: 135px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 129px; + height: 129px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif)\9; + background-position: 95px 95px; +} +#online li.selected .icon:hover { + width: 129px; + height: 129px; + border: 3px solid #1094fa; + background-position: 92px 92px; +} + + +/* 图片搜索样式 */ +#search .searchBar { + width: 100%; + height: 30px; + margin: 10px 0 5px 0; + padding: 0; +} + +#search input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -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; +} +#search input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#search input.searchTxt { + margin-left:5px; + padding-left: 5px; + background: #FFF; + width: 300px; + *width: 260px; + height: 21px; + line-height: 21px; + float: left; + dislay: block; +} +#search .pagination{ + margin-top: 5px; +} +#search input.num{ + width: 80px; +} + +#search .searchType { + width: 95px; + height: 28px; + padding:0; + line-height: 28px; + border: 1px solid #d7d7d7; + border-radius: 0; + vertical-align: top; + margin-left: 5px; + float: left; + dislay: block; +} + +#search #searchBtn, +#search #searchReset { + display: inline-block; + margin-bottom: 0; + margin-right: 5px; + padding: 4px 10px; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + font-size: 14px; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: top; + float: right; +} + +#search #searchBtn { + color: white; + border-color: #285e8e; + background-color: #3b97d7; +} +#search #searchReset { + color: #333; + border-color: #ccc; + background-color: #fff; +} +#search #searchBtn:hover { + background-color: #3276b1; +} +#search #searchReset:hover { + background-color: #eee; +} + +#search .msg { + margin-left: 5px; +} + +#search .searchList{ + width: 100%; + height: 300px; + overflow: hidden; + clear: both; +} +#search .searchList ul{ + margin:0; + padding:0; + list-style:none; + clear: both; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + zoom: 1; + position: relative; +} + +#search .searchList li { + list-style:none; + float: left; + display: block; + width: 115px; + margin: 5px 10px 5px 20px; + *margin: 5px 10px 5px 15px; + padding:0; + font-size: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + position: relative; + vertical-align: top; + text-align: center; + overflow: hidden; + cursor: pointer; + filter: alpha(Opacity=100); + -moz-opacity: 1; + opacity: 1; + border: 2px solid #eee; +} + +#search .searchList li.selected { + filter: alpha(Opacity=40); + -moz-opacity: 0.4; + opacity: 0.4; + border: 2px solid #00a0e9; +} + +#search .searchList li p { + background-color: #eee; + margin: 0; + padding: 0; + position: relative; + width:100%; + height:115px; + overflow: hidden; +} + +#search .searchList li p img { + cursor: pointer; + border: 0; +} + +#search .searchList li a { + color: #999; + border-top: 1px solid #F2F2F2; + background: #FAFAFA; + text-align: center; + display: block; + padding: 0 5px; + width: 105px; + height:32px; + line-height:32px; + white-space:nowrap; + text-overflow:ellipsis; + text-decoration: none; + overflow: hidden; + word-break: break-all; +} + +#search .searchList a:hover { + text-decoration: underline; + color: #333; +} +#search .searchList .clearFloat{ + clear: both; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.html new file mode 100644 index 0000000..f490247 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.html @@ -0,0 +1,127 @@ + + + + + neditor图片对话框 + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    + + +
    +
    + +   px +   px + +
    +
    +
    +
    + + px +
    +
    + + px +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + + + + +
    +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.js new file mode 100644 index 0000000..18f70c9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/image.js @@ -0,0 +1,1131 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var remoteImage, + uploadImage, + onlineImage, + searchImage; + + window.onload = function () { + initTabs(); + initAlign(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + var img = editor.selection.getRange().getClosedNode(); + if (img && img.tagName && img.tagName.toLowerCase() == 'img') { + setTabFocus('remote'); + } else { + setTabFocus('upload'); + } + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id'); + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'remote': + remoteImage = remoteImage || new RemoteImage(); + break; + case 'upload': + setAlign(editor.getOpt('imageInsertAlign')); + uploadImage = uploadImage || new UploadImage('queueList'); + break; + case 'online': + setAlign(editor.getOpt('imageManagerInsertAlign')); + onlineImage = onlineImage || new OnlineImage('imageList'); + onlineImage.reset(); + break; + case 'search': + setAlign(editor.getOpt('imageManagerInsertAlign')); + searchImage = searchImage || new SearchImage(); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var remote = false, list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'remote': + list = remoteImage.getInsertList(); + break; + case 'upload': + list = uploadImage.getInsertList(); + var count = uploadImage.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineImage.getInsertList(); + break; + case 'search': + list = searchImage.getInsertList(); + remote = true; + break; + } + + if(list) { + editor.execCommand('insertimage', list); + remote && editor.fireEvent("catchRemoteImage"); + } + }; + } + + + /* 初始化对其方式的点击事件 */ + function initAlign(){ + /* 点击align图标 */ + domUtils.on($G("alignIcon"), 'click', function(e){ + var target = e.target || e.srcElement; + if(target.className && target.className.indexOf('-align') != -1) { + setAlign(target.getAttribute('data-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) { + domUtils.addClass(aligns[i], 'focus'); + $G("align").value = aligns[i].getAttribute('data-align'); + } else { + domUtils.removeClasses(aligns[i], 'focus'); + } + } + } + /* 获取对齐方式 */ + function getAlign(){ + var align = $G("align").value || 'none'; + return align == 'none' ? '':align; + } + + + /* 在线图片 */ + function RemoteImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + RemoteImage.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + }, + initContainer: function () { + this.dom = { + 'url': $G('url'), + 'width': $G('width'), + 'height': $G('height'), + 'border': $G('border'), + 'vhSpace': $G('vhSpace'), + 'title': $G('title'), + 'align': $G('align') + }; + var img = editor.selection.getRange().getClosedNode(); + if (img) { + this.setImage(img); + } + }, + initEvents: function () { + var _this = this, + locker = $G('lock'); + + /* 改变url */ + domUtils.on($G("url"), 'keyup', updatePreview); + 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'); + $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'); + $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); + locker.setAttribute('data-proportion', proportion); + }); + + function updatePreview(){ + _this.setPreview(); + } + }, + updateLocker: function(){ + var width = $G('width').value, + height = $G('height').value, + locker = $G('lock'); + if(width && height && width == parseInt(width) && height == parseInt(height)) { + locker.disabled = false; + locker.title = ''; + } else { + locker.checked = false; + locker.disabled = 'disabled'; + locker.title = lang.remoteLockError; + } + }, + setImage: function(img){ + /* 不是正常的图片 */ + if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; + + var wordImgFlag = img.getAttribute("word_img"), + src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), + align = editor.queryCommandValue("imageFloat"); + + /* 防止onchange事件循环调用 */ + if (src !== $G("url").value) $G("url").value = src; + if(src) { + /* 设置表单内容 */ + $G("width").value = img.width || ''; + $G("height").value = img.height || ''; + $G("border").value = img.getAttribute("border") || '0'; + $G("vhSpace").value = img.getAttribute("vspace") || '0'; + $G("title").value = img.title || img.alt || ''; + setAlign(align); + this.setPreview(); + this.updateLocker(); + } + }, + getData: function(){ + var data = {}; + for(var k in this.dom){ + data[k] = this.dom[k].value; + } + return data; + }, + setPreview: function(){ + var url = $G('url').value, + ow = $G('width').value, + oh = $G('height').value, + border = $G('border').value, + title = $G('title').value, + preview = $G('preview'), + 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; + + if(url) { + preview.innerHTML = ''; + } + }, + getInsertList: function () { + var data = this.getData(); + if(data['url']) { + return [{ + src: data['url'], + _src: data['url'], + width: data['width'] || '', + height: data['height'] || '', + border: data['border'] || '', + floatStyle: data['align'] || '', + vspace: data['vhSpace'] || '', + alt: data['title'] || '', + style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" + }]; + } else { + return []; + } + } + }; + + + + /* 上传图片 */ + function UploadImage(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadImage.prototype = { + init: function () { + this.imageList = []; + 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('imageActionName')), + acceptExtensions = (editor.getOpt('imageAllowFiles') || [".png", ".jpg", ".jpeg", ".gif", ".bmp"]).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    "}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
    <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
    "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
    '+b.getLang("elementPathTip")+":
    "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("https://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
    '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=[],f=0;f
    '+(this.toolbars.length?'
    '+this.renderToolbarBoxHtml()+"
    ":"")+'
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('imageActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + /* 上传插件 */ + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + accept: { + title: 'Images', + extensions: acceptExtensions, + mimeTypes: 'image/jpeg,image/png,image/svg,image/webp,image/gif' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 默认 2 M + compress: false + }); + 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 (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $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) { + /* 选择文件后设置上传相关的url和自定义参数 */ + editor.getOpt("imageUploadService")(_this, editor).setUploadData(file); + + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= imageMaxSize) { + 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': + /* 设置Uploader配置项 */ + editor.getOpt("imageUploadService")(_this, editor).setUploaderOptions(uploader); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (object, data, headers) { + //这里可以通过data对象添加POST参数 + editor.getOpt("imageUploadService")(_this, editor).setFormData(object, data, headers); + }); + + 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, res) { + var $file = $('#' + file.id); + try { + if (editor.getOpt("imageUploadService")(_this, editor).getResponseSuccess(res)) { + _this.imageList.push(res); + $file.append(''); + } else { + $file.find('.error').text(res.message).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + 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('uploadComplete', function (file, ret) { + }); + + /* 上传按钮 */ + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + window.setTimeout(function() { + uploader.upload(); + }, 500); + } else if (state === 'paused') { + window.setTimeout(function() { + uploader.upload(); + }, 500); + } 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; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'), + imageSrcField = editor.getOpt("imageUploadService")(this, editor).imageSrcField || 'url', + imageSrc = '', + imageSrcFieldKeys = imageSrcField.split('.'); + + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + + if(imageSrcFieldKeys.length > 1) { + function setImageSrc(obj, keys, index) { + obj = obj[keys[index]]; + if (index < keys.length - 1) { + setImageSrc(obj, keys, index += 1) + } else { + imageSrc = obj; + } + } + + setImageSrc(data, imageSrcFieldKeys, 0); + } else { + imageSrc = data[imageSrcField]; + } + + list.push({ + src: prefix + imageSrc, + _src: prefix + imageSrc, + alt: data.original, + floatStyle: align + }); + } + return list; + } + }; + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + 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':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + 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) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + 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(){ + _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); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + + } + return list; + } + }; + + /*搜索图片 */ + function SearchImage() { + this.init(); + } + SearchImage.prototype = { + init: function () { + this.initEvents(); + }, + initEvents: function(){ + var _this = this; + + /* 点击搜索按钮 */ + domUtils.on($G('searchBtn'), 'click', function(){ + var key = $G('searchTxt').value; + if(key && key != lang.searchRemind) { + _this.getImageData(); + } + }); + /* 点击清除妞 */ + domUtils.on($G('searchReset'), 'click', function(){ + $G('searchTxt').value = lang.searchRemind; + $G('searchListUl').innerHTML = ''; + $G('searchType').selectedIndex = 0; + }); + /* 搜索框聚焦 */ + domUtils.on($G('searchTxt'), 'focus', function(){ + var key = $G('searchTxt').value; + if(key && key == lang.searchRemind) { + $G('searchTxt').value = ''; + } + }); + /* 搜索框回车键搜索 */ + domUtils.on($G('searchTxt'), 'keydown', function(e){ + var keyCode = e.keyCode || e.which; + if (keyCode == 13) { + $G('searchBtn').click(); + } + }); + + /* 选中图片 */ + domUtils.on($G('searchList'), 'click', function(e){ + var target = e.target || e.srcElement, + li = target.parentNode.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 改变图片大小 */ + scale: function (img, w, h) { + var ow = img.width, + oh = img.height; + + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + }, + getImageData: function(){ + var _this = this, + key = $G('searchTxt').value, + type = $G('searchType').value, + keepOriginName = editor.options.keepOriginName ? "1" : "0", + pageNum = $G('pageNum').value, + url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + key + "&cl=2" + type + "&ie=utf-8&oe=utf-8&adpicid=&z=&ic=0&word=" + key + "&se=&tab=&width=&height=&istype=2&qc=&nc=1&fr=&pn=60&rn=" + pageNum + "&gsm=78&" + new Date() + "="; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'onsuccess':function(json){ + var list = []; + if(json && json.data) { + for(var i = 0; i < json.data.length; i++) { + if(json.data[i].objURL) { + list.push({ + title: json.data[i].fromPageTitleEnc, + src: json.data[i].thumbURL, + url: json.data[i].thumbURL + }); + } + } + } + _this.setList(list); + }, + 'onerror':function(){ + $G('searchListUl').innerHTML = lang.searchRetry; + } + }); + }, + /* 添加图片到列表界面上 */ + setList: function (list) { + var i, item, p, img, link, _this = this, + listUl = $G('searchListUl'); + + listUl.innerHTML = ''; + if(list.length) { + for (i = 0; i < list.length; i++) { + item = document.createElement('li'); + p = document.createElement('p'); + img = document.createElement('img'); + link = document.createElement('a'); + + img.onload = function () { + _this.scale(this, 113, 113); + }; + img.width = 113; + img.setAttribute('src', list[i].src); + + link.href = list[i].url; + link.target = '_blank'; + link.title = list[i].title; + link.innerHTML = list[i].title; + + p.appendChild(img); + item.appendChild(p); + item.appendChild(link); + listUl.appendChild(item); + } + } else { + listUl.innerHTML = lang.searchRetry; + } + }, + getInsertList: function () { + var child, + src, + align = getAlign(), + list = [], + items = $G('searchListUl').children; + for(var i = 0; i < items.length; i++) { + child = items[i].firstChild && items[i].firstChild.firstChild; + if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { + src = child.src; + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + } + return list; + } + }; + +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/alignicon.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/alignicon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..754755b1b6e2b37d6090f68b80e91867fdcf1042 GIT binary patch literal 16101 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..717c4865c90a959c6a0e9ad1af9c777d900a2e9c GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/success.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/image/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# + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + +
    px
    px
    + +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/internal.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/internal.js new file mode 100644 index 0000000..fb845c3 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/internal.js @@ -0,0 +1,81 @@ +(function () { + var parent = window.parent; + //dialog对象 + dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; + //当前打开dialog的编辑器实例 + editor = dialog.editor; + + UE = parent.UE; + + domUtils = UE.dom.domUtils; + + utils = UE.utils; + + browser = UE.browser; + + ajax = UE.ajax; + + $G = function ( id ) { + return document.getElementById( id ) + }; + //focus元素 + $focus = function ( node ) { + setTimeout( function () { + if ( browser.ie ) { + var r = node.createTextRange(); + r.collapse( false ); + r.select(); + } else { + node.focus() + } + }, 0 ) + }; + utils.loadFile(document,{ + href:"../../themes/" + 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 () { + + var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; + //针对静态资源 + for ( var i in lang["static"] ) { + var dom = $G( i ); + if(!dom) continue; + var tagName = dom.tagName, + content = lang["static"][i]; + if(content.src){ + //clone + 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) + } + switch ( tagName.toLowerCase() ) { + case "var": + dom.parentNode.replaceChild( document.createTextNode( content ), dom ); + break; + case "select": + var ops = dom.options; + 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] ); + } + break; + default : + domUtils.setAttributes( dom, content); + } + } + } ); + } + + +})(); + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/link/link.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/link/link.html new file mode 100644 index 0000000..8da8550 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/link/link.html @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/map.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/map.html new file mode 100644 index 0000000..a4c6a9f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/map.html @@ -0,0 +1,159 @@ + + + + + + + + + + +
    + + + + + + + + + +
    ::
    +
    + +
    + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/show.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/show.html new file mode 100644 index 0000000..b150898 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/map/show.html @@ -0,0 +1,118 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/balls.svg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/balls.svg new file mode 100644 index 0000000..07130c6 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/balls.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.css new file mode 100644 index 0000000..8ec98b9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.css @@ -0,0 +1,90 @@ +.wrapper{margin: 20px;} + +.searchBar{height:30px;text-align:left;} +.searchBtn{ + font-size: 13px; + height: 28px; + border-radius: 5px; + border: 1px solid #3498db; + width: 80px; + background-color: #3498db; + color: #fff; + margin-left: 6px; +} + +.resultBar{width:589px;height:357px;margin-top: 20px;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} + +.listPanel{overflow: hidden;} +.panelon{display:block;} +.paneloff{display:none} + +.page{width:220px;margin:20px auto;overflow: hidden;display: flex;justify-content: center;flex-direction: row-reverse;} +.pageon{float:right;width:26px;line-height:26px;height:26px;margin-right: 5px;border: none;color: #fff;font-weight: bold;text-align:center; + background-color: #3498db;border-radius: 5px;} +.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; + color: #ccc;margin-right: 5px;text-decoration: none;text-align:center;} + +.m-box{width:589px;} +.m-m{float: left;line-height: 26px;height: 26px;display: flex;} +.m-h{height:30px;line-height:30px;padding-left: 70px;background-color:#f3f3f3;font-weight: bold;font-size: 12px;color: #666;} +.m-l{float:left;width:40px; margin-top: 8px; margin-left: 17px;margin-right: 10px;} +.m-t{float:left;width:142px;} +.m-s{float:left;width:142px;} +.m-z{float:left;width:142px;} +.m-try-t{float: left;width: 60px;;} + +/*.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}*/ +.m-try { + width: 4px; + display: flex; + height: 0; + border-top: 5px solid transparent; + border-left: 8px solid #9e9e9e; + border-bottom: 5px solid transparent; + margin-top: 8px; +} +/*.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}*/ + +.m-trying { + display: flex; + width: 3px; + height: 12px; + background-color: #3498db; + margin-top: 8px; + position: relative; +} +.m-trying:after { + width: 3px; + height: 12px; + background-color: #3498db; + left : 5px; + display: block; + position: absolute; + content: " "; +} +.loading{ + width: 113px; + height: 95px; + font-size: 7px; + margin: 114px auto; + background: url(balls.svg) no-repeat; +} +.empty{ + width: 300px; + height: 40px; + padding: 2px; + margin: 157px auto; + line-height: 40px; + color: #666; + text-align: center; +} + +#J_searchName{ + height: 26px; + width: 295px; + border-radius: 5px; + border: 1px solid #ccc; +} +.listPanel input[type="radio"] { + background-color: #fff; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.html new file mode 100644 index 0000000..e7ef04f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 插入音乐 + + + + +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.js new file mode 100644 index 0000000..97cfc36 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/music/music.js @@ -0,0 +1,192 @@ +function Music() { + this.init(); +} +(function () { + var pages = [], + panels = [], + selectedItem = null; + Music.prototype = { + total:70, + pageSize:10, + dataUrl:"https://tingapi.b0.upaiyun.com/v1/restserver/ting?method=baidu.ting.search.common", + playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", + + init:function () { + var me = this; + domUtils.on($G("J_searchName"), "keyup", function (event) { + var e = window.event || event; + if (e.keyCode == 13) { + me.dosearch(); + } + }); + domUtils.on($G("J_searchBtn"), "click", function () { + me.dosearch(); + }); + }, + callback:function (data) { + var me = this; + me.data = data.song_list; + setTimeout(function () { + $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); + }, 300); + }, + dosearch:function () { + var me = this; + selectedItem = null; + var key = $G('J_searchName').value; + if (utils.trim(key) == "")return false; + key = encodeURIComponent(key); + me._sent(key); + }, + doselect:function (i) { + var me = this; + if (typeof i == 'object') { + selectedItem = i; + } else if (typeof i == 'number') { + selectedItem = me.data[i]; + } + }, + onpageclick:function (id) { + var me = this; + for (var i = 0; i < pages.length; i++) { + $G(pages[i]).className = 'pageoff'; + $G(panels[i]).className = 'paneloff'; + } + $G('page' + id).className = 'pageon'; + $G('panel' + id).className = 'panelon'; + }, + listenTest:function (elem) { + var me = this, + view = $G('J_preview'), + is_play_action = (elem.className == 'm-try'), + old_trying = me._getTryingElem(); + + if (old_trying) { + old_trying.className = 'm-try'; + view.innerHTML = ''; + } + if (is_play_action) { + elem.className = 'm-trying'; + view.innerHTML = me._buildMusicHtml(me._getUrl(true)); + } + }, + _sent:function (param) { + var me = this; + $G('J_resultBar').innerHTML = '
    '; + + utils.loadFile(document, { + src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), + tag:"script", + type:"text/javascript", + defer:"defer" + }); + }, + _removeHtml:function (str) { + var reg = /<\s*\/?\s*[^>]*\s*>/gi; + return str.replace(reg, ""); + }, + _getUrl:function (isTryListen) { + var me = this; + var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + + '&autoPlay='+isTryListen+'' + '&loop=true'; + return me.playerUrl + "?" + param; + }, + _getTryingElem:function () { + var s = $G('J_listPanel').getElementsByTagName('span'); + + for (var i = 0; i < s.length; i++) { + if (s[i].className == 'm-trying') + return s[i]; + } + return null; + }, + _buildMusicHtml:function (playerUrl) { + var html = ' 12) + return s.substring(0, 5) + '...'; + if (!s) s = " "; + return s; + }, + _rebuildData:function (data) { + var me = this, + newData = [], + d = me.pageSize, + itembox; + for (var i = 0; i < data.length; i++) { + if ((i + d) % d == 0) { + itembox = []; + newData.push(itembox) + } + itembox.push(data[i]); + } + return newData; + }, + _renderTemplate:function (data) { + var me = this; + if (data.length == 0)return '
    ' + lang.emptyTxt + '
    '; + data = me._rebuildData(data); + var s = [], p = [], t = []; + s.push('
    '); + p.push('
    '); + for (var i = 0, tmpList; tmpList = data[i++];) { + panels.push('panel' + i); + pages.push('page' + i); + if (i == 1) { + s.push('
    '); + if (data.length != 1) { + t.push('
    ' + (i ) + '
    '); + } + } else { + s.push('
    '); + t.push('
    ' + (i ) + '
    '); + } + s.push('
    '); + s.push('
    ' + lang.chapter + '' + lang.singer + + '' + lang.special + '' + lang.listenTest + '
    '); + for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { + s.push(''); + } + s.push('
    '); + s.push('
    '); + } + t.reverse(); + p.push(t.join('')); + s.push('
    '); + p.push('
    '); + return s.join('') + p.join(''); + }, + exec:function () { + var me = this; + if (selectedItem == null) return; + $G('J_preview').innerHTML = ""; + editor.execCommand('music', { + url:me._getUrl(false), + width:400, + height:95 + }); + } + }; +})(); + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/preview/preview.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/preview/preview.html new file mode 100644 index 0000000..42849bb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/preview/preview.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
    + +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/addimg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/addimg.png new file mode 100644 index 0000000000000000000000000000000000000000..03a87135bab65fa2633156789ed0f4a906d6c48b GIT binary patch literal 628 zcmV-)0*n2LP)LlfO?CQ4q&JZ};uuDR(Ob))OTXC`@eBz!@zF z+HgV%Hu^952Y4l=g(2n$i9ae63lhXcqYyM9#DWA|@b(rsk9+f;1wl+yj4;&{^Z8EZ zJ2T2T$4NrJSzdPEvg}xJM?R0MBtb zF(d!&V7bvXOyyt%V+_VxCMVl|G4K0L2`GSu4nDMoTw7VvC?4}634OnCk@;@JLnc3FEH3Q_>)m5edixGKIt7FkHcF4 O0000LlRapYQ51%sn|z5A!;eU>8r+{HJr7$}yPjp=Xw4K1Ua#f7iuXvM4a5!@5mnb6Jy5;4f zq^GClVK^)=CMV^$zAd#p)X9w(bjvTJaV6W6Y< zHElN4Fd9h58CQpMwnbCF0&&|nt--a91jfSjz&XY;RG1F=2?rH8AKl0($O&qx#;_=`eAIGPkrEiZ*t@m5rL2F^2%$?h~iba07-RvG6!+$Z#-hF)* z*wUa-u1NavBOIv|-+OxK963tx@)g|sy&J-7BIJt|`BL~qAQEA|QlZmXAv_UdV92*A z3}9Ln#}*y)LEQe`d0jImLzJL!8vd uXg6z^rfGozG)+U(G#m~GPN$P@*OZ@vE+GjWfY&Ji0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzf=NU{R5(w?lReA9Q5c8MckvC3CRr4rWH3k}lHF)Du^B`%h=dG6 zguL4*gWaS^NGOSZ`kg^f{XGLc^_;r8yYF+Z`@GZ<;@`(&vA|?9`3kyXJRalQL01fi zLp&Z2WV6|iphH*mdOh6lcNB}ox0FgHl*{E8%(<2hUD0m0al73R4u_FWr%|m|U({+f zG#U+byIr{(BXid2&=t*Q6W8k%I-L%By=@ zm&*kzl?rOL8d|Lu!C(;4XcW0z4*h-~yWI|l!$HRBbc(@XARW4*QmNo{I>BPGNUT;X zoK7cPE*HFBFG8UZX0sXA>ow-{IbyLG;_u=hIe}(G|5Z=0000LlRs}0K@i1%ySKhz{O1fJ$i!Hn&_fERK@ibd zbP=ieOf+<);v-NHQBXy)C?X|I5W=L1LJA~<17{zJ<9KG5!k{1wk%*@njpn`4doyD~ z2uu@pDm37>c6P$IEISwYQmKSH==W(ZE}o0v_2wonsNzFl`^D^kf$u!}LQutt_h<;j zar~DygE3(2IEO&+5CUiji1#=ZK||o}yDIhi33JuKDcl%rWQp=QqMSoVf(}M_9S>Cz zoT{SUv$l2tmn+e19`WG*;h4Z$Tz-aRexA6TaMJJ5+ucP5L)3dz6(_2Uyk~!Jk0eQW z^|DCs>qV~3L9K47-Y79!zJ;+$TrLymKV!r*@*Yt=mC$IUKuQ!vbUH=4-H3MEa`k$j zhnMqIZzgp1JzK3F1=nNY_D=~Sf_Tr$%FJ)(9slx>D9Y%(@ACbV<1iJj6ctqv?-3E) zNCY1O8yiQHJFtexf@?2R{@BJ?i!}ygEd8hVIIh)jS(Xvyay))=@XwvUSz2QG?!rX< zd8>shILEWq)iaM~SSaveeSM-{Y&0;#;gB>(^b literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/empty.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0375196257ac3c859373b3ebebbabe6f16105587 GIT binary patch literal 519 zcmV+i0{H!jP)Ll09-0Q4oZ`x4R&OpbGFo(29U6rOK6a3v&a7 z_DM+WM6pqhRKi!#4G@N6DKtGpus^URVFFJ&)8BN@dnqD#NM-jmudlA&{11>?2dmYJ zq9_;)28>1{cDr5ttSY|V-7%R=l6xQ-X2x_n?EuB!wC#2qd7hIOIeC_oWf>_YHk(bz zMaX$Q9;cHIE-o(@kBWl9lL2S1&UiW;@}sKQ@Am+B1TJ9`@6XQ{M-IY$At_veyCZkh z2#A0HNw}-$pgZDtT-F2Ob2F>OW^-Ac+hlWdQI_N05jzL&!X;$ZZFh;o!GLIH95bB; zNW$DPvl`UcHyv6%9(DgT!0PRm7pMi8VTV70h}zld2%+{!9YE@DjHv&@KO#8t7UG=) zNe~cC4#|6f?iJh}mm_H@6X8y{FD13$rOa5b*F8Xr2vSNfffuvc>}^?=9}+-HBod@% zcfjrE+jln~Z$1J0i1=~@0GiDNLcJQPqF|2002ov JPDHLkV1nZ!(%Jw3 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/emptyH.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/emptyH.png new file mode 100644 index 0000000000000000000000000000000000000000..838ca723119499465f29e881a745f4d8a051e22c GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cMyUXw5Z8P6?!9~W&Mteod+EB17cYi1ZuhR-c=YJe)QJao zoqKZj)+^_N)hDk%kM7vxU%SOIZ)HU5u5H`4rB6P*;n@A6IVa_d+Vkc6Z`Cb3f9%S$swHPL zrX0?laV)ZJmtD^C)Jcaf-hX@G%JYPteGa)RpT7ON{^-5+yDx<|?_9t8V%D^yUKQ)t z9lf{e;O)TrtuBRYf*Q8PcI>guUcUO!os-vJoWJvW)22-q?!7sF_4&EmuM_+BN4D;= z&slDtz2el37q(f;)*ZQN z=N^Z=m4&lU_*8HD|Np=0=2?Njpo}XC@(TuXX$KfKp3qYR+O*iy#WAGfR#Jy6Gf%)R z4qpdHXJJo=hVYQC!~KV2MYI-VrJh`QUQ;LM&1;6x#M9b~#Ma7WK4-jqNPV%W#5&yr zqHMw)6OH>XB&SZ@(#H8io2zq2%cn~1gDgj6o15p{xKW{#z;wrkO(^fonRSm08Z|^C z74@VuOY>$h1UKwir)j@Gk;A27;=wb==bbzq+_Gcd9- Y9E)+P-Fqc+HPE>Xp00i_>zopr0P;w4-2eap literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/eraser.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..63e87cecb90ed3ac0e4acbc257c6dddae5311e09 GIT binary patch literal 43271 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
    h>dGcdSlWeEFl}k2MrUUS^bR;=$@vE@GsDa9 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/redoH.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/redoH.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f33d38a3d11ce10447830ce409a0890ecad264 GIT binary patch literal 536 zcmV+z0_XjSP)LlRro!K@`S+vst67f)FhPH9;i)IZy=QifsP%Q^7=yx~FIm{DVqJh#8yN2on55 zK6niC-hAJD?=d5!lvD$)D)w6iOxq2aw)?eGO}w=Q({?4W2uyj7_3$nS0b08|CV^$s zcEc4Nn6?`Q=790%;vf4s`J3kd?(rXB%yX=pvVdv3pMkYfEM|mb9T>VsU5&ud zHR{zG?2nRrWd3EgfMHFMKLD%wc#k35+Fxy@XQ-Rrp?E*AqO06&F51~7BhBb9F%{CA zdmJPWQouxT{!<~+LW6%qD0@z^RN@x6tuTZA%{2bb;RZ0`Io4$$5UD%$(J!*|z&Fpa za?fuyZTGrH*P6~!{%Io9+`*3VLY0+{d|s}SVM0@>uRpF)fd0F8hF zgjKx=6b8R6tZy&P{3zz{+r)RSrIc5o-hmLJL6K@zgnPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzF-b&0R5(wyQ*Ba%Fc9qxdXyf4gZLw&GE-Zj!G1tU_|R6xf-Mzw ztkqtHqs45L76*QWA2RbM@MiON_wCZ@{O7ZK+oR9deF10dJg3G9@~FqDz{krMf6sUA zM9%t%Ge#w-z&79UR#oU%de6AjwTpqy2_YI|tk+7Q3^s=6YMHYnLz^_O1&3i+?2mwN&7$-;U#S!Q9m{<3SMoh?w@E00BVyxZ+RCwFLF4JWG!G zOmY$;RtOYQz#3aQ*W5#AiVywHJM`%L@4v^Nzsx*vCin1#lEeQmy!?Oq z<)3F?{!hO2^5n}ed515YeEH$t2cY2pvoHVmpTDyB(*MfC{~Hedzw_aD z|6#-Q0^JY(AHHp1XAM(|igs|-_4sV4KK0;p@m*h1S8U_x=m<-jvZ+JR;{IBr4+&>f zSEaF?oUyAYF85cQWPSYh#i0ycQ4jWf_nW(8?Ylo51`N|SiTvgEn+*yn22WQ%mvv4F FO#t{IsF?r& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/size.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/size.png new file mode 100644 index 0000000000000000000000000000000000000000..8366845059c94089aef92aa3aeeee79e242732eb GIT binary patch literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^Iv_R&Gmw0`s%8O@k}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^@^W{ zcO82EKXB&y{MKgq%sz{fI)==3d^r;&6MFPw(_IV71M|xGvv%v3_j2X!dGPP#L^Pja~hhtj9%m4qMKL2y%^Z&`q z=WTfUnlHCkByWLuLg&Z-{~5B^aHX`VrcW0wpCeN?gQ0YF|Ek^0Wm|o-iywUa@%aCL z)%2NBbM`Q#t<@@?!;!p&H+$mBlaI^_YB&B#>#{8s<9mu2JY zGd5l4N$XHbnR5BlcfNx4cmMupDBR$-Y>#a9e1@#m@BaT>^X!XNW-&wBx||KyZ~Xty zRkTzmtwcMm#U?#ZF@LgB=2WKq4bg@9JjHY3ON;;i|F13o-WwPzN)S72Y1Qc%6 zcJYYNXcAOgEAc9NiWcu<*Ig$*&7M7NgR1o_Dx<9^s3W?&d{SwZWC%AQ=Vq^CQZBv#02ZVBfRNMNWq`8qHxO6)(-0}P(7 KelF{r5}E+VpO-NJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/undo.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/images/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..084c7cc73f4058c8084e5ea3ab4e51fd105b7991 GIT binary patch literal 444 zcmV;t0YmPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzI!Q!9R5(v#U>KAjGc&U&EiH|oEXQSKWlhM*$@yPcSjb6|0imIx zY(ULRYin!&1L^-HX$ETG0XlnEb#?Xs>C>nGudAyA8-k93YSsZ=r-))WP>}=>pQ);< z`afyXB(MQ<=FIuOaN)xL%ayrnkSp|9?S2!GDaj0*gvQ(FlretOfvW z6$E0%n3$MFK-vn3oq^aBh<%|nh;Lrlg%pxVI0RlGdnYDm%@o%7K^0FfxN6OiJOCi zi#RxuqoSN#Tot)WQew-+VO#$I2f6IQORU!0vXfFu4udr_4m%hxc|CaQ+tc&%`}Y0* zp6?@=rpaH1_@`<>2#kh5+8+kyfa~8Vm_`&Qf&1?$uoEc2lIZmeVHg0~PYAMri0Se6 zisfa<1zrI21FQgkJAn`w4d(-ql&7Fh^q1h21YD9xhMb<=^2_=%c1k>YpaK0r=t;rC zt=CtVDk}a`Zc&w=rjAAzFb_055%guKXWR05;yaef&C8{>rA7h90VLo8XqA)a5z{mR zl$UZFi*u7y-#5(Rpt#aUb$tcVwXHUL6R&`FK~-0c!y{7ZV&N?eU3VYvo=oj*?jtLb z0%Y5tQ3JY+q#F9ffd-5m?iOx)5tafl#kIoD<11{3}kbno$;nIA;p5?+| zPj_N{G3Qm3Edm$dw4eYE%Yq5$7Rj9jP5AfU_y|@8ao4ld0UH1S002ovPDHLkV1l6! B+-3j( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.css new file mode 100644 index 0000000..f5d35d8 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.css @@ -0,0 +1,372 @@ +/*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; +} + +/*module +*/ +.main { + margin: 20px 20px 0; + overflow: hidden; +} + +.hot { + float: left; +} + +.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; + margin-right: 18px; +} + +.drawToolbar { + float: right; + width: 175px; + height: 372px; + overflow: hidden; +} + +.colorBar { + margin-top: 10px; + margin-left: 10px; + font-size: 12px; + text-align: center; +} + +#J_removeImg { + display: block; + margin-top: 18px; +} + +#J_addImg { + display: block; + margin-top: 16px; +} + +.colorBar #J_colorList tr { + height: 32px; +} + +.colorBar a { + display: block; + width: 16px; + height: 16px; + border: 1px solid #1006F1; + border-radius: 8px; + box-shadow: 2px 2px 5px #d3d6da; + opacity: 0.6 +} + +.sectionBar { + margin-top: 20px; + font-size: 12px; + text-align: center; + display: flex; + justify-content: center; + align-items: 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;}*/ + +.size1 { + width: 4px; + height: 4px; + border-radius: 2px; + text-indent: -999px; + opacity: 0.3; + display: block; + background-color: #3498db; + margin-right: 17px; + margin-left: 15px; +} + +.size2 { + width: 8px; + height: 8px; + border-radius: 4px; + text-indent: -999px; + opacity: 0.3; + display: block; + margin-right: 17px; + background-color: #3498db; + +} + +.size3 { + width: 12px; + height: 12px; + border-radius: 6px; + text-indent: -999px; + opacity: 0.3; + display: block; + background-color: #3498db; + margin-right: 17px; +} + +.size4 { + width: 16px; + height: 16px; + border-radius: 8px; + text-indent: -999px; + opacity: 0.3; + display: block; + background-color: #3498db; +} + +.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: 410px; + z-index: 1000; +} + +.maskLayer input { + border-radius: 2px; + border: 1px solid #ccc; + padding: 4px 12px; +} + +/*btn state +*/ +.previousStepH .icon { + display: inline-block; + width: 16px; + height: 16px; +} + +.previousStepH .text { + color: #888; + cursor: pointer; +} + +.previousStep .icon { + display: inline-block; + width: 16px; + height: 16px; +} + +.previousStep .text { + color: #ccc; + cursor: default; +} + +.nextStepH .icon { + display: inline-block; + width: 16px; + height: 16px; +} + +.nextStepH .text { + color: #888; + cursor: pointer; +} + +.nextStep .icon { + display: inline-block; + width: 16px; + height: 16px; +} + +.nextStep .text { + color: #ccc; + cursor: default; +} + +.clearBoardH .icon { + display: inline-block; + width: 16px; + height: 16px; + /*background-image: url('images/empty.png');*/ + cursor: default; +} + +.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; +} + +.scaleBoardH .text { + color: #888; + cursor: pointer; +} + +.scaleBoard .icon { + display: inline-block; + width: 16px; + height: 16px; +} + +.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: #fff; + cursor: default; + padding: 7px 12px; + border-radius: 6px; + background-color: #f25f5f; +} + +.addImgH .icon { + vertical-align: top; + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/addimg.png') +} + +.addImgH .text { + color: #888; + cursor: pointer; + padding: 7px 12px; + border-radius: 6px; + background-color: #f3f3f3; +} + +/*icon +*/ +.brushIcon { + display: inline-block; + width: 16px; + height: 16px; + font-size: 16px; + margin-top: -5px; +} + +.eraserIcon { + display: inline-block; + width: 16px; + height: 16px; + font-size: 18px !important; + margin-top: -16px; +} + +.icon { + font-size: 18px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.html new file mode 100644 index 0000000..6e8db0e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.html @@ -0,0 +1,100 @@ + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + 1 + 3 + 5 + 7 +
    +
    + + 1 + 3 + 5 + 7 +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js new file mode 100644 index 0000000..c2e5cd5 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js @@ -0,0 +1,683 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-5-22 + * Time: 上午11:38 + * To change this template use File | Settings | File Templates. + */ +var scrawl = function (options) { + options && this.initOptions(options); +}; +(function () { + var canvas = $G("J_brushBoard"), + context = canvas.getContext('2d'), + drawStep = [], //undo redo存储 + drawStepIndex = 0; //undo redo指针 + + scrawl.prototype = { + isScrawl:false, //是否涂鸦 + brushWidth:-1, //画笔粗细 + brushColor:"", //画笔颜色 + + initOptions:function (options) { + var me = this; + me.originalState(options);//初始页面状态 + me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 + + me._addBoardListener(options.saveNum);//添加画板处理 + me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 + me._addColorBarListener();//添加颜色选择处理 + me._addBrushBarListener();//添加画笔大小处理 + me._addEraserBarListener();//添加橡皮大小处理 + me._addAddImgListener();//添加增添背景图片处理 + me._addRemoveImgListenter();//删除背景图片处理 + me._addScalePicListenter();//添加缩放处理 + me._addClearSelectionListenter();//添加清楚选中状态处理 + + me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 + me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 + me._clearSelection();//清楚选中状态 + }, + + originalState:function (options) { + var me = this; + + me.brushWidth = options.drawBrushSize;//同步画笔粗细 + me.brushColor = options.drawBrushColor;//同步画笔颜色 + + context.lineWidth = me.brushWidth;//初始画笔大小 + context.strokeStyle = me.brushColor;//初始画笔颜色 + context.fillStyle = "transparent";//初始画布背景颜色 + context.lineCap = "round";//去除锯齿 + context.fill(); + }, + _buildToolbarColor:function (colorList) { + var tmp = null, arr = []; + arr.push(""); + for (var i = 0, color; color = colorList[i++];) { + if ((i - 1) % 5 == 0) { + if (i != 1) { + arr.push(""); + } + arr.push(""); + } + tmp = '#' + color; + arr.push(""); + } + arr.push("
    "); + $G("J_colorBar").innerHTML = arr.join(""); + }, + + _addBoardListener:function (saveNum) { + var me = this, + margin = 0, + startX = -1, + startY = -1, + isMouseDown = false, + isMouseMove = false, + isMouseUp = false, + buttonPress = 0, button, flag = ''; + + margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex += 1; + + domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { + button = browser.webkit ? e.which : buttonPress; + switch (e.type) { + case 'mousedown': + buttonPress = 1; + flag = 1; + isMouseDown = true; + isMouseUp = false; + isMouseMove = false; + me.isScrawl = true; + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + break; + case 'mousemove' : + if (!flag && button == 0) { + return; + } + if (!flag && button) { + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + flag = 1; + } + if (isMouseUp || !isMouseDown) { + return; + } + var endX = e.clientX - margin, + endY = e.clientY - margin; + + context.moveTo(startX, startY); + context.lineTo(endX, endY); + context.stroke(); + startX = endX; + startY = endY; + isMouseMove = true; + break; + case 'mouseup': + buttonPress = 0; + if (!isMouseDown)return; + if (!isMouseMove) { + context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); + context.fillStyle = context.strokeStyle; + context.fill(); + } + context.closePath(); + me._saveOPerate(saveNum); + isMouseDown = false; + isMouseMove = false; + isMouseUp = true; + startX = -1; + startY = -1; + break; + case 'mouseout': + flag = ''; + buttonPress = 0; + if (button == 1) return; + context.closePath(); + break; + } + }); + }, + _addOPerateListener:function (saveNum) { + var me = this; + domUtils.on($G("J_previousStep"), "click", function () { + if (drawStepIndex > 1) { + drawStepIndex -= 1; + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex - 1], 0, 0); + // me.btn2Highlight("J_nextStep"); + // drawStepIndex == 1 && me.btn2disable("J_previousStep"); + } + }); + domUtils.on($G("J_nextStep"), "click", function () { + if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex], 0, 0); + drawStepIndex += 1; + // me.btn2Highlight("J_previousStep"); + // drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); + } + }); + domUtils.on($G("J_clearBoard"), "click", function () { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + drawStep = []; + me._saveOPerate(saveNum); + drawStepIndex = 1; + me.isScrawl = false; + // me.btn2disable("J_previousStep"); + // me.btn2disable("J_nextStep"); + // me.btn2disable("J_clearBoard"); + }); + }, + _addColorBarListener:function () { + var me = this; + domUtils.on($G("J_colorBar"), "click", function (e) { + var target = me.getTarget(e), + color = target.title; + if (!!color) { + me._addColorSelect(target); + + me.brushColor = color; + context.globalCompositeOperation = "source-over"; + context.lineWidth = me.brushWidth; + context.strokeStyle = color; + } + }); + }, + _addBrushBarListener:function () { + var me = this; + domUtils.on($G("J_brushBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.globalCompositeOperation = "source-over"; + context.lineWidth = parseInt(size); + context.strokeStyle = me.brushColor; + me.brushWidth = context.lineWidth; + } + }); + }, + _addEraserBarListener:function () { + var me = this; + domUtils.on($G("J_eraserBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.lineWidth = parseInt(size); + context.globalCompositeOperation = "destination-out"; + context.strokeStyle = "#FFF"; + } + }); + }, + _addAddImgListener:function () { + var file = $G("J_imgTxt"); + if (!window.FileReader) { + $G("J_addImg").style.display = 'none'; + $G("J_removeImg").style.display = 'none'; + $G("J_sacleBoard").style.display = 'none'; + } + domUtils.on(file, "change", function (e) { + var frm = file.parentNode; + addMaskLayer(lang.backgroundUploading); + + var target = e.target || e.srcElement, + reader = new FileReader(); + reader.onload = function(evt){ + var target = evt.target || evt.srcElement; + ue_callback(target.result, 'SUCCESS'); + }; + reader.readAsDataURL(target.files[0]); + frm.reset(); + }); + }, + _addRemoveImgListenter:function () { + var me = this; + domUtils.on($G("J_removeImg"), "click", function () { + $G("J_picBoard").innerHTML = ""; + // me.btn2disable("J_removeImg"); + // me.btn2disable("J_sacleBoard"); + }); + }, + _addScalePicListenter:function () { + domUtils.on($G("J_sacleBoard"), "click", function () { + var picBoard = $G("J_picBoard"), + scaleCon = $G("J_scaleCon"), + img = picBoard.children[0]; + + if (img) { + if (!scaleCon) { + picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; + img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; + var scale = new ScaleBoy(); + picBoard.appendChild(scale.init()); + scale.startScale(img); + } else { + if (scaleCon.style.visibility == "visible") { + scaleCon.style.visibility = "hidden"; + picBoard.style.position = ""; + picBoard.style.zIndex = ""; + } else { + scaleCon.style.visibility = "visible"; + picBoard.style.cssText += "position:relative;z-index:999"; + } + } + } + }); + }, + _addClearSelectionListenter:function () { + var doc = document; + domUtils.on(doc, 'mousemove', function (e) { + if (browser.ie && browser.version < 11) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + }); + }, + _clearSelection:function () { + var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; + for (var i = 0, group; group = list[i++];) { + domUtils.unSelectable($G(group)); + } + }, + + _saveOPerate:function (saveNum) { + var me = this; + if (drawStep.length <= saveNum) { + if(drawStepIndex"); + } + scale.innerHTML = arr.join(""); + return scale; + } + + var rect = [ + //[left, top, width, height] + [1, 1, -1, -1], + [0, 1, 0, -1], + [0, 1, 1, -1], + [1, 0, -1, 0], + [0, 0, 1, 0], + [1, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + ScaleBoy.prototype = { + init:function () { + _appendStyle(); + var me = this, + scale = me.dom = _getDom(); + + me.scaleMousemove.fp = me; + domUtils.on(scale, 'mousedown', function (e) { + var target = e.target || e.srcElement; + me.start = {x:e.clientX, y:e.clientY}; + if (target.className.indexOf('hand') != -1) { + me.dir = target.className.replace('hand', ''); + } + domUtils.on(document.body, 'mousemove', me.scaleMousemove); + e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; + }); + domUtils.on(document.body, 'mouseup', function (e) { + if (me.start) { + domUtils.un(document.body, 'mousemove', me.scaleMousemove); + if (me.moved) { + me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); + } + delete me.start; + delete me.moved; + delete me.dir; + } + }); + return scale; + }, + startScale:function (objElement) { + var me = this, Idom = me.dom; + + Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; + me.scalingElement = objElement; + }, + updateScaledElement:function (objStyle) { + var cur = this.scalingElement, + pos = objStyle.position, + size = objStyle.size; + if (pos) { + typeof pos.x != 'undefined' && (cur.style.left = pos.x); + typeof pos.y != 'undefined' && (cur.style.top = pos.y); + } + if (size) { + size.w && (cur.style.width = size.w); + size.h && (cur.style.height = size.h); + } + }, + updateStyleByDir:function (dir, offset) { + var me = this, + dom = me.dom, tmp; + + rect['def'] = [1, 1, 0, 0]; + 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'; + } + if (dir === 'def') { + me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); + } + }, + scaleMousemove:function (e) { + var me = arguments.callee.fp, + start = me.start, + dir = me.dir || 'def', + offset = {x:e.clientX - start.x, y:e.clientY - start.y}; + + me.updateStyleByDir(dir, offset); + arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; + arguments.callee.fp.moved = 1; + }, + _validScaledProp:function (prop, value) { + var ele = this.dom, + wrap = $G("J_picBoard"); + + 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; + } + } + }; +})(); + +//后台回调 +function ue_callback(url, state) { + var doc = document, + picBorard = $G("J_picBoard"), + img = doc.createElement("img"); + + //图片缩放 + function scale(img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + } + + //移除遮罩层 + removeMaskLayer(); + //状态响应 + if (state == "SUCCESS") { + picBorard.innerHTML = ""; + img.onload = function () { + scale(this, 300); + picBorard.appendChild(img); + + var obj = new scrawl(); + // obj.btn2Highlight("J_removeImg"); + //trace 2457 + // obj.btn2Highlight("J_sacleBoard"); + }; + img.src = url; + } else { + alert(state); + } +} +//去掉遮罩层 +function removeMaskLayer() { + var maskLayer = $G("J_maskLayer"); + maskLayer.className = "maskLayerNull"; + maskLayer.innerHTML = ""; + dialog.buttons[0].setDisabled(false); +} +//添加遮罩层 +function addMaskLayer(html) { + var maskLayer = $G("J_maskLayer"); + dialog.buttons[0].setDisabled(true); + maskLayer.className = "maskLayer"; + maskLayer.innerHTML = html; +} +//执行确认按钮方法 +function exec(scrawlObj) { + if (scrawlObj.isScrawl) { + addMaskLayer(lang.scrawlUpLoading); + var base64 = scrawlObj.getCanvasData(); + var file = scrawlObj.dataURLtoFile(base64, 'scrawl-image.png'); + /* 上传涂鸦图片 */ + editor.getOpt("scrawlUploadService")(scrawlObj, editor).uploadScraw(file, base64, function(data) { + if (!scrawlObj.isCancelScrawl) { + if (data.responseSuccess) { + var imgObj = {}, +// srcField = data.scrawlSrcField || 'url', + src = '', +// srcFieldKeys = srcField.split('.'), + prefix = editor.options.scrawlUrlPrefix; + +// if(srcFieldKeys.length > 1) { +// function setSrc(obj, keys, index) { +// obj = obj[keys[index]]; +// if (index < keys.length - 1) { +// setSrc(obj, keys, index += 1) +// } else { +// src = obj; +// } +// } +// setSrc(data, srcFieldKeys, 0); +// } else { +// src = data[srcField]; +// } + + imgObj.src = prefix + src; + imgObj._src = prefix + src; + imgObj.alt = data.original || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + addMaskLayer(data.message + "   "); + } + } + }, function(err) { + addMaskLayer(lang.imageError + "   "); + }); + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.html new file mode 100644 index 0000000..8234fe2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,127 @@ + + + + + + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    :
    + +
    + + +
    +   +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :
    :
    + +
    + + + + +
    +   +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.js new file mode 100644 index 0000000..02fa46c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,170 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午12:29 + * To change this template use File | Settings | File Templates. + */ + +//清空上次查选的痕迹 +editor.firstForSR = 0; +editor.currentRangeForSR = null; +//给tab注册切换事件 +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + 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 body = tabBodys[j], + id = body.getAttribute( "id" ); + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +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++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +$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; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + var bk = editor.selection.getRange().createBookmark(); + $G('search-msg').innerHTML = lang.getEnd; + editor.selection.getRange().moveToBookmark(bk).select(); + + + } +}; +$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +$G("preFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + $G('search-msg').innerHTML = lang.getStart; + } +}; +$G("preReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +//替换 +$G("repalceBtn").onclick = function () { + editor.trigger('clearLastSearchResult'); + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt + }; + frCommond(obj); +}; +//全部替换 +$G("repalceAllBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt, + all:true + }; + var num = frCommond(obj); + if (num) { + $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); + } +}; +//执行 +var frCommond = function (obj) { + return editor.execCommand("searchreplace", obj); +}; +switchTab("searchtab"); + + +dialog.onclose = function(){ + editor.trigger('clearLastSearchResult') +}; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/snapscreen/snapscreen.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/snapscreen/snapscreen.html new file mode 100644 index 0000000..a05d101 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,60 @@ + + + + + + + + + +
    +

    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.html new file mode 100644 index 0000000..0b5c416 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.html @@ -0,0 +1,21 @@ + + + + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.js new file mode 100644 index 0000000..f4c155e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/spechars/spechars.js @@ -0,0 +1,57 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:09 + * 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("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} +]; +(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"; + domUtils.on(span, "click", function () { + var tmps = $G("tabHeads").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.className = ""; + } + tmps = $G("tabBodys").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.style.display = "none"; + } + this.className = "focus"; + $G(this.getAttribute("tabSrc")).style.display = ""; + }); + $G("tabHeads").appendChild(span); + domUtils.insertAfter(span, document.createTextNode("\n")); + var div = document.createElement("div"); + div.id = ci.name; + div.style.display = (i == 1) ? "" : "none"; + var cons = ci.content; + for (var j = 0, con; con = cons[j++];) { + var charSpan = document.createElement("span"); + charSpan.innerHTML = con; + domUtils.on(charSpan, "click", function () { + editor.execCommand("insertHTML", this.innerHTML); + dialog.close(); + }); + div.appendChild(charSpan); + } + $G("tabBodys").appendChild(div); + } +})(charsContent); +function toArray(str) { + return str.split(","); +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/dragicon.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/dragicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f26203bf3f0026891fc8374f109724a69eb38b22 GIT binary patch literal 304 zcmV-00nh%4P)p00001b5ch_0Itp) z=>Px#=t)FDR47x8lCciKP#A@KY2U+Oz-BN?3|$yZoaJ-YrY6>w+wB>;0|AN6r2r z_B6y2bQp%1X$_7DP`QFiq0z;_c3wk<3Lh&$^V;p?#e$PywxH71VT^XlHZ=jml#@|NVkRMLVaC0F_%) zcB=vWe$h}nSjAV$|0D + + + + + + + +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + + +
    • +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.js new file mode 100644 index 0000000..11dbee7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittable.js @@ -0,0 +1,237 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-12-19 + * Time: 下午4:55 + * To change this template use File | Settings | File Templates. + */ +(function () { + var title = $G("J_title"), + titleCol = $G("J_titleCol"), + caption = $G("J_caption"), + sorttable = $G("J_sorttable"), + autoSizeContent = $G("J_autoSizeContent"), + autoSizePage = $G("J_autoSizePage"), + tone = $G("J_tone"), + me, + preview = $G("J_preview"); + + var editTable = function () { + me = this; + me.init(); + }; + editTable.prototype = { + init:function () { + var colorPiker = new UE.ui.ColorPicker({ + editor:editor + }), + colorPop = new UE.ui.Popup({ + editor:editor, + content:colorPiker + }); + + title.checked = editor.queryCommandState("inserttitle") == -1; + titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; + caption.checked = editor.queryCommandState("insertcaption") == -1; + sorttable.checked = editor.queryCommandState("enablesort") == 1; + + var enablesortState = editor.queryCommandState("enablesort"), + disablesortState = editor.queryCommandState("disablesort"); + + sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); + sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; + + me.createTable(title.checked, titleCol.checked, caption.checked); + me.setAutoSize(); + me.setColor(me.getColor()); + + domUtils.on(title, "click", me.titleHanler); + domUtils.on(titleCol, "click", me.titleColHanler); + domUtils.on(caption, "click", me.captionHanler); + domUtils.on(sorttable, "click", me.sorttableHanler); + domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); + domUtils.on(autoSizePage, "click", me.autoSizePageHanler); + + domUtils.on(tone, "click", function () { + colorPop.showAnchor(tone); + }); + domUtils.on(document, 'mousedown', function () { + colorPop.hide(); + }); + colorPiker.addListener("pickcolor", function () { + me.setColor(arguments[1]); + colorPop.hide(); + }); + colorPiker.addListener("picknocolor", function () { + me.setColor(""); + colorPop.hide(); + }); + }, + + createTable:function (hasTitle, hasTitleCol, hasCaption) { + var arr = [], + sortSpan = '^'; + arr.push(""); + if (hasCaption) { + arr.push("") + } + if (hasTitle) { + arr.push(""); + if(hasTitleCol) { arr.push(""); } + for (var j = 0; j < 5; j++) { + arr.push(""); + } + arr.push(""); + } + for (var i = 0; i < 6; i++) { + arr.push(""); + if(hasTitleCol) { arr.push("") } + for (var k = 0; k < 5; k++) { + arr.push("") + } + arr.push(""); + } + arr.push("
    " + lang.captionName + "
    " + lang.titleName + "" + lang.titleName + "
    " + lang.titleName + "" + lang.cellsName + "
    "); + preview.innerHTML = arr.join(""); + this.updateSortSpan(); + }, + titleHanler:function () { + var example = $G("J_example"), + frg=document.createDocumentFragment(), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colCount = example.rows[0].children.length; + + if (title.checked) { + example.insertRow(0); + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + frg.appendChild(node); + } + example.rows[0].appendChild(frg); + + } else { + domUtils.remove(example.rows[0]); + } + me.setColor(color); + me.updateSortSpan(); + }, + titleColHanler:function () { + var example = $G("J_example"), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colArr = example.rows, + colCount = colArr.length; + + if (titleCol.checked) { + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + colArr[i].insertBefore(node, colArr[i].children[0]); + } + } else { + for (var i = 0; i < colCount; i++) { + domUtils.remove(colArr[i].children[0]); + } + } + me.setColor(color); + me.updateSortSpan(); + }, + captionHanler:function () { + var example = $G("J_example"); + if (caption.checked) { + var row = document.createElement('caption'); + row.innerHTML = lang.captionName; + example.insertBefore(row, example.firstChild); + } else { + domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); + } + }, + sorttableHanler:function(){ + me.updateSortSpan(); + }, + autoSizeContentHanler:function () { + var example = $G("J_example"); + example.removeAttribute("width"); + }, + autoSizePageHanler:function () { + var example = $G("J_example"); + var tds = example.getElementsByTagName(example, "td"); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + example.setAttribute('width', '100%'); + }, + updateSortSpan: function(){ + var example = $G("J_example"), + row = example.rows[0]; + + 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){ + var span = document.createElement("span"); + span.innerHTML = "^"; + cell.appendChild(span); + }); + } + }, + 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"; + return color; + }, + setColor:function (color) { + var example = $G("J_example"), + arr = domUtils.getElementsByTagName(example, "td").concat( + domUtils.getElementsByTagName(example, "th"), + domUtils.getElementsByTagName(example, "caption") + ); + + tone.value = color; + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + + }, + setAutoSize:function () { + var me = this; + autoSizePage.checked = true; + me.autoSizePageHanler(); + } + }; + + new editTable; + + dialog.onok = function () { + editor.__hasEnterExecCommand = true; + + var checks = { + title:"inserttitle deletetitle", + titleCol:"inserttitlecol deletetitlecol", + caption:"insertcaption deletecaption", + sorttable:"enablesort disablesort" + }; + editor.fireEvent('saveScene'); + 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]); + } + } + + editor.execCommand("edittable", tone.value); + 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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittd.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittd.html new file mode 100644 index 0000000..49a52f7 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittd.html @@ -0,0 +1,61 @@ + + + + + + + + +
    + + +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittip.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittip.html new file mode 100644 index 0000000..954f7bb --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 表格删除提示 + + + + +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/config.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/config.js new file mode 100644 index 0000000..20d0d4c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/config.js @@ -0,0 +1,42 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:00 + * To change this template use File | Settings | File Templates. + */ +var templates = [ + { + "pre":"pre0.png", + 'title':lang.blank, + 'preHtml':'

     欢迎使用UEditor!

    ', + "html":'

    欢迎使用UEditor!

    ' + + }, + { + "pre":"pre1.png", + 'title':lang.blog, + 'preHtml':'

    深入理解Range

    UEditor二次开发

    什么是Range

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


    Range能干什么

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

    ', + "html":'

    [键入文档标题]

    [键入文档副标题]

    [标题 1]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

    [标题 2]

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

    [标题 3]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


    ' + + }, + { + "pre":"pre2.png", + 'title':lang.resume, + 'preHtml':'

    WEB前端开发简历


    联系电话:[键入您的电话]

    电子邮件:[键入您的电子邮件地址]

    家庭住址:[键入您的地址]

    目标职位

    WEB前端研发工程师

    学历

    1. [起止时间] [学校名称] [所学专业] [所获学位]

    工作经验


    ', + "html":'

    [此处键入简历标题]


    【此处插入照片】


    联系电话:[键入您的电话]


    电子邮件:[键入您的电子邮件地址]


    家庭住址:[键入您的地址]


    目标职位

    [此处键入您的期望职位]

    学历

    1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    工作经验

    1. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

      2. [键入负责项目] [键入项目简介]

    2. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

    掌握技能

     [这里可以键入您所掌握的技能]

    ' + + }, + { + "pre":"pre3.png", + 'title':lang.richText, + 'preHtml':'

    [此处键入文章标题]

    图文混排方法

    图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!

    ', + "html":'


    [此处键入文章标题]

    图文混排方法

    1. 图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


    2. 图片居右,文字围绕图片排版

    方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


    3. 图片居中环绕排版

    方法:亲,这个真心没有办法。。。



    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!


    占位


    占位


    占位


    占位


    占位



    ' + }, + { + "pre":"pre4.png", + 'title':lang.sciPapers, + 'preHtml':'

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的


    ', + 'html':'

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    来个列表瞅瞅:

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的

    这里可以多行

    右边是图片

    绝对没有问题的,不信你也可以试试看


    ' + } +]; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c1d10ad1933e02086e8a1b3c807c7d1e57d51db GIT binary patch literal 84 zcmZ?wbhEHb6kw2GXkcLY|NsA)GiMZkvM_*v4u}BBFfeKN|6H_V+Po~-c70vN1t=1+A%PQ29uxwx4>qZSNmg$Vo0WSSm;`Hl{Ww|6H_V+Po~-c6&>|-aSW-r_2!NtU#o%$i-Y0&su(f8j@G?~f`NtGer^@M zrYdIdrP)2_bk~ELr2i)^H(PkDy?QdpIbuVC@BX&$s!L5iRYqm|O_N&n@I;(N<+i7f+;9Z? Phk?P<)z4*}Q$iB}^elK+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre2.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre2.png new file mode 100644 index 0000000000000000000000000000000000000000..5a55672c1f9c4d41d5b5cf52d76bb2b7e7c6b186 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffi(Px;TbZ+h>KHoj_IVWAxIr&Fiabo)3x94Up%M35SEe^0#X9dS;F-9{&3Ljos=IM}2LB&w>e?K^KZ|9tHA z)W~h}eTfo>R&7s^?LYqdE7+t-Dv4L4H{``lKYf(JYIB0^>jrz9Khf>{)o!mlw-~mt za!)h6<9vO9zW09 gTfg@IqFVdQ&MBb@0QJAA?EnA( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre3.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre3.png new file mode 100644 index 0000000000000000000000000000000000000000..d852d29f13bcf743e15df824901ab568123a5aae GIT binary patch literal 485 zcmVTEH>0M4JV5-1QxJ>b$K`ZPMW6ena#ScoGi+aGE}QBI9b2~7O)VofCVgI z0Sj2@r|V8tRYg%8l35(bVHm0eOOPtd@{r7;D7wSi^O|UT7k&b(?|avE4}m2@pKY0^ zX8{XXz`D@ra0V&khG!6NNY4Tm0v50s9T*)L9q3sISir&!aYH5D@CmFqjy=yiBr_3O zu`P1E)qr;HnlAuCCeD2n8T2!dey#!;npC;SpUiv|xYU?E`rwKTr@$H|hS bPXPu1`Qm#ITgjGb00000NkvXXu0mjf8+_C8 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre4.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/images/pre4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7bc72ab99fe2c0ed9de1d89fd1c3e82ac3fd43 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfeL+x;TbZ+5xOQzYV@t-I~V=Oc$U@%9?>h?uf)>*!tD zz9*sh?!vZ&M%HQV5wX`#zTA@g`shVPPoZs!AO#y_jv5_v2~@eKa{lwdV71lh?Z-1u+JRxq;OXk;vd$@?2>^GKp!om* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.css new file mode 100644 index 0000000..f2bae3c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.css @@ -0,0 +1,18 @@ +.wrap{ padding: 20px;font-size: 14px;} +.left{width:425px;float: left;} +.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} +.right .pre{height: 332px;overflow-y: auto;} +.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} +.right .preitem:hover{background-color: #f3f3f3;cursor: pointer;border: #ccc 1px solid;} +.right .preitem img{display: block;margin: 0 auto;width:100px;} +.clear{clear: both;} +.top{height:26px;line-height: 26px;padding: 5px;} +.bottom{height:320px;width:100%;margin: 0 auto;} +.transparent{ background: url("images/bg.gif") repeat;} +.bottom table tr td{border:1px dashed #ccc;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} +.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +p{margin: 5px 0} +table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} +li{clear:both} +ol{padding-left:40px; } \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.html new file mode 100644 index 0000000..d9903a4 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.js new file mode 100644 index 0000000..d40e4dd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/template/template.js @@ -0,0 +1,53 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:09 + * To change this template use File | Settings | File Templates. + */ +(function () { + var me = editor, + preview = $G( "preview" ), + preitem = $G( "preitem" ), + tmps = templates, + currentTmp; + var initPre = function () { + var str = ""; + for ( var i = 0, tmp; tmp = tmps[i++]; ) { + str += '
    '; + } + preitem.innerHTML = str; + }; + var pre = function ( n ) { + var tmp = tmps[n - 1]; + currentTmp = tmp; + clearItem(); + domUtils.setStyles( preitem.childNodes[n - 1], { + "background-color":"#f3f3f3", + "border":"#ccc 1px solid" + } ); + preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; + }; + var clearItem = function () { + var items = preitem.children; + for ( var i = 0, item; item = items[i++]; ) { + domUtils.setStyles( item, { + "background-color":"", + "border":"white 1px solid" + } ); + } + }; + dialog.onok = function () { + if ( !$G( "issave" ).checked ){ + me.execCommand( "cleardoc" ); + } + var obj = { + html:currentTmp && currentTmp.html + }; + me.execCommand( "template", obj ); + }; + initPre(); + window.pre = pre; + pre(2) + +})(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/file-icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/file-icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/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/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/left_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0b2834cc82184835d01a68de6caf30408b8b5fa GIT binary patch literal 3970 zcmeHJYd92W8-C|t7;+f0PRW=VwN7)wm>I@6Ry!9tCx@@a7{}&-$xOp4t5uPZV-}UZ zuB>5{qP0`9`q-7Eh7R(j*lm}D4cXdgzR{}PpZouFU)OuR&-*@y`+4qPkMf~%92t-( z6bk4B0xumO6UUF`;MsgGK^!9>knltTaAk@GG3*qM5FN`&Na8UtbMosLbW$7x6XxVc z^b>e-5|egF(m27Aogr*V3Y!*(VY;DR#dI-Oz~u;I&|>ahUOHXOz`QR`SJ|uI1PuCp zh%kkL@mOU=@AeBod-2maXeT_yo=tKjqn&AZ5`{=3JKCYiM3OUs=u99v*b_-~B8Bci zL$3j&VoQsQrw4g&TjNr_7?`!8L?RJh}9(uK6Oe}w&kb%JvR1AbQidFODY;GTVSijd5SXW?OfprDe6UVFlwAO&0dQao z44?o61%aX<%Kw0R0AK(HS)FDL>KaIZ&{Tr}h#KVY{{XIrP}hJV^#DLX0St~%)BZC9 z0)@SI0i-_4z~uf$W76*OdxnPm~%Meqv;d4GIa(IdfN`d;~VYRPCdnD8K|$b54^_>}>PGIwM<~ zNkren<(ooFYG}txw7qe=@dHOV2?;{OGenVVoq3zJE9EAHX z=p~Fr?G$8lUDwR`hQ$R%-@Ma?bSras^fyke)7+~H&1v74A%Wi(TbSj3UD8XY9+^^? zXiF}n*}SvAs{|HJ7Sx~e1v{4tCh-3cwOi*CMW@HoN_Kx#OY{ME9fB6G(TZiCY2Tzln1$Xzq6P2; z1BxRA`#RPuT;lBZ|0#xfPsL5a?96ZNdt zmy3KZJFu2}(bd!!1sT8L1xl%Ee zK$?FyKv|X+&%7G3iEK#WcHc;hPB_tGEcZaZ2@5(s&>vH{TT{+t&EATw>0$Z@WM)G9 zt|X6g8F0r1N+2$^?L0s|KS*|79FNnE?Amrgo-BFW1~22CZIo8T&oBlA`qu_Wu+ek8 z`#MNd^ zq>r=*qYI0h(rl$RW$|}(MtXd%@5M)l9w|vDYfos@dyV08GQWoyAl4Ma$hqX`lB?$Cn~RJ&r_b{4!O2< zeO32&*DkZtoljrLeu%%?95JvzmbU_f6$IDh7nB~CwfX$Jqq*1@@<)n~7g01;UV1Kg T%FyMa8r(OKsK>HApd9%h!OrDj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/none_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e729fc59272fc2a5a5fcc8d3f09516e1bf8c14b GIT binary patch literal 3862 zcmex=fQ*uo0xNy}ykfn?l>DSrz2y8{{ffi_eM3D1eFhu*ih{)C?9>v4q}24x zJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i=|mer{ z{GxPyLrY6beFGzXBO_g)3ft z^no_$L#+TY;eNA&xnYzZ4S~@R7!85Z5Eu=C(GVCxA%JKdrRD*fMCHJ?&;Pd!IsqB^ zCHch}`2`BbdIk&@PM*Fjsth0?a7DJ~WqaBLhgIAe)dPyP>I> zV_-??rp+9pN`;dqi-}7p2Ze+-F1&c@|1Aa{W}xE*nFJZ^8NPg<^(Fr>*Tbprr@dLN za&(>BmK#fS#8r5wuj%3O{ORg?rLkYG=isGYt3JMD?xHV(a_gEVv@lJOQQUH8d5<@b z&@SU6&VKwmU9-2I>)#f-uWjE`chQt|zT_o&m;D1J?^GSUC$RhU<3sGO8#n%OFGH5t83AeDR$x8>@rd(m^+>5 zT5(!}W0TuoCFzOHGx+tKWGt^Y;dzq}It14D$-0|S=J$UxS zV@X-%C9)+gU7UIi4NYk{!16mijx3pw;Hgwy6zVXI9U&uI;L2 zO=5CgvS7h%P4{zBYAg08P29a#_E4kCQUj6W%pCFmFRY8^|MqjX-M;#{HO()7{T168 z=lHk5V$YgClf7>~{=oWd-M;5%pYPS$^L@d4J}s4X)7v6C9?bUO=x9jQT<4(t;?MNu z{R)2_&v$K)E?QGNcc1#&^)DWu>00-B^2y~P(H%t>xC<2P|6hdIVt-na``^0g?o;Pa zn(Uot&k&dO`d!Vv>PxH7SMhy#w8(37R+{&|q*%A@(HoCRZb`4!EViEU>7tfV;l!Z( zDwUC|rXD#s=j2zlv>arEM|92%0v)?WLwT0T9$_jT4Ui(<9)dsRMZUJw29 z?)Lka6X)9fyjFYnh-HS#(bs9m({)Z~&uu(q)jG-ala$_`%rddlyAb^)_5JfUCr7c5>s9Wkv~!-2X3q**xQq{bt|&T2HKN%eDrajAo)C`ZI@wXMC?U2$+wO>$<+LP?EXh|;rutL z^Ls23!o%F)Prhs?^}y*K zvXnOOgUdUtwKv{euN}5IE@Jk6hXaqUJXc!uP-M~M!xX? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..717c4865c90a959c6a0e9ad1af9c777d900a2e9c GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/right_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ce626c4babe9288c8ab5c84e4bf66fad7ee8ce2 GIT binary patch literal 3971 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/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# + + + + + + + + +

    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js new file mode 100644 index 0000000..c08f797 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js @@ -0,0 +1,818 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 上午11:19 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var video = {}, + uploadVideoList = [], + isModifyUploadVideo = false, + uploadFile; + + window.onload = function(){ + $focus($G("videoUrl")); + initTabs(); + initVideo(); + 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'); + } + } + }); + } + } + + function initVideo(){ + createAlignButton( ["videoFloat", "upload_alignment"] ); + addUrlChangeListener($G("videoUrl")); + addOkListener(); + + //编辑视频时初始化相关信息 + (function(){ + var img = editor.selection.getRange().getClosedNode(),url; + if(img && img.className){ + var hasFakedClass = (img.className == "edui-faked-video"), + hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; + if(hasFakedClass || hasUploadClass) { + $G("videoUrl").value = url = img.getAttribute("_url"); + $G("videoWidth").value = img.width; + $G("videoHeight").value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + updateAlignButton(parentAlign==="center"?"center":align); + } + if(hasUploadClass) { + isModifyUploadVideo = true; + } + } + createPreviewVideo(url); + })(); + } + + /** + * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 + */ + function addOkListener(){ + dialog.onok = function(){ + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads","tabSrc"); + switch(currentTab){ + case "video": + return insertSingle(); + break; + case "videoSearch": + return insertSearch("searchList"); + break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function(){ + $G("preview").innerHTML = ""; + }; + } + + /** + * 依据传入的align值更新按钮信息 + * @param align + */ + function updateAlignButton( align ) { + var aligns = $G( "videoFloat" ).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 width = $G("videoWidth"), + height = $G("videoHeight"), + url=$G('videoUrl').value, + align = findFocus("videoFloat","name"); + + var newurl = convert_url(url); + if (newurl.startsWith("")) { + var arr = newurl.split(" "); + for (var i=0; i>arr.length; i++) { + if (arr[i].startsWith("src")) { + newurl = arr[i].replace("src=", ""); + } + if (arr[i].startsWith("width")) { + if (!width) { + width = arr[i].replace("width=", ""); + } + } + if (arr[i].startsWith("height")) { + if (!height) { + height = arr[i].replace("height=", ""); + } + } + } + } + + if(!newurl) return false; + + if ( !checkNum( [width, height] ) ) return false; + editor.execCommand('insertvideo', { + url: newurl, + width: width.value, + height: height.value, + align: align + }, isModifyUploadVideo ? 'upload':null); + } + + /** + * 将元素id下的所有代表视频的图片插入编辑器中 + * @param id + */ + function insertSearch(id){ + var imgs = domUtils.getElementsByTagName($G(id),"img"), + videoObjs=[]; + for(var i=0,img; img=imgs[i++];){ + if(img.getAttribute("selected")){ + videoObjs.push({ + url:img.getAttribute("ue_video_url"), + width:420, + height:280, + align:"none" + }); + } + } + editor.execCommand('insertvideo',videoObjs); + } + + /** + * 找到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; + } + function convert_url(url){ + if ( !url ) return ''; + url = utils.trim(url) + .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') + .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") + .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") + .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") + .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") + .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") + .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") + .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); + + return url; + } + + /** + * 检测传入的所有input框中输入的长宽是否是正数 + * @param nodes input框集合, + */ + function checkNum( nodes ) { + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !isNumber( value ) && value) { + alert( lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + } + + /** + * 数字判断 + * @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 () { + createPreviewVideo( this.value ); + } + } else { + url.addEventListener( "input", function () { + createPreviewVideo( this.value ); + }, false ); + } + } + + /** + * 根据url生成视频预览 + * @param url + */ + function createPreviewVideo(url){ + if ( !url ) return; + + if (url.startsWith("http") && url.indexOf(".mp4") > 0) { + $G("preview").innerHTML = '
    '+lang.urlError+'
    '+ + ''; + } + if (url.startsWith("")) { + $G("preview").innerHTML = '
    '+lang.urlError+'
    '+url; + } + } + + + /* 插入上传视频 */ + function insertUpload(){ + var videoObjs=[], + prefix = editor.getOpt('videoUrlPrefix'), + width = $G('upload_width').value || 420, + height = $G('upload_height').value || 280, + align = findFocus("upload_alignment","name") || 'none', + videoSrcField = editor.getOpt("imageUploadService")(this, editor).videoSrcField || 'url';; + for(var key in uploadVideoList) { + var file = uploadVideoList[key]; + videoObjs.push({ + url: prefix + file[videoSrcField], + width:width, + height:height, + align:align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertvideo', videoObjs, 'upload'); + } + } + + /*初始化上传标签*/ + function initUpload(){ + uploadFile = new UploadVideo('queueList'); + } + + + /* 上传附件 */ + function UploadVideo(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadVideo.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('videoActionName')), + fileMaxSize = editor.getOpt('videoMaxSize'), + acceptExtensions = (editor.getOpt('videoAllowFiles') || [".mp4", ".webm", ".flv", ".ogg", ".f4v"]).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('videoActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('videoFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + 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) { + /* 选择文件后设置上传相关的url和自定义参数 */ + editor.getOpt("videoUploadService")(_this, editor).setUploadData(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': + /* 设置Uploader配置项 */ + editor.getOpt("videoUploadService")(_this, editor).setUploaderOptions(uploader); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (object, data, headers) { + //这里可以通过data对象添加POST参数 + editor.getOpt("videoUploadService")(_this, editor).setFormData(object, data, headers); + }); + + 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, res) { + var $file = $('#' + file.id); + try { + if (editor.getOpt("videoUploadService")(_this, editor).getResponseSuccess(res)) { + uploadVideoList.push({ + 'url': res.url, + 'type': res.mimetype, + 'original':res.original || '' + }); + $file.append(''); + } else { + $file.find('.error').text(res.message).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + 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('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + window.setTimeout(function() { + uploader.upload(); + }, 500); + } else if (state === 'paused') { + window.setTimeout(function() { + uploader.upload(); + }, 500); + } 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(); + } + }; + +})(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/webapp/webapp.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/webapp/webapp.html new file mode 100644 index 0000000..1614377 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/webapp/webapp.html @@ -0,0 +1,53 @@ + + + + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/fClipboard_ueditor.swf b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 0000000000000000000000000000000000000000..ac5d27f81d2111c8581a042564c5275edd751e1c GIT binary patch literal 1908 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 + * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
    + * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 + * + * @shortcut insertHTML + * @meta standard + * + * @returns {HTMLElement} 目标元素 + */ +baidu.dom.insertHTML = function (element, position, html) { + element = baidu.dom.g(element); + var range,begin; + if (element.insertAdjacentHTML && !baidu.browser.opera) { + element.insertAdjacentHTML(position, html); + } else { + range = element.ownerDocument.createRange(); + position = position.toUpperCase(); + if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { + range.selectNodeContents(element); + range.collapse(position == 'AFTERBEGIN'); + } else { + begin = position == 'BEFOREBEGIN'; + range[begin ? 'setStartBefore' : 'setEndAfter'](element); + range.collapse(begin); + } + range.insertNode(range.createContextualFragment(html)); + } + return element; +}; + +baidu.insertHTML = baidu.dom.insertHTML; + +/** + * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 + * @namespace baidu.swf + */ +baidu.swf = baidu.swf || {}; + + +/** + * 浏览器支持的flash插件版本 + * @property version 浏览器支持的flash插件版本 + * @grammar baidu.swf.version + * @return {String} 版本号 + * @meta standard + */ +baidu.swf.version = (function () { + var n = navigator; + if (n.plugins && n.mimeTypes.length) { + var plugin = n.plugins["Shockwave Flash"]; + if (plugin && plugin.description) { + return plugin.description + .replace(/([a-zA-Z]|\s)+/, "") + .replace(/(\s)+r/, ".") + ".0"; + } + } else if (window.ActiveXObject && !window.opera) { + for (var i = 12; i >= 2; i--) { + try { + var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); + if (c) { + var version = c.GetVariable("$version"); + return version.replace(/WIN/g,'').replace(/,/g,'.'); + } + } catch(e) {} + } + } +})(); + +/** + * 操作字符串的方法 + * @namespace baidu.string + */ +baidu.string = baidu.string || {}; + + +/** + * 对目标字符串进行html编码 + * @name baidu.string.encodeHTML + * @function + * @grammar baidu.string.encodeHTML(source) + * @param {string} source 目标字符串 + * @remark + * 编码字符有5个:&<>"' + * @shortcut encodeHTML + * @meta standard + * @see baidu.string.decodeHTML + * + * @returns {string} html编码后的字符串 + */ +baidu.string.encodeHTML = function (source) { + return String(source) + .replace(/&/g,'&') + .replace(//g,'>') + .replace(/"/g, """) + .replace(/'/g, "'"); +}; + +baidu.encodeHTML = baidu.string.encodeHTML; + +/** + * 创建flash对象的html字符串 + * @name baidu.swf.createHTML + * @function + * @grammar baidu.swf.createHTML(options) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @see baidu.swf.create + * @meta standard + * @returns {string} flash对象的html字符串 + */ +baidu.swf.createHTML = function (options) { + options = options || {}; + var version = baidu.swf.version, + needVersion = options['ver'] || '6.0.0', + vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, + encodeHTML = baidu.string.encodeHTML; + for (k in options) { + tmpOpt[k] = options[k]; + } + options = tmpOpt; + if (version) { + version = version.split('.'); + needVersion = needVersion.split('.'); + for (i = 0; i < 3; i++) { + vUnit1 = parseInt(version[i], 10); + vUnit2 = parseInt(needVersion[i], 10); + if (vUnit2 < vUnit1) { + break; + } else if (vUnit2 > vUnit1) { + return ''; + } + } + } else { + return ''; + } + + var vars = options['vars'], + objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; + options['align'] = options['align'] || 'middle'; + options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; + options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; + options['movie'] = options['url'] || ''; + delete options['vars']; + delete options['url']; + if ('string' == typeof vars) { + options['flashvars'] = vars; + } else { + var fvars = []; + for (k in vars) { + item = vars[k]; + fvars.push(k + "=" + encodeURIComponent(item)); + } + options['flashvars'] = fvars.join('&'); + } + var str = [''); + var params = { + 'wmode' : 1, + 'scale' : 1, + 'quality' : 1, + 'play' : 1, + 'loop' : 1, + 'menu' : 1, + 'salign' : 1, + 'bgcolor' : 1, + 'base' : 1, + 'allowscriptaccess' : 1, + 'allownetworking' : 1, + 'allowfullscreen' : 1, + 'seamlesstabbing' : 1, + 'devicefont' : 1, + 'swliveconnect' : 1, + 'flashvars' : 1, + 'movie' : 1 + }; + + for (k in options) { + item = options[k]; + k = k.toLowerCase(); + if (params[k] && (item || item === false || item === 0)) { + str.push(''); + } + } + options['src'] = options['movie']; + options['name'] = options['id']; + delete options['id']; + delete options['movie']; + delete options['classid']; + delete options['codebase']; + options['type'] = 'application/x-shockwave-flash'; + options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; + str.push(''); + + return str.join(''); +}; + + +/** + * 在页面中创建一个flash对象 + * @name baidu.swf.create + * @function + * @grammar baidu.swf.create(options[, container]) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 + * @meta standard + * @see baidu.swf.createHTML,baidu.swf.getMovie + */ +baidu.swf.create = function (options, target) { + options = options || {}; + var html = baidu.swf.createHTML(options) + || options['errorMessage'] + || ''; + + if (target && 'string' == typeof target) { + target = document.getElementById(target); + } + baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); +}; +/** + * 判断是否为ie浏览器 + * @name baidu.browser.ie + * @field + * @grammar baidu.browser.ie + * @returns {Number} IE版本号 + */ +baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; + +/** + * 移除数组中的项 + * @name baidu.array.remove + * @function + * @grammar baidu.array.remove(source, match) + * @param {Array} source 需要移除项的数组 + * @param {Any} match 要移除的项 + * @meta standard + * @see baidu.array.removeAt + * + * @returns {Array} 移除后的数组 + */ +baidu.array.remove = function (source, match) { + var len = source.length; + + while (len--) { + if (len in source && source[len] === match) { + source.splice(len, 1); + } + } + return source; +}; + +/** + * 判断目标参数是否Array对象 + * @name baidu.lang.isArray + * @function + * @grammar baidu.lang.isArray(source) + * @param {Any} source 目标参数 + * @meta standard + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isArray = function (source) { + return '[object Array]' == Object.prototype.toString.call(source); +}; + + + +/** + * 将一个变量转换成array + * @name baidu.lang.toArray + * @function + * @grammar baidu.lang.toArray(source) + * @param {mix} source 需要转换成array的变量 + * @version 1.3 + * @meta standard + * @returns {array} 转换后的array + */ +baidu.lang.toArray = function (source) { + if (source === null || source === undefined) + return []; + if (baidu.lang.isArray(source)) + return source; + if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { + return [source]; + } + if (source.item) { + var l = source.length, array = new Array(l); + while (l--) + array[l] = source[l]; + return array; + } + + return [].slice.call(source); +}; + +/** + * 获得flash对象的实例 + * @name baidu.swf.getMovie + * @function + * @grammar baidu.swf.getMovie(name) + * @param {string} name flash对象的名称 + * @see baidu.swf.create + * @meta standard + * @returns {HTMLElement} flash对象的实例 + */ +baidu.swf.getMovie = function (name) { + var movie = document[name], ret; + return baidu.browser.ie == 9 ? + movie && movie.length ? + (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ + return item.tagName.toLowerCase() != "embed"; + })).length == 1 ? ret[0] : ret + : movie + : movie || window[name]; +}; + + +baidu.flash._Base = (function(){ + + var prefix = 'bd__flash__'; + + /** + * 创建一个随机的字符串 + * @private + * @return {String} + */ + function _createString(){ + return prefix + Math.floor(Math.random() * 2147483648).toString(36); + }; + + /** + * 检查flash状态 + * @private + * @param {Object} target flash对象 + * @return {Boolean} + */ + function _checkReady(target){ + if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ + return true; + }else{ + return false; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @param {Array} callQueue 调用队列 + * @param {Object} target flash对象 + * @return {Null} + */ + function _callFn(callQueue, target){ + var result = null; + + callQueue = callQueue.reverse(); + baidu.each(callQueue, function(item){ + result = target.call(item.fnName, item.params); + item.callBack(result); + }); + }; + + /** + * 为传入的匿名函数创建函数名 + * @private + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + function _createFunName(fun){ + var name = ''; + + if(baidu.lang.isFunction(fun)){ + name = _createString(); + window[name] = function(){ + fun.apply(window, arguments); + }; + + return name; + }else if(baidu.lang.isString){ + return fun; + } + }; + + /** + * 绘制flash + * @private + * @param {Object} options 创建参数 + * @return {Object} + */ + function _render(options){ + if(!options.id){ + options.id = _createString(); + } + + var container = options.container || ''; + delete(options.container); + + baidu.swf.create(options, container); + + return baidu.swf.getMovie(options.id); + }; + + return function(options, callBack){ + var me = this, + autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), + createOptions = options.createOptions || {}, + target = null, + isReady = false, + callQueue = [], + timeHandle = null, + callBack = callBack || []; + + /** + * 将flash文件绘制到页面上 + * @public + * @return {Null} + */ + me.render = function(){ + target = _render(createOptions); + + if(callBack.length > 0){ + baidu.each(callBack, function(funName, index){ + callBack[index] = _createFunName(options[funName] || new Function()); + }); + } + me.call('setJSFuncName', [callBack]); + }; + + /** + * 返回flash状态 + * @return {Boolean} + */ + me.isReady = function(){ + return isReady; + }; + + /** + * 调用flash接口的统一入口 + * @param {String} fnName 调用的函数名 + * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 + * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 + * @return {Null} + */ + me.call = function(fnName, params, callBack){ + if(!fnName) return null; + callBack = callBack || new Function(); + + var result = null; + + if(isReady){ + result = target.call(fnName, params); + callBack(result); + }else{ + callQueue.push({ + fnName: fnName, + params: params, + callBack: callBack + }); + + (!timeHandle) && (timeHandle = setInterval(_check, 200)); + } + }; + + /** + * 为传入的匿名函数创建函数名 + * @public + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + me.createFunName = function(fun){ + return _createFunName(fun); + }; + + /** + * 检查flash是否ready, 并进行调用 + * @private + * @return {Null} + */ + function _check(){ + if(_checkReady(target)){ + clearInterval(timeHandle); + timeHandle = null; + _call(); + + isReady = true; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @return {Null} + */ + function _call(){ + _callFn(callQueue, target); + callQueue = []; + } + + autoRender && me.render(); + }; +})(); + + + +/** + * 创建flash based imageUploader + * @class + * @grammar baidu.flash.imageUploader(options) + * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {Object} vars 创建imageUploader时所需要的参数 + * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 + * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 + * @config {Number} vars.picWidth 单张预览图片的宽度 + * @config {Number} vars.picHeight 单张预览图片的高度 + * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' + * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' + * @config {Number} vars.maxSize 文件的最大体积,单位'MB' + * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 + * @config {Number} vars.maxNum:32 最大上传多少个文件 + * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 + * @config {String} vars.url 上传的url地址 + * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 + * @see baidu.swf.createHTML + * @param {String} backgroundUrl 背景图片路径 + * @param {String} listBacgroundkUrl 布局控件背景 + * @param {String} buttonUrl 按钮图片不背景 + * @param {String|Function} selectFileCallback 选择文件的回调 + * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 + * @param {String|Function} deleteFileCallback 删除文件的回调 + * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 + * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 + * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 + * @param {String|Function} allCompleteCallback 全部上传完成时的回调 + * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 + */ +baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ + + var me = this, + options = options || {}, + _flash = new baidu.flash._Base(options, [ + 'selectFileCallback', + 'exceedFileCallback', + 'deleteFileCallback', + 'startUploadCallback', + 'uploadCompleteCallback', + 'uploadErrorCallback', + 'allCompleteCallback', + 'changeFlashHeight' + ]); + /** + * 开始或回复上传图片 + * @public + * @return {Null} + */ + me.upload = function(){ + _flash.call('upload'); + }; + + /** + * 暂停上传图片 + * @public + * @return {Null} + */ + me.pause = function(){ + _flash.call('pause'); + }; + me.addCustomizedParams = function(index,obj){ + _flash.call('addCustomizedParams',[index,obj]); + } +}; + +/** + * 操作原生对象的方法 + * @namespace baidu.object + */ +baidu.object = baidu.object || {}; + + +/** + * 将源对象的所有属性拷贝到目标对象中 + * @author erik + * @name baidu.object.extend + * @function + * @grammar baidu.object.extend(target, source) + * @param {Object} target 目标对象 + * @param {Object} source 源对象 + * @see baidu.array.merge + * @remark + * +1.目标对象中,与源对象key相同的成员将会被覆盖。
    +2.源对象的prototype成员不会拷贝。 + + * @shortcut extend + * @meta standard + * + * @returns {Object} 目标对象 + */ +baidu.extend = +baidu.object.extend = function (target, source) { + for (var p in source) { + if (source.hasOwnProperty(p)) { + target[p] = source[p]; + } + } + + return target; +}; + + + + + +/** + * 创建flash based fileUploader + * @class + * @grammar baidu.flash.fileUploader(options) + * @param {Object} options + * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {String} createOptions.width + * @config {String} createOptions.height + * @config {Number} maxNum 最大可选文件数 + * @config {Function|String} selectFile + * @config {Function|String} exceedMaxSize + * @config {Function|String} deleteFile + * @config {Function|String} uploadStart + * @config {Function|String} uploadComplete + * @config {Function|String} uploadError + * @config {Function|String} uploadProgress + */ +baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ + var me = this, + options = options || {}; + + options.createOptions = baidu.extend({ + wmod: 'transparent' + },options.createOptions || {}); + + var _flash = new baidu.flash._Base(options, [ + 'selectFile', + 'exceedMaxSize', + 'deleteFile', + 'uploadStart', + 'uploadComplete', + 'uploadError', + 'uploadProgress' + ]); + + _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); + + /** + * 设置当鼠标移动到flash上时,是否变成手型 + * @public + * @param {Boolean} isCursor + * @return {Null} + */ + me.setHandCursor = function(isCursor){ + _flash.call('setHandCursor', [isCursor || false]); + }; + + /** + * 设置鼠标相应函数名 + * @param {String|Function} fun + */ + me.setMSFunName = function(fun){ + _flash.call('setMSFunName',[_flash.createFunName(fun)]); + }; + + /** + * 执行上传操作 + * @param {String} url 上传的url + * @param {String} fieldName 上传的表单字段名 + * @param {Object} postData 键值对,上传的POST数据 + * @param {Number|Array|null|-1} [index]上传的文件序列 + * Int值上传该文件 + * Array一次串行上传该序列文件 + * -1/null上传所有文件 + * @return {Null} + */ + me.upload = function(url, fieldName, postData, index){ + + if(typeof url !== 'string' || typeof fieldName !== 'string') return null; + if(typeof index === 'undefined') index = -1; + + _flash.call('upload', [url, fieldName, postData, index]); + }; + + /** + * 取消上传操作 + * @public + * @param {Number|-1} index + */ + me.cancel = function(index){ + if(typeof index === 'undefined') index = -1; + _flash.call('cancel', [index]); + }; + + /** + * 删除文件 + * @public + * @param {Number|Array} [index] 要删除的index,不传则全部删除 + * @param {Function} callBack + * */ + me.deleteFile = function(index, callBack){ + + var callBackAll = function(list){ + callBack && callBack(list); + }; + + if(typeof index === 'undefined'){ + _flash.call('deleteFilesAll', [], callBackAll); + return; + }; + + if(typeof index === 'Number') index = [index]; + index.sort(function(a,b){ + return b-a; + }); + baidu.each(index, function(item){ + _flash.call('deleteFileBy', item, callBackAll); + }); + }; + + /** + * 添加文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.addFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('addFileTypes', type); + }; + + /** + * 设置文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.setFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('setFileTypes', type); + }; + + /** + * 设置可选文件的数量限制 + * @public + * @param {Number} num + * @return {Null} + */ + me.setMaxNum = function(num){ + _flash.call('setMaxNum', [num]); + }; + + /** + * 设置可选文件大小限制,以兆M为单位 + * @public + * @param {Number} num,0为无限制 + * @return {Null} + */ + me.setMaxSize = function(num){ + _flash.call('setMaxSize', [num]); + }; + + /** + * @public + */ + me.getFileAll = function(callBack){ + _flash.call('getFileAll', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {Function} [callBack] + */ + me.getFileByIndex = function(index, callBack){ + _flash.call('getFileByIndex', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {function} [callBack] + */ + me.getStatusByIndex = function(index, callBack){ + _flash.call('getStatusByIndex', [], callBack); + }; +}; + +/** + * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 + * @namespace baidu.sio + */ +baidu.sio = baidu.sio || {}; + +/** + * + * @param {HTMLElement} src script节点 + * @param {String} url script节点的地址 + * @param {String} [charset] 编码 + */ +baidu.sio._createScriptTag = function(scr, url, charset){ + scr.setAttribute('type', 'text/javascript'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); +}; + +/** + * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 + * + * @param {HTMLElement} src script节点 + */ +baidu.sio._removeScriptTag = function(scr){ + if (scr.clearAttributes) { + scr.clearAttributes(); + } else { + for (var attr in scr) { + if (scr.hasOwnProperty(attr)) { + delete scr[attr]; + } + } + } + if(scr && scr.parentNode){ + scr.parentNode.removeChild(scr); + } + scr = null; +}; + + +/** + * 通过script标签加载数据,加载完成由浏览器端触发回调 + * @name baidu.sio.callByBrowser + * @function + * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) + * @param {string} url 加载数据的url + * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 + * @param {Object} opt_options 其他可选项 + * @config {String} [charset] script的字符集 + * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 + * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 + * @meta standard + * @see baidu.sio.callByServer + */ +baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { + var scr = document.createElement("SCRIPT"), + scriptLoaded = 0, + options = opt_options || {}, + charset = options['charset'], + callback = opt_callback || function(){}, + timeOut = options['timeOut'] || 0, + timer; + scr.onload = scr.onreadystatechange = function () { + if (scriptLoaded) { + return; + } + + var readyState = scr.readyState; + if ('undefined' == typeof readyState + || readyState == "loaded" + || readyState == "complete") { + scriptLoaded = 1; + try { + callback(); + clearTimeout(timer); + } finally { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + } + } + }; + + if( timeOut ){ + timer = setTimeout(function(){ + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + options.onfailure && options.onfailure(); + }, timeOut); + } + + baidu.sio._createScriptTag(scr, url, charset); +}; + +/** + * 通过script标签加载数据,加载完成由服务器端触发回调 + * @name baidu.sio.callByServer + * @function + * @grammar baidu.sio.callByServer(url, callback[, opt_options]) + * @param {string} url 加载数据的url. + * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. + * @param {Object} opt_options 加载数据时的选项. + * @config {string} [charset] script的字符集 + * @config {string} [queryField] 服务器端callback请求字段名,默认为callback + * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 + * @meta standard + * @see baidu.sio.callByBrowser + */ +baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { + var scr = document.createElement('SCRIPT'), + prefix = 'bd__cbs__', + callbackName, + callbackImpl, + options = opt_options || {}, + charset = options['charset'], + queryField = options['queryField'] || 'callback', + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), + matches; + + if (baidu.lang.isFunction(callback)) { + callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackName] = getCallBack(0); + } else if(baidu.lang.isString(callback)){ + callbackName = callback; + } else { + if (matches = reg.exec(url)) { + callbackName = matches[2]; + } + } + + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + url = url.replace(reg, '\x241' + queryField + '=' + callbackName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; + } + baidu.sio._createScriptTag(scr, url, charset); + + /* + * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 + */ + function getCallBack(onTimeOut){ + /*global callbackName, callback, scr, options;*/ + return function(){ + try { + if( onTimeOut ){ + options.onfailure && options.onfailure(); + }else{ + callback.apply(window, arguments); + clearTimeout(timer); + } + window[callbackName] = null; + delete window[callbackName]; + } catch (exception) { + } finally { + baidu.sio._removeScriptTag(scr); + } + } + } +}; + +/** + * 通过请求一个图片的方式令服务器存储一条日志 + * @function + * @grammar baidu.sio.log(url) + * @param {string} url 要发送的地址. + * @author: int08h,leeight + */ +baidu.sio.log = function(url) { + var img = new Image(), + key = 'tangram_sio_log_' + Math.floor(Math.random() * + 2147483648).toString(36); + window[key] = img; + + img.onload = img.onerror = img.onabort = function() { + img.onload = img.onerror = img.onabort = null; + + window[key] = null; + img = null; + }; + img.src = url; +}; + + + +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json.js + * author: erik + * version: 1.1.0 + * date: 2009/12/02 + */ + + +/** + * 操作json对象的方法 + * @namespace baidu.json + */ +baidu.json = baidu.json || {}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/parse.js + * author: erik, berg + * version: 1.2 + * date: 2009/11/23 + */ + + + +/** + * 将字符串解析成json对象。注:不会自动祛除空格 + * @name baidu.json.parse + * @function + * @grammar baidu.json.parse(data) + * @param {string} source 需要解析的字符串 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.stringify,baidu.json.decode + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.parse = function (data) { + //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 + return (new Function("return (" + data + ")"))(); +}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/decode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 + * @name baidu.json.decode + * @function + * @grammar baidu.json.decode(source) + * @param {string} source 需要解析的字符串 + * @meta out + * @see baidu.json.encode,baidu.json.parse + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.decode = baidu.json.parse; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/stringify.js + * author: erik + * version: 1.1.0 + * date: 2010/01/11 + */ + + + +/** + * 将json对象序列化 + * @name baidu.json.stringify + * @function + * @grammar baidu.json.stringify(value) + * @param {JSON} value 需要序列化的json对象 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.parse,baidu.json.encode + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.stringify = (function () { + /** + * 字符串处理时需要转义的字符表 + * @private + */ + var escapeMap = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"' : '\\"', + "\\": '\\\\' + }; + + /** + * 字符串序列化 + * @private + */ + 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 + '"'; + } + + /** + * 数组序列化 + * @private + */ + 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(baidu.json.stringify(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + /** + * 处理日期序列化时的补零 + * @private + */ + function pad(source) { + return source < 10 ? '0' + source : source; + } + + /** + * 日期序列化 + * @private + */ + 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 (value instanceof Array) { + return encodeArray(value); + } else if (value instanceof Date) { + return encodeDate(value); + } else { + var result = ['{'], + encode = baidu.json.stringify, + 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(''); + } + } + }; +})(); +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/encode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 + * @name baidu.json.encode + * @function + * @grammar baidu.json.encode(value) + * @param {JSON} value 需要序列化的json对象 + * @meta out + * @see baidu.json.decode,baidu.json.stringify + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.encode = baidu.json.stringify; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.html new file mode 100644 index 0000000..670db71 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.html @@ -0,0 +1,111 @@ + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + +
    + : +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.js new file mode 100644 index 0000000..b3a075d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/wordimage/wordimage.js @@ -0,0 +1,157 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-1-30 + * Time: 下午12:50 + * To change this template use File | Settings | File Templates. + */ + + + +var wordImage = {}; +//(function(){ +var g = baidu.g, + flashObj,flashContainer; + +wordImage.init = function(opt, callbacks) { + showLocalPath("localPath"); + //createCopyButton("clipboard","localPath"); + createFlashUploader(opt, callbacks); + addUploadListener(); + addOkListener(); +}; + +function hideFlash(){ + flashObj = null; + flashContainer.innerHTML = ""; +} +function addOkListener() { + dialog.onok = function() { + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document,"img"); + editor.fireEvent('saveScene'); + for (var i = 0,img; img = images[i++];) { + var src = img.getAttribute("word_img"); + if (!src) continue; + for (var j = 0,url; url = imageUrls[j++];) { + if (src.indexOf(url.original.replace(" ","")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 + img.setAttribute("title",url.title); + domUtils.removeAttributes(img, ["word_img","style","width","height"]); + editor.fireEvent("selectionchange"); + break; + } + } + } + editor.fireEvent('saveScene'); + hideFlash(); + }; + dialog.oncancel = function(){ + hideFlash(); + } +} + +/** + * 绑定开始上传事件 + */ +function addUploadListener() { + g("upload").onclick = function () { + flashObj.upload(); + this.style.display = "none"; + }; +} + +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 ? "/":"\\" ; + + path = path.substring(0, path.lastIndexOf(separater)+1); + g(id).value = path; +} + +function createFlashUploader(opt, callbacks) { + //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 + var i18n = utils.extend({},lang.flashI18n); + //处理图片资源地址的编码,补全等问题 + for(var i in i18n){ + if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ + i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); + } + } + opt = utils.extend(opt,i18n,false); + var option = { + createOptions:{ + id:'flash', + url:opt.flashUrl, + width:opt.width, + height:opt.height, + errorMessage:lang.flashError, + wmode:browser.safari ? 'transparent' : 'window', + ver:'10.0.0', + vars:opt, + container:opt.container + } + }; + + option = extendProperty(callbacks, option); + flashObj = new baidu.flash.imageUploader(option); + flashContainer = $G(opt.container); +} + +function extendProperty(fromObj, toObj) { + for (var i in fromObj) { + if (!toObj[i]) { + toObj[i] = fromObj[i]; + } + } + return toObj; +} + +//})(); + +function getPasteData(id) { + baidu.g("msg").innerHTML = lang.copySuccess + "
    "; + setTimeout(function() { + baidu.g("msg").innerHTML = ""; + }, 5000); + return baidu.g(id).value; +} + +function createCopyButton(id, dataFrom) { + baidu.swf.create({ + id:"copyFlash", + url:"fClipboard_neditor.swf", + width:"58", + height:"25", + errorMessage:"", + bgColor:"#CBCBCB", + wmode:"transparent", + ver:"10.0.0", + vars:{ + tid:dataFrom + } + }, id + ); + + var clipboard = baidu.swf.getMovie("copyFlash"); + var clipinterval = setInterval(function() { + if (clipboard && clipboard.flashInit) { + clearInterval(clipinterval); + clipboard.setHandCursor(true); + clipboard.setContentFuncName("getPasteData"); + //clipboard.setMEFuncName("mouseEventHandler"); + } + }, 500); +} +createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/en.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/en.js new file mode 100644 index 0000000..0ccead1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/en.js @@ -0,0 +1,684 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午6:57 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + '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', 'map':'BaiduMap', 'gmap':'GoogleMap', + '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', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' + }, + '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...' + }, + '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':{ + 'songti':'Sim Sun', + 'kaiti':'Sim Kai', + 'heiti':'Sim Hei', + 'lishu':'Sim Li', + 'yahei': 'Microsoft YaHei', + 'andaleMono':'Andale Mono', + 'arial': 'Arial', + 'arialBlack':'Arial Black', + 'comicSansMs':'Comic Sans MS', + 'impact':'Impact', + 'timesNewRoman':'Times New Roman' + }, + '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", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'simpleupload':{ + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format 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!", + 'loadconfigError': 'Get server config error.', + 'loadconfigFormatError': 'Server config format error.', + 'loadconfigHttpError': 'Get server config http error.', + 'snapScreen_plugin':{ + 'browserMsg':"Only IE supported!", + 'callBackErrorMsg':"The callback data is wrong,please check the config!", + 'uploadErrorMsg':"Upload error,please check your server environment! " + }, + '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!" + }, + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + '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"]} + }, + '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':["All", "Avatar", "Facial", "Cartoon", "StickFigure", "GIF", "StaticImage"]}, + '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', + '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!" + }, + '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" + }, + '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.' + }, + + '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_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!", + + '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', + '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.' + }, + 'webapp':{ + 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", + 'tip2':"And then open the file neditor.config.js to set it! ", + 'applyFor':"APPLY FOR", + 'anthorApi':"Baidu API" + }, + '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" + }, + 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...' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"Input singer/song/album, search you interested in music!", + 'J_searchBtn':{value:'Search songs'} + }, + 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', + 'chapter':'Songs', + 'singer':'Singer', + 'special':'Album', + 'listenTest':'Audition' + }, + anchor:{ + 'static':{ + 'lang_input_anchorName':'Anchor Name:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'Data source:', + 'lang_chart_format': 'Chart format:', + 'lang_data_align': 'Align', + 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', + 'lang_chart_align_reverse': 'X-axis Y-axis opposite', + 'lang_chart_title': 'Title', + 'lang_chart_main_title': 'main title:', + 'lang_chart_sub_title': 'sub title:', + 'lang_chart_x_title': 'X-axis title:', + 'lang_chart_y_title': 'Y-axis title:', + 'lang_chart_tip': 'Prompt', + 'lang_cahrt_tip_prefix': 'prefix:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': 'Unit', + 'lang_chart_data_unit_title': 'unit:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': 'Chart type:', + 'lang_prev_btn': 'Previous', + 'lang_next_btn': 'Next' + } + }, + 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' + } + }, + gmap:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{value:"Beijing"} + }, + searchError:'Unable to locate the address!' + }, + help:{ + 'static':{ + 'lang_input_about':'About', + 'lang_input_shortcuts':'Shortcuts', + 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", + '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"]} + }, + '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:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + map:{ + 'static':{ + lang_city:"City", + lang_address:"Address", + city:{value:"Beijing"}, + lang_search:"Search", + lang_dynamicmap:"Dynamic map" + }, + cityMsg:"Please enter the city name!", + errorMsg:"Can't find the place!" + }, + 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)!" + }, + snapscreen:{ + 'static':{ + lang_showMsg:"You should install the UEditor screenshots program first!", + lang_download:"Download!", + lang_step1:"Step1:Download the program and then run it", + lang_step2:"Step2:After complete install,try to click the button again" + } + }, + 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:' + }, + 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' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'Background Color:' + } + }, + '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." + }, + 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' + } + }, + 'autosave': { + 'success':'Local conservation success' + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/addimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/addimage.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2fd17121b9e0d435b2ca082d696c33b9f27b79 GIT binary patch literal 3373 zcmV+|4bt+7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00075Nkl3`{TEJie8u#ZKCX-pjWHM`TbtWcWh*2now&&s;3`jv3 z8BYw~jZ)fbpT6HuOAd#Fpp?3}F|9R}Qcz047z1Mr2q7SZfKm!dDICYaluc``m z=TJ&vHk%;`0&vc+&`PLMN@Q6E$8kUinJmN_K&2G2ECXW<%jFWD=QReDAUWp2I$*oq)}A+;jTPd2K1Y%y({kZ5+pbothh30!4k1Kshd$ok@%jB_?f>!i4gih! zZSA%`RqN{iYc5?P))@(p)Rt07acK?7qJ?xw0?iT$m!UW4 z;_ve6`Q=OWE`x&L;|Sk-_kHjE-~YYuUHTi1M&Cn|fxZVQgPMN$yS{f^E1&%f8ADSq z!|x|zo*kp7-nDG~D91*gPQD0tjoZfb@^*2?I${CbknseSM_v`GHp$!@m&79CO>wW8 zwhl_<_wB=EG8z&~a&#Eb{N5YEJ-3IoUjm$m7(un2i_SA-&*p5tCVN(AUeQaMo#LA5 z=aTKm-IG|@u=fAh&iSXs*A(4zg@4{=^M6_3M7#wBO+1c4s`lD^8`ms!*sOI#;9YZ^ zBcF3+RO-Xpv$G95RYC>5o6JFJV=jSxbi`1-&2Ro}Iu{#rNf5J5((^6sf6&bqqXh8H z5+W1P5QK>etklXEj4aG_oOr@I>a(S6<;)SE*toYxk1;0R% z`>N8PF(SZ{LKiA_vD#EOz+YEyts^yeMAV&P)rM?lKv2-qXPi+RPDT$Pv?ig%s%zFz zCG7!vVGg4=d2SK*5JI{rGZyLjB4$#Ntz1RL2M%seBHGsIcn6uf4HY9@%l`b@8)*-W zzOms*n^yqn?Tbi9a=W=1G9Zb%yj^hdrQ=!`QcZyZ8Y0e zxMGl0+n6TZ9dn#u)9Z&Gsa!a92udR{2e{@uVnM}7S7eWCB!C67-N}`6FM!r>s^FQP zh9+-P@!+I$WNFgh`G*Of7$(EUkOsH&gU>Hmr61I@n(=mlUC8F11eskof`0s$cPDZw ZzyK$sgmq7P@T33$002ovPDHLkV1jUEUt0hG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/alldeletebtnupskin.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000000000000000000000000000000000000..61658ce6f10164478ce293c05f1f0485a8fa1fc4 GIT binary patch literal 743 zcmV?P)0erzw)>{zXkhd zCViG2qouyIq;`tF{_e3*U(2`+Ovl!Y>7`>9!1cI4q4LP9T)`xnSL2dcM0_glBh$(C zJo)V>#zKCNSVCWV0L|~K5!`lrBscPavk)VwX7#rD4B4|eoh`|p<(WZxNwZVjXv8ns zuB86?K6fQI3TE}@*Wxfmw_M?$x9RK|3!I2Ir=W?)F-X;3M}Gt~3mx`->6pM=`)?YBin;;*T6(J=Db+^A#kEl|A)6WC6twgiXViw1(E|vrNhq=Enl)5O zdw^b;!)Q&OXM{b3kS+?3dfUE;;ji9Q=2XQ84sK7--_YoI2bsDJ6(e2C{=Yvbq&+a& z#)czpUIC!JFCrbu?dE34fFx>cEmy-A320qNH3gy!%Axr^EcGOBcm&N{{EtK0XtsxN zhLcnqm?quL)e(Y?#||x0xp3+blty9>aLswdf{Kx@NFS9*01ITx1k+k z#qTE-4^Em#mL?s|f0*EjVbbI7)ZjLM@c9L+^n-dgMWqNq5dlSMfW zNC{19DAGhg@Gixmw2M1CyR&!iez|k+xBKDDGw=K5o%4I<38mi+>%=K$#$Ds8!vcClYJ=>250ez{$K&dCcK`w>u{LO=%?hU`d1f1K8iPqO^|9ul5wM2GVc3(zpn|k4CNY9}6C75} zr}XtHdAo9BDB|NWk2tKP7#`A%Q!ffWi;s97^RRnwF66n_Xe0S!-(l^T)^gbvwx*w& zK*Nw`q+q3lVJL>5IrSl;v#n!pQAQ`6PQ(|m(9~QJymcT90lQ%u8fS$F)NcSJaG0J3 z5X`d)vV74;%&YKBCkW;Ngy5fa&Xfkj4s?R!;RQg)0D{40h}nQ#O5oh%=DGmRO9N-| zdmo1Z2D_UX0s)RGf*g?CBp|@%9-{|5)j?VRg@^h8B@5U+Oxsk!xHOP8w(~FoRds+s zWTCGHGz>u2Dkf4AP=)~KE@9z7@E{Yg8*JKX{BpK}Wf^*$RA#jXUPM(t+>u7wkJ`>o z=8Ocbh{a)L-hW1Hhbr*x;cQtmZUEoeJZ9_)K(z((@91?rn0MM>VrfEy!J&wA=Fik&S*{ zB7S0GX>oDfqz&%q(rp)dh;F$|usgW^Elgvdyz}AByhynG#c)H)-489j+h+NE{f}uM zxK4dcFx;=BKicOX7HTtg#iO9?3s$Ut@p@U0w&e4LV&RV^+eL?tuFTI$?NMmWDuJqN zT9A+=>7t8n6kkonSy29jc`^W-4L;59C1@xxo)L5X0Y_i74-9if0mj4lu^#}J^h9Kk z-8I^sGyv%3hC{1#dAFOnr3h4f%_pat>Gz$LAHYT0THq{jx+@sIo6eGD_u&#zeO3HW zXV`lkenoE;lT3^4YbH%!=I<^vIn5G{;k1;xT{LVif|D^2*M}(Kcp9$E$X&r^ zBTCjd5rKCx>{ddiNlHd?)(?>awnqG$nm13VMmrhQC#iP<`TP4(jfQe5;nh}}?-^a^w~<-FyAQcvc|1T93TEa4M3wL;r>ERi+Gp3%H!oHA0!8EXIwB1o%W0PfgOQ z&{90GY7rMoE;4;3R)6YS8@H>xTr|o^N_dntfepqI5`$<{5n+u*$cy6>PZ+;^fgEBT zG8npHExaOCoULedS~&UL0?EnVGD2|BE7_FiIO4gq>Mo|-@@ zK`+MAsN3O6ZDKF`Chp#WHe?*|H^ga{6z8cT6igKCYOJ?XJhZ77GW>R*_*>8}OBAMW zg*}{M{~|dr$y=akhL>}9@+wJ7PeYX&m0Fb=t~DuFtQTSnn)Dm&_rjTUJ59u$#0}92 z#FN-%n+cogLb^gub4|6K3YikGeBQhUy@0nj3O6!x-dw`unE4dW1T`&x=L>}$AP>C1 z7w#A`pr~pXM5ss%L~f0CB|jexepn~z7c0cYRvkpXOR7uy+=C?ipvLnNgP#qUA6@Nm zS`b=5W6g)73nb~mnGbSSXjz%|~8bWpX=N7*`DtT8CZmWz%yls6QfD#TkPTa@OEqFbwe z!M(#3*YQ*>jZ={-aNf937qlxEx~{#VbtAbcIkZ0X=L1b@#^?#AQho>iuv@Qgva4NC zo5>|sMR7aD&nVk;&t*7SalOuCj#HgCst zSJR@2|Bm0qx!|E4Y<5j{%X$&1azlCJ>PGa`(_Y1=k~#JYw+33f5Ff0T2DRy*rpkKF zmW5d&EW^>Y%fc`>Sdv}&SXEtqKndC93zybct(#95v=%f}X5?q=FZZet>bmNBEL(kY zE=SHH?g<}VISM`+1cew;2$~``TsPeD#NKZ3UBS2U+G-^CuhkRlx{q@4x*WO*_sj1u zHJ1x|c70AP7bGud5R-^knIg}JeHtC0cKPTM*BZtk9vK~J7o{EV8-qGMD3`7jFgS&{ zHLLesFHLVI8!cz4S}AR!1l1~$xu!9xQm1zk zz7;)>ou^+2;mUw@UGxpgBerZu7IGHLuu7?=>6pb>oJ;wKE(^4X^O5K#TYzXhT~G^u z3t9*^s5}@mj&OpWvDh?%ng>7roYbfkB+{;sFSUe!AYPoM+eyncv-dXHF^uG^(ogf)o;n|p;{YVN+@Tnq79qqn77iVR(w8e6|;iGtbB z*1CL;!t!cy#6GNGCvl~7+#8pe3S8oi_UV3`IhFFNxU>y_rQc)7W98$FbdDoaT1ooH zbfz1O6O*qPXD_^3-}$Off~EIKkQyRz2>kQ68m}AO3*Qm@)U}Z>klV=bNac;8=~|bu z-5Y}&ydjNW6+e%V92?08TJPSFY$3MhBOW8}d&YY;WbKOBl9k=GJ@1R<7T$jAofJb9 z2h_q$xH0_u5&j`fq;C^&Y#{KV!s4PGb%IM{`{n4Uf5SJXmN#1J4-&ps5W`$ zQApVw_3%%3_|g2ZYw)biEQ4&DtUX6p$9l_Nt-;aNnc#gx(of7!6gBLFOtz5ku1>Dp zA5KPZ_CLa=Vnf4ZzD+rkp5a24-H5Z-n0>y~v-r;q=^w={t2e3>oi<Svz*gmH^mQ#Jq;59;v40SmW`LUb=Gw!5Yy2k+Kz`)<6oxkT_XhKZVgTulBpsi z`VW(K5||Mu6EYKeq8Ovra?WX~s?KZQJXqN;MD${{>Yu`;lnsofXDd1*gZ4N-NC;*rU0KOd^a|M9gvH+|)1E7`x0GH3> z%k2gLP^ud1=^_IsKaa{mfGiE6N^XHoP1Gs(M1>x_vg4jTHEb96)jQn*i+IJXb( P9go0R-$Jhf?tK5Bgo^WU literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/button.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/button.png new file mode 100644 index 0000000000000000000000000000000000000000..098874cb1fa85852d77ba9acbb5850c91c341fb7 GIT binary patch literal 4929 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deletedisable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deletedisable.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ee75094f59f0c1262806fd294d361f30f64f58 GIT binary patch literal 649 zcmV;40(Sk0P)!u-Pc3GOd!YPO+bG=gGoA_gW7h+<&i6W@>CzIUsorkT}tXKy|I-GoR_nf%RY$+yzqrWn_y0c| zycG_I116IRG@DK0sZ-E55u|Ou1fok>7zp9LsHJgReXhe;7C4$VS;)mE^wOWxM5!>w+j7B4b z!(p<+cswRyO2rY#*XuP527_xko|w>=_a0qmu_(~#bP__L5ZG)saJ${)TYOfjR7kAi zYvg9L`EQ38LQ-=rdwc{0EpJ`Z=~U9|_2kw4eh&tN0eJ55 jcWg?)n1^9d$t00000NkvXXu0mjfULPWN literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deleteenable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/deleteenable.png new file mode 100644 index 0000000000000000000000000000000000000000..26acc883567c5d7fde8de3ba052d7754a5b1c539 GIT binary patch literal 664 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 F`FAsl-Jbve literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/localimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..12c8e6aefa8fd16287ac77bbecd7d5b58c3fc837 GIT binary patch literal 3083 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 Z1^`gxH94g;riuUn002ovPDHLkV1oEm+S&jB literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/music.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..69c5a9a7e1cecdf78902fc11178313f7f33d1f85 GIT binary patch literal 3599 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 QgFz3XqhWyfq;3=XFFr8S`Tzg` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftdisable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftdisable.png new file mode 100644 index 0000000000000000000000000000000000000000..741526e0d5e6eb5c30eb0a62c9b1d6d558ed9cdf GIT binary patch literal 719 zcmV;=0xVLm}k=YQ<2%m+GNILKMZ4Wj)Eo{6dA(i=1OgO`#k70DYI-BmRjYes)SkU2cI0GZBR;y4N3I~Hh!d`9*7LUg-fQ!ZA17DgvC%W<{o)0F! zU*`EmuKGZYN~Kcs0v3uoolcs~W&&`zTnccgjDVT|^mshtI#kAIIINifC7$1T{?yd~ z`f398$nzJ^&xXUj%I~;@1tb~>YHqh%0jWR{cz-&b2!6()Y&M(t%#{JqZzlB@o&~uo zRdFYN7<*g3d>y0SFTSsu}||KmrzxrzXV}0f4+Nl`U`wo^<=3%s|h|0ur}Z0m~6a z)9IA5+3a~Uyo=N{O{`Z26ni!(U6x=a31615Uq6I}2cZ-|0a2}1X+EF7+lbqaCbL*9 zVjpaCBO8zeF31Bljb43c1B|5gdMy+K1i&JZ2&owiAH&aRFjxU~zu$k$sq`Wh)qB?* z7JdW}ya?6MP#9CN2390Mab0C5lljw}edEbwzR6l%S5ujn*P2rK!bg5RKf!pHvr45x zq@5Lg56Rlp|dF?<); zZnrB`Ycv`HPI*-K+S{`L4RzyPXZYcl&002ovPDHLkV1lL= BGwT2V literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftenable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/rotateleftenable.png new file mode 100644 index 0000000000000000000000000000000000000000..e164ddbd62a232f3a89826158c9795f6c082cc89 GIT binary patch literal 952 zcmV;p14sOcP)B{+A~4pJXZ}t_3ogEQ=EtDt@NW=ovC^1YY3D0f#y*iY)MG5<8F z!|f{@kKz7^5#8k3NZf?c9K_t5iFB?APcn|7{XXn#Ybhtak0o(qW)4fuAr!0vET4{< zSc+h47GQ*Qo%FCG#zDtxKn;d}ii3LDciA+S|Xdhl! zB4Tth6pKaVi#F1YAvCEHTFJM^bUHnP0sSYFPoVrcDQm)w^;g8!)bGBFx|JW?%CGA- z&{PEjJ5@v`9|31h11Z`(8l4W74acX!rYt{M#7D#XGmFrJ8p1{(Q)@sv8@F2OUzvR1 zx9$d0kvWXM{tBEwN0$R4YNDW*#-^%Df&-Q6zoW#Uu@ZDmhS%$@-$mxZRD^B@1aSM_ zhL@++3|_o?ixNDPXhWAA>})fj>w5hzGPAR@B4aE>&p+Mbf*>$imMuk5EW2c0000?hzPCHlRk++nh`E3!rKF3htnTQ@ z$gI|MU8lEVHuFTg-PR|Q2`!gP+H5wYX&N~k4)SU74-bY78_Ii7=yw!+~9z)9EC?-%tI1pNtpOgTWwx zYc~hmYPIxUug9z{77N<%_sk-|f_a_y+;xqv4+oe^KHq!n0!Sli2@LjQ?eJI-PQw!5kz2kP;{i1#vW)J3m7@ilvOQx*+0gD21yWM29TG_#>*)V5x3eEte0rs!7XTfq- zNpDVBe^HqJA^?xgte(JHEEaB201ADoR;^a);o$)-i`fNGNCD$l*jUkV&ZOJ#g6-=H z48;P#aDbi7X5{nvH~?d$9K9Fo01LT5x392A!Cv-)3}9cydREAx^dDF>`_*d2002m8 z7y1N?u~>`?4DAa45ev4jw7ek*Sw2XA4L&zdS z9A4&}t`&psbm3W({))<)8k1Mzq-LMgHh4P0I-QOV5C8-H!ohO6T&8$D&Va$Z(UY0s zOeS;lL%|{kl3A%;S#MlC&Amg&cpiN1r-rvC| zuQ1Fer=aUPn>g6re+%A~4HxgfoyFs_jfT}hvT2|~buTAFG7cgsM5)fELnz*RfYsA+ z%+JjZfW5eCXjGl)8+s)4P|lCQu*F>n-SXLP{rpv`@{BNE{IcsI8B@_npSvh)X*hNpW_TLgr2`Ju@0bJqvCruO={o6E(Z3`5{jw@Hv`M-m z=H><1m4WE;;`c%mkz)x|ObZEnAD_J*B%s8ej2PcmwhgRZado>%)jtid7zm=SE zQ*F%`{_{RP6wdfheSj59}E|h^E{{P*E_)R6H^3NW^13gC8C>dV0CgKv@POF4dxfvY6kSFwxaNHki&!>3-Y^~4kn%F>oC=IgN4BfYTUZZWo z4NgH0Fff*Y6!1`OQEtkV%qBhmGZEnCEqwT{hG--_gp%$=?(C?C;zb^jm66PHQ4|^R zkb*cmi1NcmKm&YfVi#crNDyF;_V&?5G literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/en/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb15b3d6d6799504cf7093a1600bd7ece0d9ef5 GIT binary patch literal 3941 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/copy.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..66b6fe71757822ab6962141c33fea3feb3a0297f GIT binary patch literal 1510 zcmVX0ssI2mtLes0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%h)G02RCwC#T+b_fYaG7A7{8{OVH%?} zC1r|YK{g^Kl0U$&vJpj*1!d#M%1W^iMG?CZ8>K{65-Suoenb}I*NkFjFlMgdK6gHS z-+S(vIcHql+wGk9S)9&!=W{;iygcvoc|OM+nvai<-#9pa0#aPkXf)r2zkZ*=n`Y8X(ehx~r7# zZnxX(^=h@+w6rvX!Jxc3K0Q5oJf7FrSEJEru~?)cIo%Zwh&t$gd3mYV>p_M1FlhY8 zuO(G9KF_g#T6QQi=7N>{_V#vteGO^1*=#uEbXO@{E*A_;c6K(14o*l>K>-K`gD`BE zCb^m@&WE!>@n!~99v%k52{tI0>zFBs4kvSWcPDA|IUy8Jclg@$^mMdzDyif$)8uql zIKXnh-w$^S5|F`F@MOvQbGoYE~*zrTNff4`@vhhj=g zOOdL#x3{vgvZJE|kx*`yt*WXjH#e8|&(6*k78bCsgm;3Xfy%J4u`xV6Tvu23wGNf5 zySmgJniu>9p&payLOWSJi8=ZifIyNc9Z=xZUR*g|(fm)6!+QSjQ@n$zjL zy}ga02LZMr(xOnSO6~hJA#yA}=ih{WVSIduIGAV#;SZY)O88eq3CfR;xubmz0zg$!4K7M~51dSYH5~ z{ngbK95!1OKMSZkN%-;cF&r27?rH?2jw}s!prar?=q|-|lGT5M>(pZYH@&!wy7MP9 z3J1O3_NTCEwV(pHuIxuo@-dw53J18Z*Xw;gAMqYrRXu>>bXT33F&d3tuNSU8IXM{y zSE(~a;R4;=ZnxQN=B=tq5ex=l+?`IRPNy@OO!OA>dl(9s9cDq_GqH2?_MCX0Vd2R%=R1ip)RW_(OmJ01;Py{iMs1UjP6A M07*qoM6N<$g25KT-2eap literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/localimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/ja-jp/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..ebacdefd64d8766fc74a93a9c2d99cef44bfe451 GIT binary patch literal 4860 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
    `|Yo;Y=6)}kk^Hy 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文字の数が許容される最大値を超えているため、サーバーは保存を拒否する可能性があります。!', + 'ok':"ok", + 'cancel':"キャンセル", + 'closeDialog':"閉じる", + 'tableDrag':"表をドラッグするにはuiUtils.jsを導入しなければなりません!", + 'autofloatMsg':"ツールバーのフロートはエディタUIと関連しているので、UIファイルを導入しなければなりません!", + 'loadconfigError': 'バックグラウンド設定リクエスト獲得エラー、アップロードできません!', + 'loadconfigFormatError': 'バックグラウンド設定項目は形式エラーを返します。アップロードできません!', + 'loadconfigHttpError': 'バックグラウンド設定項目をリクエストするhttpエラー、アップロードできません!', + 'snapScreen_plugin':{ + 'browserMsg':"IEブラウザのみをサポートしています!", + 'callBackErrorMsg':"サーバーはデータエラーを返しました。設定項目を確認してからもう一度お試しください。", + 'uploadErrorMsg':"スクリーンショットのアップロードは失敗しました。サーバー側の環境を確認してください!! " + }, + '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':'3色グラデーション', + 'copy':"コピー(Ctrl + c)", + 'copymsg': "ブラウザはこれをサポートしません。「Ctrl + c」を使ってください", + 'paste':"貼り付け(Ctrl + v)", + 'pastemsg': "ブラウザはこれをサポートしません。「Ctrl + v」を使ってください" + }, + 'copymsg': "ブラウザはこれをサポートしません。「Ctrl + c」を使ってください", + 'pastemsg': "ブラウザはこれをサポートしません。「Ctrl + v」を使ってください", + 'anthorMsg':"リンク", + 'clearColor':'色をクリア', + 'standardColor':'標準色', + 'themeColor':'テーマの色', + 'property':'属性', + 'default':'デフォルト', + 'modify':'変更', + 'justifyleft':'左揃え', + 'justifyright':'右揃え', + 'justifycenter':'中央揃え', + 'justify':'デフォルト', + 'clear':'クリア', + 'anchorMsg':'アンカー', + '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':["中央揃え", "横方向の繰り返し", "縦方向の繰り返し", "タイル","カスタム"]} + + }, + 'noUploadImage':"まだ画像がアップロードされていません!", + 'toggleSelect':"クリックして選択ステータスを切り替え\n元のサイズ: " + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"画像を挿入", //ノード + 'lang_tab_upload':"ローカルアップロード", + 'lang_tab_online':"オンライン管理", + 'lang_tab_search':"画像検索", + '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':"Baidu"}, + 'searchReset':{'value':"検索をクリア"}, + 'noneAlign':{'title':'ノーフロート'}, + 'leftAlign':{'title':'左フロート'}, + 'rightAlign':{'title':'右フロート'}, + 'centerAlign':{'title':'中央揃え、一行に占める'} + }, + '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':" :( 申し訳ございません、写真が見つかりません!もう一度お試しください!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': '添付ファイルをアップロード', + 'lang_tab_online': 'オンライン添付ファイル', + 'lang_start_upload':"アップロード", + 'lang_drop_remind':"ファイルをここでドラッグして、一回、100個までのファイルを選択できます" + }, + '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':'サーバーはエラーを返しました' + }, + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"動画を挿入", + 'lang_tab_searchV':"動画を検索", + 'lang_tab_uploadV':"動画をアップロード", + 'lang_video_url':"動画URL", + 'lang_video_size':"動画サイズ", + 'lang_videoW':"幅", + 'lang_videoH':"高さ", + 'lang_alignment':"配置", + 'videoSearchTxt':{'value':"検索キーワードを入力してください!"}, + 'videoType':{'options':["すべて", "人気", "娯楽", "お笑い", "スポーツ", "科学技術", "バラエティ"]}, + 'videoSearchBtn':{'value':"baidu"}, + '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形式をおすすめします。." + + }, + 'numError':"123,400などの正しい値を入力してください", + 'floatLeft':"左フロート", + 'floatRight':"右フロート", + '"default"':"デフォルト", + 'block':"一行に占める", + 'urlError':"動画URLは間違っています。チャックしてからもう一度お試しください!", + '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':'サーバーがエラーを返しました' + }, + 'webapp':{ + 'tip1':"この機能はBaiduによって提供されています。このページが表示された場合、まずサイト管理者はBaidu APPKeyを申し込んでください!", + 'tip2':"申し込んでから、neditor.config.jsからのappkeyを設定してください! ", + 'applyFor':"申し込む", + 'anthorApi':"Baidu API" + }, + '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:'背景画像を追加'} + }, + 'noScarwl':"何もかかっていない、空白の紙~", + 'scrawlUpLoading':"落書きのアップロード中、心配しないでください~", + 'continueBtn':"続行", + 'imageError':"やばい、画像の読み込みに失敗しました!", + 'backgroundUploading':'背景画像のアップロード中、心配しないでください~' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"歌手/音楽/アルバムを入力し、興味のある音楽を検索してください!", + 'J_searchBtn':{value:'音楽を検索'} + }, + 'emptyTxt':'検索条件と一致する結果がありません。別のキーワードを変更してみてください。', + 'chapter':'音楽', + 'singer':'歌手', + 'special':'アルバム', + 'listenTest':'試聴' + }, + 'anchor':{ + 'static':{ + 'lang_input_anchorName':'アンカー名:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'データソース:', + 'lang_chart_format': 'グラフ形式:', + 'lang_data_align': 'データの配置', + 'lang_chart_align_same': 'データソースはグラフのXY軸と一致しています', + 'lang_chart_align_reverse': 'データソースはチャートXY軸と逆です', + 'lang_chart_title': 'チャートのタイトル', + 'lang_chart_main_title': 'メインタイトル:', + 'lang_chart_sub_title': 'サブタイトル:', + 'lang_chart_x_title': 'X軸タイトル:', + 'lang_chart_y_title': 'Y軸タイトル:', + 'lang_chart_tip': 'チップ文字', + 'lang_cahrt_tip_prefix': 'チップ文字プレフィックス:', + 'lang_cahrt_tip_description': '円グラフのみ有効です。マウスが円グラフに移動したとき、プロンプトボックス内のテキストのプレフィックスを表示します', + 'lang_chart_data_unit': 'データ単位', + 'lang_chart_data_unit_title': '単位:', + 'lang_chart_data_unit_description': '各データポイントに表示されるデータの単位。例えば、温度の単位°C', + 'lang_chart_type': 'グラフタイプ', + 'lang_prev_btn': '前', + 'lang_next_btn': '次へ' + } + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'選択', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'カブトムシ', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'バブル', + 'lang_input_youa':'はい' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'アドレス', + 'lang_input_search':'検索', + 'address':{value:"北京"} + }, + searchError:'このアドレスが見つかりません!' + }, + 'help':{ + 'static':{ + 'lang_input_about':'UEditorについて', + 'lang_input_shortcuts':'ショートカットキー', + 'lang_input_introduction':'UEditorは、Baidu WebフロントエンドのR&D部門によって開発された豊富なテキストWebエディタです。軽量で、カスタマイズ可能で、ユーザ優先などの特長が持っています。オープンソースはBSDプロトコルに基づいており、コードの自由な使用と変更が可能です。', + + '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:["デフォルト", "左揃え", "右揃え", "中央揃え"]} + }, + 'enterAddress':'アドレスを入力してください!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'コンテンツ:', + 'lang_input_url':'リンクアドレス:', + 'lang_input_title':'タイトル:', + 'lang_input_target':'新しいウィンドウで開きますか:' + }, + 'validLink':'リンクを選択する場合のみ、有効', + 'httpPrompt':'ご入力いただいたハイパーリンクにはhttpなどのプロトコル名が含まれておらず、デフォルトはhttp://を追加します' + }, + 'map':{ + 'static':{ + lang_city:"都市", + lang_address:"アドレス", + city:{value:"北京"}, + lang_search:"検索", + lang_dynamicmap:"ダイナミックマップを挿入する" + }, + cityMsg:"都市を選んでください", + errorMsg:"申し訳ございませんが、場所が見つかりません!" + }, + 'searchreplace':{ + 'static':{ + lang_tab_search:"検索", + lang_tab_replace:"置換", + lang_search1:"検索", + lang_search2:"検索", + lang_replace:"置換", + lang_searchReg:'正規表現をサポートします。前後方スラッシュを追加する場合は正規表現です。例えば、“/expression/”', + lang_searchReg1:'正規表現をサポートします。前後方スラッシュを追加する場合は正規表現です。例えば、“/expression/”', + lang_case_sensitive1:"大文字と小文字を区別", + lang_case_sensitive2:"大文字と小文字を区別", + nextFindBtn:{value:"次へ"}, + preFindBtn:{value:"前"}, + nextReplaceBtn:{value:"次へ"}, + preReplaceBtn:{value:"前"}, + repalceBtn:{value:"置換"}, + repalceAllBtn:{value:"すべて置換"} + }, + getEnd:"既にテキストの最後まで検索しました!", + getStart:"テキストのトップまで検索しました", + countMsg:"合計で{#count}を置き換えました!" + }, + 'snapscreen':{ + 'static':{ + lang_showMsg:"スクリーンショット機能を使うにはUEditorプラグインをインストールする必要があります!", + lang_download:"クリックしてダウンロード", + lang_step1:"ステップ1:UEditorプラグインをダウンロードしてからインストールしてください。", + lang_step2:"ステップ2:インストールした後に使用できますが、うまくいかない場合は、ブラウザを再起動して試してください!" + } + }, + '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':'色:' + }, + captionName:'表名', + titleName:'タイトル', + cellsName:'コンテンツ', + errorMsg:'マージされたセルがあるので、ソートできません' + }, + 'edittip':{ + 'static':{ + lang_delRow:'行全体を削除する', + lang_delCol:'列全体を削除する' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'背景色:' + } + }, + '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.開いてて画像アップロードプロセスを選択してください。" + }, + 'fileType':"イメージ", + 'flashError':"初期化に失敗しました。プラグインが正しくインストールされているか確認してください!", + 'netError':"ネットエラー、もう一度お試しください!", + 'copySuccess':"イメージURLがコピーされました!", + 'flashI18n':{} //ブランクがある場合、中国語を表示 + }, + 'autosave': { + 'saving':'保存中...', + 'success':'ローカル保存成功' + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/copy.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b2536aac72e763b9a872b507462458ecb96990f0 GIT binary patch literal 4319 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 N002ovPDHLkV1nv#UQ7T0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/localimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/i18n/zh-cn/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..7303c364318b6ac27dc4a8ae6717124d8dafaff9 GIT binary patch literal 6979 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 O0000字数超出最大允许值,服务器可能拒绝保存!', + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', + 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', + 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', + 'snapScreen_plugin':{ + 'browserMsg':"仅支持IE浏览器!", + 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", + 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " + }, + '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)", + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'paste':"粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + }, + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + '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':["居中", "横向重复", "纵向重复", "平铺","自定义"]} + + }, + 'noUploadImage':"当前未上传过任何图片!", + 'toggleSelect':"单击可切换选中状态\n原图尺寸: " + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"插入图片", //节点 + 'lang_tab_upload':"本地上传", + 'lang_tab_online':"在线管理", + 'lang_tab_search':"图片搜索", + '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':'不能预览', + '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':" :( ,抱歉,没有找到图片!请重试一次!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': '上传附件', + 'lang_tab_online': '在线附件', + 'lang_start_upload':"开始上传", + 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" + }, + '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':'服务器返回出错' + }, + '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_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':"    抱歉,找不到对应的视频,请重试!", + + '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':'服务器返回出错' + }, + 'webapp':{ + 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", + 'tip2':"申请完成之后请至neditor.config.js中配置获得的appkey! ", + 'applyFor':"点此申请", + 'anthorApi':"百度API" + }, + '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:'添加背景图片'} + }, + 'noScarwl':"尚未作画,白纸一张~", + 'scrawlUpLoading':"涂鸦上传中,别急哦~", + 'continueBtn':"继续", + 'imageError':"糟糕,图片读取失败了!", + 'backgroundUploading':'背景图片上传中,别急哦~' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", + 'J_searchBtn':{value:'搜索歌曲'} + }, + 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', + 'chapter':'歌曲', + 'singer':'歌手', + 'special':'专辑', + 'listenTest':'试听' + }, + 'anchor':{ + 'static':{ + 'lang_input_anchorName':'锚点名字:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'数据源:', + 'lang_chart_format': '图表格式:', + 'lang_data_align': '数据对齐方式', + 'lang_chart_align_same': '数据源与图表X轴Y轴一致', + 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', + 'lang_chart_title': '图表标题', + 'lang_chart_main_title': '主标题:', + 'lang_chart_sub_title': '子标题:', + 'lang_chart_x_title': 'X轴标题:', + 'lang_chart_y_title': 'Y轴标题:', + 'lang_chart_tip': '提示文字', + 'lang_cahrt_tip_prefix': '提示文字前缀:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': '数据单位', + 'lang_chart_data_unit_title': '单位:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': '图表类型:', + 'lang_prev_btn': '上一个', + 'lang_next_btn': '下一个' + } + }, + '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':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{value:"北京"} + }, + searchError:'无法定位到该地址!' + }, + 'help':{ + 'static':{ + 'lang_input_about':'关于UEditor', + 'lang_input_shortcuts':'快捷键', + 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', + '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:["默认", "左对齐", "右对齐", "居中"]} + }, + 'enterAddress':'请输入地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + lang_city:"城市", + lang_address:"地址", + city:{value:"北京"}, + lang_search:"搜索", + lang_dynamicmap:"插入动态地图" + }, + cityMsg:"请选择城市", + errorMsg:"抱歉,找不到该位置!" + }, + '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}处!" + }, + 'snapscreen':{ + 'static':{ + lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", + lang_download:"点此下载", + lang_step1:"第一步,下载UEditor截图插件并运行安装。", + lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" + } + }, + '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':'颜色:' + }, + captionName:'表格名称', + titleName:'标题', + cellsName:'内容', + errorMsg:'有合并单元格,不可排序' + }, + 'edittip':{ + 'static':{ + lang_delRow:'删除整行', + lang_delCol:'删除整列' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'背景颜色:' + } + }, + '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、点击打开后选择图片上传流程。" + }, + 'fileType':"图片", + 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError':"网络连接错误,请重试!", + 'copySuccess':"图片地址已经复制!", + 'flashI18n':{} //留空默认中文 + }, + 'autosave': { + 'saving':'保存中...', + 'success':'本地保存成功' + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js new file mode 100644 index 0000000..c3273ec --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js @@ -0,0 +1,601 @@ +/** + * neditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +/**************************提示******************************** + * 所有被注释的配置项均为UEditor默认值。 + * 修改默认配置请首先确保已经完全明确该参数的真实用途。 + * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 + * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 + **************************提示********************************/ + +(function () { + /** + * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 + * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 + * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/neditor/"这样的路径。 + * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 + * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 + * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; + */ + var URL = window.UEDITOR_HOME_URL || getUEBasePath(); + + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + //为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL, + + // 服务器统一请求接口路径 + //serverUrl: window.NEDITOR_UPLOAD || URL + "php/controller.php", + serverUrl: "", + imageActionName: "uploadimage", + scrawlActionName: "uploadscrawl", + videoActionName: "uploadvideo", + fileActionName: "uploadfile", + imageFieldName: "file", // 提交的图片表单名称 + imageMaxSize: 2048000, // 上传大小限制,单位B + imageUrlPrefix: "", + scrawlUrlPrefix: "", + videoUrlPrefix: "", + fileUrlPrefix: "", + catcherLocalDomain: "", + //工具栏上的所有的功能按钮和下拉框,可以在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", + "music", + "attachment", + "map", + "gmap", + "insertframe", + // "webapp", + "pagebreak", + "template", + "background", + "|", + "insertcode", + "horizontal", + "date", + "time", + "spechars", + "snapscreen", + "wordimage", + "|", + "inserttable", + "deletetable", + "insertparagraphbeforetable", + "insertrow", + "deleterow", + "insertcol", + "deletecol", + "mergecells", + "mergeright", + "mergedown", + "splittocells", + "splittorows", + "splittocols", + "charts", + "|", + "print", + "preview", + "searchreplace", + "drafts", + "help" + ] + ] + //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 + //,labelMap:{ + // 'anchor':'', 'undo':'' + //} + + //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: + //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() + //,lang:"zh-cn" + //,langPath:URL +"i18n/" + + //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: + //现有如下皮肤:default + , + theme: 'notadd' + //,themePath:URL +"themes/" + + , + zIndex: 1100 //编辑器层级的基数,默认是900 + + //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 + //,charset:"utf-8" + + //若实例化编辑器的页面手动修改的domain,此处需要设置为true + //,customDomain:false + + //常用配置项目 + //,isShow : true //默认显示编辑器 + + //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 + + //,initialContent:'欢迎使用neditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 + + //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 + + //,focus:false //初始化时,是否让编辑器获得焦点true或false + + //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 + //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 + + //,iframeJsUrl: '' //给编辑区域的iframe引入一个js文件 + //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 + + //indentValue + //首行缩进距离,默认是2em + //,indentValue:'2em' + + //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 + //,initialFrameHeight:320 //初始化编辑器高度,默认320 + + //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false + + //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) + + //启用自动保存 + //,enableAutoSave: true + //自动保存间隔时间, 单位ms + //,saveInterval: 500 + + //启用拖放上传 + //,enableDragUpload: true + //启用粘贴上传 + //,enablePasteUpload: true + + //启用图片拉伸缩放 + //,imageScaleEnabled: true + + //,fullscreen : false //是否开启初始化时即全屏,默认关闭 + + //,imagePopup:true //图片操作的浮层开关,默认打开 + + //,autoSyncData:true //自动同步编辑器要提交的数据 + //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 + + //粘贴只保留标签,去除标签所有属性 + //,retainOnlyLabelPasted: false + + //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + //纯文本粘贴模式下的过滤规则 + //'filterTxtRules' : function(){ + // function transP(node){ + // node.tagName = 'p'; + // node.setStyle(); + // } + // return { + // //直接删除及其字节点内容 + // '-' : 'script style object iframe embed input select', + // 'p': {$:{}}, + // 'br':{$:{}}, + // 'div':{'$':{}}, + // 'li':{'$':{}}, + // '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()) + // } + // } + //}() + + //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 + + //insertorderedlist + //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,'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' : '' , lang //'A,B,C' + // 'upper-roman' : '' //'I,II,III...' + //} + + //insertunorderedlist + //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,insertunorderedlist : { //自定的样式 + // 'dash' :'— 破折号', //-破折号 + // 'dot':' 。 小圆圈', //系统自带 + // 'circle' : '', // '○ 小圆圈' + // 'disc' : '', // '● 小圆点' + // 'square' : '' //'■ 小方块' + //} + //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 + //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 + //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 + + //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 + + //fontfamily + //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 + //,'fontfamily':[ + // { label:'',name:'songti',val:'宋体,SimSun'}, + // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, + // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, + // { label:'',name:'heiti',val:'黑体, SimHei'}, + // { label:'',name:'lishu',val:'隶书, SimLi'}, + // { label:'',name:'andaleMono',val:'andale mono'}, + // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, + // { label:'',name:'arialBlack',val:'arial black,avant garde'}, + // { label:'',name:'comicSansMs',val:'comic sans ms'}, + // { label:'',name:'impact',val:'impact,chicago'}, + // { label:'',name:'timesNewRoman',val:'times new roman'} + //] + + //fontsize + //字号 + //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] + + //paragraph + //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 + //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} + + //rowspacingtop + //段间距 值和显示的名字相同 + //,'rowspacingtop':['5', '10', '15', '20', '25'] + + //rowspacingBottom + //段间距 值和显示的名字相同 + //,'rowspacingbottom':['5', '10', '15', '20', '25'] + + //lineheight + //行内间距 值和显示的名字相同 + //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] + + //customstyle + //自定义样式,不支持国际化,此处配置值即可最后显示值 + //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 + //尽量使用一些常用的标签 + //参数说明 + //tag 使用的标签名字 + //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, + //style 添加的样式 + //每一个对象就是一个自定义的样式 + //,'customstyle':[ + // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, + // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, + // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} + //] + + //打开右键菜单功能 + //,enableContextMenu: true + //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 + //,contextMenu:[ + // { + // label:'', //显示的名称 + // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 + // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName + // exec:function () { + // //this是当前编辑器的实例 + // //this.ui._dialogs['inserttableDialog'].open(); + // } + // } + //] + + //快捷菜单 + //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] + + //elementPathEnabled + //是否启用元素路径,默认是显示 + //,elementPathEnabled : true + + //wordCount + //,wordCount:true //是否开启字数统计 + //,maximumWords:10000 //允许的最大字符数 + //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 + //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 + //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 + //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! + + //tab + //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 + //,tabSize:4 + //,tabNode:' ' + + //removeFormat + //清除格式时可以删除的标签和属性 + //removeForamtTags标签 + //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' + //removeFormatAttributes属性 + //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' + + //undo + //可以最多回退的次数,默认20 + //,maxUndoCount:20 + //当输入的字符数超过该值时,保存一次现场 + //,maxInputCount:1 + + //autoHeightEnabled + // 是否自动长高,默认true + , + autoHeightEnabled: false + + //scaleEnabled + //是否可以拉伸长高,默认true(当开启时,自动长高失效) + //,scaleEnabled:false + //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + + //autoFloatEnabled + //是否保持toolbar的位置不动,默认true + //,autoFloatEnabled:true + //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 + //,topOffset:30 + //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) + //,toolbarTopOffset:400 + + //设置远程图片是否抓取到本地保存 + //,catchRemoteImageEnable: true //设置是否抓取远程图片 + + //pageBreakTag + //分页标识符,默认是_neditor_page_break_tag_ + //,pageBreakTag:'_neditor_page_break_tag_' + + //autotypeset + //自动排版参数 + //,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: {标签名字:1}, + // indent: false, // 行首缩进 + // indentValue : '2em', //行首缩进的大小 + // bdc2sb: false, + // tobdc: false + //} + + //tableDragable + //表格是否可以拖拽 + //,tableDragable: true + + //sourceEditor + //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror + //注意默认codemirror只能在ie8+和非ie中使用 + //,sourceEditor:"codemirror" + //如果sourceEditor是codemirror,还用配置一下两个参数 + //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" + //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" + //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" + //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" + //编辑器初始化完成后是否进入源码模式,默认为否。 + //,sourceEditorFirst:false + + //iframeUrlMap + //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 + //,iframeUrlMap:{ + // 'anchor':'~/dialogs/anchor/anchor.html', + //} + + //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http + //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] + + //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html + //, webAppKey: "" + + //默认过滤规则相关配置项目 + //,disabledTableInTable:true //禁止表格嵌套 + //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 + //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 + + // xss 过滤是否开启,inserthtml等操作 + , + xssFilterRules: true + //input xss过滤 + , + inputXssFilter: true + //output xss过滤 + , + outputXssFilter: true + // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js + , + whitList: { + a: ['target', 'href', 'title', 'class', 'style'], + abbr: ['title', 'class', 'style'], + address: ['class', 'style'], + area: ['shape', 'coords', 'href', 'alt'], + article: [], + aside: [], + audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], + b: ['class', 'style'], + bdi: ['dir'], + bdo: ['dir'], + big: [], + blockquote: ['cite', 'class', 'style'], + br: [], + caption: ['class', 'style'], + center: [], + cite: [], + code: ['class', 'style'], + col: ['align', 'valign', 'span', 'width', 'class', 'style'], + colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], + dd: ['class', 'style'], + del: ['datetime'], + details: ['open'], + div: ['class', 'style'], + dl: ['class', 'style'], + dt: ['class', 'style'], + em: ['class', 'style'], + font: ['color', 'size', 'face'], + footer: [], + h1: ['class', 'style'], + h2: ['class', 'style'], + h3: ['class', 'style'], + h4: ['class', 'style'], + h5: ['class', 'style'], + h6: ['class', 'style'], + header: [], + hr: [], + i: ['class', 'style'], + img: ['style', 'src', 'alt', 'title', 'width', 'height', 'id', '_src', '_url', 'loadingclass', 'class', 'data-latex'], + ins: ['datetime'], + li: ['class', 'style'], + mark: [], + nav: [], + ol: ['class', 'style'], + p: ['class', 'style'], + pre: ['class', 'style'], + s: [], + section: [], + small: [], + span: ['class', 'style'], + sub: ['class', 'style'], + sup: ['class', 'style'], + strong: ['class', 'style'], + table: ['width', 'border', 'align', 'valign', 'class', 'style'], + tbody: ['align', 'valign', 'class', 'style'], + td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + tfoot: ['align', 'valign', 'class', 'style'], + th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + thead: ['align', 'valign', 'class', 'style'], + tr: ['rowspan', 'align', 'valign', 'class', 'style'], + tt: [], + u: [], + ul: ['class', 'style'], + video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'], + source: ['src', 'type'], + embed: ['type', 'class', 'pluginspage', 'src', 'width', 'height', 'align', 'style', 'wmode', 'play', 'autoplay', 'loop', 'menu', 'allowscriptaccess', 'allowfullscreen', 'controls', 'preload'], + iframe: ['src', 'class', 'height', 'width', 'max-width', 'max-height', 'align', 'frameborder', 'allowfullscreen'] + } + }; + + function getUEBasePath(docUrl, confUrl) { + return getBasePath( + docUrl || self.document.URL || self.location.href, + confUrl || getConfigFilePath() + ); + } + + function getConfigFilePath() { + var configPath = document.getElementsByTagName("script"); + + return configPath[configPath.length - 1].src; + } + + function getBasePath(docUrl, confUrl) { + var basePath = confUrl; + + if (/^(\/|\\\\)/.test(confUrl)) { + basePath = + /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ""); + } else if (!/^[a-z]+:/i.test(confUrl)) { + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ""); + + basePath = docUrl + "" + confUrl; + } + + return optimizationPath(basePath); + } + + function optimizationPath(path) { + var protocol = /^[a-z]+:\/\//.exec(path)[0], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, "/").split(/\//); + + path[path.length - 1] = ""; + + while (path.length) { + if ((tmp = path.shift()) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + } + + return protocol + res.join("/"); + } + + window.UE = { + getUEBasePath: getUEBasePath + }; +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js new file mode 100644 index 0000000..2fea85e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js @@ -0,0 +1,64 @@ +(function() { + var paths = [ + 'parse.js', + 'insertcode.js', + 'table.js', + 'charts.js', + 'background.js', + 'list.js', + 'video.js' + ]; + + function getUEBasePath(docUrl, confUrl) { + return getBasePath( + docUrl || self.document.URL || self.location.href, + confUrl || getConfigFilePath() + ); + } + + function getConfigFilePath() { + var configPath = document.getElementsByTagName("script"); + + return configPath[configPath.length - 1].src; + } + + function getBasePath(docUrl, confUrl) { + var basePath = confUrl; + + if (!/^[a-z]+:/i.test(confUrl)) { + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ""); + + basePath = docUrl + "" + confUrl; + } + + return optimizationPath(basePath); + } + + function optimizationPath(path) { + var protocol = /^[a-z]+:\/\//.exec(path)[0], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, "/").split(/\//); + + path[path.length - 1] = ""; + + while (path.length) { + if ((tmp = path.shift()) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + } + + return protocol + res.join("/"); + } + var baseURL = getUEBasePath() + "_parse/"; + for (var i = 0, pi; (pi = paths[i++]); ) { + document.write( + '' + ); + } +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.service.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.service.js new file mode 100644 index 0000000..7fd4ffe --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.service.js @@ -0,0 +1,234 @@ +/** + * 自定义上传接口 + * 由于所有Neditor请求都通过editor对象的getActionUrl方法获取上传接口,可以直接通过复写这个方法实现自定义上传接口 + * @param {String} action 匹配neditor.config.js中配置的xxxActionName + * @returns 返回自定义的上传接口 + */ +UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl; +UE.Editor.prototype.getActionUrl = function(action) { + /* 按config中的xxxActionName返回对应的接口地址 */ + if (action == 'uploadimage' || action == 'uploadscrawl') { + return 'http://a.b.com/upload.php'; + } else if (action == 'uploadvideo') { + return 'http://a.b.com/video.php'; + } else { + return this._bkGetActionUrl.call(this, action); + } +} + +/** + * 图片上传service + * @param {Object} context UploadImage对象 图片上传上下文 + * @param {Object} editor 编辑器对象 + * @returns imageUploadService 对象 + */ +window.UEDITOR_CONFIG['imageUploadService'] = function(context, editor) { + return { + /** + * 触发fileQueued事件时执行 + * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数) + * @param {Object} file 当前选择的文件对象 + */ + setUploadData: function(file) { + return file; + }, + /** + * 触发uploadBeforeSend事件时执行 + * 在文件上传之前触发,用来添加附带参数 + * @param {Object} object 当前上传对象 + * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数 + * @param {Object} headers 可以扩展此对象来控制上传头部 + * @returns 上传参数对象 + */ + setFormData: function(object, data, headers) { + return data; + }, + /** + * 触发startUpload事件时执行 + * 当开始上传流程时触发,用来设置Uploader配置项 + * @param {Object} uploader + * @returns uploader + */ + setUploaderOptions: function(uploader) { + return uploader; + }, + /** + * 触发uploadSuccess事件时执行 + * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象 + * @param {Object} res 上传接口返回的response + * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200) + */ + getResponseSuccess: function(res) { + return res.code == 200; + }, + /* 指定上传接口返回的response中图片路径的字段,默认为 url + * 如果图片路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url + * */ + imageSrcField: 'url' + } +}; + +/** + * 视频上传service + * @param {Object} context UploadVideo对象 视频上传上下文 + * @param {Object} editor 编辑器对象 + * @returns videoUploadService 对象 + */ +window.UEDITOR_CONFIG['videoUploadService'] = function(context, editor) { + return { + /** + * 触发fileQueued事件时执行 + * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数) + * @param {Object} file 当前选择的文件对象 + */ + setUploadData: function(file) { + return file; + }, + /** + * 触发uploadBeforeSend事件时执行 + * 在文件上传之前触发,用来添加附带参数 + * @param {Object} object 当前上传对象 + * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数 + * @param {Object} headers 可以扩展此对象来控制上传头部 + * @returns 上传参数对象 + */ + setFormData: function(object, data, headers) { + return data; + }, + /** + * 触发startUpload事件时执行 + * 当开始上传流程时触发,用来设置Uploader配置项 + * @param {Object} uploader + * @returns uploader + */ + setUploaderOptions: function(uploader) { + return uploader; + }, + /** + * 触发uploadSuccess事件时执行 + * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象 + * @param {Object} res 上传接口返回的response + * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200) + */ + getResponseSuccess: function(res) { + return res.code == 200; + }, + /* 指定上传接口返回的response中视频路径的字段,默认为 url + * 如果视频路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url + * */ + videoSrcField: 'url' + } +}; + +/** + * 涂鸦上传service + * @param {Object} context scrawlObj对象 + * @param {Object} editor 编辑器对象 + * @returns scrawlUploadService 对象 + */ +window.UEDITOR_CONFIG['scrawlUploadService'] = function(context, editor) { + return scrawlUploadService = { + /** + * 点击涂鸦模态框确认按钮时触发 + * 上传涂鸦图片 + * @param {Object} file 涂鸦canvas生成的图片 + * @param {Object} base64 涂鸦canvas生成的base64 + * @param {Function} success 上传成功回调函数,回传上传成功的response对象 + * @param {Function} fail 上传失败回调函数,回传上传失败的response对象 + */ + + /** + * 上传成功的response对象必须为以下两个属性赋值 + * + * 上传接口返回的response成功状态条件 {Boolean} (比如: res.code == 200) + * res.responseSuccess = res.code == 200; + * + * 指定上传接口返回的response中涂鸦图片路径的字段,默认为 url + * res.videoSrcField = 'url'; + */ + uploadScraw: function(file, base64, success, fail) { + + /* 模拟上传操作 */ + var formData = new FormData(); + formData.append('file', file, file.name); + + $.ajax({ + url: editor.getActionUrl(editor.getOpt('scrawlActionName')), + type: 'POST', + //ajax2.0可以不用设置请求头,但是jq帮我们自动设置了,这样的话需要我们自己取消掉 + contentType: false, + //取消帮我们格式化数据,是什么就是什么 + processData: false, + data: formData + }).done(function(res) { + var res = JSON.parse(res); + + /* 上传接口返回的response成功状态条件 (比如: res.code == 200) */ + res.responseSuccess = res.code == 200; + + /* 指定上传接口返回的response中涂鸦图片路径的字段,默认为 url + * 如果涂鸦图片路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url + */ + res.scrawlSrcField = 'url'; + + /* 上传成功 */ + success.call(context, res); + }).fail(function(err) { + /* 上传失败 */ + fail.call(context, err); + }); + } + } +} + +/** + * 附件上传service + * @param {Object} context UploadFile对象 附件上传上下文 + * @param {Object} editor 编辑器对象 + * @returns fileUploadService 对象 + */ +window.UEDITOR_CONFIG['fileUploadService'] = function(context, editor) { + return { + /** + * 触发fileQueued事件时执行 + * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数) + * @param {Object} file 当前选择的文件对象 + */ + setUploadData: function(file) { + return file; + }, + /** + * 触发uploadBeforeSend事件时执行 + * 在文件上传之前触发,用来添加附带参数 + * @param {Object} object 当前上传对象 + * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数 + * @param {Object} headers 可以扩展此对象来控制上传头部 + * @returns 上传参数对象 + */ + setFormData: function(object, data, headers) { + return data; + }, + /** + * 触发startUpload事件时执行 + * 当开始上传流程时触发,用来设置Uploader配置项 + * @param {Object} uploader + * @returns uploader + */ + setUploaderOptions: function(uploader) { + return uploader; + }, + /** + * 触发uploadSuccess事件时执行 + * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象 + * @param {Object} res 上传接口返回的response + * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200) + */ + getResponseSuccess: function(res) { + return res.code == 200; + }, + /* 指定上传接口返回的response中附件路径的字段,默认为 url + * 如果附件路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url + * */ + fileSrcField: 'url' + } +}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/package.json b/web/src/main/resources/static/plug-in/neditor/2.1.17/package.json new file mode 100644 index 0000000..4790531 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/package.json @@ -0,0 +1,44 @@ +{ + "name": "@notadd/neditor", + "title": "neditor", + "description": "Neditor富文本web编辑器", + "version": "2.1.17", + "homepage": "https://github.com/notadd/neditor", + "author": { + "name": "Notadd", + "url": "http://www.notadd.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/notadd/neditor.git" + }, + "keywords": [ + "neditor", + "web editor", + "javascript", + "rich editor" + ], + "bugs": { + "url": "https://github.com/notadd/neditor/issues" + }, + "dependencies": {}, + "devDependencies": { + "conventional-changelog-cli": "^2.0.5", + "gh-pages": "^1.2.0", + "grunt": "~0.4.1", + "grunt-cli": "^1.2.0", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-copy": "~0.4.0", + "grunt-contrib-cssmin": "~0.6.0", + "grunt-contrib-uglify": "^1.0.1", + "grunt-text-replace": "~0.3.9", + "grunt-transcoding": "~0.1.1" + }, + "scripts": { + "build": "grunt neditor", + "publish": "cd dist && npm publish --access public", + "deploy": "gh-pages -d dist", + "changelog": "rm -rf CHANGELOG.md && conventional-changelog -p angular -r 4 -i CHANGELOG.md -s" + } +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/autotypesetpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/autotypesetpicker.css new file mode 100644 index 0000000..72c4c76 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/autotypesetpicker.css @@ -0,0 +1,21 @@ +/*自动排版弹出菜单*/ +.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-default .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-default .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/button.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/button.css new file mode 100644 index 0000000..722639f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/button.css @@ -0,0 +1,42 @@ +/*普通按钮样式及状态*/ +.edui-default .edui-toolbar .edui-button .edui-icon, +.edui-default .edui-toolbar .edui-menubutton .edui-icon, +.edui-default .edui-toolbar .edui-splitbutton .edui-icon { + height: 20px !important; + width: 20px !important; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +.edui-default .edui-toolbar .edui-button .edui-button-wrap { + padding: 1px; + position: relative; +} + +.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #fff5d4; + padding: 0; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #ffe69f; + padding: 0; + border: 1px solid #dcac6c; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #ffffff; + padding: 0; + border: 1px solid gray; +} +.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); +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/buttonicon.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/buttonicon.css new file mode 100644 index 0000000..0e6fc03 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/buttonicon.css @@ -0,0 +1,419 @@ +/* toolbar icons */ +.edui-default .edui-for-undo .edui-icon { + background-position: -160px 0; +} + +.edui-default .edui-for-redo .edui-icon { + background-position: -100px 0; +} + +.edui-default .edui-for-bold .edui-icon { + background-position: 0 0; +} + +.edui-default .edui-for-italic .edui-icon { + background-position: -60px 0; +} + +.edui-default .edui-for-fontborder .edui-icon { + background-position:-160px -40px; +} +.edui-default .edui-for-underline .edui-icon { + background-position: -140px 0; +} + +.edui-default .edui-for-strikethrough .edui-icon { + background-position: -120px 0; +} + +.edui-default .edui-for-subscript .edui-icon { + background-position: -600px 0; +} + +.edui-default .edui-for-superscript .edui-icon { + background-position: -620px 0; +} + +.edui-default .edui-for-blockquote .edui-icon { + background-position: -220px 0; +} + +.edui-default .edui-for-forecolor .edui-icon { + background-position: -720px 0; +} + +.edui-default .edui-for-backcolor .edui-icon { + background-position: -760px 0; +} + +.edui-default .edui-for-inserttable .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-autotypeset .edui-icon { + background-position: -640px -40px; +} + +.edui-default .edui-for-justifyleft .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-justifycenter .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-justifyright .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-justifyjustify .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-insertorderedlist .edui-icon { + background-position: -80px 0; +} + +.edui-default .edui-for-insertunorderedlist .edui-icon { + background-position: -20px 0; +} + +.edui-default .edui-for-lineheight .edui-icon { + background-position: -725px -40px; +} + +.edui-default .edui-for-rowspacingbottom .edui-icon { + background-position: -745px -40px; +} + +.edui-default .edui-for-rowspacingtop .edui-icon { + background-position: -765px -40px; +} + +.edui-default .edui-for-horizontal .edui-icon { + background-position: -360px 0; +} + +.edui-default .edui-for-link .edui-icon { + background-position: -500px 0; +} + +.edui-default .edui-for-code .edui-icon { + background-position: -440px -40px; +} + +.edui-default .edui-for-insertimage .edui-icon { + background-position: -726px -77px; +} + +.edui-default .edui-for-insertframe .edui-icon { + background-position: -240px -40px; +} + +.edui-default .edui-for-emoticon .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-spechars .edui-icon { + background-position: -240px 0; +} + +.edui-default .edui-for-help .edui-icon { + background-position: -340px 0; +} + +.edui-default .edui-for-print .edui-icon { + background-position: -440px -20px; +} + +.edui-default .edui-for-preview .edui-icon { + background-position: -420px -20px; +} + +.edui-default .edui-for-selectall .edui-icon { + background-position: -400px -20px; +} + +.edui-default .edui-for-searchreplace .edui-icon { + background-position: -520px -20px; +} + +.edui-default .edui-for-map .edui-icon { + background-position: -40px -40px; +} + +.edui-default .edui-for-gmap .edui-icon { + background-position: -260px -40px; +} + +.edui-default .edui-for-insertvideo .edui-icon { + background-position: -320px -20px; +} + +.edui-default .edui-for-time .edui-icon { + background-position: -160px -20px; +} + +.edui-default .edui-for-date .edui-icon { + background-position: -140px -20px; +} + +.edui-default .edui-for-cut .edui-icon { + background-position: -680px 0; +} + +.edui-default .edui-for-copy .edui-icon { + background-position: -700px 0; +} + +.edui-default .edui-for-paste .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-formatmatch .edui-icon { + background-position: -40px 0; +} + +.edui-default .edui-for-pasteplain .edui-icon { + background-position: -360px -20px; +} + +.edui-default .edui-for-directionalityltr .edui-icon { + background-position: -20px -20px; +} + +.edui-default .edui-for-directionalityrtl .edui-icon { + background-position: -40px -20px; +} + +.edui-default .edui-for-source .edui-icon { + background-position: -261px -0px; +} + +.edui-default .edui-for-removeformat .edui-icon { + background-position: -580px 0; +} + +.edui-default .edui-for-unlink .edui-icon { + background-position: -640px 0; +} + +.edui-default .edui-for-touppercase .edui-icon { + background-position: -786px 0; +} + +.edui-default .edui-for-tolowercase .edui-icon { + background-position: -806px 0; +} + +.edui-default .edui-for-insertrow .edui-icon { + background-position: -478px -76px; +} + +.edui-default .edui-for-insertrownext .edui-icon { + background-position: -498px -76px; +} + +.edui-default .edui-for-insertcol .edui-icon { + background-position: -455px -76px; +} + +.edui-default .edui-for-insertcolnext .edui-icon { + background-position: -429px -76px; +} + +.edui-default .edui-for-mergeright .edui-icon { + background-position: -60px -40px; +} + +.edui-default .edui-for-mergedown .edui-icon { + background-position: -80px -40px; +} + +.edui-default .edui-for-splittorows .edui-icon { + background-position: -100px -40px; +} + +.edui-default .edui-for-splittocols .edui-icon { + background-position: -120px -40px; +} + +.edui-default .edui-for-insertparagraphbeforetable .edui-icon { + background-position: -140px -40px; +} + +.edui-default .edui-for-deleterow .edui-icon { + background-position: -660px -20px; +} + +.edui-default .edui-for-deletecol .edui-icon { + background-position: -640px -20px; +} + +.edui-default .edui-for-splittocells .edui-icon { + background-position: -800px -20px; +} + +.edui-default .edui-for-mergecells .edui-icon { + background-position: -760px -20px; +} + +.edui-default .edui-for-deletetable .edui-icon { + background-position: -620px -20px; +} + +.edui-default .edui-for-cleardoc .edui-icon { + background-position: -520px 0; +} + +.edui-default .edui-for-fullscreen .edui-icon { + background-position: -100px -20px; +} + +.edui-default .edui-for-anchor .edui-icon { + background-position: -200px 0; +} + +.edui-default .edui-for-pagebreak .edui-icon { + background-position: -460px -40px; +} + +.edui-default .edui-for-imagenone .edui-icon { + background-position: -480px -40px; +} + +.edui-default .edui-for-imageleft .edui-icon { + background-position: -500px -40px; +} + +.edui-default .edui-for-wordimage .edui-icon { + background-position: -660px -40px; +} + +.edui-default .edui-for-imageright .edui-icon { + background-position: -520px -40px; +} + +.edui-default .edui-for-imagecenter .edui-icon { + background-position: -540px -40px; +} + +.edui-default .edui-for-indent .edui-icon { + background-position: -400px 0; +} + +.edui-default .edui-for-outdent .edui-icon { + background-position: -540px 0; +} + +.edui-default .edui-for-webapp .edui-icon { + background-position: -601px -40px +} + +.edui-default .edui-for-table .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-edittable .edui-icon { + background-position: -420px -40px; +} + +.edui-default .edui-for-template .edui-icon { + background-position: -339px -40px; +} + +.edui-default .edui-for-delete .edui-icon { + background-position: -360px -40px; +} + +.edui-default .edui-for-attachment .edui-icon { + background-position: -620px -40px; +} + +.edui-default .edui-for-edittd .edui-icon { + background-position: -700px -40px; +} + +.edui-default .edui-for-snapscreen .edui-icon { + background-position: -581px -40px +} + +.edui-default .edui-for-scrawl .edui-icon { + background-position: -801px -41px +} + +.edui-default .edui-for-background .edui-icon { + background-position: -680px -40px; +} + +.edui-default .edui-for-music .edui-icon { + background-position: -18px -40px +} + +.edui-default .edui-for-formula .edui-icon { + background-position: -200px -40px +} + +.edui-default .edui-for-aligntd .edui-icon { + background-position: -236px -76px; +} + +.edui-default .edui-for-insertparagraphtrue .edui-icon { + background-position: -625px -76px; +} + +.edui-default .edui-for-insertparagraph .edui-icon { + background-position: -602px -76px; +} + +.edui-default .edui-for-insertcaption .edui-icon { + background-position: -336px -76px; +} + +.edui-default .edui-for-deletecaption .edui-icon { + background-position: -362px -76px; +} + +.edui-default .edui-for-inserttitle .edui-icon { + background-position: -286px -76px; +} + +.edui-default .edui-for-deletetitle .edui-icon { + background-position: -311px -76px; +} + +.edui-default .edui-for-aligntable .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-tablealignment-left .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-tablealignment-center .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-tablealignment-right .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-drafts .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-charts .edui-icon { + background: url(../images/charts.png) no-repeat 2px 3px!important; +} + +.edui-default .edui-for-inserttitlecol .edui-icon { + background-position: -673px -76px; +} + +.edui-default .edui-for-deletetitlecol .edui-icon { + background-position: -698px -76px; +} + +.edui-default .edui-for-simpleupload .edui-icon { + background-position: -380px 0px; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/cellalignpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/cellalignpicker.css new file mode 100644 index 0000000..9f5aa5c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/cellalignpicker.css @@ -0,0 +1,56 @@ +/*自动排版弹出菜单*/ +.edui-default .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-default .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-default .edui-cellalignpicker-body td{ + padding: 1px; +} +.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{ + background-position: 0 0; +} + +.edui-default .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-default .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.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{ + background-position: -98px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorbutton.css new file mode 100644 index 0000000..791c61d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorbutton.css @@ -0,0 +1,9 @@ +/*颜色按钮 */ +.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 1px; + left: 1px; + width: 18px; + height: 4px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorpicker.css new file mode 100644 index 0000000..fae1219 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/colorpicker.css @@ -0,0 +1,119 @@ +/* 颜色弹出菜单 */ +.edui-default .edui-colorpicker-topbar { + height: 27px; + width: 200px; + /*border-bottom: 1px gray dashed;*/ +} + +.edui-default .edui-colorpicker-preview { + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} + +.edui-default .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} + +.edui-default .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-default .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-default .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-default .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.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; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/combox.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/combox.css new file mode 100644 index 0000000..796c1c0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/combox.css @@ -0,0 +1,62 @@ +/*不可选中菜单按钮 */ +.edui-default .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/contextmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/contextmenu.css new file mode 100644 index 0000000..366e653 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/contextmenu.css @@ -0,0 +1,29 @@ +/*contextmenu*/ +.edui-default .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; + background: url("../images/icons-all.gif") no-repeat 10px -233px; +} + +.edui-default .edui-menu-body .edui-menuitem { + padding: 1px; +} + +.edui-default .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; +} + +.edui-default .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-default .edui-menu-body .edui-state-hover { + padding: 0 !important; + background-color: #fff5d4; + border: 1px solid #dcac6c; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/dialog.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/dialog.css new file mode 100644 index 0000000..42e9855 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/dialog.css @@ -0,0 +1,294 @@ +/* 弹出对话框按钮和对话框大小 */ +.edui-default .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div{ + width:auto; +} + +.edui-default .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-default .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-default .edui-dialog-body { + position: relative; + padding:2px 0 0 2px; + _zoom: 1; +} + +.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-default .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-default .edui-dialog-foot { + background-color: white; +} + +.edui-default .edui-dialog-titlebar { + height: 26px; + border-bottom: 1px solid #c6c6c6; + background: url(../images/dialog-title-bg.png) repeat-x bottom; + position: relative; + cursor: move; +} +.edui-default .edui-dialog-caption { + font-weight: bold; + font-size: 12px; + line-height: 26px; + padding-left: 5px; +} + +.edui-default .edui-dialog-draghandle { + height: 26px; +} + +.edui-default .edui-dialog-closebutton { + position: absolute !important; + right: 5px; + top: 3px; +} + +.edui-default .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + background: url("../images/icons-all.gif") no-repeat 0 -59px; +} + +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -89px; +} + +.edui-default .edui-dialog-foot { + height: 40px; +} + +.edui-default .edui-dialog-buttons { + position: absolute; + right: 0; +} + +.edui-default .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-button-body { + background: url("../images/icons-all.gif") no-repeat; + height: 24px; + width: 96px; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: default; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -30px; +} + +.edui-default .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-default .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #ccc; + position: absolute; + /*z-index: 1999;*/ +} + +.edui-default .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-default .edui-dialog-content { + position: relative; +} + +.edui-default .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-default .edui-for-link .edui-dialog-content { + width: 420px; + height: 200px; + overflow: hidden; +} +/*background-dialog*/ +.edui-default .edui-for-background .edui-dialog-content { + width: 440px; + height: 280px; + overflow: hidden; +} + +/*template-dialog*/ +.edui-default .edui-for-template .edui-dialog-content { + width: 630px; + height: 390px; + overflow: hidden; +} + +/*scrawl-dialog*/ +.edui-default .edui-for-scrawl .edui-dialog-content { + width: 515px; + *width: 506px; + height: 360px; +} + +/*spechars-dialog*/ +.edui-default .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-default .edui-for-insertimage .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-default .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-default .edui-for-insertframe .edui-dialog-content { + width: 350px; + height: 200px; + overflow: hidden; +} + +/*wordImage-dialog*/ +.edui-default .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-default .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + + +/*map-dialog*/ +.edui-default .edui-for-map .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*gmap-dialog*/ +.edui-default .edui-for-gmap .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*video-dialog*/ +.edui-default .edui-for-insertvideo .edui-dialog-content { + width: 590px; + height: 390px; +} + +/*anchor-dialog*/ +.edui-default .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-default .edui-for-searchreplace .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*help-dialog*/ +.edui-default .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-default .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-default .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-default .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-default .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-default .edui-for-music .edui-dialog-content { + width: 515px; + height: 360px; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/editor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/editor.css new file mode 100644 index 0000000..de6af7a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/editor.css @@ -0,0 +1,168 @@ +/*UI工具栏、编辑区域、底部*/ +.edui-default .edui-editor { + border: 1px solid #d4d4d4; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.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; +} + +.edui-default .edui-editor-toolbarboxouter { + border-bottom: 1px solid #d4d4d4; + background-color: #fafafa; + 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); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + /*border: 1px solid #d4d4d4;*/ + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.edui-default .edui-editor-toolbarboxinner { + padding: 2px; +} + +.edui-default .edui-editor-iframeholder { + position: relative; + /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ + /*_position: static !important;* +} + +.edui-default .edui-editor-iframeholder textarea { + font-family: consolas, "Courier New", "lucida console", monospace; + font-size: 12px; + line-height: 18px; +} + +.edui-default .edui-editor-bottombar { + /*border-top: 1px solid #ccc;*/ + /*height: 20px;*/ + /*width: 40%;*/ + /*float: left;*/ + /*overflow: hidden;*/ +} + +.edui-default .edui-editor-bottomContainer { + overflow: hidden; +} + +.edui-default .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-default .edui-editor-bottomContainer td { + white-space: nowrap; + border-top: 1px solid #ccc; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-default .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-default .edui-editor-scale { + width: 12px; +} +.edui-default .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-default .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-default .edui-editor-breadcrumb span { + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.edui-default .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-default .edui-bubble .edui-popup-content { + border: 1px solid #DCAC6C; + background-color: #fff6d9; + padding: 5px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-default .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-default .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-default .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-default .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-default .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css new file mode 100644 index 0000000..92bf7aa --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css @@ -0,0 +1,46 @@ +/* 可选中按钮弹出菜单*/ +.edui-default .edui-menu { + z-index: 3000; +} + +.edui-default .edui-menu .edui-popup-content { + padding: 3px; +} + +.edui-default .edui-menu-body { + _width: 150px; + min-width: 170px; + background: url("../images/sparator_v.png") repeat-y 25px; +} + +.edui-default .edui-menuitem-body { +} + +.edui-default .edui-menuitem { + height: 20px; + cursor: default; + vertical-align: top; +} + +.edui-default .edui-menuitem .edui-icon { + width: 20px !important; + height: 20px !important; + background: url(../images/icons.png) 0 -4000px; + background: url(../images/icons.gif) 0 -4000px\9; +} + +.edui-default .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-default .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-default .edui-state-disabled .edui-menuitem-label { + color: gray; +} + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css new file mode 100644 index 0000000..9665192 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css @@ -0,0 +1,72 @@ +/*可选中菜单按钮*/ +.edui-default .edui-list .edui-bordereraser { + display: none; +} + +.edui-default .edui-listitem { + padding: 1px; + white-space: nowrap; +} + +.edui-default .edui-list .edui-state-hover { + position: relative; + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-default .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-default .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-default .edui-for-rowspacingtop .edui-listitem-label, +.edui-default .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css new file mode 100644 index 0000000..3088efd --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css @@ -0,0 +1,66 @@ +.edui-default .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-default .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.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{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.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{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-default .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + 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; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css new file mode 100644 index 0000000..78f354b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css @@ -0,0 +1,29 @@ +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-default .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-default .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-default .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-default .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + border-left: 1px solid transparent; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css new file mode 100644 index 0000000..9118c06 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css @@ -0,0 +1,45 @@ +/*段落弹出菜单*/ +.edui-default .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css new file mode 100644 index 0000000..73c5b95 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css @@ -0,0 +1,72 @@ +/*粘贴弹出菜单*/ +.edui-default .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-default .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-default .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-default .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-default .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.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{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.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{ + background-position: -148px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css new file mode 100644 index 0000000..f304ab1 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css @@ -0,0 +1,75 @@ +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width:auto; + height:auto; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.edui-default .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 5px; + background:#ffffff; +} + +.edui-default .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; +} + +.edui-default .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-default .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-default .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-default .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-default .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css new file mode 100644 index 0000000..f932a60 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css @@ -0,0 +1,8 @@ +/*分隔线*/ +.edui-default .edui-toolbar .edui-separator { + width: 2px; + height: 20px; + margin: 2px 4px 2px 3px; + background: url(../images/icons.png) -181px 0; + background: url(../images/icons.gif) -181px 0 \9; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css new file mode 100644 index 0000000..ec4a81a --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css @@ -0,0 +1,9 @@ +/*弹出菜单*/ +.edui-default .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css new file mode 100644 index 0000000..ef76672 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css @@ -0,0 +1,84 @@ +/*splitbutton*/ +.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, +.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { + padding: 1px; +} + +.edui-default .edui-toolbar .edui-splitborder { + width: 1px; + height: 20px; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { + width: 1px; + border-left: 0px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-active .edui-splitborder { + width: 0; + border-left: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { + width: 1px; + border: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #ffffff; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + background-color: white; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-for-insertorderedlist .edui-bordereraser, +.edui-default .edui-for-lineheight .edui-bordereraser, +.edui-default .edui-for-rowspacingtop .edui-bordereraser, +.edui-default .edui-for-rowspacingbottom .edui-bordereraser, +.edui-default .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.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 ; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css new file mode 100644 index 0000000..34232ed --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css @@ -0,0 +1,40 @@ +/* 表格弹出菜单 */ +.edui-default .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.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; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-default .edui-dialog-buttons .edui-label { + line-height: 24px; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-default .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css new file mode 100644 index 0000000..9f7db12 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css @@ -0,0 +1,18 @@ +/* 工具栏 */ +.edui-default .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + padding: 1px; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} + +.edui-default .edui-toolbar .edui-button, +.edui-default .edui-toolbar .edui-splitbutton, +.edui-default .edui-toolbar .edui-menubutton, +.edui-default .edui-toolbar .edui-combox { + margin: 1px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css new file mode 100644 index 0000000..fee7d83 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css @@ -0,0 +1,59 @@ +/*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载 +*/ + +/*-------基础UI构建,必须加载-------*/ +@import "uibase.css"; +@import "toolbar.css"; +@import "editor.css"; + + +/*-------可选中菜单按钮,按需加载-------*/ + /*可选中菜单按钮--依赖splitbutton*/ +@import "menubutton.css"; + /*可选中菜单按钮-弹出菜单*/ +@import "menu.css"; + + +/*-------不可选中菜单按钮,按需加载-------*/ + /*不可选中菜单按钮--依赖splitbutton*/ +@import "combox.css"; + + +/*-------按钮类型,按需加载-------*/ + /*普通按钮*/ +@import "button.css"; + /*按钮icon*/ +@import "buttonicon.css"; + /*弹出菜单按钮-附加按钮*/ +@import "splitbutton.css"; + /*弹出菜单*/ +@import "popup.css"; + /*提示消息*/ +@import "message.css"; + + +/*-------独立按钮样式,按需加载-------*/ + /*弹出对话框样式*/ +@import "dialog.css"; + /*段落格式弹出菜单*/ +@import "paragraphpicker.css"; + /*表格弹出菜单*/ +@import "tablepicker.css"; + /*颜色弹出菜单*/ +@import "colorpicker.css"; + /*自动排版弹出菜单*/ +@import "autotypesetpicker.css"; + /*平均分布菜单*/ +@import "cellalignpicker.css"; + /*分隔线*/ +@import "separtor.css"; + /*颜色按钮--依赖splitbutton*/ +@import "colorbutton.css"; + /*表情按钮--依赖splitbutton*/ +@import "multiMenu.css"; + /*右键菜单*/ +@import "contextmenu.css"; + /*快捷菜单*/ +@import "shortcutmenu.css"; + /*粘贴提示*/ +@import "pastepicker.css"; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css new file mode 100644 index 0000000..6be464c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css @@ -0,0 +1,115 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-default .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-default a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-default a.edui-box:hover { + text-decoration: none; +} + +.edui-default a.edui-box:active { + text-decoration: none; +} + +.edui-default table.edui-box { + border-collapse: collapse; +} + +.edui-default ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: top; +} + +.edui-default .edui-clearfix { + zoom: 1 +} + +.edui-default .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + + * 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-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-default .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-default .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-default .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-default .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-default .edui-label { + cursor: default; +} + +.edui-default span.edui-clickable { + color: blue; + cursor: pointer; + text-decoration: underline; +} + +.edui-default span.edui-unclickable { + color: gray; + cursor: default; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css new file mode 100644 index 0000000..cd663d5 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css @@ -0,0 +1,100 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 5px; + height: 30px; + border: 1px solid #ccc; + background: url("images/dialog-title-bg.png") repeat-x; + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; +} + +.tabhead span.focus { + height: 31px; + border-bottom: none; + background: #fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + border: 1px solid #ccc; +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + background: url(../../themes/default/images/icons-all.gif) no-repeat; +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/anchor.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/anchor.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aa797b2240a432d9f3f1d166ed5542eaf684937 GIT binary patch literal 184 zcmZ?wbhEHb6kygJ|Uu&?oD;%Ae!z@09(NL_hv#6Slx0y!YR{?r|LJZgAju=f-$sQVWNL{+Tsz18#+~Ke%+zTWns()WcPwy8dQcr!JH# U&i)o#ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_down.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9257e83b00375259f2f724c7cbac03d0df5ceb2 GIT binary patch literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_up.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..74277af1e6a8ef91f8fe664efde11377a5292dbc GIT binary patch literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/button-bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/button-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec7fa2eabf0705226fe0c488d65198508bf547e9 GIT binary patch literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cancelbutton.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cancelbutton.gif new file mode 100644 index 0000000000000000000000000000000000000000..df4bc2c06d485df4403d689c98ee745a4cde8e97 GIT binary patch literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7c3e7e9eb5755d57ec03c34097c258244abe61a GIT binary patch literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb508db552b6ac3f670f9ce1fcb1e55669db0dd6 GIT binary patch literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/filescan.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/filescan.png new file mode 100644 index 0000000000000000000000000000000000000000..1d271588692c1726e3521032f71d8354b66fab0e GIT binary patch literal 4282 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/highlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/highlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons-all.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons-all.gif new file mode 100644 index 0000000000000000000000000000000000000000..21915e59dede0aa22cda8c7097a14f0f1f68906c GIT binary patch literal 3750 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 b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..c015e3aac9a84ebad11b932e84722124772d9641 GIT binary patch literal 19694 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ÏmvOE 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 b`u_(2Nr-(&rSM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/img-cracked.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/img-cracked.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1d38965486452bf9a13a913109299ec713c8f8 GIT binary patch literal 1497 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loading.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b713e27dfba708a01c380e7c731a13b52a34edfc GIT binary patch literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/pagebreak.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6 GIT binary patch literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sortable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..1bca649698e187a80e1b1951fde99ddea3d7b038 GIT binary patch literal 2851 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 BXOsW{ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/spacer.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sparator_v.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sparator_v.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf5662da8c36a446e1e08eb71b992c730ab8d15 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/table-cell-align.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/table-cell-align.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf42853ea5c00663e74d9195d1f1264ab684252 GIT binary patch literal 1847 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/toolbar_bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/toolbar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab685f4236ad543601b0d7dc43e429e041bee98 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/unhighlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/unhighlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ad0b67ae634d41e76848ec0b6696e8ac7e06983 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..08d4d9268204a20ca343bf75784302cc706d2417 GIT binary patch literal 6608 zcmV;>887CEP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z4*f|)K~#9!teSgpT-ABNf8ROx-j!A>$q&Gm@PiO+2q+ZrWGHVa(@6|T{%eS7I@1RU zblOf!(zG+A5GGA&($EfcLWVd^{^;akXWC4YV%(0#BXRRkwbz7wrovzD%sq0`np;D87%?pDZ(g$6LHfS`aA z2*}zP+Rhk1i#-mZRA5=&$TCM5ShS#$W{x1RONMX4G;u7QZiWfK5S$i6n)Hn^Sd-t~ z^mKz0Cyo;&Swa{H>Os}b0?Rk6O$-|6a}9~DMHIT72b~15coUIGfW;wRav(Lp%td+e zs5sPk5CK)hr_0w6D>#?7&Am%c3&&E1wMs&r&{aAJ-13Gsf-xTFa;s79E^*wa1e&FU zR)~|7z#333B-qd5Xl@#sa;^oZJRYkq*AVrnfJ4Z2O^Uw-oPsuG+8I=o)(^`Z&gr7_ zQ^Bz`Qv*n;*s`9s*-{mpbBGAm3UM40c;{#t9j`NVjGHk$3aCTH;1E1u6(9rB9L@xV zc?()7L@2bSiNnsQFy1T1$b$1z!Lc+Z3TQb$^Jz0AXNoa`_lj4C7$FeJ&6P0* z@3NLEs*@Hsq>yee9>t*;eDhG5BB3EmJra5{1$7>4030GSM2$+$6g4P<;+uS5o(&d* zpC#dQ=cj^Wsb(fi6fb(Z77LNWf{3(~LDUfBs^f9aVPr-XMP)|PXG?=H3)qfQ6*_4lq+4- zrYGp?E|d8bR0^%}7zM@Rc@GXZXH;u3{k}fn*9flv0<=xPN)t~JwM8ZfnJ6-ubTJU!q!7MI#y-#<*P^Y!Pp!Tjv`(Rt67=HvxcN075!TcOzeWKKczAXrdLk>E8NQ_$VbRO-+q(1kvOV`lf2TF-+Z{5MRk6ys7AG;uD z##oJOZ{5jv@4tx+gS~BG;_Pu?`W3vF+kEm})KNsx5=9XG`5fb02{#G7hg=IJsv2VNh~46*XiM zVDN-~8si)El=_%d`1$^$$kZg$XLYl-E2eMdGra!zKe6`mZM=QrEhehnbeAu{+A>Zo zp!8KDj82ge7Mkc=5~a+1&y}*H<29b%J4UsZP_4xrICzYsV^xMnPVhIMy^m+R+5Rk7Zy99UN6+sV<;+~9FXV1Ub2zJz zBC|4I>F_Kc8wUD#nsKVNgrUu6(BE6)=va*d2TyQxyw0x2kMPhJZ)m~Y_t~rX`0YPw zN%FiTuOrQw@qKRq;s`^VS98a$A*;OZ;b@yZx? zX@hci7sSKpc!~9EeuFoU9N~-$w~%;`nhZ>e*D@mUoGfuZL!RC{2GEkQZ6CdWuWo;i ztGArp`hRHi8T|3Rj{$JkKkQ+2tVUmNRKT6hSGPaUP1m2xhJl4mN41`C*Wd4H^J7hI zY%)_7@F@>}{{a1!hz$dMfE3^GXzd6?o6l&?n_6A1r}X!BbxaPM#ZB+?+$hK+s2MLm zKLb^|z2aSlmE4HgFyfW}8D{+lE@t$EXS|-UY0U>nU;G*ASv^D+=&5k>#272j4XGWU zM17U9*Q@M&WF(iEqGGDR{)5LkIq_n;5e#j?Y1>o!V+`#(cLU%p>Dqp|n2E6wi zICz|!t~-aJO{=KZ6Rx^!ko5z-MbH4%T0&nXWZjw`y!V}Lx6jS!?VlW)_gi13Gy|u~ z{*kw+)*4*7We`RAqkI3GYAtD9et&Por#`oP7Nhf^<)6Ry;f_9|$q*6A^R{M`G2d}& zp(RS>Jh%)*Q6r?8uyJsJAH6Vwx$u0vRv3HfBo|u2boC%i=H{q7S!v$K z#zD^?e&YSCu9U%7Fj>G4cD=&ww+yu|dvv_U-+k+OwqCoD^#i?p=9Zzh1B{N>0Jvz= zDo#$s3?Dkqm+!oSzDkKb`^M<2gj8z{sa3f;tXo@I)aj#+?>#cY z=WpA>H+LKW;2-b4zP0X#-}zU*{AX7(w0ZTyI2L#|E9`BLgXc0tF{Ii>NfR=g=Am&? z=R+G-u=jtD^7`8uCdnwj{VJD7hp}Nd>bejNCy!hD&%Bg!?-r7H4dNXuyF6sM^E~`! zozd}H8|~TOoeuHn6Gyn|x^qxfhDVOmS1GZ6pqHa#6a2|vKh7s_-rTl+$F31nb>8#Y zPE{9-GTX=Qr$+g`-@b%(XI181>Yjb$Ow{5cgr3OPKlvI%n^tq>WdjQa6?2_?u+YJ0 z+xFa>qy>W%@fm0K2b?#shF_kj6Zn)q5>}f@#74Lz!It|ehaoFBUxxFmNnC_gkEm-E z=k^~u&d{dSE$vv!=&M8wkDOrp&S6H!YizxCW83~eGe_HY>>A;!4i}=QP-Xt`HRq68 z0oU2|U3u9c!y_jEn5ZXg-*JGg*PX-qfy%ry&ZXa+2eYNIlZF6f0TSICUi^Uj2 zuhbbVmx+Q1^Tre=@Q95Fxy&<(09|2TW;FK z*6Yq;$0G;Xv1^2_*KVX*PddUahO1pNm!=^`9Nm5jr#-DGsR?t%rE9t3(zUI%cR%n9 zpT1?NWpWpyKlkirsgmN0III~hPEOP)2k_?MmpOiPgp!-4zqbb!MWX;Q7O^23mZ(im z6?K~?4$px@#~42J4!7LAY1xw6*Ap^2UT+=tcmLw2r__%)wO(K64(IMCUt{~uVfO4B zXZMq@v3{V^=KmI=Kd*GssZ*l*(pX0tSeTd$kXpWS$_X|3W?K_95 z)?>c(rhdVVJL7%{C#4D!r=?zsOu`v7?G3)hl)Aq!Rz zX*^G>K61?lM#t;i^WZZKA3DLG|G{O8GCi+^2YFlAn3l!_kcV6IyI@6>rJjHcM}+fW z)Zo<6D5QOADq(8ML1`uSjEnKIq3E6TQ(4soriTD<+CbFv%aJ$Px%(CFz4H>*oK;2> zT~u=Bj&J?&B}9Y=?z#q5rMD;K!N0n$b(x>ox{1C@)Ux9{A3fBDYv-dQtY2GcwUC<{ z_vzodh&}tp=KF<9*3Ohb&hE#jX>J8NXxh59J$&bHZ{&xM9^(FQ?_HJ#0$ zF)d~^86+ae3opK;8#k`QWf>x~os|I$fzK$rX<}9~9eTV7PRn@{$_io{WLXJY7M!1E zMZFg*5JoVS)rccUBb~-Xmafe4(j%!E9 z>-=!{AwKu}mv+QwttCxU!Z5@+M;L}2IdTMf?)ew>f(yEX!I9DV0hbJa~|x+4;-U_zpxQe|bk0j8{Y)s3XLY zWfKI}VNE~Yd5l=z32KC52-JcEIPdXli3qS+fNIb>OlnfXCFTH&7v}Vo7_wX#1vDyy z)=~7d8Dfl?r=>xuR3eV!1$$trKqC-JNmBHZJ&MPg6o)Wv0Mmt}4Z2APeTm42;5|kZ zXFMVasxg@fP!YU9Bg|h33VhJ&EiWfRn!Ubx5zED~To~^i=tO79J;gJqD%M)!IHs$s zt6)eYrn@U@Ihffd3uDQm0OJiJ#cMojK|E0y5*x*sZmi_>TW3l{8sL+RFcdI~SV2^Y zT!7Et0wN6+^&!?v?#wzIW+59tPo0Z-`~F!pI6xICqMN1CRrLe`IByno)JvtWMU@>9 zj0lsB23@5Ra_r<({Kgw^@XkALcSM-ivwT|>xOj7}_^Ti`KVZ>8kvZKsiZ?7~SKD=N zA!(5s)BM+Q9M;;ld0_3baV!_c7ck4sV03}7*BB|Z1p52?S+{N-|33iQeTU$!k*lr% O00001IobTth)ve1{+;xF-z$zX1$@cbk;N#jz zM8mU4YCupmEU?Nii0lQg^bRCan?Ab3%VAH658-8xBFJMB`IuzR@?X?_cxg~njWe8Z z7he1{t~NY@;sD2oqwB>InLWHP3|(&rFL;_%YXisG!f|)t`LI~xqj*wKLbXWp)f$eo z4#asOE4^bXVR1zDClZ^-`L@9YE{GEUM6w@>B$|*3C13A^6xxLq**_!Pdr{&MM+{D{ z56z@TzG*@hw6S^P4v136mt~*C)1y;z@#LIHDjO7zE0$NBVk(?tEAPD`x}r!4rSvo+ zGrN|Z-`M*gk?fXS+qo0;d0 zh<&hBzt>Fxc`eUN=*S8tip(N)4%c-Hsa$abS1kGZZD3dwRL~Y&OiQls$!Zy(aK#~| zjPP=1B(V$A*qhVABln1FxZ*mlSSnXYWQzzgJF1owUC)i7_7-#saE!r1=5SG$fWQ*I z?G_O^BB^|7ZhisN&MW7LKFbwbTU$SV{P_O;`{w56#>U3_`uf`1+Un}+%F2pDp;%g4 zT3lS5pP!e@<#Tg$GMVhlmoKxkvokX@)6>(Flao@ZbYfycB9V-bkB^RyibNuzP$&=x zMn*=4hK2?Q2l;$HkH;Gr80hQk>+S93a=9E1r@OnG&1QFYb~2ev27}Sj(b3-C-qzOE z+}zyQ*hr;PDHIBkNX*O2%g)YDPEJltOhlnjzdrQ8MQa@l0suN-^vmE^6Tt3mAau_$ zXbql@q{N)M&$25b1FG78WjFA2Q`{wpcH+plH-T+lc4H{-V^L{To}?sY^7t- zRp-#0EC|Fh>5nV9*osg354U2y3FFpwXQ!`Na;JKQ;uHrYmb=qU|MBr zTOt(Y=@VUlJq+6mQt^WJ9lIJTz?$6jvB@_0Ijg#xyHYhx6QE$9@Q;P`SNru{MQcx_ z>I9eqMm;}}tfJ*J&?Udq;ijL1AIs^TNj%ED8++(4bqQ3YK5><%~obS)3oEv z2`L9EwBilZbt=4c48b+h%ydj29TQf1;FclAt3p@D@Iv$C>k|Ryx={((b>+iEv*M}T zw2%>2(|!*aqioP7@6#WGj~%z23qkbWx? zq>K{ydFDHsgH&Ab#e8p|DBB+i&e7YjgH&Dp_Cc?zbGzF=vu-e#1^&&3UitP6Qvg=W z;+>M!e1J%3O7HX-hEcUA+~cC@8WAyj^bml>?&AT`HEEBQ}9Z=3X$i*Zty)I zU*Zj5^tvjIuB=l9Z9~T)&b;Eg=FK&TO>3g*yVOqt8d@&{JXvVbxz7~cYII$TQHvSS zgJ#LpO3a#6>HScB5@i5vKw}cnyiI*AUkCSPz7s6};*mIoCN(8C-gssBWz<}Twr?3} zMG(-KVyeCT&UjVicgg-NE@GN=DKAW@1zjD3zqggT>WPOqXK6a*HA(U%`Q-^?%QNdz M>|NJq=D?r-0Tclc1poj5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/word.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/word.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ef5d09b7b30c4f3225f77788462e429cc494b9b GIT binary patch literal 1019 zcmW+#TS$~q5T1<>pWt14jMv{auoz~;1SCV+kTN8O z*boX}0~%OZ#xz+T`;^wAHET_l7L`(3iB_x?SrurC(jr<|3t3T^Wu;j(vu1)utZGu4 zL=$TQD^vpvqM;J9&;v2B0SzoHlQm>(JW-03BI^&ds6>>o60&xo0!xf? z#6rjsNh1L0!Z?D4TSSRGAQRh&1DaqM4xt)g5RFa9f({S^8_;A=WT(+ajYqf`f`mWN zqGGZiht1Www{1Env@ttZv9nIlHgzXEyXwSYkKj18NRDWG6Gw*ycA)V&;7SM&o-Eba zy=cpczTV!-s;aFwzt7HV4|Iq2l~0C;rWTzV9~zrZOwNS$yNsfDDY8RU$A(FE4VEA_0^D@ukP5)lC z*1s%|_WE??n$+wYv8N{!$#so=716BK#S7;@%{-TWXjYCdLg z-F0ozo|U6HH1mp*y&mmiRt6b3{Zfl(1j zhekRMzTfwL-}!Ogv#)FK71w>=&-1Kx|5)qVv3fcWC`egJ0RRAnhPtZ3bvu6jsu172 z{;n69zrJo*&}wFALzDyB*VYpbxMz>Dg9A0(Y#reSa9ewSk3qN`06+jl7@48Xw6$bm zC^r$?KNt}|H}`8c03fI6=WYvgfun(Ta7P4E9<<%k0RkfIybRj35|A_g+P3LeMNjFL{OfN5HT4UnLirh;=2>RG z1y#5g%oE{`Mxc??C~vep=sMGXmEh+7A6cZ=znAHH!61IN?hr8%(LW{q4b;~D z|DkSf|3Q194dDOH_x}|3GV*taLk!?vC~r^L^~O2e`V-1sR>c!;i$-}Gp-`@WucDq4 z3XSq|Lb(G~45fgk2&6sA*Xu8|wzjMW(hF^iguyjbb!1hzC&CAA zf8P`32K=jFS;Rl*BK41Y|K{5Nb1v6;|3e*+>trB*w)KB)^WRg~-ucu0k7=(5|FJzB zdF^%2Yg3asHVOj(3{4uU_l*4JaF!IQ3{yc@-~3TWo3%pLL(%v&P(;KCcRB$nE+vyb zVBA?r$>bd1mD=d%D&;nekeB|Tk$5{mXW7Up1;0OzHqw&ZdhSMIF%ZWTmA@$yYhY;? zdxIuD3j2GrJxHSAD8zBA_3pmI*LHu@%4YR&p2YCHzr_Bf*Xrfg)l%^J$EbG63v3iU z`lw7VhVKTn`{)LAsj-Q7x?==J|5}3o+pg|pK#22MdF_=^g7Rap=@MC*2>v3Btr6&c zCs%= zLFFncvrZk1re+o-he=)(k#&kss}oTr zcdq|DOdB6TI~)7Tf4Gq@*NoZ2>b)h0Sl`Fs-db#A_|;=ETW{KS&4`y;H^w@!xk#3)!3&m z6QlZOpiM|e30SYVGLn-Kq|oB)VqQk5)nw6N(B!j+k_%WB(p{x9$h?mxwk#SU=Byv- zjRDL%6jk>1SUITSX}A`kfX!>u$%>d%y0*_6Y$~!eHTX zX?+VaThnUn4WUU#5Ssn=ii(N|#^6%eYf%lc(JdINiT!2#t*2=~G9kBkp|2zKkt^=Xo8U{}bNW!>*e zzr^TN6SCULE-o%o)L1jS2rb5wgd- zdgiZNF}P`SR1~(wH*2}hevo#y$%~hWHWw25CPJuHu*~9EP@OL-2!zxqd6E@hFDGVA;nr2~R;%2^OgasXS zqsW+)CuVCze|F)C)CGd7qOTVv!%mxG;)&T`M+mdkdwTFmEZ({UadxO;5*e zYvAJ}0~?YG&VCotF>9okSKSHu+xc)pGC#7a7GKi{<~TKi`gF7P*2k}(-^Q1s;8HT2 z(0^N68g{#0SQSIB_e!{r? zB2HaP?@Z#DV_8QliMp!VPX!j-dniQVL-dzHmX;jl)*YOOxGw}$aytOU4*FQ?@^UMo z@$!im`Nfw6p@yT%K_jw$rwJuChvi?YlOLIOWZ%_)P)%-9-pJu2n&k8}O}b;CUHy=2 z46S>kVxoR?-sWU4U~6UZ1YRS`%jOzJ_B?NXRI7y_irtcISJ<#IP5a|4$mft)|uQ4P2M$<^m(fOs=@} zJhc?zWB?6m06I8AU5r%w7OTq>J9c(KGxCGI>56`4hbBt9VU5MDmaV51=GM}%hwL(j zjET`K>L;d3CEH^H9=@7tOb?<%If1m81Cm7oI^~Mk8$~4JM3IIKVN2=j%*Z09-tAP- zeS2tmn{$Lz3dcZ{v9U1)qdIzrd2o=Hgu3l0%Ex++ zE$KlJ-BJ$Xl%7c_TG+h4GshQ8s0e?uh|pVdtFmY!wF+40xs^Nlf^K1o3RQ{sBes?q zeTWdPEL_M)w?Jpd707!I8YG{B$Dww`O({)}?eT=4=Whn<1c~{f0vQ8~zr(=TTJ}5c zfUiMEmVQ5CdHtwbEuKDO6#gN>oLA-lg^!}^MTgWtf)RG8%U;5}LoLI)iVb8+D2w~oARCWuuw zA^5$*Ebrd={%B7u9k0#CWGN3`N|xFXJoXYdwjcb?gK+*b)GZHgE+t6o`h~tt#W>>K zJAt>Al~0WX2(zH5PpKq#ccYlBzJF(dkyFqzvey+2hK23mBb2?v1Aiyp_HP%B;;6qd z#B%d~&Fa9`*;qN)Jqa|&xHxQw7l-#uk`BHzS1d+W$kLwAtP{Rk{MiGx)B8AF^ul8jqjCh6mX_ylFk&E+B=29-yDtek2GFR_MK7^J z1{WyK=*%jPuodsTsAk#fP-3LaCbUzrr~YIOTk9tGB=0zd-dLM%@k^m^fxhrOSvN^O zzpx8^NUIQ~rF`iQe(Br%ECZAEMY;Lrm+-gX>2jefg@Je6e4J^PUV7&-K| zUI1uoyVy*Z$KQ<(S31(~A7qSWFpN(l9PEu|VFLS>XO#-C4Ta1pik^oWnK(Sg*Ox^! zlK0jS%)9AiOeUJt(lC`z`}p`ca9Fn<(X%(ja<3lizpX-q78kMEc74nBlAGCP)`)CA zti&57;Y^@Z1X^x|tAuv*E%i4+zDu0VvlZacQ4X_Cp@`ob%w<5yoqft!(>-}J_Q8#T z2}wM+_iB_=?M80q9qhfEr>(EJ8D#LyiP*uCF!1uV?Fk5I>8wP08Wd>+scOb{*WaBr z!ANTr^v4qxNpjLnbW0_rcH%y&-J*PE(W3tJO*VYKiejfgZTvwX4Xis)@sMP3mafSs zS&j7*;~>9Dp~`FD8?V(tO-8D*aljOH5KxU)8RrHacPck$98-2yVxR4N&W>#d ztmhcE9c+v(i?$0i>aXM-PUr?53^!coG%AM@4p7&E5E19<$|p!8Vx9{@D*cQj+ZNi3x#ooSmgX$pbjP zUPaUe6-<;7V=Gh9x0;HdpX&~MDThfoR}P;%_b`pI3d7gP?RG;+>^a~hn&-R2c&{wA zAnDE2hfT`zVfnuWl%YH`vRt(|6M+l%|NLQ2Sv+Qp+nx3#stzLgq7|oKiQR z?(dqU{YS|kzy84ByneKF35Cw2C2GDg)oUKCT4S@m$d*~YaZl$Be}3==17DJ4jV9R| zdj&D*RSlKe=C%~%ZI%Mfkn`n&J&taoy|iYQQFAk!t>6t-mX*acjHcJ_a9St#fDvjE zm%O@n2Rq84ep#zOyUH4LRq}xSv4-GT_S^DqQs7zkizmNlv31KP)4pxE^pBNHCUX`6 z3}soz*;=J~k2o6uOM}AGM@?tzZ)iW(l|pvY2aPhZye98?sBWr@SCsAMM~NOT{$7CP}zXL4Q_(Gf$|>uyPhCXZ`X=+dwdNE^%8Vt=2KXN@aE}b z$9^Nbt~)!7EsP|XmC+WlxavSB# zV%}|f{R(IDWK-I~CU*gG1?}`l)7|#Ts)|XidU;I!?IFlOwszyIfnup=eclsgz2ZS_ z!ow+ggFkn}Uu4_#sVBuT#2$2y0~vcPV(??l7HY}A=AVpV{MeD|%x5>J+-CKyo%_23 zTcxPU4E*eIb>)K<8xNrtjk6SK3?zE5KJYtwP>r`uj^q>#JW3%u!VnNG>Y`3*ug+I4 z3H0t`C^+~IC=Pc0Pmh~G1xFd+v(v?0F4u60JhK_r<0G!i2oi7z42)u!B!lIpt@J9k z#ldlPrZ$S+`(#N`YuD}=&vf4u-)v**S5S^=Qoh}w-rt>2bpN>|j0?-G@9=7_AU%vk zm_E}Ty-%$=0^$VORFc!fzE8ZGL;nK51kf!nS6>cB+o<&%X~`$?4&u}tS4*T=)dgi= z()Y}oYAKesp;BaS(;ugy?b@S za$)%p>60P*6@#!HYci(vI5cjt~8`q;Bah&<&#v-i9e1?1UQ1L*SKfPu& z*IUr2L0JjP{2ML?XKZwF6mY;F6olm=JxcHov~l52Rxkoq?6a|Gk-5ABTF|MR_Oe5~8*^ooGZ3v!-50T}zxh$7qS3Xa%th z9UL*;HtOE3(>U(gP0L;N%{OOq)Qy(^Exn4UTy~WvFh$v5*)ZoJBl|8drh!N+) z`}srpWO#Np%Y_L5v#x2TF@JTU7Q`YjgS>pdk)tT%S-hp37Z(U5lv>8K`$%FWGp5iC zx>@F^yCe2R$@8#~sb`kAMKbfjxFodg+y+;d=*njVed77nYy+bJd!OKk6jsfy-DRPB zAas^tUVMF|do?{gS-)kRtd9!~#|7SDVAc}%%yo!igVDuI`bNsTX6pa6v!_aD9kFls zrnLT)60?ff;SZi}Iwdwr=jQ>4c)Oik*yHwH7@eu(gQ7NWuVlt{7)w#~=~-K?aqwwY zDTNuWMWuQ4Z3S6|+VUMP$_I-d%3zE1+U!G_FtesOz1uBFC-+_(qbEkVs8jJ*tbFf= zl}TP>EJ6M4au&hn%D}?**7!dD5!?*gwPWI2)4}7t5w2bNPe!LQNSRM>6pB0g+RlaQ zl%qw|lvp)^cq7NBxRD^QLGSj4IZt*P#q@$*OXc zIYF%PWqee+bhY~@=auY~2eF_OA~9F3_utFY!8nlUq^%mh|9F-MN- z0wJtaEg9 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/iframe.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/iframe.css new file mode 100644 index 0000000..124a267 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/iframe.css @@ -0,0 +1,5 @@ +/*可以在这里添加你自己的css*/ +img { + max-width: 100%; + height: auto; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css new file mode 100644 index 0000000..9442189 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css @@ -0,0 +1,26 @@ +/*自动排版弹出菜单*/ +.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} +.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body tr:last-child td:last-child button { + border-radius: 3px; + border: 1px solid #ddd; + padding: 2px 8px; + background-color: #f3f3f3; +} +.edui-notadd .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-notadd .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-notadd .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css new file mode 100644 index 0000000..e29161b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css @@ -0,0 +1,96 @@ +/*普通按钮样式及状态*/ +.edui-notadd .edui-toolbar .edui-button .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-icon, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon { + padding: 5px !important; + display: block; + height: 26px !important; + width: 26px !important; + line-height: 1 !important; +} + +.edui-notadd .edui-toolbar .edui-button .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon::before { + display: none; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon::before { + display: block; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon svg { + display: none; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon::before { + display: block; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon svg { + display: none; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon::before { + display: block; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon svg { + display: none; +} + +.edui-dialog-buttons .edui-icon svg { + display: none; +} + +.edui-notadd .edui-toolbar .edui-button .edui-icon { + color: #666; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon { + color: #fff; +} + +.edui-notadd .edui-toolbar .edui-button .edui-button-wrap { + position: relative; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #e5e5e5; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #666666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #666666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon { + color: #fff; +} + +.edui-notadd .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} + +.edui-notadd .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity=30); +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css new file mode 100644 index 0000000..9c75123 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css @@ -0,0 +1,419 @@ +/* toolbar icons */ +.edui-notadd .edui-for-undo .edui-icon { + /*background-position: -160px 0;*/ +} + +.edui-notadd .edui-for-redo .edui-icon { + /*background-position: -100px 0;*/ +} + +.edui-notadd .edui-for-bold .edui-icon { + /*background-position: 0 0;*/ +} + +.edui-notadd .edui-for-italic .edui-icon { + /*background-position: -60px 0;*/ +} + +.edui-notadd .edui-for-fontborder .edui-icon { + /*background-position:-160px -40px;*/ +} +.edui-notadd .edui-for-underline .edui-icon { + /*background-position: -140px 0;*/ +} + +.edui-notadd .edui-for-strikethrough .edui-icon { + /*background-position: -120px 0;*/ +} + +.edui-notadd .edui-for-subscript .edui-icon { + /*background-position: -600px 0;*/ +} + +.edui-notadd .edui-for-superscript .edui-icon { + /*background-position: -620px 0;*/ +} + +.edui-notadd .edui-for-blockquote .edui-icon { + /*background-position: -220px 0;*/ +} + +.edui-notadd .edui-for-forecolor .edui-icon { + /*background-position: -720px 0;*/ +} + +.edui-notadd .edui-for-backcolor .edui-icon { + /*background-position: -760px 0;*/ +} + +.edui-notadd .edui-for-inserttable .edui-icon { + /*background-position: -580px -20px;*/ +} + +.edui-notadd .edui-for-autotypeset .edui-icon { + /*background-position: -640px -40px;*/ +} + +.edui-notadd .edui-for-justifyleft .edui-icon { + /*background-position: -460px 0;*/ +} + +.edui-notadd .edui-for-justifycenter .edui-icon { + /*background-position: -420px 0;*/ +} + +.edui-notadd .edui-for-justifyright .edui-icon { + /*background-position: -480px 0;*/ +} + +.edui-notadd .edui-for-justifyjustify .edui-icon { + /*background-position: -440px 0;*/ +} + +.edui-notadd .edui-for-insertorderedlist .edui-icon { + /*background-position: -80px 0;*/ +} + +.edui-notadd .edui-for-insertunorderedlist .edui-icon { + /*background-position: -20px 0;*/ +} + +.edui-notadd .edui-for-lineheight .edui-icon { + /*background-position: -725px -40px;*/ +} + +.edui-notadd .edui-for-rowspacingbottom .edui-icon { + /*background-position: -745px -40px;*/ +} + +.edui-notadd .edui-for-rowspacingtop .edui-icon { + /*background-position: -765px -40px;*/ +} + +.edui-notadd .edui-for-horizontal .edui-icon { + /*background-position: -360px 0;*/ +} + +.edui-notadd .edui-for-link .edui-icon { + /*background-position: -500px 0;*/ +} + +.edui-notadd .edui-for-code .edui-icon { + /*background-position: -440px -40px;*/ +} + +.edui-notadd .edui-for-insertimage .edui-icon { + /*background-position: -726px -77px;*/ +} + +.edui-notadd .edui-for-insertframe .edui-icon { + /*background-position: -240px -40px;*/ +} + +.edui-notadd .edui-for-emoticon .edui-icon { + /*background-position: -60px -20px;*/ +} + +.edui-notadd .edui-for-spechars .edui-icon { + /*background-position: -240px 0;*/ +} + +.edui-notadd .edui-for-help .edui-icon { + /*background-position: -340px 0;*/ +} + +.edui-notadd .edui-for-print .edui-icon { + /*background-position: -440px -20px;*/ +} + +.edui-notadd .edui-for-preview .edui-icon { + /*background-position: -420px -20px;*/ +} + +.edui-notadd .edui-for-selectall .edui-icon { + /*background-position: -400px -20px;*/ +} + +.edui-notadd .edui-for-searchreplace .edui-icon { + /*background-position: -520px -20px;*/ +} + +.edui-notadd .edui-for-map .edui-icon { + /*background-position: -40px -40px;*/ +} + +.edui-notadd .edui-for-gmap .edui-icon { + /*background-position: -260px -40px;*/ +} + +.edui-notadd .edui-for-insertvideo .edui-icon { + /*background-position: -320px -20px;*/ +} + +.edui-notadd .edui-for-time .edui-icon { + /*background-position: -160px -20px;*/ +} + +.edui-notadd .edui-for-date .edui-icon { + /*background-position: -140px -20px;*/ +} + +.edui-notadd .edui-for-cut .edui-icon { + /*background-position: -680px 0;*/ +} + +.edui-notadd .edui-for-copy .edui-icon { + /*background-position: -700px 0;*/ +} + +.edui-notadd .edui-for-paste .edui-icon { + /*background-position: -560px 0;*/ +} + +.edui-notadd .edui-for-formatmatch .edui-icon { + /*background-position: -40px 0;*/ +} + +.edui-notadd .edui-for-pasteplain .edui-icon { + /*background-position: -360px -20px;*/ +} + +.edui-notadd .edui-for-directionalityltr .edui-icon { + /*background-position: -20px -20px;*/ +} + +.edui-notadd .edui-for-directionalityrtl .edui-icon { + /*background-position: -40px -20px;*/ +} + +.edui-notadd .edui-for-source .edui-icon { + /*background-position: -261px -0px;*/ +} + +.edui-notadd .edui-for-removeformat .edui-icon { + /*background-position: -580px 0;*/ +} + +.edui-notadd .edui-for-unlink .edui-icon { + /*background-position: -640px 0;*/ +} + +.edui-notadd .edui-for-touppercase .edui-icon { + /*background-position: -786px 0;*/ +} + +.edui-notadd .edui-for-tolowercase .edui-icon { + /*background-position: -806px 0;*/ +} + +.edui-notadd .edui-for-insertrow .edui-icon { + /*background-position: -478px -76px;*/ +} + +.edui-notadd .edui-for-insertrownext .edui-icon { + /*background-position: -498px -76px;*/ +} + +.edui-notadd .edui-for-insertcol .edui-icon { + /*background-position: -455px -76px;*/ +} + +.edui-notadd .edui-for-insertcolnext .edui-icon { + /*background-position: -429px -76px;*/ +} + +.edui-notadd .edui-for-mergeright .edui-icon { + /*background-position: -60px -40px;*/ +} + +.edui-notadd .edui-for-mergedown .edui-icon { + /*background-position: -80px -40px;*/ +} + +.edui-notadd .edui-for-splittorows .edui-icon { + /*background-position: -100px -40px;*/ +} + +.edui-notadd .edui-for-splittocols .edui-icon { + /*background-position: -120px -40px;*/ +} + +.edui-notadd .edui-for-insertparagraphbeforetable .edui-icon { + /*background-position: -140px -40px;*/ +} + +.edui-notadd .edui-for-deleterow .edui-icon { + /*background-position: -660px -20px;*/ +} + +.edui-notadd .edui-for-deletecol .edui-icon { + /*background-position: -640px -20px;*/ +} + +.edui-notadd .edui-for-splittocells .edui-icon { + /*background-position: -800px -20px;*/ +} + +.edui-notadd .edui-for-mergecells .edui-icon { + /*background-position: -760px -20px;*/ +} + +.edui-notadd .edui-for-deletetable .edui-icon { + /*background-position: -620px -20px;*/ +} + +.edui-notadd .edui-for-cleardoc .edui-icon { + /*background-position: -520px 0;*/ +} + +.edui-notadd .edui-for-fullscreen .edui-icon { + /*background-position: -100px -20px;*/ +} + +.edui-notadd .edui-for-anchor .edui-icon { + /*background-position: -200px 0;*/ +} + +.edui-notadd .edui-for-pagebreak .edui-icon { + /*background-position: -460px -40px;*/ +} + +.edui-notadd .edui-for-imagenone .edui-icon { + /*background-position: -480px -40px;*/ +} + +.edui-notadd .edui-for-imageleft .edui-icon { + /*background-position: -500px -40px;*/ +} + +.edui-notadd .edui-for-wordimage .edui-icon { + /*background-position: -660px -40px;*/ +} + +.edui-notadd .edui-for-imageright .edui-icon { + /*background-position: -520px -40px;*/ +} + +.edui-notadd .edui-for-imagecenter .edui-icon { + /*background-position: -540px -40px;*/ +} + +.edui-notadd .edui-for-indent .edui-icon { + /*background-position: -400px 0;*/ +} + +.edui-notadd .edui-for-outdent .edui-icon { + /*background-position: -540px 0;*/ +} + +.edui-notadd .edui-for-webapp .edui-icon { + /*background-position: -601px -40px*/ +} + +.edui-notadd .edui-for-table .edui-icon { + /*background-position: -580px -20px;*/ +} + +.edui-notadd .edui-for-edittable .edui-icon { + /*background-position: -420px -40px;*/ +} + +.edui-notadd .edui-for-template .edui-icon { + /*background-position: -339px -40px;*/ +} + +.edui-notadd .edui-for-delete .edui-icon { + /*background-position: -360px -40px;*/ +} + +.edui-notadd .edui-for-attachment .edui-icon { + /*background-position: -620px -40px;*/ +} + +.edui-notadd .edui-for-edittd .edui-icon { + /*background-position: -700px -40px;*/ +} + +.edui-notadd .edui-for-snapscreen .edui-icon { + /*background-position: -581px -40px*/ +} + +.edui-notadd .edui-for-scrawl .edui-icon { + /*background-position: -801px -41px*/ +} + +.edui-notadd .edui-for-background .edui-icon { + /*background-position: -680px -40px;*/ +} + +.edui-notadd .edui-for-music .edui-icon { + /*background-position: -18px -40px*/ +} + +.edui-notadd .edui-for-formula .edui-icon { + /*background-position: -200px -40px*/ +} + +.edui-notadd .edui-for-aligntd .edui-icon { + /*background-position: -236px -76px;*/ +} + +.edui-notadd .edui-for-insertparagraphtrue .edui-icon { + /*background-position: -625px -76px;*/ +} + +.edui-notadd .edui-for-insertparagraph .edui-icon { + /*background-position: -602px -76px;*/ +} + +.edui-notadd .edui-for-insertcaption .edui-icon { + /*background-position: -336px -76px;*/ +} + +.edui-notadd .edui-for-deletecaption .edui-icon { + /*background-position: -362px -76px;*/ +} + +.edui-notadd .edui-for-inserttitle .edui-icon { + /*background-position: -286px -76px;*/ +} + +.edui-notadd .edui-for-deletetitle .edui-icon { + /*background-position: -311px -76px;*/ +} + +.edui-notadd .edui-for-aligntable .edui-icon { + /*background-position: -440px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-left .edui-icon { + /*background-position: -460px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-center .edui-icon { + /*background-position: -420px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-right .edui-icon { + /*background-position: -480px 0;*/ +} + +.edui-notadd .edui-for-drafts .edui-icon { + /*background-position: -560px 0;*/ +} + +.edui-notadd .edui-for-charts .edui-icon { + /*background: url( ../images/charts.png ) no-repeat 2px 3px!important;*/ +} + +.edui-notadd .edui-for-inserttitlecol .edui-icon { + /*background-position: -673px -76px;*/ +} + +.edui-notadd .edui-for-deletetitlecol .edui-icon { + /*background-position: -698px -76px;*/ +} + +.edui-notadd .edui-for-simpleupload .edui-icon { + /*background-position: -380px 0px;*/ +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css new file mode 100644 index 0000000..cc6812e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css @@ -0,0 +1,272 @@ + +@font-face {font-family: "edui-notadd"; + src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/ + src: url('../fonts/iconfont.eot?t=1544182120898#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('../fonts/iconfont.ttf?t=1544182120898') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('../fonts/iconfont.svg?t=1544182120898#edui-notadd') format('svg'); /* iOS 4.1- */ +} + +.edui-notadd .edui-icon{ + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +.edui-for-close .edui-icon:before { content: "\e654"; } + +.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } + +.edui-for-italic .edui-icon:before { content: "\e62d"; } + +.edui-for-insertcaption .edui-icon:before { content: "\e657"; } + +.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; } + +.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; } + +.edui-for-insertimage .edui-icon:before { content: "\e617"; } + +.edui-for-previousstep .edui-icon:before { content: "\e630"; } + +.edui-for-nextstep .edui-icon:before { content: "\e631"; } + +.edui-for-scaleboard .edui-icon:before { content: "\e632"; } + +.edui-for-brush .edui-icon:before { content: "\e633"; } + +.edui-for-background .edui-icon:before { content: "\e65d"; } + +.edui-for-strikethrough .edui-icon:before { content: "\e60c"; } + +.edui-for-spechars .edui-icon:before { content: "\e603"; } + +.edui-for-clearboard .edui-icon:before { content: "\e634"; } + +.edui-for-bold .edui-icon:before { content: "\e604"; } + +.edui-for-fullscreen .edui-icon:before { content: "\e656"; } + +.edui-for-formatmatch .edui-icon:before { content: "\e60d"; } + +.edui-for-underline .edui-icon:before { content: "\e605"; } + +.edui-for-removeformat .edui-icon:before { content: "\e60e"; } + +.edui-for-blockquote .edui-icon:before { content: "\e60f"; } + +.edui-for-anchor .edui-icon:before { content: "\e618"; } + +.edui-for-help .edui-icon:before { content: "\e619"; } + +.edui-for-horizontal .edui-icon:before { content: "\e638"; } + +.edui-for-simpleupload .edui-icon:before { content: "\e61a"; } + +.edui-for-indent .edui-icon:before { content: "\e61b"; } + +.edui-for-justifycenter .edui-icon:before { content: "\e61c"; } + +.edui-for-justifyleft .edui-icon:before { content: "\e61d"; } + +.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; } + +.edui-for-justifyright .edui-icon:before { content: "\e61f"; } + +.edui-for-link .edui-icon:before { content: "\e620"; } + +.edui-for-cleardoc .edui-icon:before { content: "\e621"; } + +.edui-for-drafts .edui-icon:before { content: "\e610"; } + +.edui-for-subscript .edui-icon:before { content: "\e611"; } + +.edui-for-unlink .edui-icon:before { content: "\e622"; } + +.edui-for-superscript .edui-icon:before { content: "\e612"; } + +.edui-for-forecolor .edui-icon:before { content: "\e63a"; } + +.edui-for-backcolor .edui-icon:before { content: "\e655"; } + +.edui-for-touppercase .edui-icon:before { content: "\e623"; } + +.edui-for-tolowercase .edui-icon:before { content: "\e624"; } + +.edui-for-insertvideo .edui-icon:before { content: "\e627"; } + +.edui-for-emotion .edui-icon:before { content: "\e606"; } + +.edui-for-pasteplain .edui-icon:before { content: "\e613"; } + +.edui-for-preview .edui-icon:before { content: "\e63b"; } + +.edui-for-print .edui-icon:before { content: "\e63c"; } + +.edui-for-selectall .edui-icon:before { content: "\e614"; } + +.edui-for-mergecells .edui-icon:before { content: "\e63d"; } + +.edui-for-deletecol .edui-icon:before { content: "\e63e"; } + +.edui-for-deleterow .edui-icon:before { content: "\e63f"; } + +.edui-for-attachment .edui-icon:before { content: "\e628"; } + +.edui-for-music .edui-icon:before { content: "\e640"; } + +.edui-for-gmap .edui-icon:before { content: "\e629"; } + +.edui-for-insertframe .edui-icon:before { content: "\e645"; } + +.edui-for-pdfformat .edui-icon:before { content: "\e62f"; } + +.edui-for-word .edui-icon:before { content: "\e646"; } + +.edui-for-excel .edui-icon:before { content: "\e647"; } + +.edui-for-time .edui-icon:before { content: "\e64a"; } + +.edui-for-snapscreen .edui-icon:before { content: "\e650"; } + +.edui-for-wordimage .edui-icon:before { content: "\e652"; } + +.edui-for-edittd .edui-icon:before { content: "\e65a"; } + +.edui-for-lineheight .edui-icon:before { content: "\e62a"; } + +.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; } + +.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; } + +.edui-for-scrawl .edui-icon:before { content: "\e616"; } + +.edui-for-redo .edui-icon:before { content: "\e609"; } + +.edui-for-undo .edui-icon:before { content: "\e600"; } + +.edui-for-inserttitle .edui-icon:before { content: "\e65b"; } + +.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; } + +.edui-for-aligntable .edui-icon:before { content: "\e662"; } + +.edui-for-table .edui-icon:before { content: "\e664"; } + +.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; } + +.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; } + +.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; } + +.edui-for-paste .edui-icon:before { content: "\e667"; } + +.edui-for-map .edui-icon:before { content: "\e668"; } + +.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; } + +.edui-for-imagecenter .edui-icon:before { content: "\e602"; } + +.edui-for-imagenone .edui-icon:before { content: "\e607"; } + +.edui-for-fontborder .edui-icon:before { content: "\e608"; } + +.edui-for-edittable .edui-icon:before { content: "\e60a"; } + +.edui-for-imageleft .edui-icon:before { content: "\e60b"; } + +.edui-for-imageright .edui-icon:before { content: "\e615"; } + +.edui-for-insertcol .edui-icon:before { content: "\e625"; } + +.edui-for-insertcolnext .edui-icon:before { content: "\e626"; } + +.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; } + +.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; } + +.edui-for-insertrow .edui-icon:before { content: "\e637"; } + +.edui-for-insertrownext .edui-icon:before { content: "\e639"; } + +.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; } + +.edui-for-mergeright .edui-icon:before { content: "\e642"; } + +.edui-for-mergedown .edui-icon:before { content: "\e643"; } + +.edui-for-inserttable .edui-icon:before { content: "\e644"; } + +.edui-for-pagebreak .edui-icon:before { content: "\e648"; } + +.edui-for-source .edui-icon:before { content: "\e649"; } + +.edui-for-splittorows .edui-icon:before { content: "\e64b"; } + +.edui-for-splittocols .edui-icon:before { content: "\e64c"; } + +.edui-for-splittocells .edui-icon:before { content: "\e64d"; } + +.edui-for-arrow .edui-icon:before { content: "\e64f"; } + +.edui-for-aligntd .edui-icon:before { content: "\e651"; } + +.edui-for-autotypeset .edui-icon:before { content: "\e653"; } + +.edui-for-charts .edui-icon:before { content: "\e658"; } + +.edui-for-closeerror .edui-icon:before { content: "\e65c"; } + +.edui-for-copy .edui-icon:before { content: "\e65f"; } + +.edui-for-date .edui-icon:before { content: "\e661"; } + +.edui-for-deletetable .edui-icon:before { content: "\e669"; } + +.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; } + +.edui-for-arrowright .edui-icon:before { content: "\e66b"; } + +.edui-for-tableleft .edui-icon:before { content: "\e66c"; } + +.edui-for-tableright .edui-icon:before { content: "\e66d"; } + +.edui-for-tablecenter .edui-icon:before { content: "\e66e"; } + +.edui-for-videoleft .edui-icon:before { content: "\e66f"; } + +.edui-for-videocenter .edui-icon:before { content: "\e670"; } + +.edui-for-videonone .edui-icon:before { content: "\e671"; } + +.edui-for-videoright .edui-icon:before { content: "\e672"; } + +.edui-for-template .edui-icon:before { content: "\e64e"; } + +.edui-for-addfile .edui-icon:before { content: "\e673"; } + +.edui-for-selected .edui-icon:before { content: "\e674"; } + +.edui-for-pickarea .edui-icon:before { content: "\e675"; } + +.edui-for-overlay .edui-icon:before { content: "\e676"; } + +.edui-for-preitem .edui-icon:before { content: "\e677"; } + +.edui-for-preitem1 .edui-icon:before { content: "\e678"; } + +.edui-for-preitem2 .edui-icon:before { content: "\e679"; } + +.edui-for-preitem3 .edui-icon:before { content: "\e67a"; } + +.edui-for-preitem4 .edui-icon:before { content: "\e67b"; } + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css new file mode 100644 index 0000000..c28c43b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css @@ -0,0 +1,68 @@ +/*自动排版弹出菜单*/ +.edui-notadd .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-notadd .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-notadd .edui-cellalignpicker-body td{ + padding: 1px; +} +.edui-notadd .edui-cellalignpicker-body .edui-icon{ + height: 20px; + width: 20px; + padding: 1px; + color: #666; +} + +.edui-notadd .edui-cellalignpicker-body .edui-left{ + background-position: 0 0; +} + +.edui-notadd .edui-cellalignpicker-body .edui-left:before{ + content: '\e66c'; +} + +.edui-notadd .edui-cellalignpicker-body .edui-center:before{ + content: '\e66e'; +} + +.edui-notadd .edui-cellalignpicker-body .edui-right:before{ + content: '\e66d'; +} + +.edui-notadd .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-notadd .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-left{ + background-position: -73px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-center{ + background-position: -98px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css new file mode 100644 index 0000000..f07f260 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css @@ -0,0 +1,9 @@ +/*颜色按钮 */ +.edui-notadd .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 5px; + left: 9px; + width: 18px; + height: 4px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css new file mode 100644 index 0000000..0e267d9 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css @@ -0,0 +1,120 @@ +/* 颜色弹出菜单 */ +.edui-notadd .edui-colorpicker-topbar { + height: 27px; + width: 200px; +} + +.edui-notadd .edui-colorpicker-preview { + height: 20px; + border: 1px solid #ccc; + margin-left: 1px; + width: 128px; + float: left; + border-radius: 5px; +} + +.edui-notadd .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 12px; + height: 22px; + border: 1px solid #ccc; + padding: 3px 5px; + cursor: pointer; + border-radius: 5px; +} + +.edui-notadd .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-notadd .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-notadd .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-notadd .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.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; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css new file mode 100644 index 0000000..67e6ab0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css @@ -0,0 +1,72 @@ +/*不可选中菜单按钮 */ +.edui-notadd .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px !important; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow::after { + height: 25px; + line-height: 24px; + font-family:"edui-notadd" !important; + font-size: 26px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: "\e64f"; + /*padding: 10px 0;*/ + display: block; +} + +.edui-notadd .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + margin: 0 10px; + height: 26px; + line-height: 26px; +} + +.edui-notadd .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #f3f3f3; + border: 1px solid #ccc; +} + +.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #ccc; +} + +.edui-notadd .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css new file mode 100644 index 0000000..1cbb647 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css @@ -0,0 +1,47 @@ +/*contextmenu*/ +.edui-notadd .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; +} + +.edui-notadd .edui-hassubmenu .edui-arrow::after { + font-family: "edui-notadd" !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: '\e66b'; + line-height: 1; + display: block; +} + +.edui-notadd .edui-menu-body .edui-menuitem { + padding: 5px 10px; +} + +.edui-notadd .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; + display: none; +} + +.edui-notadd .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-notadd .edui-menu-body .edui-state-hover { + background-color: #f3f3f3; +} + +.edui-notadd .edui-menu-body .edui-for-tablesort { + padding-left: 25px; +} + +.edui-notadd .edui-menu-body .edui-for-borderBack { + padding-left: 25px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css new file mode 100644 index 0000000..333da63 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css @@ -0,0 +1,365 @@ +/* 弹出对话框按钮和对话框大小 */ +.edui-notadd .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div{ + width:auto; +} + +.edui-notadd .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-notadd .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-notadd .edui-dialog-body { + box-sizing: content-box; + position: relative; + padding:2px; + _zoom: 1; +} + +.edui-notadd .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-notadd .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-notadd .edui-dialog-foot { + background-color: white; +} + +.edui-notadd .edui-dialog-titlebar { + height: 50px; + border-bottom: 2px solid #ccc; + position: relative; + cursor: move; +} +.edui-notadd .edui-dialog-caption { + font-weight: bold; + font-size: 16px; + line-height: 50px; + padding-left: 20px; + color: #444; +} + +.edui-notadd .edui-dialog-draghandle { + height: 50px; +} + +.edui-notadd .edui-dialog-closebutton { + position: absolute !important; + right: 20px; + top: 15px; +} + +.edui-notadd .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + /*background: url("../images/icons-all.gif") no-repeat 0 -59px;*/ +} + +.edui-notadd .edui-dialog-closebutton .edui-state-hover .edui-button-body { + /*background: url("../images/icons-all.gif") no-repeat 0 -89px;*/ +} + +.edui-notadd .edui-dialog-foot { + position: relative; + height: 56px; + border-top: 2px solid #ccc; +} + +.edui-notadd .edui-dialog-buttons { + position: absolute; + right: 10px; + bottom: 10px; +} + +.edui-notadd .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-notadd .edui-dialog-buttons .edui-okbutton { + background-color: #3498db; + border-radius: 5px; + color: #fff; +} + +.edui-notadd .edui-dialog-buttons .edui-cancelbutton { + background-color: #f3f3f3; + border-radius: 5px; + color: #898989; +} + +.edui-notadd .edui-dialog-buttons .edui-button .edui-button-body { + height: 34px; + width: 94px; + font-size: 12px; + line-height: 34px; + text-align: center; + cursor: default; + border-radius: 5px; +} + + +.edui-notadd .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-notadd .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #000; + position: absolute; +} + +.edui-notadd .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-notadd .edui-dialog-content { + position: relative; +} + +.edui-notadd .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-notadd .edui-for-link .edui-dialog-content { + width: 420px; + height: 257px; + overflow: hidden; +} +.edui-dialog .edui-for-link .edui-dialog-body { + height: 368px !important; + width: 420px !important; +} + +/*background-dialog*/ +.edui-notadd .edui-for-background .edui-dialog-content { + width: 465px; + height: 287px; + overflow: hidden; +} +.edui-dialog .edui-for-background .edui-dialog-body { + height: 398px !important; + width: 465px !important; +} + +/*template-dialog*/ +.edui-notadd .edui-for-template .edui-dialog-content { + width: 682px; + height: 406px; + overflow: hidden; +} +.edui-dialog .edui-for-template .edui-dialog-body { + height: 516px !important; + width: 682px !important; +} + +/*scrawl-dialog*/ +.edui-notadd .edui-for-scrawl .edui-dialog-content { + width: 640px; + height: 435px; +} +.edui-dialog .edui-for-scrawl .edui-dialog-body { + height: 545px !important; + width: 640px !important; +} + +/*spechars-dialog*/ +.edui-notadd .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-notadd .edui-for-insertimage .edui-dialog-content { + width: 641px; + height: 455px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-notadd .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-notadd .edui-for-insertframe .edui-dialog-content { + width: 400px; + height: 255px; + overflow: hidden; +} +.edui-dialog .edui-for-insertframe .edui-dialog-body { + height: 365px !important; + width: 400px !important; +} + +/*wordImage-dialog*/ +.edui-notadd .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-notadd .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + +/*map-dialog*/ +.edui-notadd .edui-for-map .edui-dialog-content { + width: 640px; + height: 455px; +} +.edui-dialog .edui-for-map .edui-dialog-body { + height: 562px !important; + width: 640px !important; +} + +/*gmap-dialog*/ +.edui-notadd .edui-for-gmap .edui-dialog-content { + width: 640px; + height: 452px; +} +.edui-dialog .edui-for-gmap .edui-dialog-body { + height: 563px !important; + width: 640px !important; +} + +/*video-dialog*/ +.edui-notadd .edui-for-insertvideo .edui-dialog-content { + width: 641px; + height: 450px; +} +.edui-dialog .edui-for-insertvideo .edui-dialog-body { + height: 560px !important; + width: 640px !important; +} + +/*anchor-dialog*/ +.edui-notadd .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-notadd .edui-for-searchreplace .edui-dialog-content { + width: 404px; + height: 310px; +} + +.edui-dialog .edui-for-searchreplace .edui-dialog-body { + height: 364px !important; + width: 404px !important; +} + +/*help-dialog*/ +.edui-notadd .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-notadd .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-notadd .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-notadd .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-notadd .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-notadd .edui-for-music .edui-dialog-content { + width: 630px; + height: 449px; +} +.edui-dialog .edui-for-music .edui-dialog-body { + height: 560px !important; + width: 630px !important; +} + +.edui-dialog-body .edui-dialog-foot .edui-icon:before { + content: ''; +} + +.edui-dialog-body .edui-dialog-titlebar .edui-icon:before { + content: '\e654'; + font-size: 18px; + font-weight: bold; + color: #ccc; +} + +.edui-dialog .edui-dialog-fullscreen-flag .edui-dialog-content { + padding: 20px; +} + +.icon-delete:before { + content: '\e654'; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css new file mode 100644 index 0000000..152833b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css @@ -0,0 +1,161 @@ +/*UI工具栏、编辑区域、底部*/ +.edui-notadd .edui-editor { + border: 1px solid #e5e5e5; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; +} + +.edui-notadd .edui-dialog .edui-dialog-body { + font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; +} + +.edui-editor div{ + width:auto; + height:auto; + line-height: 1 !important; +} +.edui-notadd .edui-editor-toolbarbox { + position: relative; + zoom: 1; + border-top-left-radius:2px; + border-top-right-radius:2px; +} + +.edui-notadd .edui-editor-toolbarboxouter { + border-bottom: 1px solid #e5e5e5; + background-color: #f3f3f3; +} + +.edui-notadd .edui-editor-toolbarboxinner { + /*padding: 2px;*/ +} + +.edui-notadd .edui-editor-iframeholder .view p { + overflow: hidden; +} + +.edui-notadd .edui-editor-iframeholder { + position: relative; +} + +.edui-notadd .edui-editor-bottomContainer { + overflow: hidden; + padding: 0 4px; + border-top: 1px solid #e5e5e5; +} + +.edui-notadd .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-notadd .edui-editor-bottomContainer td { + white-space: nowrap; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-notadd .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-notadd .edui-editor-scale { + width: 12px; +} +.edui-notadd .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-notadd .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-notadd .edui-editor-breadcrumb span { + cursor: pointer; + /*text-decoration: underline;*/ + color: blue; +} + +.edui-notadd .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-notadd .edui-bubble .edui-popup-content { + border: 1px solid #e5e5e5; + background-color: #f3f3f3; + padding: 10px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-notadd .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-notadd .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-notadd .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-notadd .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-notadd .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} + +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +#edui1_imagescale_cover { + +} +.edui-notadd .edui-editor-imagescale { + +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css new file mode 100644 index 0000000..69651ac --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css @@ -0,0 +1,194 @@ + +@font-face {font-family: "edui-notadd"; + src: url('../fonts/iconfont.eot?t=1544172107808'); /* IE9*/ + src: url('../fonts/iconfont.eot?t=1544172107808#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('../fonts/iconfont.ttf?t=1544172107808') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('../fonts/iconfont.svg?t=1544172107808#iconfont') format('svg'); /* iOS 4.1- */ +} + +.edui-notadd .edui-icon{ + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +.edui-for-insertparagraphtrue .edui-icon:before { content: "\e6c1"; } + +.edui-for-splittocells .edui-icon:before { content: "\e6c2"; } + +.edui-for-insertcol .edui-icon:before { content: "\e6c4"; } + +.edui-for-insertparagraph .edui-icon:before { content: "\e6c9"; } + +.edui-for-insertimage .edui-icon:before { content: "\e6ce"; } + +.edui-for-date .edui-icon:before { content: "\e6d1"; } + +.edui-for-previousstep .edui-icon:before { content: "\e6d2"; } + +.edui-for-nextstep .edui-icon:before { content: "\e6d5"; } + +.edui-for-brush .edui-icon:before { content: "\e6d7"; } + +.edui-for-fullscreen .edui-icon:before { content: "\e6d9"; } + +.edui-for-scaleboard .edui-icon:before { content: "\e6da"; } + +.edui-for-clearboard .edui-icon:before { content: "\e6db"; } + +.edui-for-background .edui-icon:before { content: "\e6dc"; } + +.edui-for-strikethrough .edui-icon:before { content: "\e6dd"; } + +.edui-for-spechars .edui-icon:before { content: "\e6de"; } + +.edui-for-italic .edui-icon:before { content: "\e6e0"; } + +.edui-for-insertorderedlist .edui-icon:before { content: "\e6e1"; } + +.edui-for-formatmatch .edui-icon:before { content: "\e6e2"; } + +.edui-for-insertunorderedlist .edui-icon:before { content: "\e6e3"; } + +.edui-for-underline .edui-icon:before { content: "\e6e4"; } + +.edui-for-anchor .edui-icon:before { content: "\e6e5"; } + +.edui-for-removeformat .edui-icon:before { content: "\e6e6"; } + +.edui-for-blockquote .edui-icon:before { content: "\e6e7"; } + +.edui-for-source .edui-icon:before { content: "\e6e8"; } + +.edui-for-copy .edui-icon:before { content: "\e6ea"; } + +.edui-for-horizontal .edui-icon:before { content: "\e6eb"; } + +.edui-for-help .edui-icon:before { content: "\e6ed"; } + +.edui-for-indent .edui-icon:before { content: "\e6ee"; } + +.edui-for-justifyjustify .edui-icon:before { content: "\e6ef"; } + +.edui-for-justifycenter .edui-icon:before { content: "\e6f0"; } + +.edui-for-justifyleft .edui-icon:before { content: "\e6f1"; } + +.edui-for-justifyright .edui-icon:before { content: "\e6f2"; } + +.edui-for-link .edui-icon:before { content: "\e6f3"; } + +.edui-for-cleardoc .edui-icon:before { content: "\e6f4"; } + +.edui-for-notadd-ueditor-59 .edui-icon:before { content: "\e6f6"; } + +.edui-for-drafts .edui-icon:before { content: "\e6f7"; } + +.edui-for-superscript .edui-icon:before { content: "\e6f9"; } + +.edui-for-subscript .edui-icon:before { content: "\e6fa"; } + +.edui-for-forecolor .edui-icon:before { content: "\e6fb"; } + +.edui-for-arrow .edui-icon:before { content: "\e6fc"; } + +.edui-for-backcolor .edui-icon:before { content: "\e6fd"; } + +.edui-for-touppercase .edui-icon:before { content: "\e6fe"; } + +.edui-for-directionalityltr .edui-icon:before { content: "\e6ff"; } + +.edui-for-tolowercase .edui-icon:before { content: "\e700"; } + +.edui-for-directionalityrtl .edui-icon:before { content: "\e701"; } + +.edui-for-insertvideo .edui-icon:before { content: "\e705"; } + +.edui-for-emotion .edui-icon:before { content: "\e706"; } + +.edui-for-pasteplain .edui-icon:before { content: "\e707"; } + +.edui-for-preview .edui-icon:before { content: "\e708"; } + +.edui-for-print .edui-icon:before { content: "\e70a"; } + +.edui-for-selectall .edui-icon:before { content: "\e70d"; } + +.edui-for-mergecells .edui-icon:before { content: "\e70e"; } + +.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } + +.edui-for-deletecol .edui-icon:before { content: "\e714"; } + +.edui-for-deleterow .edui-icon:before { content: "\e715"; } + +.edui-for-deletetable .edui-icon:before { content: "\e716"; } + +.edui-for-inserttable .edui-icon:before { content: "\e717"; } + +.edui-for-music .edui-icon:before { content: "\e719"; } + +.edui-for-attachment .edui-icon:before { content: "\e71c"; } + +.edui-for-mergedown .edui-icon:before { content: "\e71d"; } + +.edui-for-mergeright .edui-icon:before { content: "\e71e"; } + +.edui-for-splittorows .edui-icon:before { content: "\e71f"; } + +.edui-for-splittocols .edui-icon:before { content: "\e721"; } + +.edui-for-fontborder .edui-icon:before { content: "\e724"; } + +.edui-for-insertframe .edui-icon:before { content: "\e725"; } + +.edui-for-gmap .edui-icon:before { content: "\e726"; } + +.edui-for-template .edui-icon:before { content: "\e72a"; } + +.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e72c"; } + +.edui-for-time .edui-icon:before { content: "\e72e"; } + +.edui-for-pagebreak .edui-icon:before { content: "\e732"; } + +.edui-for-imagenone .edui-icon:before { content: "\e733"; } + +.edui-for-imageleft .edui-icon:before { content: "\e734"; } + +.edui-for-imageright .edui-icon:before { content: "\e735"; } + +.edui-for-imagecenter .edui-icon:before { content: "\e736"; } + +.edui-for-snapscreen .edui-icon:before { content: "\e738"; } + +.edui-for-autotypeset .edui-icon:before { content: "\e739"; } + +.edui-for-lineheight .edui-icon:before { content: "\e73b"; } + +.edui-for-wordimage .edui-icon:before { content: "\e73c"; } + +.edui-for-redo .edui-icon:before { content: "\e73d"; } + +.edui-for-rowspacingbottom .edui-icon:before { content: "\e73e"; } + +.edui-for-scrawl .edui-icon:before { content: "\e73f"; } + +.edui-for-rowspacingtop .edui-icon:before { content: "\e740"; } + +.edui-for-undo .edui-icon:before { content: "\e742"; } + +.edui-for-close .edui-icon:before { content: "\e745"; } + +.edui-for-map .edui-icon:before { content: "\e668"; } + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css new file mode 100644 index 0000000..038a3cf --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css @@ -0,0 +1,49 @@ +/* 可选中按钮弹出菜单*/ +.edui-notadd .edui-menu { + z-index: 3000; +} + +.edui-notadd .edui-menu .edui-popup-content { + padding: 0; + overflow: hidden; +} + +.edui-notadd .edui-menu-body { + _width: 150px; + min-width: 170px; +} + +.edui-notadd .edui-menuitem-body { + font-size: 14px; + color: #666; +} + +.edui-notadd .edui-menuitem { + height: 30px; + cursor: default; + vertical-align: top; +} + +.edui-notadd .edui-menuitem .edui-icon { + line-height: 1.3; +} + +.edui-notadd .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-notadd .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-notadd .edui-state-disabled .edui-menuitem-label { + color: gray; +} + +.edui-notadd .edui-menu-body .edui-menuitem.edui-for-setbordervisible { + padding-left: 25px; +} + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css new file mode 100644 index 0000000..f1bdb3c --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css @@ -0,0 +1,70 @@ +/*可选中菜单按钮*/ +.edui-notadd .edui-list .edui-bordereraser { + display: none; +} + +.edui-notadd .edui-listitem { + white-space: nowrap; +} + +.edui-notadd .edui-list .edui-state-hover { + position: relative; + background-color: #f3f3f3; + padding: 0; +} + +.edui-notadd .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-notadd .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-notadd .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-notadd .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-notadd .edui-for-rowspacingtop .edui-listitem-label, +.edui-notadd .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-notadd .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-notadd .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css new file mode 100644 index 0000000..5fffbd0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css @@ -0,0 +1,66 @@ +.edui-notadd .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-notadd .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.edui-notadd .edui-message-body{ + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} +.edui-notadd .edui-message-type-info{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.edui-notadd .edui-message-type-success{ + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.edui-notadd .edui-message-type-danger, +.edui-notadd .edui-message-type-error{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-notadd .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} +.edui-notadd .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css new file mode 100644 index 0000000..57829c2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css @@ -0,0 +1,29 @@ +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-notadd .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-notadd .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-notadd .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-notadd .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-notadd .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-notadd .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + /*border-left: 1px solid transparent;*/ +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css new file mode 100644 index 0000000..e0d66b2 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css @@ -0,0 +1,60 @@ +/*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载 +*/ + +/*-------基础UI构建,必须加载-------*/ +@import "uibase.css"; +@import "toolbar.css"; +@import "editor.css"; + + +/*-------可选中菜单按钮,按需加载-------*/ + /*可选中菜单按钮--依赖splitbutton*/ +@import "menubutton.css"; + /*可选中菜单按钮-弹出菜单*/ +@import "menu.css"; + + +/*-------不可选中菜单按钮,按需加载-------*/ + /*不可选中菜单按钮--依赖splitbutton*/ +@import "combox.css"; + + +/*-------按钮类型,按需加载-------*/ + /*普通按钮*/ +@import "button.css"; + /*按钮icon*/ +@import "buttonicon.css"; +@import "buttoniconex.css"; + /*弹出菜单按钮-附加按钮*/ +@import "splitbutton.css"; + /*弹出菜单*/ +@import "popup.css"; + /*提示消息*/ +@import "message.css"; + + +/*-------独立按钮样式,按需加载-------*/ + /*弹出对话框样式*/ +@import "dialog.css"; + /*段落格式弹出菜单*/ +@import "paragraphpicker.css"; + /*表格弹出菜单*/ +@import "tablepicker.css"; + /*颜色弹出菜单*/ +@import "colorpicker.css"; + /*自动排版弹出菜单*/ +@import "autotypesetpicker.css"; + /*平均分布菜单*/ +@import "cellalignpicker.css"; + /*分隔线*/ +@import "separtor.css"; + /*颜色按钮--依赖splitbutton*/ +@import "colorbutton.css"; + /*表情按钮--依赖splitbutton*/ +@import "multiMenu.css"; + /*右键菜单*/ +@import "contextmenu.css"; + /*快捷菜单*/ +@import "shortcutmenu.css"; + /*粘贴提示*/ +@import "pastepicker.css"; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css new file mode 100644 index 0000000..3f66871 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css @@ -0,0 +1,45 @@ +/*段落弹出菜单*/ +.edui-notadd .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css new file mode 100644 index 0000000..10e9c8e --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css @@ -0,0 +1,72 @@ +/*粘贴弹出菜单*/ +.edui-notadd .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-notadd .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-notadd .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-notadd .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-notadd .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-notadd .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon, +.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + background-position: -148px -34px; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css new file mode 100644 index 0000000..41bce98 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css @@ -0,0 +1,78 @@ +/* 弹出菜单 */ +.edui-notadd .edui-popup { + z-index: 3000; + width:auto; + height:auto; + +} + +.edui-notadd .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-notadd .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 10px; + background:#ffffff; +} + +.edui-notadd .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; + display: none; +} + +.edui-notadd .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-notadd .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-notadd .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-notadd .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-notadd .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} + +.edui-notadd .edui-bubble .edui-popup-body{ + width: 355px !important; + height: 40px !important; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css new file mode 100644 index 0000000..f4ebb0b --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css @@ -0,0 +1,4 @@ +/*分隔线*/ +.edui-notadd .edui-toolbar .edui-separator { + display: none; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css new file mode 100644 index 0000000..8dda16f --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css @@ -0,0 +1,9 @@ +/*弹出菜单*/ +.edui-notadd .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css new file mode 100644 index 0000000..fe43e78 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css @@ -0,0 +1,94 @@ +/*splitbutton*/ +.edui-notadd .edui-toolbar .edui-splitbutton-body .edui-arrow::after, +.edui-notadd .edui-toolbar .edui-menubutton-body .edui-arrow::after { + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: "\e64f"; + display: block; + position: relative; + right: 5px; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-menubutton-body { + /*padding: 1px;*/ +} + +.edui-notadd .edui-toolbar .edui-splitborder { + height: 20px; +} + +.edui-notadd .edui-toolbar .edui-state-hover .edui-splitborder { + /*width: 1px;*/ + /*border-left: 0px solid #dcac6c;*/ +} + +.edui-notadd .edui-toolbar .edui-state-active .edui-splitborder { + /*width: 0;*/ + /*border-left: 1px solid gray;*/ +} + +.edui-notadd .edui-toolbar .edui-state-opened .edui-splitborder { + /*width: 1px;*/ + /*border: 0;*/ +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon { + color: #fff; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #e5e5e5; + /*border: 1px solid #dcac6c;*/ + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon { + color: #fff; +} + +.edui-notadd .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + padding: 0; +} + +.edui-notadd .edui-for-insertorderedlist .edui-bordereraser, +.edui-notadd .edui-for-lineheight .edui-bordereraser, +.edui-notadd .edui-for-rowspacingtop .edui-bordereraser, +.edui-notadd .edui-for-rowspacingbottom .edui-bordereraser, +.edui-notadd .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-notadd .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-notadd .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-notadd .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-notadd .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-notadd .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + background-image: none ; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css new file mode 100644 index 0000000..9f090f0 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css @@ -0,0 +1,41 @@ +/* 表格弹出菜单 */ +.edui-notadd .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-notadd .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.edui-notadd .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + /*border-left: 1px solid transparent;*/ +} +.edui-notadd .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-notadd .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-notadd .edui-dialog-buttons .edui-label { + line-height: 34px; + font-size: 14px; +} + +.edui-notadd .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-notadd .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-notadd .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css new file mode 100644 index 0000000..d4d3817 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css @@ -0,0 +1,17 @@ +/* 工具栏 */ +.edui-notadd .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} + +.edui-notadd .edui-toolbar .edui-button, +.edui-notadd .edui-toolbar .edui-splitbutton, +.edui-notadd .edui-toolbar .edui-menubutton, +.edui-notadd .edui-toolbar .edui-combox { + padding: 4px 0 !important; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css new file mode 100644 index 0000000..b7ce608 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css @@ -0,0 +1,119 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-notadd * { + box-sizing: border-box; +} +.edui-notadd .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-notadd a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-notadd a.edui-box:hover { + text-decoration: none; +} + +.edui-notadd a.edui-box:active { + text-decoration: none; +} + +.edui-notadd table.edui-box { + border-collapse: collapse; +} + +.edui-notadd ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: middle; +} + +.edui-notadd .edui-clearfix { + zoom: 1 +} + +.edui-notadd .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + + * html div.edui-box { + display: inline !important; +} + +*:first-child+html div.edui-box { + display: inline !important; +} + +/* control layout */ +.edui-notadd .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} + +.edui-notadd .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-notadd .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-notadd .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-notadd .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-notadd .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-notadd .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-notadd .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-notadd .edui-label { + cursor: default; +} + +.edui-notadd span.edui-clickable { + color: #666; + cursor: pointer; + text-decoration: none; + padding-left: 5px; +} + +.edui-notadd span.edui-unclickable { + color: gray; + cursor: default; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/dialogbase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/dialogbase.css new file mode 100644 index 0000000..85317d6 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/dialogbase.css @@ -0,0 +1,104 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 13px/1.5 Microsoft yahei,sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 12px; + height: 30px; + /*border: 1px solid #ccc;*/ + /*background: url("images/dialog-title-bg.png") repeat-x;*/ + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.tabhead span.focus { + /*height: 31px;*/ + border-bottom: none; + background: #3498db; + color:#fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + /*border: 1px solid #ccc;*/ +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + /*background: url(../../themes/default/images/icons-all.gif) no-repeat;*/ +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.eot b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..45c54826615b6f7919a3b65666c9e8c877c83913 GIT binary patch literal 25672 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�Q-x8Dm9|h%E<N#p_U>ph?=$E|j{7p-*D15q{Q#yulGpPRm3zy0Fv%kdo57uwUk;_~gS{yNEr^{X}( zU1m1pfJ5O%mg?cWH{&~{~JuLQEN)5`QL`mv$n!3akSzEOv)Sqx&`=m_r z6Sr7z^Xc8;iI{s3 zvFDTq9EM|wU^s#yM__BiPK6Q9PG)n|!w z%)GZizUu;qv)^of)I4p%-%ocsTbFM3JZ-D8^joT$LYB?d8(JRkH)=^(+PoA*O}G<<0@HDBCvAxW)^ph1xyW3)Qdos4`y9= zBFq93RXB*l2g{XOz}Ico-0?wf4Z{%C((a;hmMOyUdCJxKHS9F@L1kLi}*Nx9>+=todXAf*??$NX#r##V#a#l2Ntfe zvkR@@UqR#;>vKpUI4V#N`(8F1w6bVWop15L)IeE#@BS{^Q3bCCUI zULT9HFaaV)%m9w1q#oJSwl~OsckBA)5=8FB)#@rKxgntLmz52HW(Bd&`F6MdtpU!a zy*aT|UOy}1J2yZ&CF47#TX>Fm9d|wE|2iR|%pNKy=s<)5K3=YAD`b7YNQ%%k>U&ugCJB%5?Sf%G_MCV9O>Uqfh!0B;2!Fg!zqzPyq4mlYy{AQ8{#mGAA%(j^z}N z*h#$o)NDqJ-X*bB530Pg6IapeMd2N&i9*cow4tig_m2Xl2rWWA1hw9ni^|3`lzGvb zIi~f@uJ!U$veqT7mvpDrGrQJHwK(Dkz7eNHju!T_FgGOzBXap1SYa=MUt@*%5V$8C z?9xm{EDAv+uz(Ov&ab15o#2teirS3RJeo#W3G*eGZ)VPA>5#$^Z#WWM%vXomXoz?F z8lzg87W*T-aWrZn7<{+@e{LU=CXq=A<0=979||B=jt*$4gh&HHHlbO5(`2cwP_Nl^ zdEI+#B|9tVmh!SW@^||EUH;rhsH(BCJK(R}m9P27{GL8r{mO%@msQuwvQ$j~u;qs8Z?t5*)rTJ$*D1Dos>53yr!5&#;x!Re^>)5souu;iLp_uV- z{QAz(+g(+4Au@WlT_ly&1o6n+o1Z-S$Xa@A{*gQP25XG9A?Xt*9|;E#viawpl8?(< z7vx`u;9W_8de>s?np)wMbI$qZm0TjfqAT8qSoSy)T2?xnWwBt06R)Eo-gu&th>qMh z5|!`I-TeA5rPqH+Ex&(5`u!VJ|C1j{Klzb*IUQG{(fgzK<4^4zxj#w|-9OwzSKmJp zjgI8*!`b1FM&GO6SJ>d(KdZ+F(EPspUW(o~8jTL~be)u8|J|H*%4h~4W`viM3{ao! z>(X?jqUqmvh>e?zgky18{!{Bu6p6?)#zz0dHt#M@dNNmHp--hjEbyunyeWk}ds>P; zE2m3qXE*l(_X^w<>}ARCP{N1xUKVs(4GZX`FHpFk>`wOusm%^cpq;nvt9yo{BT)@t z;d0K@Y3{4XH?_MLsnlZiI$zeF#7}ugsP35)QT%}sv_g;EldpN_u^BPCQ$c$oMR|1U zaenIC%kqLzGGE*vUnXA*Zm)!9U!w6fmY4NdoW$S=@CDmtNHJeD=5s+GC1MF!!_3Tb zV+7Gsj^06eXr2&RQ!O>bDN=N$WRNX&QcHV9#dQZ7{cspKd*$BFuUs9hpl;bt(fHpx zE$UBwm4+AZz4t{!rBD5-#d-8mIr4`;MC3=M9;2_Us*El-Ij^z!t)W0irL=+6TxlcS zMps!)bX(45r|&gi)PC=avi#z`?H4txjduBS@}oz$u2y%_Q>(WgeUxbfAxFsSjLaqY z;yB8}-fXzC1F@(>hDAcktb#yu1}~(ngavR8-qgq`91MU@4}J=bp9^%QWmxf>H5|F- zFK1gR9M(cR%?T*5Y=%jOO;VFNKajs6dy42XPn8ZWE0AZ8z3eghzS$AFPaT0tj;$(b z$10a)Pjo~TJs?aPW*-jsDTDDOLFra4dsKut*B1-R8e}-3Yub{T_Oza88_y`2-|TvV zP9P_g7xS`6-hV$E^mxVTgjCMFg){mZ{07aok6^8|1OAE&@t$PA7y`Z`aW-M0Wjvfq z4<`keP3#?l>42>JF3dkxMbJB4P=t8t0xu z@zv}cm&j#$tm3ZO40|eam`MJxhcKDxcz;vt@GUYL$a1NC^Uj+LNL{eDL{VqE%T_^4 zTRkCLx`L?Uagzf!cBStcSyl|ChNEU_d}n*4{LzXI`LD4u6588JNxpL?1I&xLAIe{s zYl`NTb9hfbw>-aq=$Yr3=UJQUnx0`*Kw*3USxCVM6dMnMEMza>QW}6HonaRzAq9i$;q%vY}@tqTvmaXD^5=AyN zt@L%(wYc0(RaH(WMcjeXPVdSlO9C$`HPslx0eQWg1j_i2kqGUlG;H4CM;@ogv9zY1 z;)|Co4Qx@B+N!Qv$!V{SmD%xjmBZFm4UeYW)nu$~GBs7pi?C`Fr>7@qYRco9K&^$Z z5tEG|E59@tLzn~91kTb#CW}pm9HI(ZpaHC>EvxC?y4F=`Gv#pde+`jOqD)U7Y79MFf&q>~34}vZM z8etn~)*QKAk&%iX0&p@8mE7Wn{aFpct;n)a(S;KLLAiw$R;^mjNx^e`4I;^R~3DN@(95-8lgb0Sl=eg3-8l#&%k#GtD;vf0P#fRL8pruH`WpQ$lSU{Jka%I7J+A9IExuB)VFOw=B#5)1>v&IE4&l5%7TSzo zoI+X+Ogtpzb2d^7VWo??S^)jIq%qWOFm#8cuj>2UGWb&PcBi9E`eJ^sB()Cn7VgcC zki5I8ldzxt81^z=2AzGjtfHb!?klShr_)c`dp{iL;+#2u8jl67bZeP)Bn zAd*ZckaqJRYc*_!E1Gsihj|9`_6hqD7G!O?z}E=;ClC`izb!dywerA2%0mxm+qb1) zXsyI!-FGt7B83>liC(7|GDDl3|O|5V{BT&wm&duiQ-3`2*tGK-CTpFwBE zYvTl74r5~o20r@eNHX*AU2zjErU>68Yb7ueF4N`BerYRHD=0!5d5IK=9KPjAUt1AB zFdjk}DbGOR%i%zPfb`82*pqvwGer_>2AvDf_MR*kithRO`Fp-+;a$(s$nEU<={v(c zzp(I@tMpsKHYxD#$+7G2cLqh1776CK*}lSBQJ2Du50(*F3oig;kOPmLn2C@|K6f6g z4kTqTLE(oC!YFHRB6)Q5E^O2fJZ1_&cd7@a{uA>b{9r^Oee(rXaK1epB-r*pvh7d} z7x*1X>Yq&lp-DcLaqN`+{-i&b!R7>hC?@~a^EhvE+SFs(h5a_??A716^bXv^uUGJ0 z{7&1+8}V<6ow5ci*4u^ry(Qut{JO_JG0eZmQ}E}pzT)qx*y7`YhA2MwCt%T~5$PYn zV*mU{Ix%1DKP!BmI16;niIdoUH<-=mqG;>*Vj8T3RO%9|k&&|d?YJyZU+B+5ac6~_ zKSFEA-W@L9H9rnw;5^=n%F5hjfvc7t-JZ!PwVy(9R#yUG> z5EH+))L3q{SwiIpUo8(=;K{aFUOi~Dgv)QSqDi$n4U>EHH&*K{xXyO)Rc^^kt3qBe z|KdtW6rtK(?auk!)zxn4$L?x5IEyW{7tVK}`Am%)7idlSF0-F4G_HmK<@khxU)fcP z=B%J=7R(*vJ;neDS&*JAL5pu)j`B`uNVd1=EehRqJ_D8hQ zA_W7?FpG)T(2?&3M(-5gW6st-91hpZ1b>7lUzUVf`155M^^ttpfO2=fY(#lQzHCCd zFJHDIy1Xl2W)H`;plvc>^!Rnt_vgz5|Ic&zGDmg3kuS@r|9-w~K>5G&Wux#?X})Yi zIgl?~#coRE%cUYrcUae?Qv)-pA^*N3{?Wn7iQ&nK8Eb0j&}iGlOW7Q|ZaeQ-d?@ z`)6jRmUeXTL%F_vaB>{(jWzfg!;~1n4;At+j{9K@9l>@~3~IkfKCEqL(C+lVN51eE z%}?Lv^tGq|<@3|G-GHZ00Mc*k=QIqr5llM&B=9i$J&ZP!_#sC>%n<%Xbsp6izLTio z9}k|y4?(6dwi*0j#D49nDg3-<2fl@o7TULK7#L?V)YdWB!xwbg&r!lJ50Qb4WP)FV ze_YCnoZd3LlxM?Ro)zREC*G)Y@ar+uLotdYg=Y!%(o)0=mgARZR^n|^4k@mtHMEx2(R$iI zeYBA_(Pr9$pE%h@+i3^wq;qK(ok!=>Zn}Ujq>E?|U5uYXx`ZyJ%c!3QXdeyI5T$6C zMrc2cBIon~jnOzw&?HUKK}yp!&Cnsbg07^)bcBx5Rl+zpHaVRtpH2;=2luB_Q)2^z zDbwi8z}VC_dYlZU3KXHruo6RE>9T(C|L4veMtO%9}ojQi4uruSR-4GbO_NlzY{7%HEhNsk^# z&Fsg~$o`V)snp>9f%LR>a18y@E-~zz92>F@9~v8*9!#fF6Q#qG>G6RX{0;86;0~$u z*yu#6ES(ykydtHav+l$1+#fi2XmTcH8kiW|Kbbb{PmN7kQ5Zc6_8Ax}n;spX8cQ9T z8k-y#GL7Oc6Eo$PADW&S9X>LMaw=V#KN?F7&)D+i{H`p&Pmhl5pE2O+2THW=4owc4 zhSCGWGt-voL;KL%(Wx2Jp$TqKI(=vg{I6A6&`CzzWZJ@b&`PB%;b3a$%>iD zDHHB6aOIc*vU1XZNu10-Tq7#iDFio@K9sV8E=MqP`^Hj6ZR^suS}l*Gjpxa8N}WEF z?o(>DX_GNv$IvJyf>Daw%p6J2fR>qx^~)?;d17)RWo41O4`WTGE!sf27y4;_s#R;K z-PNM^9LO%P(Bv3%fkUs?Zjl-q8=ao1K4pyim~>NGPxChczVbIgiEole%b|&)+vpRm zKUD{W7~sq#PeGxKK2DeA>or0#4y1A3tmAp8bl}j; z.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}")}catch(h){console&&console.log(h)}}!function(h){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(h,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(a=h,t=o.document,i=!1,v=function(){i||(i=!0,a())},(p=function(){try{t.documentElement.doScroll("left")}catch(h){return void setTimeout(p,50)}v()})(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())});var a,t,i,v,p}(function(){var h,l,a,t,i,v;(h=document.createElement("div")).innerHTML=p,p=null,(l=h.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",a=l,(t=document.body).firstChild?(i=a,(v=t.firstChild).parentNode.insertBefore(i,v)):t.appendChild(a))})}(window); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.svg b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.svg new file mode 100644 index 0000000..f2e73d5 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.svg @@ -0,0 +1,398 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.ttf b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..294ff8550c1495f68b57d5a98aefb423b32ed6d8 GIT binary patch literal 25492 zcmd^od3+n?ng9FD=&)p4vTom&EK73Y+p?rMr^tPf8v=v?c5K-(@fF#DBwPdK{*^*u z>6R2|I9u9n*=~1%mKL<#{^+r!-R^d`w1qb8vg&=%b}0pG{QEvLk|T$NrtJ3f`(q_P zGw;0f&dhr}_w$S_NC;6X6d{Ywbvw^r`Pb@ae<1`dLhZ_}J3G3U{&IsG$5-Qc*T7i+ z3qq7E9v(eBv}f#w$Al>RwGf+szAx23=!q}dg|;UE@qMVU+-tlQWwaMf z`^KgZ{rc|Nw{gF31AaU@G0^|(>Q|1S18?H|8)N;4Ch2kUw>VdcWB+*nSn4->{`p=Z zcE2oy^ufuAsp)Tj#y%j#C6hv!f&zV)m03mXF+MdrJNq5u(_Ay}b405_?KZ=!(aY>h z|4Wn_v<5GA9@)nQ-s9R5I4lv8b{bv4{)qUvXw;6m){3tXv)ZwK-YV)vtDx0u z&pi)U>NnQU(CEl;KkD*FILBuRH6%>=S{xgkbeAxS66rSSMbzG@@9Afvn{cfpj52CZ z^Vv4EW>6%v;zxFU{OCK+V1D%cs58Ut?8$RyDxc~4;`V21^S`nF&p$85r-V2au*{%E zP_6(LYSS+5)^UK&LoH)NEB3%z)ElT7$0hgzm$R2-ulkXF7Py=h*~|12&gvNYCGi$Y zE5#;puCR#;;SvkQX0b(_BesfdqFgwITX;kOl+h$wM7!87lEN&!!Y8UkwWtxbq7HP? zAp9aIBBELB5Ie;J(Jgw!GO=8&K#zS5i5FzxpO>~G((Iukd zLUEDUE!K*dNQgz^VzEc`ic7?$;xchS^ohlyUn~)OG0L!T0Nn>bS4+hzF(}GJN~{(` zVvSgbtJjMS=<7x?EcS^JakU{Zqyh zU_6nZ25|o@iVVODkp*Tk07FC;GsXa15m{g&1F%M9!DJYKKOze(WdJ6LEM}JhI3==X z9e`aT3x3A{JQG=q4!}5(1@iB1 zt%+s zibb|n2hg*~w&}o}D9iH&V9u27&;isgvYk4B?nSms2XFw9<>vvIOJ$=vfGdbBKN|r4 zAhIzXz$rwQ?*#zQ5ZQzd;2t8oNC)r{k?qw197SXo>j2&&vP*PeZkb)G1Ne=|^4I|2 zJR-|u1AqsKERPKUZX~iv9l)1F_8c9+p+t724&YTHyGjReEsvRBj6WR4TfX|8S1|7ihM0TSN;C&*yNe6I2kv&%j@I#T^tOGcs$ZpXAJW^!0 z>LB{C-=+ijrpPiL1HeH=mT>|AUMjMT698~kk>$AtuoTJiTm!&qMV99p0G=zdJih=| zHnKby0Ptav<+%W`rjzBl0Dw1(ERPKUE-kV=HURiFq>&Eb+>k~(fQO50pAO*WBFlXR zfUk=z_YVLLFS7hR0C>H~^1T4sob&Yn@PCozYXFc0B0H>u#s~JH41jbH*%2KeCq(vg z9Uw78cE1jg9U?ob1Eh$^j_Ck-BC_K;K(dJJgbt7~B0H%Aq>ae(dH^7IL^iDhB#_8X z=>SSz7ZZJJ;deQV_bD8;4^K<4G zOPnQ_m%L$_w*1;UYW;kvRJyVB@iK4OblHc>zFyv4ezg4SwkF%vwiEWn6}u`vP@y`; z9p83VI&W~*yKZ;=#=X(~W%qA9H+a76`L#Fcz1w%l_cy+uSMI31u}V}Wt46CnUG;_c&o9bvAc0kh5sh}21X5h zp3TS^ImujxA{H`R$Y-Gh$(h~iQT6C<8qzj2ghMHdjaE8&0`~x3&t5Cf$_hBY4OGzy z>;^qjR1V6~L^P6!C%g?r?G#x~k$5=LPUfH^>WwF~LyC5Lye6|L67<<95{&7GA#Rq4 z*r=X-om?YV>Te{NKS=-)AROzi*5%|QD;kEVEwIsRJUv3(s z3VXO?&EL7(t9Ea`l`0(S@~%*ar!HPACoWq$IZ4Z;Rk<&Ibmi-Ad|p>aT|UXSsiUsj z>2gWAFOsj)x1y;gO7J&4qT3f8STs4g=zxFbFXS6%KJ(f?-2N)nzV@2BM7`pPMNh~p z)hp=sSGmD~S5*_er7nM!Khpk1>ZfT3%b{7tAh1>j$ewcWttvcUdmf${4PvtZ-6=dz z{?C~jgP2)Lh95jgFzwVCGUR5|WG0!Bm0U(js=%PxJgAwZieaQBPsglgSJTDTxsY42?2{jha+4Ny1qLdyMaFS}BxKlOz-+$$yz-(jaol!W_|Q zN^0T$`Td`C0pW2;{ZT+MA;WslV13Vl=2gR*5BbOi+yU_gY-DzToI1M#v4E?y%M>SI z9Hszx1`NAYp_2QPRPUYnxVN6D&MTd()_mZ+dbu3K=8=zN=+m>pNB_vD>%F-J-a1N3 zw+8ESDxc3VADx|*|F2A-f5^B%W5i71h&vWfP(0Dt)$R4+ifFeFebE0RJs!8&WJcfg zzj(NXJYKE~S}3-hmPlIT{Mlf*(Hv}Sr)5O1*~(<~E{{YWnl5uunagOd@9AvY9&j)9 zSnG^(S((%3H9KPgY1u++G!iFUnM?f`^_m*J=H3gpc5L^zIJfmWw{=M+PK(W6=`a&* zwpWu}>!9^zRBA1^XUfZ3{iVB>lpNR;F`B&ga*}Li_3buurJ2kR8I6^Wa#Gany`Gv{ zM=(4?Umi?2Mwh*$<=wBX>yZP?x-{w?>XRFRYM*V88Q`R4x%#k8Aq+5+NM5blI}TLQEn}( ztzLL=U2}bN30bJd^OsZ&JqWm{XuPHl`qV{C-Fcu%;|P6;k!S{!bl4Afpi-SI@k=k1R7 zbO6!fT3hXTbfvXI{d$F$Bwxkj&)VzSY|oO%-eB{P#X@d-!0w@EY^`;+XC84>lH|di zD_mr;@}948Joc=;zSaILk-MV7?$$4=ufY6&-rj<%9>rDU26>dD<+ivB{t8l|-?YQW3A4AD)SHEhr zs-II|vAaAKAAg2B{fy69gAS3~=4D#f_$+~!SHUJ~0j+~lFdM)g+2aL`Euj!-Z#ngZ z$>@SmH&Y_s-9TPnx1Hqg|K8CWZLLs4b%v!>Q{L!y(1jr{z2tDabKh1USw?%ve_c|2 zC0SBw`F)8*vPl|vtHR}~P=mg(`h?u(FSjR+b@Wn2OSC2TwIteKroMXPI%-Io&2L%C zWT*w2-7|Zgf&1u%ec1{d3Ys?s8cm+gE{EG24Rm&4oltJ4pwUK+;huPuMLq=*K9|p9 zqhJUN?Dj5!9Kd2bfB*rUhb+WVfujZFmvdjWdpvfj7mLF)_bj!oZfk37Y$LL$tv8^PcBI=S(uD3yuZ0OdD*QSE+BWTWN=IK zN^kCOlAS%&8BeNjm%7U?DEC^Dit#Yruq?6mBNeU_-fE()>w4C01%kSos%mNYQrp5R zxwk8m$;2|Z-I&R&I7bdv_YD&@*3oAFxq&-E>zjh>!r!(pZ(VS=rQT`Ojz?7?8`fWQX>3tv=e2iV+tImbQCG*+ z>y=}jF``)KvGw<(y>;{Liyl~itfPmhr}Lrp4<_EfrF8q9i|>~!6Ma{&FWGQyXBRH( zymo_i{Wa~KaV#$Dy82kySLcFHqlSGD6bpD*MS}_z3!x}O!DStTu#Z99N*Psw`XDRG zoWcqd#HFqYkjP|mpk$f#g_#WW#Uyr`Cc@fCGO6fv{;YfeGQA4^iv)0~U4|-+`H1M# zfd^^YGzH>3Rc1_{4b;Jt2m-=cty&&4)^)88Hg>yw6%-0I_jj?j);rYG+MRonOu@DF zl~o2$W&PTq`WBrC1sd0c)!&jUvMJD5_xbRKB@2z#a9!Q1aO;J^THlOftf>o*NW)a& zb9L4=_EuK94C-5vb(L-xZAPVswcNs7HNYRk3iBMndNiVrg0J^L=EsZ=L@W!mmbDtDOQu)+@v#K@oH<9y-%aAPsKuJ1 zpV%na>H4a0Icl(Yyp9aY*fIJouTf5b^09cDe%Ge{i>4-GeOT|o%E1nh*|!$OHRRCA z9V)C&zK)EfO;nXx^}Kq;?@yNSe8}$SH9fMCeSRU>W@Z;w2`hsV#soDY zk_frL$~39#b3x89U(?1d{mZ#M*RQYdT}#sFjvb>Ct?8u=*F}fae{I{g<@r(j=<{24 zwSp2h#N!)C+rGBGwZ};Jdis*vM`d|*d$P}?PMQ;~%UjeRZCtu~-HM%5O9u+AaSg_5 zn8UA9&|#D*1Kw&gT<>v_2n!iKEc8hZLY+*+p*sY-8qHkY?elV9@t1%ZAc^m(KQtOC z@V)O*z-Ux|_`T|&i0ndz=fW*7m-w=bZm4rU%tFaLHC6wEDS&=#y|(K29_3%v~xVRjJEy= zdjYFLaFNwew1(t48p0qzGcra{OfSl@W2@BJWPxbpJi4DsAxVNc1GK@TPdSw%oiH@< zs1XR;jCx<#Zmj_iilOrnM~F1~4MLi`y{=Qr39zQQ6Z(OTyfUa&%=qPu-Qlp$Bzap@ z?vO-Pn1Xexs0#+`<_@@yPV}ith7?D=1Aj9aeJ_b%9iLqsoSiFiRHwjq7%zhGV=jRl z-pT$zXdbL#1iHQ8jYVZ&QTc4@U1w-7pC}sCH*?xBB_8Hy{)g)2q(1We1iaf$n%`9S zKPbQ{1-_o*d6_pW#-foGm*q3m7tiRt_Qf-y9w?d$I#4th#Yk}GR`brBehO4&-o%_b zc=H)>V&2$`SH8GhJodAyFCKgG2>(0f_cUzr|8d+!OMb?2pQ%kz{d*g?W`7%mbUo}2 zXdWSE|Bwf4P_p*SnkF;O7Tqfe5zyI%W7KwbMfp4qq~9;vBuSeVeR$Ei;PUs3Jverc z5j*wK4;l25A%DL2TuCwBJ+53WZR}mNiD*;r*j=)G*Vx>4-U(f{EAR~{;OlI)1=*xM zg{?;%;7{QQ45N4=085|6tk>s|l?>#NYO0OMa->%J9q*f}$eeRph|Ki!QpktO&sil& z`D!IxuEE+Fr8dZW>6WSn%B_c=!y=DkYt2AWwC3(%ImG;3=L@XM2I0YNMXzF-W|p5b z*4I3mz2*rd90ZAJW-TWcO~B{r2*^pN?F3{63!4+Ho{=BQQBHx^jAe|Z3{_`X+(^k| zHfLV(!X-Jy=FFg);37@tb`K>pQc^&D0SNiH^b~xgO&oR8R<9>wV!@4W^U6g%At)TM zWnu2xsDr|BBbIUnLDPlH*iNRfblm!WYoMi}qiS_%F}w$Ro9~>tihgBpbD3=hr|LkV z#AcL8bvTW-5?7m@e&saS%&xZ0bsNrYs3v1Ww6+d*L32Fe-!MSG)LOw_cIt)Y^vjA? zzJpVB>IK0%n?8?0j;&yJfJue5#R~eOn%Tps$TlpDTeB;`h7i}_9FDmaE5m#hl;M0U zsm2tJ84R(o`kcNuk!jC0M&mVmX!V|}P1yfI{hC&D^(AI9>TPIcxW|ZVOlG|a6btGM zxkH_Voh#f)igfs5_r-@L>|A>eORzTd0ypFHMa}s9Y1V~(bcs{f#rWr17gFli^THVX zMGNy!XR|OmPUUrUGh(YYraHtX0=_8K5S-lsY4fpPjP;Vc_YQUK@Q^yj+B&P&k3UZ3 z)T@3)ok}uZ&R!?K3A!x@<-*I&whFHpW&u_ynImSOMS`9#-)Y`srX_7{O9>05mQ)_; zKcc=&56}a-?c^fYPfDNZv9#jk(pF3SX=!Qob%WQb|ElhyPf(5epBg>Rz-Ph|+YW83 zizCby(z`3eN$5s6#TbkG&Azx7{!<{1Wtil*uEl(;HDAs zU;DMMT2@T=u=$h8$U;rN-P|4OaQ^D&(}(sr7nO9w{rXv%fXzkGk>qKzLWfz^)x>sM4iCbGgvm@c5Fm9nv8{l zj2?i$ysJs0uB4`T6aMJBeBpXXD_8?}y}LmpEvezFnrif&8q&lZ=9k-NnHdgv;1_3;J^qhrCc=N1uZ&G9`)G$v~hWhQcz!X}b(UB6FF| zNnl+Hhic%zfEA-acqApbPjtHl&6BeNQV6vf$QXa2u^|~baz3bHPd}sAiS@;RUzSaeKpTTU?@y~viTy}L;8+;^f z^hLXirl!=XL+bjkynZONlRYsun^V9K3_hyaA>8L;KN@Gq6)4YPH$fvk^ZjXjg zCs3#FgIvbdaw2Azq6t@VHOhP(1jNkI6;jL`@4I+eQ*PQ})G~E1Qf6-ZUn{ z%!{8%H>c~<>H52#xvyazeKp;DK)pSU549eMq&MQ^-Fzgybzs4PTn7rbrWd4h524^i zfl!nC1sc)MP`K(q^MU(tAbo=`c^;*|OsCavVts~*%zX3Z;@~R>VUs#fX5T6w%F2v@+Xc1y->iU_4ycUBv6hh6=Qvhg zRuso>fFUj#Q(n6oJ)*7`bS16Qco^Ja3s${ zF27hf&<``2%<9#KFW=gT?2Ti7jt=KCmmIljkNfB`+n%eATyo?ECAHq(cBkIk&uv6r_n9WBa^0?`mz&!33G%#b*CuH5W+Z`O z5oh10@fl5jLUgHJLa+h)X?MK@{|}kK^%4|;0pYHfK*c!I(=M@g0gj0(rfiDHFXrBC z*t%!ivc|@G`nD&wEVjVw^{8#06$?G|P>Aalzy@z$ky zj_M2T?p}8J)>eO=mXF=PF9*Fx>`**X?-G& zmTO{i1M_ayeRR1Q0REqYzC^+0V8oyYTKFa()^f9*#`EV0p7i?XRU`DU*kdU*C<_uL zsmp2d5>sS#)uK>e!gcKvGRcqMV(m>eze@du0G;OBhgQI96PudY>t4#$AB3fL%@2+s zZJ|2Z)GUAey0X#_KThEwmD11As@NMkbG?3L;bwSUV{S~Pi0A~Mad#j`bA?!o{FL($ zx9-Cz=VrB?d|tOX67Pwadl0eblm;AzV~Jomf+0tsYeP?k63$L$bJXPaMSx^J#PuN` ze2w77)1A9A_fw8D2?BSJpwZ3wAwC|yw3(VOZn==8)&+97)ue6Tw|qhE zqTsg1`uawD$BKqPtLfUvo)$TBN%OzGMo3Rp=N@Hx)cvfQ4rPE%<wo(FR}kf1lP}M$iT94J*tGFWdoL-mtlo{x3z9BgT}}^v^yZs;zr$QzdMbB2;w!JH zZ{I}gf^}x~x3}K>DQ5fXM{lFcsr%3(-buSxm6lq{*6fyO@kHlG2)T?pj%$3Q4qP6Y zuw=4RFoJA0V0svPSCm5`QA7|>3MNif{ZGa3Z&=I~hNdn1H#?n@tzyH}U)-3qR+N|= zCDwJf-Le0Z#mLDh&Dbr9arDx*)(byFJJe5Kc+myBX-DoZini|V+|$+yHahuFe-yoo z#$$(m2!F~SqsSKIW?-Zp6m-ea6%>WJ8I?~4;?5LPxbyx^^>xN3|M|!MHGBWgBr^K? z9{Nu$6jwaNQ|a#`E6!QD{3GfI)rp61TebFKQs#Kf^`OIzoDC227E;8=@$)z=9dr&9 z1Y*NPqe=@P+YmF>13%Dkjh$U+1^)^n$FR@Ah2W?_J@k9oY?Rk~TH{Kh)!TdL_Nw~j z3k};=jz^b2{F1@&(j$+&WT^6OYX}(0_Tr0VGp^`W?{im^t)jvvSB0u2o5Nv~s@@nU zmvo=EC8oq%J<;Xnnoy+9-V}3?;k%DK{9S|LyAMTRg!oc2A{@PHJsyU59j2WBT#4%KZceLf@^*st}*mGBJp0!VzL^8v-_p%$+Eb8O|;%qoIHt&Q6MyvpirKBF&)V4Rse|PKJr4m@~#ntKxDY-77 z?vs^ufo27<&$)KD{;dJdrad{aSYA6L;@j7OJ0;`WrCWH7*p9m%>wle)P-YL66L=s( z0Uw)dnuV+-Q)XwA1zk1?9(~f6AmN_XBFt|zgaU|f zpA3X0iprrglsSPRb1bKD#7^SvXJ#^5^e&05dO+o!ow$l#FADEKOcY{vrwvt|zJC-b zMQ9P?A*l7nTvRrmq0B~W=9tzqyVlFk$Xb`QUecXf&+J++)#8XF=ti6pIhx@uvRK<-P==AR&U?`^t$L8 zqAJgVxT&G8#8O@&8SIO~RqG z_Yvp73LVQUMWAUb*9vV6|KqlK#q-aCyjH_k*_J;`}ookiN^$bj1;*V2>=a zTf_P-^txunPWGy{9_sH#gf;Gn4 zko2jOkAwpV+5EFl%E#r+^YX7l@UA3)y{j>HO{{RrIp=({C6~xsbjAA+^BzY+%Svap zEEWuL;&n8{8&6ac(c$}sqw>+*&9DDTdi___^5z@Tn{QD4Pk$`^^vCMubX<)_k4BH; zPwgB&8l?x14)xI0M~9=);oN;VJM{7B`_=mj8=U)R^>{y;-*?}O(fdZC(IH;0lRWId zo3l>va9|%D!^vFH= zns*2?G+W*?QitMVc_hQ zdpo~&b+CfEWjjUVfA6%YKl4=@Uby$(7Yvm?^=B66kw@gnAN~-LACY>DzOt$^y4>Wv z#^Sez0v(moI#P3`jdUAbWi`=lIh&n+(0oz*y)Ve}3-`8P)T}nz-io{ukg_QAdEF*YLf+QJa6AVqDyu3U zvjtnB4x0|kR)ZqThkZ5M$0Tx@9<8`*Cc~bJ92Sy4>>*5MIzHIcI&_PS2C`f#-@N@M z15y{PEm73j?y^s!}S5N~M%71v2?u*gz{iOZig}z@8 zRw%Q8k2=_h)L>p&lY*cE(2_Po8Fte0M}qFoU+#dMLCUiB$BrMp^sdhgStL!XK=w1} zl|jpd&X;Au!Z#-*1xAJTVLvv16hxZvo$r$ejcem%fx+@({+x#SJ#MDN!Ys=0v&(vB z0+<>!>LrMgaou5H#vH#J3Sn$K9q+_< z9k()|A$}LuEjaETKzM|lI18hggUsh4y066xzo^h8x+BD@Cqo3J!x3}5%7Ns0rZ7e0%D7#U z-_O7k5P1WGNYV;;;y^GcgP(zDz@IUBTCY&YeZx_b--lx*0BQ}#8G`)guZztu&AM^~ zeLArQjR>A`r7w!0A*k5L2@$bRrh9wwcc8bo_mlLM^UsqLy&W6m&P9nQaI7c@7Anww z_*qGMdxq41c>f)A$NOoS$`4N#(Xc%C)`}i&*Q62N6VS$}zjKSR@|f}LD#!|L8uFZ5 z7Y0~ufh90t0>D-jMM+B9PJwVr@=y!Fd|XxZ1US4>ghI@Ay|qPP`9`rdT-DIeb#}O>r6Zr`au=C!#yhC zYhlkwT0qd#SwU=Y7BG|1MjQM*6A1moNBRc+Eu%s=t0&K}ogofcmy=&%7T8xqJ_ zkafH#Er)Q<9}8*5FHRw?1}Yws@;Mu+g<$Dot>!^rE@=#P8w}kc>FfGFw*Ll!EK7qZAmqBNqDXXX`lh>D3h||d@?Y$okbaBoohjy6C z`1{9V5TGNl6xIncYEn~t6=dXzg0uKcF$j<#@Gp-6a^ZE(<5$0uWxj@$l{3j3-H@_n} zYo&7kgUW;VYuk6EVC9Ajr_d(PzvkgZs5s|`XBT*}06rZk^mAT&DEq*KGvqVPM-L_i z>1;ENg*Mrel055-WA-`dbAD>>k6?|3-=SlE8wny`MITE*=2gg-T|q|zjAjNjZV*5Z zovgXfp#75vI0K`JHMk^}2&|D*9ho!Cy@1aWuFy!Y7;o)}|AxSsIlDs;dLb9BnoHAj z&^^pA1IM=Ki%=;^8TZ8p4qTj0YumM&wwz(g%VEfn422FBOH*0V^!q0ZSK(T<57JBP zCU_V+td*H<U<=O! zV~_)noS2D_NfKKQ|iLi*(V=L55Hc)ckw%ICvU{RC3cDpRxGy*`Fo4RIrw#ty<&)ekEh_zV|m5jQ)i2h z3lgIE+@COuE)7Zl$Sn5FeWVj}#lEwe&l6`cowMTP?7o+o&F7+Mc6>1oR)Q;aiIvDm z+4au3EMQ;g&w_DhH8+0**N(lnxp>d?Sd2l1^8Yj@%@N}XI(8P+_-7-=Jb#67k(1&i z&S?6oro(9b33?3n5J0TMK#@yAOM-xe*g>gCk3p5lWN=T&h&eq*K*~WNgWo|oL!tL4 zRX?3b5=KrZ@<+G?PcK}X@vgdjx3$Xp z%7OB*#eR#m+WK4T%%DMx|He{dxz%O~l^=MeJY<0<+hTd;fXxyvzr~6s)#?;f?vdYG zt+(Jh+kscOC7V`-ykh>vp^)~LYLH*V4#4frsxWh3U5@E&VlG)g7n z!Jq!raKYP8P?P$y^k%LkZ+6tlFAOhMpR2nYU+gZ#H@{Xz&!6|q{Jr1$K7P^Tp_6yH z2iIYm&)Dxm?)JQUvCg3NANykcfl$qBVbu1gj7K^~PpcaWkn7`7Nzdh0YS5DVjntZZ zTH1h-{{drtj#i%Re$*ToR zg=f2H#%K7s_J^K)Qf=jK6~oDH+_QKIdcjkT$$rd!?2j2 z_0}KeuRGSKFgM!%ur^wxV1O8Au<+V+rl`0pm7W@z825LzcNW#IOO2<}g?mn2G2A^pJ>(xsPmKB3 z;^wK*(Fy-#dgAibz;ye*>FLSE9Uc5ou5TZh7=wFb6@JDrCHnD0g((DN{7{AtV>==S z@Cw5?6eHeFqaB|;i263|hj^!P#UQ>rP(O_NQ5^GqPS@u2wY$)of6RA8dx9UTLpxp} zI(^%9s2|tbpW4qUC~m`8bpA=;A@q9)_ng2FIr^c7=si!NZ=)#twI2_jzz;#DFt%wt zZJ&14Bz|7A1K+|(3+>yr85mF1mm&q>E@bU5uYXx`ZyJ%czg~X)g`XAf;%ChG`#-Am?;HjnWv6 z(*#Y@0ZP*pP18ZTg07@PbeN9NRl+zhIx&?hpGx(o2lk~?lcW6uDbvVw|LDj-`N;TG zDm^{WKRFGIwd+Td{ptSUbpPZ&n|?e!GCi6am>4b94@buOhf`&f>C_b?69=cJrc;w8 z9PK4{0;20;0~$u=*W1gES(ygxFV&W zv+l+3-0wedaAG=T>K`B2H<32%ON~xiQ5ZP_^64Kfn;IFL98DdZ9G&PNG>zacOI-`%AR$4o(c12GjjR(^HnIgL~22 zk;!S(!EtU-I(2Xo^siM}&`F-SiL{01K`WI`PaK>?i-G>B6w0F$SLVz5IXI-xrQym6EL-XjZf2Ms8B1BG#``Dr zm9X$BZQV_&!IA0dK`XDsz7$VO1s*ds**`EcKD>8gdU|54{A9)S#H0y#=)ZE*0A4v^ zz#>lMAFd&l>lB2WP9IEJftSNrxxJ$)qqcQvTdkJI(Z=iKIi*ftN%twW+Oo+Quw!rp z3&B&0+e{x$PXm`3i}lMaT6uh8JY{8;yBA|kr7hY(xfl9reyUY#sNL0~_Z*X5Afbs- zrUHjvuiYXwI65*lU46SWvN!o&$ou;+@Mq| z71wI3pw()Zl}x8Vy?DAALU(9nG*zNwerm8}a%5mXByc}d#t52~YNTW{{W@6X$HR_(J^_dea#Kf1d5 zEO!NQaR3P5U$F22;Qo_=N&n^ldH??*p`s=X0DwUMQ(6B(xc005QbC20<)6m)kBk0; zI^UHPI?&e0;hz=&0Dyr50MI-SDH9OpHlAhx0C)%hK&b-&$X)2#1{GPD8kqn9v^)Rm znE!zTgM&-m;-3fr(4qh1ME^hrlMM0O!q&y(pT_o&;eEV^!%HjCjbCR zx=@D%^vD7lniv}H7{>u;j0{~I?_rE~3=NF}0CDg@c{48(MffqWvAO_DL?W}`-=Kg9 zQZNO;|JI-wXZ7@q_4F=`x`YJ=<`D|Bc9}659~c@M8XKCL^}vG8>8kv|%VFj_Hn)4( z?m_O~7`XwXnt)CK1Dx2y`*~ztE}E;O8zG18x=T`kJ5Qn1=ci$S9aW|=84iSKF;!0` zzf^1l`#)^8()Fj`J7kpi@1CEPTm8YeNS>U7q!(dx5d$jDinDHwEtqvw%@%A^p09(t z)^vSeeZ6aFEI3qWSu1#OTamWVD8y)N3;y9~_dcZT_U{;q5Vf@+k4PKl&G+n9QG;#hq^$f^ce8+}j!9 zuCMmW+c{ypg2TAC}#G2l8-@IOfcZszCnO1uuD6 zF5xby&pE`N_Ux6>XCAZOx=C^O*&)q+zz1ec`|MU&&!6mkm&^;U`OAGg_4}fp!Ih(& zA(xXc(5hOOT9-B{ek)$)$>;M3^NY#Bx?-_&FPJYRDGn>Ch;&NG!MPGIVxLJ^1@R=F z!9G$g;-9HoiI-xPrsp9Rn}vF%XW*Y%S;?1nm$l}}mmGz9tH|0SPO>(VcZ6G6d$2Ax%`~X2g9#qv2j)84d&n$K^-Oze?3k}$t)VYm z%}o7y3Tc9B6|0-K-)(2wd;>9A6^&Y>@^|d$2X+l>+nh#PE@9 z>8*$w0!z^XulG%M>T_Xzp62uTC9+{``Oa*1ym_$Jf)-w91PU2KI7nTY8%WD!@@%E_ z5Orf|^AM!<5Og!G^Qxo~!nR3V`5mq|p!q~N`|WeuFxL7PE_><)&|9|LL6=YMEDX+V z(YJWm@z!=1f_oZ$eyp7@6!f_I;LKe-*gWOhE5dtU7W@3%#+IsDwA z=)VCGKTXa&vJQRR)9@CPulb+d(sE{6+bCS8U6x&*B@;_{Ca5qYNMXo(z@>T&g;;*3 zVLPcBu^_>R4O)jAqS#KX@d>*9Ok-bIduP%o_5NJ)8{$~m!=}t4h!o76(W^h+I3sw3 zmo|L&_UDt+*wksZ+icqn+2(#u`oY9u3M2EQGLU)Xt>+wU5lResiNZUz(;CetnQ|o} z^#jWzq4ksV2av#K--?-B_Q=#P#VFVYgcnC=K9u4iKZhPOq7E^@Z-gPphB)yOss?io z7@FS!?yDK@*^yIO{6<`Hm_5#>Mr-yN2T-Fn!|*s;(ct{@*dNIhGZHAm|vV_De} zgq^{&*2((lLrcd9Uvk?)d4INU5@CwN*8EbK{YsIuwhuBK(Pv8{P}~c3Q{r>&eLe0M z?rQj0oM!N3jriVbn2s*p=r$t~z>5*}c&+%uQ4!g`<^qjZVDjPk4AwV8Q?z83uodzYn+_cKQ$Q?~nNKsk!a& zb7=#=&-3OE$jh2;yXj^|Kbr&Qx`D1AcAn8RvK?mLJ9^%;)(^3{tj7K@F-CS5!KcP8 z>I~|`8JfQvcis=*Z)Vu}CVO=sefN%wIIw8x0m}+kP>|yns4ZjU>$UJQX{M3598-O& zhqd(mLq_{8<<}0Zxjw&w?DOi(vkGbFtNyQ?4`7gWXhzm)YVg z(WBJ@(kyWv>f!qb$HZM@b^zS%ZzklQLP&tFDF^*fvY~;6g``ktfAq*Yjx2jf8c_%O z_}2u#o3OZS$X^MsCMFIeDgZn_d5}45nW!W6iZSP_a;#bIGU z8i72diWR8i)JbZkn&C)aXTMNcBr0Z_d7n4~@cY(E-PQ_IWqtZZBsdWLXHM96#L!?+ zEDrHM%zIB1PQkvoiL(&Wz8my7xcy&goLLHYq0Z-zHXt9-DDTcpXHtV51(elBj_jJ>WRV%^yX0DsE3AF#Ed7_j>LTB-h`{Sa|Xp*>=c#ajNe zlV?C9BSr=mnFIQDB$C7MmuG;_Nk%6}?nw#rfcyLlUre{!_=G3nfBn zdPjQ}oIdHbpC72iej4Z*SbOGp9j2*bpI==<3)?}xaN)Skj-s^&83CoMUds$VV{r}B z*slHgq(b1gTy3c03-mtUh*Wo@Y&-9PvK`wNp#?G&ib)_2topd2-f~WX#pfjiyzV@T z0{bID?%N`Ou!nz9$mR+DysyfRp_i#1m0|jwvPQVlZ1X5faD_O2bu^4@_%i$ z_)m-EneD(f;Y9`16XG)A zS|JYQJU^3zet)zA62u0O3ckEFVf4PJx}NLIKW?{r2oyzZd#Rex&udDCb!vOf!Cq!q zbNhAK47*Qinse(65JZ!9j-M4vo=bN*E|5h(nMoL_%|VWvL&-IfPOtrXR)x+`q-Bd< zB}uR8gLEM`P*l(KsW8KMiHZ@Sgg#!T^YlA8ElT#QA!e46BEohCT;TN)#R?9uSCQyL z=x18{YYo`XGJO53_lfvE9^8ZDC1;ivqCV43&TU|STyb^aUCerqZL`&Wl|5N6SA`(< zpZhK^Q}GRe7TUXw2n=aPJpRR77kZ;ORD%2^Je!t-hu7!Y=ObugCs@eR8YE9cm>|ZU zPvbW;*U~e);*)gPl15AxK(>W68D}ANEB!hckPrSs#eg`uQ9sjMS;Lro26nUBx$Ju| zZvL~h>|@o@pX-9Kd94l5w$>6}7MRZB468VxE!|UHkg{_baOY6oY_BEwP}1XPa{V}S ze;^|FlXZh&$V;OHbrIvhM(YRnaBftZFYSkom z?a+lz(rBm*BNBQhF;RY`gEb}D(M>4^BmC(l4~Ph1(^p0-S6|pvq8kB*a{bN?eT>;- zS-$o=)?%Jp!m^2_pBY$V^)(mGH2PG&=L2>z`&TQadD}miI-bc@$Ol+-T}8QW$`~Jh z8^IqL)*7x{vy0*?SVX+S&--Hg7#leb^7oE(Y0~z*CATJ@#|x3_(O=eHqJM8-GV_>d zsc*Ht@{DWyB+Y0KH-i-J)i&Lq9N3=LG1!_Oc?XJhI$u4I_t}+U;c?GQrtCeKSgvqk zZPDG@3;g2KDI`XmQ;aN69YTBbP?NNz798fAy<-X=3zZy`+|PI!`z*-aSZVlLihtMO zn-PTf`Ua!D%Jn}MuiI^k-=rnDm_CFeXi9g8)^nBiGjX^%Rquxv&G;Ze=XpogbkXRrpOx!F%K+(qC%s9tq5CkEx70YiOEMlWnw|Hu=Wz3eP zpI)*5N!Cu09^p@3Z}p|??n^;nka5bdWUV1n+)iJeJ=pwHF&chIrC@RrCH2$J&D5C< z)VfYlOF3SFO#@#R2%c7gtsXC1RiHbaH#ME8D-kBnmyec9X3eFiNnYQV6J}yiONOS= zG9{20=Z1g=Cml+chci&~QeYkPp~W*+*)T+_dp@GXmmZ{cLlYUY=5T9)f6CN+9oB3S zJ?7Nuun4{VxcW_8mrL!+zXk%i1_Bz-Fn@~;&3zHGGjFsVH#qrs6kG6k<&p5X`26&| z#(ypJ!7$S!JoGpDgia2+CZZXHpd_9-k^D1rn7Gy)l+*#*m&YqV7~j4{3MR@ck) zyYmX-+0`+5jBK5s4U{dby-B=kOIklOanuOre7v#Pc{z&1K?WY@cWi<4aum6^20-vR z4LEgJ>w~U-In%theZ5|L_38|EEYN-RqJI#g7TQM>cf368{~J}LM==&oKe2p(r4EN>hLr!M{FaI%~K zcZmMVmSbA!+)0{(#_^y~tM+VZ@Oi5{9%Jg}Z>QSWp3mY_(sD$-;c+%}EquQa({qY0 z`s+ZbamPlx49O^LZzTdnglu8t)1Y(%|dG+I?Hz6hr}GXF(#ee z2OAzv;QQ;1WZ8xI7m+ z1c~fhElTfGE=mx>l+e$d6wU7W2$mv&sLb%R2!FiQBgU3vCG zh{(psYBuN_*TE(E+MAQjjP@itiEOy%3+LaW&3c9B0c&#~7c7`x=Z(}Au<_ffbpcATN1*7=eZa^uTuEHRqXVGd@jT5M6UgJjxog=Ro2$u!I};`R9) z43hP!Z%IoHIFE57!T>D4^?WQE4m3AbovKcEa$(r||bQuzIiu01hH zCF8bQ<18MIWuhc~up17EcK8I1v$%&`{8L5(T^NA9I8{+zpV11MKA{i#{W-6iD7j7{ zs6ifF!gQXkC}#I)Nj-7_fz$21A7dvpHc8HZrO(*#x7T=P6GRr{s0tMNG}6LusVq>y_;!a*dn|h-MY26cZ=A@^ja6 zqS}C77dC$AG*Omd!@F?~2~L9{=5U+VsDj2_lZmm<3@cTi0M|gUs>pZyMg~KQAqykj zY<9T&Yl**17zW|Nvz?VWui@t*`m*Ib4SB1DWUp(R-RlCdv$N|L80$@I>o8Sl4So+w z7C}nyxK9vaHo#vVxXaBj+|8?Xrx;M%1=x^Vl^TzZ1E+g#*O-hG*XKHb7DYF``@<4F zyKd0uUf;uL{+@}MdP7mjwH8nSE1~YB@QTR{Km;1YLGiKkqcfe7Iph9=R>=Lq$ zC}zOCo)R5;K^>yQFH9Je5b;rr+c7H0Y1Q%=yp3oY!ji2Q(pe?}y>+ zOdM``pLe7>eI32-d>XBvB_n^^+HsFgu4vC{ETj)ek@W-b>-xOsO08k8mlqc62y0%B zBD)5$jz&IyS_iKVd2jZg2Hp_*dG8kK^pU#uqgePT15mB%1qGJZtrxJPXW&a}#vMcQ zQ_0s>4XpVBf^;S;w)i|h1U5V_h7SX}w4SjLBo_?tna;3Mp7Qwl;ZhQB8RdMx1nBfx z$l=B3{V^XHJ|okpW2Ma9|8m>h?4%&XS(Bwod2TF5IUI}=%i(y#xL~y1K=IO~TPw2X zu{#XsA>asfN7J}Ba))Q9z{V`@!LMD9=Ii5@YMOZ3cB3kdERht=fjQliQ!gjT61IMd zMoGqWA#0gXv>uHVnWZU9gnX9dC)CP6{sJ*YwH3&ll~Iq95uEq_MO>Gm&ZfA8XDiS)_tlG(LXTXDrnuTHF+v?& zkKmo_gGvJ8ZMlseEbwAQ1d63=Xy8!B{}j#1*cd~u5VcKcMn~@3S2=gAEtsJ$!hOGL z+=O0thI9IpKhReE{nDjX;lQ?d{EMs`RG);pY(bW>%M~%e;#;HLVhTZh$8X33?jjp zpgAbNB8_;p(fqGB3p00m3vhZWCi!O172~@7A62NHz(I$$9=D zYxE8*E!+sQw(x_u61=;20t0OmjrTUlKa;?dz}a7r+tMFuUQhKfVszA1Pon1Q!Fk02 zOFj2N;MDpDUo}|J*F6S?(8_Rw{j-6W-{&0gOg~`$Ot4kVgJGxQ2u9Ei33tU=;yEYg zDtV>BcU<)OU~2RN{9!KhY9RB_00{Nkp19D=y)Z7tE1a%b1hq0Q<;UVy>l2DMo!ds) z?#Q>fGAVUq6wzq0prN?A?cz%Kd3tqx(*|d7H%A{Q6~=oGEEp{|uWaAT?AS`=C7N4x zZ&ENg37&w*W=*uygp0cn@~Xz;f!UVsa$`(J?2jKk&?%BJN>Rl8cfBIAMVpBym2MK^ zKcw#ooD^`wk|E7SU=IFRC2LI}siAc#JQcRv+*gv@EDep64APd=8*wF97Oe`KV~X_v zu{U|FlyRFB?yxBk039#B)J?D{rBE*ggLGOh+vlCQm9KE#*kJAg`dn)Ju^o(I{zzdD zwYn%e3v~|vPN8@HJeQ+hvAVu0+}!=^dUvQ{6MnUJx$QJ~NNMoZcZS3y5P|4Gic=&q zq6o6aQc@ZsjWer?An~&)P`s8so198iJV<-smbhMM$}ha2vWd>gqg%Dpfq~xo`tGpH zTyAm;Vm~{zvh9k;Ze(lAr+t3iTpjNI586V<-AlDb+glclvOdfRjCQ+Q6pb^4w*vb z`(=Br)PT-e%}U;GCagxN0%uIIUHwe~)(BfOHFnr-smkpRKaj3r_4&*&tenoSX4WaS z&07q06EjZBa@nzSin5$C51^FRU|8g-qWHQ&-1zU@C79fbN;b%Sy-?;;Ui|%PFRX84 zZyv#+S50C;iaukgo@l-m)h=Fe%>yniBiJ43_8(z&Bm(`Z$6`>UcFa|riIRj8N=Zo4 z+-$});;ybbw9-$2Ndw8?eh)g&U)&{{?nkQ*U!yq}e^cTgJeZvxfuI8goJ+AetDiVo z9R1E(j%FE+`eUZK!ofS`xw?qR_UvtKgU9Y{96m=%BNj7&?&ROrf}pf|to6)cNe1{T zVA4rsQ#SzGKTle{OMmxQq-^jcxcMtS{|x1C*$}5b9^JK)gtG0JQWz|-XhoA=`X*<&O(Nb_3lLSWW3qA=EUvq zykDYHc-8UQ?@Fm|u$Ma@%aIuBbS(+(n}lj}mwH85GdB(Z4Xnoz95`kzaS?ew%0UZ! zoc|q;6N{P zEb?v})UVovExH8e@&i@wLEvFs^*+Thm8$tA81YUEKH2OYP9!Nblt!}2&1 z|HI!3vCWxym*DTB)Shd7KCA1frXax|50NP@w9mhU{kHB(?uq)`hrI60@-$|#JlE$| zJ^s)Vf-WNwdfohD_?JR2c(J zQIAJ7{K}88(pqfIB|Q|JM3&JIA{9y<9u(x`2Yx zwGAuAqoJ|FPiCWPS+~qZ9G9+BLcJMCoiUpnO(o;dXj&y6?9k{BarJQ87RY6PsQolb zB(=1sgn6mtiN={PAmVhN+Ee3nztS9L1-A`|hJd-eoE%UKyoJ3BJjS-^FFbCs`nuKT z_h5$48<8ihVXa%L+-VBuA!M@4ES!kl^vaw&k}A0U64xC}Q##b$wg&zq)CD0Ku27d+ zBLB_O!6wvb;;hwW3P0S4zMmFXChT9C=J6Z|6UNImTj&E^Gs3^Y$&F>stq?@Qc0lJD z9=(yPUVXC$Vi=5BszN}vSVN|6UBPDX2&r0RhVWBq3AHH9Jhur8BZNKtjVwpXsFm~S zDSTj9Uv0*mX&UA$sc|UXPa1HaDLYryNouMkW9aG#t3Vc(6eocZ#l9b*sFdG8pd7yZCfANgx2B)Z6ajmZU*c2V;B%^oDy^Zhfvrx+8rqs49voS*isg?EauQV>b$Q$R=(>X#27<#GjUeD8 zu7cLrZIq*ETLKzXm^RvZkp>e9vI&G%B-E z{IkvYD}OJv%f21b%uZ_$=F_UvwXLzqu~4ceDV@qcHlWF5ryBKVovypt%@0=JA=rNf zcE3WMc)lxqTnhf&i#E9B^fS#x@V3?4F1qf^7wWj9TE2u7-Yq}G4OElBHd&rQA0Ep4d#W-=g&wxF}R z2Dsr97TEB+q=|H$)=F60MV!9u-|-DPk!VnJKdfv(aUJ0PESX*LM#{?Nmfnk0_^mRy zxZ=iYHH9*|?57MhQio&K;1{SYyLfK}{;0%kpn5>BSNL~^(fxYlfkfeVTzL@!l_)I3 zF2io*ea@Gm!!UQ5yhbN2AB{Lvw`UP%h!F~)^M=tV_Y=2q^|5c$y?e(>{c`)IFIAB2 z?{!Ba2GVVoj;)PlNIm~46Zd0gPKKF$8Bn#v?&X>jhGeLYu-__d5i!eoOmz zp&c&<@;4npo6jYxHz{A8$>kx^;?N9hIKlw~oM*jATf)RSu@TCCifk<%T)H<3NkBml z(-?&<ka7A(C|L$Xx65XIpM@_}l8EHylLb4~a)Y?0X|jVgA6QecDe zf$4N)c9CuE{8m^T-ZV$*GRI+PzJ0wGVk&&o*QYZb=j&oRt-^z+CtQ(TLA3Rau5 z&E@7zma66$U-YMBI!kakvx_xy5oppUfi2MvwfuDAug{QyC#{BLj@tc|a2q&Wb92M> zRnVWB3oNjMbKdpXW8NdNfiuJ)Z^)NhW`9fF!xT}x_`%Od3z(yDXgC3LfF4Rkb~Sp> z;my>V7f`i3&#zqG455t{_GMi3y)a<4tLJ$ruPk|Iy29Ih-IgcvgLUsw$_}Yt6;@#F zF^keQOK6L%?RrbL$iThBO-#arY7)Km8o7lgSnk=`rdL4^tT5YeTn_zf;exy_iD8y+ z{4b)3bG5mzQ6ixm6b0y6*LtsH56*Va_~?Uh_xFDfpgFYj;;Kgl~>`E})~Z)G2e zhRG*lLI+#gUw$|2)dczU&5LHGwNABi{!-f&gkuKy3D*u=MH30UqQ5qJ?^$LR!eNpG z6g-imQKK_G)B;}zC|udO+N=ZzkQFEu(P8J3ynaVXdQObUC`IcAbR5XW>uEv8tYm+Y z0X0=jT82rcAQR)n27W(o+Bcki)OHiD>i^&%JYJQT>*7UxhAML05Senioq-CL)#@EYH*CMD4H$7HlB__LS9bs|!!gk!1$grzBjf*zwsk2a+E-^R(aFiXf2s z044lrBSDZVgoN5E08ce04(#lpd`5a@DJr{u3<_@E6tSsa=Jhepc4?}yGW@hs0A+IO zOocu_%7nZ#3=xDa+m@(5YcUnf_AvQ(j?J5pQy6$UwFur?1PYc^8KHC{$sbZ$-XN~v z3ph*CbY&V9l?Hz*PB?mWL`XUYTu9$m;%qXZZI2&Zo>Od2udu^NhgmwH zNbP7rP6j^Z25-ed%7r*ROqYI)>H(ZN^0+=7rZoF230!=^y(fPC4M8-4i0{=Zk|oJ} z&J>FA5AetRikBqSlXYT=@~>OYQ)%s1zLZfG7nu@8l=^;mT%`K4FA%l6GlNk0wsr-oM~`on;>taUq6(~Kz&bJ!gLw77`TkfzcQXsG~X zTA>=k35LqzeceQ|by1q2dPUw?97*cG_^GKZ#f_@%_19FCfOmrcoN|bj2AwFX-!5js zZ=EUn-m*$cC;?GUWdOBU(nyq&>arNgNY$u?x{=ncg#t3^1DZ9ziA4Wxk6x!xVPgv` zt8t*?+3)_#`|#D5So6?!QRf8+^(WHBc0vI{Y3h~eR+e>CBuo;|vXD7ZB|5}u0A<*f z-OG(*TB9qE6gz1Vy)oh(yh@mya8_6hosHb5DsnX77mamhaqD+q{*FNKOy<4bCi)5@ zvkqCOdBrk{g>?9SrP17Fn-K8smbwW348~S&0>eAg>Fcq_~4pMab(( zHw6H=#!@|&8GGBf0ILkX{e+rEc+&L2+f#p^ z?XM4%$>T24v?=PQ@4Nm98*VMl)i?e)*yqdk%P{lL=m z8ab)=RunhFUii<+w0L~Peo5G$c%;5E%16X;q%I8c7>8C4@R-ajp;8jE`#*&DGDI_Z zjP%;)Yk7@wLAab&G+N93fV+HXNh7f!pM?0UQMp}E@$zD4iOY#N0r0-0%5-Esv{#k( zW&W=D)cbH7n%mmn>b|G&SiIMQzP4SNA6+i<0~KO+l3~?Jo9P#WPgxTd1v)kC1wiy0k%= zx?QyTh4J$|RN*DIHCFi>aeP?C1O4OS{H=S9tHGl_{8j_lO;V@!NAsMRea9}(Zs+iy zalg=Rz3PfIe8=0qCeJ75Ti#owM6}zQzv}GQxwli&>(^gD zqhA6!T-#mMZiPOJTb+*Y*_~K==>EoQsjfX=(#v3nRB# z?(hG4R1FOQdw`T*L$@Cs2G}iHKZJI|eyTx6eSLomLY=!Ei4&y;2f~oS0!Xdk{$u3* zKQHWm?W%2;-{0TMTFtBgF-0K^K&Lr0#lLo=fBx3q@b7QR2@3IRs$%n&TD$%MfO!d$ z)4%%v4H7^Opb78-LIZLFN^#sIbj&IDc#!2*#6F$c*283dURIRSYB1rMbU)de*H zjS6iA{RHCza|3Gw+Xe>;Cko3;D59J>r*Z^!HY#Z!q>@6I592=Y{ zoF<$dTo2r8+yguUJWaeMd{lf{{4o3@0ww}4f+m6oLIJ|xgnfilL=;2;M5RP)#5}}7 z#2dtKB+w)*B)TMFq&TD_Wb$Nt$;yzXZ;1@5YEW8;=iox?Y6_b?u=lLoO1r) zo`QQ2cu4U&>J<55vpNW-Pv_mzN6X6{KTY=4*)PK;fERs{8P{ z6_`Dud)A$EXvWM$fmx@X{-eHCR)rk4N}Yx6Yc9=r<#K50J#UO_4;lv*1RgkGo(&vN zBMK3YX^9APZQo?~{neTelO~Zi$9ST0^d>s_?IvEMGe9|v*EqWOuP;(Z0Ojo!2 z38vkz1(ABx8pYO>C^MCk01;tjFNQYvuBl!E3qN~ENVxdE2xrm_v~;uf$g)+1@?Pga zUX*E&l$O_}#6R6)wPkI4-txW<+L00kM}-DxH@zQw15OumyYJ>D`0!#lw|FgF%oYS+ zPrh?WvwF3nn0wJ#C*p}E0wGdXdbzWP8SMHA7s0hWJ~so_GED0-$b@ z35G~L&|`NU`2s0#(Q}4aTcXTw@p6VSbO+gWhv7U>7bEg1hD)K?b+De#3+>X#TtQ&`EKn zLYhX=IIx_xf#SiKkeHmiJ18?oggSUT$PzE+Z1HOz+Fq#gOEHz03B@$fRR_wAIl6Iu zkfv+SpHr}uOY$pTCEHLKY*Gc0eib-%#i6bZHL}OPM7;K=M51xt)NIM(Emq2HQ_G&z z2WFSD%jzyB@)aqV zF*x-KpIZ7>q@0|*XcjcuTDY9mQtMfPJS_CjEjQ(L89WuyrNt2i4Mv^?_dlx;$$?IT zwetu3|qmRW=kx>KKsbU1E zG(o3y-jciFbsXy;&j(i(5ff3oQC*22D2?B6e~KY4w%H zz~8Ts2NN7v#L!xt8z+UQ9SQrcq!)44hoU0sRqFhy`&CA(Cjr6HS|($@v^F)On6U|0 zD&?xsY6Qup)N@Wb^B%N?R?9^&y=>#(@VzV4639CIZmQ|bkrokXB8~1=J3;4E$E~{c zPDRC1Ue`tLe}@DZB(fQD{ys|UbD7Hh%{~lsryUd)m40QyYwM}UYd;knN41lad5thH zKG0uH!->9q+fQRxpc0!5iv&L0VMa6?Hg6Xpt6CoR7pd^4IJ#K=&WcH^IiyDqhHr4W z3}@<`@x214eVU|OR^dU-EaS{hRP`7~aPmso`QdEp=NPsBM>b^tUTfM}?KeZ3gT<&y z+7K=FUiN_?yfGtZ$`C;eElTOhFB%NL2nBrI9OI`$^3(wh;ZaR8uAA&IJ|1+K>;?)9 zRO#GFu-nVS3sxmH+9Jy>1pzhZiUVr>`sfJyu2$Ju`2;6`vUx7@0j?978nDmtHulb%ar(_2Yem zV}~XwaRuv4R8e%jS-?LnDDMDk#BQe4cC{(C6SuAn3U;}qAsKc?;&Z)j+NY}()81Qt z{U)<-X5pG8Z?3Fi>p9Ks>VIhJ$^C`5`U(=xteCSw{qyb%s_&0VNPK$|<*%EuN<4^z zlOu5dp9M$PO)yS6v2DZu@2tY>THN~&^}ckI6Xpx4u`qcmzv-O_&%bN0UA>MryM!tQ zx=!|!bi6flO1ZSz{+uke?rSM7QTB17ue$bevEIG4;7Q~TlYY7F@4hCUYyI$OZRE{q zp3GvU*;^HK^H1(tW4-!ZcC?@6C%q}5p;KGCgpKXL=WKry5vUYclH}^H`-3IqTXfrt zD;58MA*5R38c~vxSdwa$T$Bo=7>o=IEp!dcbd4-Rj0~+z&8!SewGAw+3=H(X>^4Nv zkei>9nN|tXV4`bas%u~vVq{=tVrFG(0@3j3>e>}R4bC7Niu2P-$`gxH8T3nwi}Z8y zlM{3FGjkKuQ-L@$Ia|Lt11PDVlAo;a2@>@Mi|U%|>u2Vrq*mxU zm!(@J=jZ08=9MrgxTof&76F}}qL5Un;F+B7o1dSjmzl3%aQd_dP=f@>{*a8)+$1Y2 zm;B^XkR~gu0H7_!42H}9@770C19pIwl}Bo3dPWI@xuKyb!?jSL8gV3ZplZT1Q%W*G zO4>fQaR8M_A}R6B%uOw+EJ$SldsDw4FWr7qm>-%sz9B$W42H&*7M3O!CWau2QWrs|iMmlx&dm+0rEmKSH1 zfcbigTe~DWM4fmaJ0N literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d9008866ba56c4a4715a3f883ccb3be941031206 GIT binary patch literal 1173 zcmd^<>ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_down.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9257e83b00375259f2f724c7cbac03d0df5ceb2 GIT binary patch literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_up.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..74277af1e6a8ef91f8fe664efde11377a5292dbc GIT binary patch literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/button-bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/button-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec7fa2eabf0705226fe0c488d65198508bf547e9 GIT binary patch literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cancelbutton.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cancelbutton.gif new file mode 100644 index 0000000000000000000000000000000000000000..df4bc2c06d485df4403d689c98ee745a4cde8e97 GIT binary patch literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_h.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7c3e7e9eb5755d57ec03c34097c258244abe61a GIT binary patch literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_v.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/cursor_v.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb508db552b6ac3f670f9ce1fcb1e55669db0dd6 GIT binary patch literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/filescan.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/filescan.png new file mode 100644 index 0000000000000000000000000000000000000000..1d271588692c1726e3521032f71d8354b66fab0e GIT binary patch literal 4282 zcmV;r5Jm5aP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1?NdbK~#9!?3_!lWmOT!t7_HW`<(lvZ{H>$5@Q?MbURQ7v;-We31bE(&WQtc=8P#* zJ^>RAGY2LPoG<`iA;Azj5j8?%(@{|Rrqg}SeH_nzt+lGk!3`$J>9zR)_4^3F{8#PT zwH|0@w>~=R#xaCo;QT)bAR=2$bLC54z`uWZXJ>os!rqRXD)>5Ct=DbG|LMoaAAPtV zqsuDDy0Eu%cX7;h6_SXkyDE`Hs)|_+RL#s~l~6S^U{h07RdpjpS*mJmV5%lAYcg42 zYzC^PUb8;eGBi_DHBVMimZ_OBn2DN*C#!@612YBy00VGYWefng9mabnt1%|`QJ|@- zb{M%IV-y|6=tc_6np$#ZL?jAC!HpCk3W~x&NP#f8tfH(yAjpIiCy*XdM^2q-7i~-=?qyF|ON2^@cMp^Y}+eiJ= zPt5SQf4hHopf5kRuZCXbH*{D4g!a!nXOGO4|Mc*1Kq4exhGkg<0BnF_DCXma5@Kk8eAef@ z?2cRSvq~InbK7S&!|chLA{&|^6Cnro&7Cs*$qXKunc0ODW$`B)7FFQNWfiFc6A=?p zU2$EzkP>ypM8qLbRfozyhUH|{Aq3(;P}kIC@8FBcswogKGtOr)dh1YRJ_BatS%te> zko-_-;a>+}cMF;d*wS#g4;mo*DclFBVuZsTxSb-t^})%_wO+e&fCPSX;Ij~dDZF>< z`06g9nccjzdi~vdt5M9OwINuz*Mw)k_VCrm_80*AVLVwb*L`wT8w-}qtA5xA0DkSA zfBp5t<#XS<+_0a~+AM3#@|(YWyj=D8)1STZ{P(V{x~RT)|G=_^dt3D@zq`p>b+zha z8@+{}2-v(1JZ5d9bkUD?mt|qh#!+-V4zox~%DBDJRix%rU#Ha~$0O@8F4T;LT`2ENxy zTx1bXR*4Yov=z?8W7UY?H=K|aGBNYKsrPmzd+Sh?#mw!B!>p+v+Lh$D?~AgkDx5SN z>blz5LVv2D2-j7pYsP?7Gx>a`2-S=M8O$t;sTcSXmI=&QQp#PMy=IlEDoKf@>&DX) z@!y?tQ(A@GbsW2OTrRSB2VX4kfpXXK1(JTT$i8J*P8Q)oK>WoUw_kYW&F#vClxP#Y z^!zhuX1{;ugI~S=$K~;vOWDZ9gZ=M6`}B9e`2+*Nw=d7GJ#{Db3-HJ6J_}McKRmcR z0|0D4db9nW?p8e@@1=$Epyn(CjR4{F=jz zK-Z|fJ9%*b4xkVkWP}9TgSo6C3J96OB3KJHxR7GF6f81WLhVpT7gDNPs$hx1M$it- zWtEqqfQ<~6KwI!+O~}gU$%>#IsJ~M>nXGs&s|EFWR#{d$mz6Re`^&{9so@8s|^FfM#}lHq)$07*qoM6N<$f|`Fa&Hw-a literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/highlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/highlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons-all.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons-all.gif new file mode 100644 index 0000000000000000000000000000000000000000..21915e59dede0aa22cda8c7097a14f0f1f68906c GIT binary patch literal 3750 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 b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..c015e3aac9a84ebad11b932e84722124772d9641 GIT binary patch literal 19694 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ÏmvOE zXqFlYd~kr)`gOl%ulvQBN~zcTgAtXx$n%?f=k|vS9Nk##9j6!sL`#ba=zw?GO-KHt zbkYzO{6ur=*yR|7DYXFyb17vohSBG4SfG0S+vxf6K8BJ86LMLC zGvFP%P2})wD@4#wC(=3JH2w5DYz9QN{XTxoPLgIlTYbI_-`A^D`F7;9&zydp$-=7H z`ZF((w1gI(()fmrS4EB-&Cdm&nyuBM{h8-wesIrCiKTl`3IA55SFkcNNkN<|P z4gO#1Da`s!_PT*0;+WtDtZOK=Ud8R;Q&SsES#IZ{N+_>TSw&%9at_tx?YWLWtcw{< zr$wOE&jJ$Lly|&iaC) z5F{ayDwlm5E6Xbx=sV-0CYJ_uK@Cp-&Usu$ssk&rOP#iV8 zw!A#wZB5$mX3;A5pt7=3K4g<^IawLT3N?1NSPaAe%|*KE=#4U#?UUxc!#km1-0p0= zxM;j!ri#s!4VMC$RetOF z)K49rCa|Kq>GZPQT}~GB!(whi5!ydYjnmxpcC0Y8JLrpcpj$&e48cWW>!*ei(kH^8 zNWJxXFX7Lvu}Y=MlVhwkXT}XzLt~XRqlMEseq=ZxXkV`Za%!^mpa&zZVQr*r3Q-rUIULb}^@3 zy`YV>COx>Es*t(4n!`P>dWCj~@VI1NVsscD3B1Ty&_XIzTQuc@xCo+x|P z1fw9f*}VmGh7vG+%1->~KQ_zlbusG)G$bQugSfOT5JP+Y>f(`C_4SV&Y%b<}^f8fR zgD=4e-PyPS|5V}in&LNY`*AS>3N{6=^9Egxbl~xpd>}+M?2{f%$8n|Q;?r(K z^y;b;0Q4lx^V`}PVeND-xtw0wt?ZOzIWXpYI=zqG_d7Oz*#ByT05C1R2&|XY!U0@m z71tLy`qZq_Wtz_Nig}E+FvhVu8mSZf+37!gcafVvF)_C??~kE;X(_bmA8Yq~wuKbL z?@tc*%NObn4{jDCNb8`O-RtVZkiPn45O!vz0RkR zj97G>;|+h>{|@uTv2TI?#Q7V`Y9=bOZZiyf+AzH@H(vQlU#+YjaQgZ7b1Qvm6x`Dj zbp7QZdAc+=;01OXhzaDeN87fQe*G7CRmUTA!s1_kq`dm8P0jg92|I3d&~lkmm#*me z&a~uS;7;`rDixn=5iC|sUej~3DQ|9?vvV$vZ;(!Hi{$uvGav{ZO+yTpznAzv5d0F@ zz&qhG9a<7e^7FriA|fAZ=)QGDz@U`Hi+6BpIMW5jLWkh&XZgC1&fzTkgbGe9Yc*6a zd|hE=8NVY%395Z5{PE))#|WXPK>q6H<<#y&Cf@z|MFOoB0Kk6GV>e&o?hOE#(;?F# zy~fU``g>2SmS=H8k5&26)ouom?5ZtfX(NYM5mcS5g<10;&$baKgAT8szRu^$(?jnj zQrlM-|5e!ZGc#2^uIB8=_M}ns_w1Vm^pli~%|xy2VLwvB(}OhxG{+&WqT;e?YH8`Q zbs{7M5>{c>!;_)`ZKez4JwtH!pr{AD>c!k zP2J~iH+2>CLtZ_l1g$wGaDn`kZkl%@@ZJfgh+X2*@V=)w-Vq$|HxI+=surJO2QQHoI?!slczArz?pT3r4Xdc*=LvUJgu^ zykRaBy1&1E|K1&^7$<-&?YaB?1csclpxZCaSLJ?%?f%N1zC3{Fs@>-0+>gDc z-mIvOtSrH+=fI_xnP*3_ysDJg3#^;fa;5ugN@hZ^cI|10k1cI*05>o5cJgaT^4ZfJ zBLz5eo%NKe!IZ;lMyI>o&|LLnYYXw#t+*a0 zIDkRbqk_q_Q9ntHb$Zz!NW;?uTl(AJAPXMKNT!?llDCH-=s{Bi=BR(@QDMPQGRQZBGY z&;T>=)Tf}oKfmwLbYx-BPH^EzXrcTme_4`>HXeS z@9*#LengsUsCURrM~R&9i3@zZD@mV-M$l&7C2ge;qCazh1CPSu&MJU)p8)B_L7r}& zpb~NpnK}#TEbGihHke+5js(vkp!^cSu{&(3|6*%o=X=r^>jFwYwJyp*$+*G*CG=AV zK3?>{V05bM{KL030FZHI%k3ymPCj}!!O20!$-yz#d0lCGrQiL5*lU?;@GU-(i8f@f z1Nm_*TRSlM@gbYW)(e(KFkA7QJmHp9uQb?98*(3Z@tWocT2oOxuFe(*7U-5$Rt#BM z1`O3yw59%ZfW`cbOKt9z3r!z~r2cuP9`OW1UkGjcIGm{7$^EytU@3t;_aRw^L1*jj#|i?;;5KcBa80?tDb0-vvPc^)@n@faPlA}cB?4C!Sw*}?XELu-ESR@gYHD|W z?Y+^;^EY~Ubd-75;XL}Oo8zUz_vLxrr6jCSC^(FqlrvS;cz?E1n-%ME4gZyFUTR>g z=QN|gSXz_KS&e}RtCc{9z?#qSXTOWBzSC2&jIV83S-x)8tC@*ztY(F*raA=69%mUJ z7qhSchOt2>x$q+?goT(mC=P$U9oM|kqmU}PA`<*%6v6H z640q-DJ;lX8|mHpER8|Tr1N7#`WkXeHvKpKLG4GalfZP%+!m@QF9kNmrk*1O7UOZi)J$vR5BA_QQ|E1XhHjoEbuDGzM z^0Yl@ukLLbxnBwTNccb9=kXq5<7@Z!9Ty@1Nd}$w?JwTj(C%*jx|*ov0I%J(F71#B z?XJ4B5UJ)0`ndyxxJpj?{Tz{jkq*FxPkPFtr;)_z{IK& zbQ}(73cNokb?WZixN2Sxc$ik^L7&PmnJ3G!_pSb}?-B^f3Vr#i1#1LyfQsh7FaiMc z609xg2;uAa-QQ?f&_nT3=hofo^-}yaxX0?%Io>F5iByDb&O6_8MRw{G^&w#UaE!#m}muZzukYADkD)m2#?V>FCppkP9%ske)U zt=dkC&ItE<-7zt{$vT{xgBTN>C3Ys+R0UA(GmThovs$Yhd+|)f8|=moV`FJ<>hGe#t&#^GBr)o#v;-P7n5p-a z!>l7t?wRZNAx^dfhVQ)JZ3)bV%}95*T^+tWj?Y%gvek)(S8Oyy39A&_w)hl2%u8JP zpuYK%l!&VY3l4rMzcpxio}I$@#gX-NSS`SGrfuYZJ*z#-HYKWEEH^8YfZp~&^8*;x zVXYbN8-sL8T?PT#Qz!oe|+=5KLqPZNPOqt?p*jpfPaQZ5p`zQ6?Zk9b?#z)GG1{b?9P zTK98&OV-@Rg+AZqU%A-Mz^~zOxQa}bg;3QW1YG4QCnNd`_t8hc%b@NIK?V8HkUe`A z@ca@+>U)1UFY|YYT<1cppAEAx^YoV~FYQD;0O|n}b%OQZ){reANx)^>?pSk?DQf74 z*I$vSQnLrUrYiz)iC^iML6Rp<)I|Kfr>&A0bHqWpQa~pm-_@ z6<9-9DOwL8{`@);y-mUG;;(4#JKXkocC)|ER=y*o*tK^^NC|XeKj6n}#0c}nCoH(% z?oVPVi2sfg(G?VGIdh)hl^y>at_5&>` ztgcKH_9i&STvXej4IWGy6jlM}gbDG*Em&Te!KnQ@mg9=m?PAcQ-@}Twf=(7}fDaSi zvHB~>onNeQ;5&bai7$v46p;a!SWZ^-y-UGEZIlunq#9@P0ii8#^;0#Qrg8GYquEIO z(>folxpnaM(WDa+xOdn6A0Xp8n%^oHd<(=%FICY&v&F-qF(#xXZ)9Qd(;DBaKG~H~ zvgC{m{_omX!@mZxJ-aj)nd(*4rlCn-4CfRPa0(#EbIefbF4X>3SXAq z4`w;diV#aB2b+pYtL2TSv77vjLgTa?Nn;CLwG$HywuB8e?$UY}=?YIFQe2$$BNHPV zbR`m=WZZtz4okgPU?f))8byfMs@ph2?#k65L+&3zJ(nM(MLyRB6=JSu90GYEv6x`e z?i@?8-0^V>TcksFsn!FQOe{GG|I1->(NuZrtWITY2m}HeED<1bkG%m4SNEy5w8#1L zYD}0(u7+<;_B$h3giLaHPcSG>jcojxL=|1e+ggU*5+Rs#fdTbNChqM8;i63J0ufnA?ccB_vEPf1xfu#OOVFQrNxe zPBtQ#<3J?6GqyJGM`BR~a<<`XIDYo|t#>;IibS9k;&d0#fp8lw_$ob^BfkHGs0^nB zIs~3VHZ+D*Ama_9K}oDI=7fddeKlhC>PRCRL5+E{ia@j{8<0;s5lKYat0CgD=I@kS4zRPlSZP zM~69z+o7YQBdS7~l*qagOBCVTxxk6$Ve>^|(pl2|7^YYjtF&NK`W>;yuda;QtD-2~PIbs1qk>1j(hF?ovZ; zH&m-BE|a+gPA*0loV~GmWAnz1%^!UTO1 zYy98)RM2nSql*_5AcW8)gpg>Qm~qf3D=SOG-^(O~G!rLg(SH;99-aC^)Y};4s5?TM zi4!NX&zPXI8WQNkFZ=SbX4xguptBh;2_eKbKd8*1Ji6$FO=3LyBvCF$T^u8I5zTD? zUHTF@S5!{k4`fh<>Ex3&yN{(9}eg|{cVFjNdP+gWp54W5|_o^deCJ`j$AfW%zlQ_ z=&@tRjvYJtCYtWxBr13B-o1PG?!v;+cilDquD|2k zazo&gL{h9{hBuBbvtjwMvcC%Gl6#i}ebOZQkfU;jvx{+t(2F_uY|9J%y? z*>#j=&;DTa2N#K(@aW)lMz&Gfeb-%g-F4U4yHwC`LNd2R-L4xqzYPt)?8}$?SR?Ns zot?L9vVh^;Lw5W35czBzqtRnW=T_bf=-@1i(E7W-yX&sIMynoO)pu5ZW0O(%-z=m5 z-hJb%t7SN^X$BgNR4`6%0RT8TO&)#MXs6moSEXu%>wn$#zd!|Dl`2&#=&DqyQbAXx zN|g$_Dpjgf&{h4_^z4vRPSFB@)Rkle^H6oif_^upo7h!B<{tJP|? zs_^}7fzF3YWFg|?;|bn!So4LIFZvI}l1$PT}FK6e77e^2T5f>LH zS|ctljv#ylm4t7Ni;H_!V3h-%B9MrJ(Q36?tppMAM+ibpsa4{IKCHwkQxX%WBqk$0)bE*e;KvL zvjQtY5Cq|)pJH!J08H^odUR6OqsxGvn3$MI(LN<{vV1EbCg>EANI#=8fLI_1S#VrISJjO4pkdw!UG59w!8y z*F`6yV{V|8B$2pVs*i3JiFZ&IzHSHTNCo`{K%Wet#c@AE{#y%rJVLB@((;{d9B%=? ztB#&&Q7}No-jqG={_Y+ zy6GM#uo4Lg32{^f5;x@V+OVVU2~-1&c@xwP!vUSDGNVDKvQY(nn4nLdJbAJ<-|xr$ ze9)=posSSS@hE>u#K*_;!z{M}bR-7dpYOjZ(Btv^{QP{sU*yr{qwd4*qXV5EN}xyA z4H5xQ8PKVwdz`FCj~kLlr_QLj>CU$1>BYQK;A4`Divnd|k5N2h+k zfmhl&4hgZ}VLf_`0Qk*-j)b85{rP^spy{5FkT9IsbUf$Lqd}L6eGf0{E(#%uhcG1T z21&_+p1}0c69lpJXF1Rl_*hYEBp{T4@HiGhJdS;EoA4#XB_zZp#8GbvJkV(iy+klE zlaE@1dhl1GLC2#&=Y`^lA&luTphpGc=svm{jJvTu`dk4nJkZ6V;V95!cyuHQdR%;5 ze0+R-Tzs6Cw@+<+922MG>{3y8sdBN`P%?#{Nr)IKi}`q_viclJkaHbvW7hb zID|p5sJcON9qBz#?QJ4q3X$;av;5KVXPfh^8E|=^ z$FV5KB?w@qmnFm{(A5AR^n}EOgv5lz#Dv6zMBX==oH&IE$0rJdbc#{;=%zarbyq$5 zt%$l0!=uMD@pDl@mIXZ_Ez5YLS}@&+Fh5K6$=rn@Nkh0{^@1e_1L1cfpl zJq{s+crURRC@zz`Fh)KauY&%qfi5@NBmsI{Ts-wB3O2>Z$7{8;Yt_cb4+nIu81(%7 ze7`Ul7biWuMkl5M^?cBIQTMnQLs>Tly4;qOK$lua8uY}(#Kgn|B4G*d_V7-$YMMEK05zWA5rPkD%K|A zb>iZw_ytpaQda6}Hp-)muTr1FjH3&#caypbPU>p8TMxS2c=<3vXFRt!tL5yfZm~xf zFW^8IdUS?o6c-m41$shU92Knn0^WePzMgy^0$ z**n!lceLFG$y^wd$c5q)`O$c_>HaM?-IeZM6D?tfW<*hUK}(!pri%M8P;2yDAlQRjR&| b`u_(2Nr-(&rSM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loaderror.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loaderror.png new file mode 100644 index 0000000000000000000000000000000000000000..35ff3336457d48dbecbc11698ef8245441a94f82 GIT binary patch literal 3209 zcmV;440iL0P)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0k%m*K~#9!e2~FQ({TXB-x{;bZO(-Y8ex`bv_p{XBo;-4Lx{T6F{n%Z2VFaK3aU$& zE|sxGZNe~(3~EV`F(hqUo8`hK+nQq9zB^(+vY&UL4)a=R(2AtXn2}?J98ztH%RD53?tG7;9}I z-_`_!ekQu?Ois@L7y$+#9*%I|?PU4DPOQT|zID5(_xYLX_3`TYc%$Xt0Kh~x#TAL{ zZa4M*E=)%gPfj1Fwy_GcWz!|MZfch#o1p0<6qW* v>K|>hpp+{XU2~DJy!*S=f9j0>L+$qf@2pSN^>p6l00000NkvXXu0mjf@-HC0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loading.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b713e27dfba708a01c380e7c731a13b52a34edfc GIT binary patch literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/pagebreak.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6 GIT binary patch literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sortable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..1bca649698e187a80e1b1951fde99ddea3d7b038 GIT binary patch literal 2851 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 BXOsW{ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/spacer.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sparator_v.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/sparator_v.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf5662da8c36a446e1e08eb71b992c730ab8d15 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/table-cell-align.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/table-cell-align.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf42853ea5c00663e74d9195d1f1264ab684252 GIT binary patch literal 1847 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 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/toolbar_bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/toolbar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab685f4236ad543601b0d7dc43e429e041bee98 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/unhighlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/unhighlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ad0b67ae634d41e76848ec0b6696e8ac7e06983 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..08d4d9268204a20ca343bf75784302cc706d2417 GIT binary patch literal 6608 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 O0000R>^78WY^MyiTK|w)L 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dash.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dash.gif new file mode 100644 index 0000000000000000000000000000000000000000..7822259184d903b5b358a9dae81e7035ae733c05 GIT binary patch literal 64 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFp2l{uRQ&hfAO3xehr(? RC06IOKJu8R7RkV14FD-< literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dot.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/dot.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ad7cb20029ce0b6c610f510d9b1f0a3a20c13d5 GIT binary patch literal 166 zcmZ?wbhEHb+|z#zn+15ymKlYv!vfl6OW=Ddtm jlMXTo`gFOJOkTj|%e`VTbMur%A1v1Nop@r%!e9*mQj9L1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-1.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..875604d8d0319928f6ca80671eafaae328cdcdb0 GIT binary patch literal 67 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFiG|FuRQ&hfAO3xehr(? UZTrno;M1& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-10.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-10.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a7ad26db45b6489cf181873532710c8a1d43708 GIT binary patch literal 76 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&%&FF&38GO1;gR+jEL e@gMwEF`IjrL{8jaOwYn;yS`m$!$R@+CP_FsM)C4T>1m=n`feidPkvlj7Fj~chS JZscOH1^`MaC=}pO%)qToUJ^5{w@uhAHt)n_Cm>8@9Mu#A) literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..842efb3b1191ed541c9d67b0cf538bc74fb64b2b GIT binary patch literal 92 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6soFQ4_A-?uyQ(rJSY vKZ<^oKG-~UnP%8?sb#U<9(t^&zrDF~r|)+ZJ~eaHiX<4x%aH(aL3=WUGoCJct=&75PA{Hz+epk?Exjo literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-19.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-19.gif new file mode 100644 index 0000000000000000000000000000000000000000..6176fa92e6984a60fa2a41cf1cbe3d6b77a0d769 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BSFQ4_A-?!WNR`|!e zdfp6e3fn7Br%Zb!HIJim>3WvvqJX;}=9ZiKCT3)9;_=$iT+wGdN%LxxC@~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-20.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ebc4ef338a439ac4c56770409d5372c8db41f84 GIT binary patch literal 84 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPn&s^}9pSfG`M)mzA md*1V9Jl>4-8KjS5%sWJho(n)H&Tt5dgFjxZs%NZie literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-24.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-24.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca34f3eb1c746d7f9ef79045316e607d94cb4a78 GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}WK&s^}9Upa~EM)%q^ zKkatOh;ZbkU7gTYwJlg{-A3)wvICn+qR;K%xih!w;6(o&ivOl*`wP4bFq(2E>(sQy Vg?5T7${I`M_C9`oErfx=8UP$_E*k&< literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-25.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..554eb5b794ce8de3cfa3d803503f15f1b3eb85b8 GIT binary patch literal 105 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(}&s^}9Upa~QM)%4& zKkfeJKH{)?+M%_4);34>&F^y7l=>|G#`vyM^rdc{Vn;znOKO9w+++(wrR5i*TstL2 H85pbq7*Zva literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..fea94acbfaa506b0bbef74b577f1393bb0d56656 GIT binary patch literal 104 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmI?&s=buUpZycDXvZD zK7ZnFYZRUMXyuG!$MRNO-}e4ZsJ8FwbG?gyC31c9nk)N=y=SA8$6T(?-=3|9MJ8)# IF)&yI097_9nE(I) literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-27.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8323551eaaf8cf8241cba2f099eda4e10c2bc64 GIT binary patch literal 104 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmI?&s=bdcX5vYwamtQ zR&hTPmBg$bYfj@nC3okv<%U~TSE8Tmt$h83?^R?)$7y|o=D>~v%Ql=asp&J-GHTOe HV6X-N1P><_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6f317ac637174f07780069488ee7f00995eedeb GIT binary patch literal 109 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC;f&s-q;X3?B{Cx*dX3$FM}*zBA(|E3S;TEmG!to^}D N<)V%+Uc|s)4FDdVD(wIO literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-29.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-29.gif new file mode 100644 index 0000000000000000000000000000000000000000..b018ba3b82348556653d1ae791de3c13d10ee12a GIT binary patch literal 107 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf+~&s=buUpZysDeg_z zf^TuR9W2jT)?v3KX>Dfev6SD}+PW`%>%RZ<-0D9v2l_4^|8&C7Q?$@T$8NbthUcv% L(~MRyF<1it-j*xK literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..520a277c6b4e51fccc369fddf4cb00ab7fa1f77e GIT binary patch literal 70 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<4xuathk&p3O_t?teD XG@ba`+EuhtI_GpBUzQQZz+epkiP03_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-30.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-30.gif new file mode 100644 index 0000000000000000000000000000000000000000..9db31c393f6ebd5c6acdf5af047a5a037ad19143 GIT binary patch literal 86 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6&s^}9anYPLSKB}D o-c|mtl~1GUisaM`t7+?;_9gM0l#0DA-RAr{<>AYyO-u~d0E+V;Y5)KL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-31.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-31.gif new file mode 100644 index 0000000000000000000000000000000000000000..338ddf5f13f1d7ea4c1e042629d0cc09f615eeee GIT binary patch literal 92 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6ss&s^|!eZ!n7rrewF uP5;fG_<*D9iDc-iPCf1F1Nm3;3VPYiw_o2oxBEervDa~Nmp=up4AuZjbs^3G literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-32.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-32.gif new file mode 100644 index 0000000000000000000000000000000000000000..19e25b251e63c43a7f2f1d2a26c793e78de022c4 GIT binary patch literal 94 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFq!uB&s^|!eZ!n7rrewF xeGfg=%BMCh&0${Fms;&BUiZ8Yf0f;<*>~yp-|kR>{mlYXK7Z^v?Z(Jp4FI-TB-#J~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-33.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..196e6364cfa9aa3174aa12701a162587382e07fd GIT binary patch literal 97 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@5U&s^|!eZ!n7rqbE1 zd*t7=DzWrEi=6jrX{PpdFaKXh-+SEuRsMXpJk!1wxr7|yMA_6mcMoxDGB8*J01VC~ A6951J literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-34.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-34.gif new file mode 100644 index 0000000000000000000000000000000000000000..eec910d6fdd8d523093541df0e8f9a26819165b3 GIT binary patch literal 115 zcmV-(0F3`fNk%w1VK@K{0Du7iGcz;)|NkNR1OWg50RSuj0000u01W^D0!oaJnV{{j zfSi;yyQ+q~ABxnr2%QS;ia-Jr`2n$wzYJ^#+aL#P(NHzsPlm+L8OCtgWj6X Vh3{!S?U<3vmiMY&!&p-R06UitG1mY9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-35.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-35.gif new file mode 100644 index 0000000000000000000000000000000000000000..f965d8029fdaa321fcf0744847b23e7c613ff4d2 GIT binary patch literal 105 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(}&s^|!eZ!n7rqbE1 zd*uH#+&j@J-Z^dV%&J?`TP5FYIF@}{i{)9>j@`O-2c-@@`Tf&njcQ*JlicDXH{Q&2 J5n*7k1^|H4Dl7m1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-36.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-36.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6dbd7eaa907d6d3ce9b0eb07b87265a6f338891 GIT binary patch literal 107 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf+~&s=buzj4kKQ*P#S zdshGTxM$I%*qOF0Y-{$e9ineeu0IxOe)sK;hmYqf@wrSWH`Z*`dh}d!qp#j!{ueW% L-fn1PVz34Pm`W-R literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-37.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-37.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5c06fe0c09554ee8368855817ff2944988983f2 GIT binary patch literal 104 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmI?&s=bdS9-=4JMr^p z_ayJDRJzgn_-CrxtH^gx_PpSBUVZwR_sZ`FcWwR|VsnJe!X>NeG{;#bO|#|B$*Y^R H7#OSpSO6%^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-38.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-38.gif new file mode 100644 index 0000000000000000000000000000000000000000..309067f04bdd7502baf30f7689700b64d752331e GIT binary patch literal 110 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC^h&s-q;<`LtTs1+NU zLw?P#l<{baGM@HIP3rlt*rN6&8?5(FcDZc6<~C>j>IJLCls+k~Up9%;S81jtcUS8t N+j-%c(?b{-tO5OjDO3Oe literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-39.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-39.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fea742b3105294ad227b3b93071875ba9d2b2d8 GIT binary patch literal 109 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC;f&s=buzj4kKQ|X2G zY#w|sRT7sHHC^_gZR)DBV|_p6HcmNMc6Rsg^T9te4kUe8WGvKwLUhsBmb(F5@tmtt Ns%C}WS;4?y4FCj(E5ZN( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-4.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..48f23844df23b1e8593d1116b0c10cd98d58580a GIT binary patch literal 90 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6prujGDve;Ut&kSz7n sH)48grgNyJv`>3+V&&@VtJXX{67+SZ;tcKD{3ec4;RokLH5eGI0sbr?qW}N^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-40.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-40.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3e58a3509591a280f8b72d09147e9fe62791975 GIT binary patch literal 105 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(}&s^}9VR6g($Rj@I z8rO3d-F}$(Ks76+bkkfef1|7WKHi#QnzQ`pI*Ex&>-wTvI;EfUHsQrcv8`k~WKZ?E|mo*i#5 Q5z4)y*%Tcr!oXk+0KQQyng9R* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-42.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-42.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b835c54f0829ce50a1960581ae0694fbd6f1fe5 GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRX$&s^|!f5V(9rrev4 zO|xDTGG&|0+@BM(vgYXSKKA|%>m%L#6?@xv#;pEXryZWn^t&5Y< SP8$|;U$OMb+CPhl!5RPsjV(6- literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-43.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-43.gif new file mode 100644 index 0000000000000000000000000000000000000000..94992afe6544b1fe210362d99ca97f8bf4f178a2 GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRR!&s^|!f5V(9rmI)A z{fy|*y<^eTRylE1^P;<4)kPPwqR(voTzykhUDqO`|RQ!KddzGJhcDUUq Qb;D$3l~-58+*ui{0ptuVH~;_u literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-44.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-44.gif new file mode 100644 index 0000000000000000000000000000000000000000..54144b4739df34c4cc0b2313415027f9b0fc5947 GIT binary patch literal 126 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopK?&s^|!f5V(9rqbE1 zT+#0nI3yZ#_Z5sP-ylfbd%hyogS{yZ@C{=_};IZWmH(SFG5eFNul25yo=f#)v3EyibUnE bGSGf|byn<$dAB!pUNKGD`!Ihs1A{dHTbD6M literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-47.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-47.gif new file mode 100644 index 0000000000000000000000000000000000000000..da9da835c8811e20804bb36e62dacbc646bd0883 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZL&s=bdS9Zo0JMr^p zKicupJh0Eq|ypo%NY01A{dHCtED` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..048c0f6687f7434ecf961954a1ad496ce1db4273 GIT binary patch literal 125 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopE=&s-q;W)b6-s8aRI=`RML%bGcq+NcX)qlhNw45Dnm1J*VTKTIRMn ddYf*)cFX1s54Yv6kV!S1du843TrCC$YXAhWF-iac literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-49.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-49.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f4472b97acb6d3d950196091170925e1072426b GIT binary patch literal 124 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`JY&s=c(f5V&*w+xAU zj^Ar4_|%GemoJHc4~-ZwKQ$b3+r^V4s~V?Ogp&-%kkTTgBY c+kPacyz_`#g`U2}8PVBSU-mr>V_>ib0Ck5kLjV8( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-5.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..89df4fdf5cddbadae60d1450884e657d3f0737f2 GIT binary patch literal 77 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsbzPuathk&p6xT(rlf3 eRrlX%UKG}ojW7!ho41I4k(Su(D;@2u4AuZ9rx$Dh literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-50.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-50.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c161e86abce62a5a0c022229476025a7f121902 GIT binary patch literal 92 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6ss&s^}9anYPLSKGtw u%AfZ&&QqTBILztFEV~@;xr$7O)5B+*+rD1$>{V@po%ah5;GX0Cum{;(^dP0@6YHp#-Q?-M~r_9P~ I;$pA{0N&;%D*ylh literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-54.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-54.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ba3faa6b646e766e2fcab554f0c9a46869caf41 GIT binary patch literal 122 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`GX&s^|!eZ!n7rn^_Q z$$YPlm~q^7spF!Br{+DI$(Ag=du!Y2)%SK4{p&be;S#_8+U<{R$COxE&%`l literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-56.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-56.gif new file mode 100644 index 0000000000000000000000000000000000000000..611bd6c59a4d2a7c533efa249b0c4e470d59a8c1 GIT binary patch literal 112 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{i&s=buzj4kKQ*P#S zf8P9wP5j;?o;it6D{S4W8Si+m7q2Q5TbF0i|FE=Xfzl&o8!hECSBqZQOkLu?__&m< PlA}4-R;ksZ3=Gx)J9;Sm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-57.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-57.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0998f106553c61eea1dd4f9ced2b509993165c2 GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>g&s=bdS9-=4JMr^p zW6C!>J{0dwN}qINy3*QLp4V(Ht+z=}bzeSuot-Dw0xp8Kbi;IED8%@X6VUxC<^q6>d#nw|j UlG88ysC(~93c2i8P0wFeY%tott?lK@=iEv)N(%2KR{w4D2n)KIG_AnvF^AXQ S6y~rqS3G-Q1=<74BMeGHsPf+{^9|>E5LBd$q;9uRgXNNmBmm{Z7K(n~}j90A<}G0ssI2 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-61.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-61.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0b73af4e09b9760323cfcd90edb884d55d1b5f5 GIT binary patch literal 104 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmGoFRwnypImb3LYMKb z;OaAu52rIe>zsGqV_P=YX1&KJ&Pp%VOI0pDz45D-Gq-P$%e1h$^8JD@FzhE_1Q<%_^@*&Fb>bgb38(U0;RJ@Lg IFfdpH0R8zT+W-In literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-63.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-63.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6a6bcdd32eb87c4e68ff06333135af6a717869a GIT binary patch literal 106 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf-xFRwnypImb30_&!G z+c&*Yd}vWN!E@T3u0=1cH_G@}tt&dc-Tkc+@9Q@;qKlp?8>%_44x;fM>9|E`0{sNQO)+WJkGE*GwFbiXw6o)1sUIzW6dslzFpkn bS9)5H?KkW7Evx6IF}hYA&iJ^Jfx#L8Yk4sD literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-65.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-65.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1ecee44b5602bc8a1cd083ce60b8d0f28f7f9e7 GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRVcFRwnypImb30_&!G z+c&*Yj1%{IQkW12fp81`Bhm%jY5`sWuZdyihD&l;8smVDrlT{O=jIiyG^ Qar;8mtyz2hJXsm60e`?N9{>OV literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-67.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-67.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae8417405f43b48682dfcf7da94e03321df753af GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC3pZyPaGGAZ>uwTz OXn}fo=2LA325SIAp(>F8 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-68.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-68.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8c4be7aef7f2b1352f95ff4af47a4196be70570 GIT binary patch literal 116 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRYdFRwoNe%_SASzP+t zgx};?%DYeGP@gs7_%@vzv9I>**cN`;#6rtf>DNr9L-DR1r;bjunxB=NVkU7yICRw+ UKj$eEw^u(&+J5Wx8U_Yy0J&}~%m4rY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-69.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-69.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bc0216161015091468bbbfcb4ada99b982e80ff GIT binary patch literal 116 zcmV-)0E_=eNk%w1VK@K{0Du7iGcz;)|NkNR1OWg50RSuj0000u01W^D0!xeor+dlj zo}4C9bnV?pOTU2JB!&-wrs)`}?#h%^!`9XNnzOCTJ4xd~g23WWsF5j$x{YUP#KbtD WlC^2^iBO*|mgx;Q!7bmS0029$_%Uq& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-7.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..42257fac80d607225cf377d8bc4cc6cf01d51aa0 GIT binary patch literal 76 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&%&Ey8_O%J&t5xum%7zoEh~1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-70.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-70.gif new file mode 100644 index 0000000000000000000000000000000000000000..939c9c16f69aaaf64b4917785c6e348c66fd8ff9 GIT binary patch literal 92 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6soF7JM`Unr#LR&egV uV(0Ug3nbzWbk1`;wJcS-PgU%Etnazo8mBG)a%U;=&+k9@>xKv`gEasGogfeZ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-71.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-71.gif new file mode 100644 index 0000000000000000000000000000000000000000..e50ac95c2225284516517a1733207c7075c93631 GIT binary patch literal 100 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@ETF7JNBpWKyxsaty6 zPJ6w|Ma)i5UogH}#rEd(qD!;qe$bu2WX|e1!UUKQgg4!w5nHa1A DWtArE literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-72.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-72.gif new file mode 100644 index 0000000000000000000000000000000000000000..596bf879a530c23469a353c774ea2ee31e2d79c4 GIT binary patch literal 102 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF-F7JNBpWKyxsatv* z&yWA9{OX-*E{mS;YDjo+Oip`eq}TnbeUJL~3s0;$@L-wguah~Vil2^Oz7uy+V<`iJ FH2|qsC;0#X literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-73.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-73.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cbe886c8f8f4150f5605f6a3012b316fcf0e7d0 GIT binary patch literal 105 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(_F7JNBpWKyh)UbKm zmBO2?Ngo`ac7#2exhUFgU%vNQMd{O9s@_}gV<>Bx{-8OcSkl%m&i|m*$(-Jc$FA^* IGB8*J05Cr%ssI20 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-74.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-74.gif new file mode 100644 index 0000000000000000000000000000000000000000..c929fde5c582261fcc09d5f629d700b13604413b GIT binary patch literal 120 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}fJF7JNBpWKzM*Rc6m z$hTt=lYiKXm4;iCC(JV({WWOS1NOUzN($ YTH$g2T3c;v$%XZ6--yiaVr8%f0HW_NPyhe` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-75.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-75.gif new file mode 100644 index 0000000000000000000000000000000000000000..54219aa2aa67db374f32af249a7ba8ffa7d314d1 GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>cF7JNBpWKyh)UbKm zmBO2~vKC#}J7&doOp_Md^XX<>G}pn*R93CU=0BM=P4=x literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-76.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-76.gif new file mode 100644 index 0000000000000000000000000000000000000000..1246b237790ccc5ea1dadeb5a9f5cc7d3067be6d GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>cF7Mv+a*<7eS@c@I z$};vEX^XBNORX2oZSP($#v&N}u4tha*CSFA~dliZ+uJ UP?hR&uC|ofu_?1MxuOC9J04aq9smFU literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-79.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-79.gif new file mode 100644 index 0000000000000000000000000000000000000000..c382b3a412342690a54f78d824a49056507288ee GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRXyF7Mv+a*<8Jw#c>n ztgQDZDoQXst89DZrWLw+T87p2XU<2j*hH=W_tMkIAoSwaM^BRGg-w(&d9)~mFJwoG S#nzib!lr9><*j03um%8{PAkg* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-8.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f9cecff034f570ce72cb7fc13ec3c6b3b98e453 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb**H=NF$wO}@fSC{U+ immlBM@+HJRDx8_#ZuIKKvD>TnUG=y(S+(^b literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-82.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-82.gif new file mode 100644 index 0000000000000000000000000000000000000000..c36f1ea44f01ff99deb26246349b52e5f0e5557f GIT binary patch literal 108 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf?gH&mbES1vi=s=Yan z?R<3W!*8my+?R2euF^Za?vc&D=&K7?=O$ZydhA&<^FeQmkyO9#ji-*?Ox?nBf^SG> LExh5&$Y2csWkx7Q literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-83.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-83.gif new file mode 100644 index 0000000000000000000000000000000000000000..65099e34324b8761bdf87e7cfc1c68b996659e03 GIT binary patch literal 110 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC@~H&mbES1vi=x_i~V zP_I|24?UXX+?MtHT=_0*0jK-v_bxX(?5=OWVevOkA})u6=VZ^Zz|S1B6&8xmc^mck NP1M!n#Ze3l)&TPOD=Gj0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-84.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-84.gif new file mode 100644 index 0000000000000000000000000000000000000000..4645aefd6acc732a6d308ab8874422d71bc27a2e GIT binary patch literal 126 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopKWH&mbES1vi=+P&&t zl-DcOepac788aWQ+@@l+E&h#}L2%lgb$b@ocn3sqFFG&&hcVN2_M{zNXA2JW8sFM; eWPwD+H*a45180(!-gywYG+DRG^P30*gEat*{V_lQ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-85.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-85.gif new file mode 100644 index 0000000000000000000000000000000000000000..116b99149fb5d5fef91b74fe7379b6a157cff46a GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}VzH&mbES1vi=x_i~V zP_I|2iehzaKNs{wt$WU~U2aC9*{M_NQ}R@x#*YVGIn`0HNe600000 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-86.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-86.gif new file mode 100644 index 0000000000000000000000000000000000000000..acadd119639600976d516561a28655a329929a02 GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}VzH&mZ`F>lVv293gH zHI{!H&Rm@uuimGcwed0Q@ei-I&g)tJ#YJt`S>|^NE~nNj$tX=;m9TLm)8CRyYVIzj V*S6h~E)%}w)0>c&5zfG14FH!jF2eu- literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-87.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-87.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca5d9a764734fe779db41195e9527f8746b41a4e GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRRIH&mZ`J#P-5OXbHq z>py)-l~3*H;p|;}d|}6Gv!|I?%Y5$}guPuRcRQwLp@OHHPFC3R6z$d;v+3tvtl`>N QG9~Q7M6TSMJ**7Y0JNhlZ~y=R literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-88.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-88.gif new file mode 100644 index 0000000000000000000000000000000000000000..26ee6358cd3f12713901257a9b3fa469109651d3 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}Y!H&mZ`Kd*(&r84tW zvDLYT6W6Eurgo(#Ez4NBukiG>#jVeOI9anrmTolVv291xG zw_Nux?0%6tO+D^aR9m{cSy6V=*{;=(efrO_a__5}uqeB!bLyl+wF*)Q?p>3Zwk4cecac;1qs!sQK1Um^&u1;9gE^No-O@Obcv5+dEEj_{0Hzip A8~^|S literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-91.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-91.gif new file mode 100644 index 0000000000000000000000000000000000000000..3bfe6067f875ad392560e9339cb50adbd2046081 GIT binary patch literal 106 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf-xFRwnyuUxX}YIp9k zo#qT}2}diJIZo}VDtoDPENOS9p!Re1<65@54<|NoOwafDBRl=5s9lib1{6nCvKty`7d@TAA^<>~nnn^8#(ouDluUvz}ZQ UOq&?``ZTw1+q%S0YZw@;0YFGEa{vGU literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..6abd466db84e9050a602c2cf42f15ea1e994a307 GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRPaFRwoNdfuEuvuv$n zx5~cd@;XdY+1{#DQu*>%+62$(32S$4vYTzt@4#8#@1;M1& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-98.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-1-98.gif new file mode 100644 index 0000000000000000000000000000000000000000..b86014f928b3829d3f51564c80bf85708a9f6c15 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}W`FRwoNeqPID*Ov#@ z7KiUoiCI2Xm0jymhuPcoC2OSHpVhAVdgr38 Zt498|1=|B-SI$|n)$8q|eIbkt)&S147kU5y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-10.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-10.gif new file mode 100644 index 0000000000000000000000000000000000000000..952786cf9e61fa1c83a720d51b5ec0304c812757 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$MFF&38azXYaKkL`E g(b^1cNjoYcx7TKzicNd6$wP;IeeCw1feZ}R0Cuw(@Bjb+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-11.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-11.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7fdc97a1d1b6e2703b1b609ead179234c445a57 GIT binary patch literal 89 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jlFF*Zu-aMDdN44~? s?fCe!)H{RWS?9b(PE~PS#cQ|PeU5N`w0CXI*TqjFwm!HJz`$S)0QLkTcK`qY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-12.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..be524e6305cf63fa61e0472e51d775213f32dca3 GIT binary patch literal 89 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jlFF*Zu-aMDdN7*)A s+qUYp<3h$h*)2=wc=oA!x9ZEBQQCV$;@`~8TyJ((=*nLVW?--e0MWf4r~m)} literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-13.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-13.gif new file mode 100644 index 0000000000000000000000000000000000000000..bde3f368c5c27f5cf402003fc18b186bbf661497 GIT binary patch literal 91 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6mmFF*Zup45yjZpHUc uMScEPI%!4AlW!5PN)|1bT%*H$dF}OUKkNEy-dB01h`RW*r-(2xSOWlP@FIW! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-14.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..26b1793d24e6646d13f53a004dc21326718d1717 GIT binary patch literal 106 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf<{FF*Zup2UnTexmbp zEWb_7Yi(UX)o=2x07=7_5`gk+Vi)?d!g^lZZTKinNK-= Jy literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-15.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..62ba0d4d901b2fdabe72c7deab6ff1ee9160fb4a GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BSFF*Zup45yjZpHUc z1+c$s>{&4(_C;;~QNQG@eF4?WR!y7uu}#VJ&S8(7eWLzuJ%tX|DJxSI*|-?20V$Uw AuK)l5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f61b75f954dabab107f4f5906afdfa562d64889 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BSFQ4_A-?ux_&O2~j zMd>fggMY-2qd2^0*kR0m}>` AzyJUM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-17.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..446d24e5e40fa9d30b7806591b71163f569baaec GIT binary patch literal 97 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@5QFQ5II-?@8|-zvQ; zebF(s3QSc#EK6RkD$A+rQ#?HFQ_rnUGhZtEzv3*nYi7Hl`Dnt)ORv&27#OSpq!A+@ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-18.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-18.gif new file mode 100644 index 0000000000000000000000000000000000000000..7eb2828eaa137c688edfb5b993e254a627c5fcfc GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@ETFV8;7Kee0BNAh9q z)U<7lz26ff-HWcBTF1R=>WRqK%`!K>OFXvX7x@`veR;!oA-Spg-hpYqpBA(+F<1it DCg>!S literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-19.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-19.gif new file mode 100644 index 0000000000000000000000000000000000000000..9faa9654d315885ed73a018ed6b3271ed66767a0 GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF-FQ4_A-?v-%+KGZ4 z{mJ|-i!w61r+bQ+ZcEvT#53yhPJRxV6&-Wsw*Fa3-tgEau)W)~Fz literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-20.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..53d00001c2ffab49b93f403a6700c10b2abd5a74 GIT binary patch literal 87 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5&s^}9pSjq$sr%#V o-sANZ+#YRVo~f(aIx@=leN;Oi!n^a?wsi)*%>SCqV;C8%0dJ}vA^-pY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-21.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-21.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fefc6e2a15427b583367bdf08863a1c36102d53 GIT binary patch literal 96 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFq!xC&s^}9UpYzW633=% z@57$g25I;`b)V-JmG^ELTh1P{_j@nQ&HHrf&ZoaE2X3Es6XC0Lhz*WlV6X-N-<%}1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-22.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-22.gif new file mode 100644 index 0000000000000000000000000000000000000000..52d8e416af5adca9fef3651a4d97ff02ff633bcb GIT binary patch literal 98 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BW&s^}9UpYzW633=% z?^p5GU9G5iQq-3gwTYW!{nR(xzLr>*?7D9IGnrL&uf!Tf literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-23.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-23.gif new file mode 100644 index 0000000000000000000000000000000000000000..51a0ff13ee94afaa1d5debb81c04a1d081b4d14c GIT binary patch literal 100 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EX&s^}9Upa~QM)%5# z29J+>`e}HjST20AGH>mpqxlEUy_1-~b?$75S=-Wj_@qm~~HNVz34P DVK5}H literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-24.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-24.gif new file mode 100644 index 0000000000000000000000000000000000000000..71cc84d1d58318b642039a87e9fe3336d909b7e3 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZL&s^}9Upa~EM)%t( zijUoO*+tvhP8Pnf+>|%_ST_6g&^HxUZ*M8-&HPy-o!}DDEZVz(EwgB+;q2{_{x7ej W&WX_~(~8Yl9RK0{9bZuf25SH~jx4GG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-25.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..15bfb6367444a5e36b23d63ed0ad967f3a23c385 GIT binary patch literal 107 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf+~&s^}9Upa~QM)%5# z29J+hE;RBA+Uc@_bDo}dmE6xmrkdT`cIHjq7tG1OBF-S;$&{*1l54+K%Pn+RR1!7U K#C{DEgEasqYbI>~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..604cd63a4970a837e7858249e337111fde99b4ff GIT binary patch literal 108 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf@1&s=buUpZxxopj^9 z>Qf6+@4u*-Q8X#^@Ya}>i`GfYXZEgJ(D8X*A@jEyof(A{E=%$pAFK)8<1+O`d|zv3 L*vupTj11NQ!mcV! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-27.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..eea87b42b9142f0c49cf2d7e296b7851ce1fea33 GIT binary patch literal 106 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf=0&s=bdcX5t?m=*7h zImfvh{oM3sW=zwX6_s`4=sl(8H@B5Ob$-5F%kYiKX;Hp}RaQ}76wl{mv1-@Ze3G`M I1*{C#00P4$D*ylh literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..22e6d98b5a025dee945967587e9c567dac043181 GIT binary patch literal 112 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{i&s-q;X3?B{CkFA_ z9p7hIitm`}exqkm=Ay1$o7TJ6bIdt4r8<7k$IEk77A6ElDDozskSSitcs1+XtG8D} Pl7b~N%A{+9xEQPfP*WUuMI- z-(fk4N!JRV3HL2XS=zBW?b)1dac7>XbgeIExc#-RD?q^F&z~lDg|{IpxA@Mg7;CMG M^49QO!@yt-0PoBxivR!s literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..06229e2ed480e294b577a0920493a69a8c0824ac GIT binary patch literal 75 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&x)uathk&p2sKRMzJ! ce;(AO3T~-UNS^1lsw($r)#DfY@);Sd0Um1^i2wiq literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-30.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-30.gif new file mode 100644 index 0000000000000000000000000000000000000000..17f1bf0e7ffb4181edc4360bdce88d7a369ec4ff GIT binary patch literal 90 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6pr&s^}9anYPLp}#k^ t{d|{S(Z!MVB*^ND)I!Pj(;Y2&RM^rIgN|K8UP|n BC7u8P literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-33.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..148bfaee49daacf047b5a6ed4c9ac75f0c4dadd0 GIT binary patch literal 100 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EX&s^|!eZ!n7rqbE2 z62E@e#!B=(DVmp7wPq#T=C<31zT`F=x$L+8@61|y_}=-5M>jQG&J|sfvYT*;iNP8G DiasX| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-34.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-34.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b96c4b755d4ca1b9c5601d48a48a98bc0bc4acc GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZL&s^|!eZ!n7rn^_U zN&MoL61&Fww0+()!%f^=yC?db`?xgstJW=ly`QZW*5`ChbH2v8_j_s1`Z23dJ-=#c XSo@tE7LS*12W6*T>qtGs#b6BprI9ZR literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-35.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-35.gif new file mode 100644 index 0000000000000000000000000000000000000000..7253fe464bd2c196b2d4dee9ef50effb94862f74 GIT binary patch literal 110 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC^h&s^|!eZ!n7rqbE2 z62E?zK5#Eus6Oq*&Q;TwxxQicHsQ5iX?^dw9K$D{348$-CJN0*TsJK(K2@;Q^ZltQ OcD3EBwuUe;SOWm@PATUA literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-36.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-36.gif new file mode 100644 index 0000000000000000000000000000000000000000..2220578187849c01fe9afaf10b32ee747a08717b GIT binary patch literal 109 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC;f&s=buzj4kKQ*P#c zJD>mcnD1^SmoZIsRjA&HRd2mdy4PF|On*45_R-z41A>JoH04A!rulak8`*EUWpeV4 N&B7b&mNPI|0|2pfDY*au literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-37.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-37.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ef3b6a124445595aeccb1823d2ff0311c3fdc9a GIT binary patch literal 107 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf+~&s=bdS9-=4JMr^V zcRuHBoZ+tYNMdg4tCi2BqBdDHuM6D0{LY~#y{~^-9dOwA!dh>d^P+&mJx|qSo^#*Y LBBZ^KiNP8Goe(NB literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-38.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-38.gif new file mode 100644 index 0000000000000000000000000000000000000000..973eab6c4a396110fad5b34a6ef04c09fea490b0 GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRR!&s-q;<`LtTs1+NU zw`6jrDTvoT%+zz+HSe9twx_#ezqy~gbT`-fc-4gfYZn8HmX|5>QqC+Fvh2RF;^Xnv RCfjGuEAZM{y+<>Hq|d%Rw-oMcqQ5Gb2GiOMy)XTR-V#c Q!MQORn|D3f$i-j{0Hnh$k^lez literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-4.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..f749890bf347b147ff994de95eb95815e11ffb7c GIT binary patch literal 91 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6mqujGDvUm)VsnS#Po uXJ(zroTAa>6;b#ooW>|FYLdp)*rr7pu5liuaE{7kUEIK4(0& Ih($ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-41.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-41.gif new file mode 100644 index 0000000000000000000000000000000000000000..69145198ac922e65030fefb6304227f21184d759 GIT binary patch literal 115 zcmV-(0F3`fNk%w1VK@K{0Du7iGcz;)|NkNR1OWg50RSuj0000u01W^D0!oaJnV{{z zfSi;y3o~}ucAka7rhMZ;qM`NXk-~gz=`( VOY3T_MoYrUv&yr5d)in506TjrF_HiP literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-42.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-42.gif new file mode 100644 index 0000000000000000000000000000000000000000..baa3e73fcc3a64313c1c467a9661ed9b5e7fd362 GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}WK&s^|!f5V(9rrgG5 zH_HBnOxZNCy}apWlwRhC*w=UVZ4m7Km9y$Qf5}G$(>vPNq<>Y-p6Ii)M0ELu^pF`Y VFI=J?l@+y$<%Z=<4QF7m1^~E3FQEVc literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-43.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-43.gif new file mode 100644 index 0000000000000000000000000000000000000000..b377817832060a37773c49337083e31bb196dfc3 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZL&s^|!f5V(9rmI)E z-AMdhd7+{tGP6b8a~8MM3U%vU1#=GF^4p)($9zuDdbTgeuAf!=Lk&zbjoOzlE`2p6 X$nr++5{-*a2NM_0nEiGW7lSnbrsywK literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-44.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-44.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea0386af7aa47d0e2d02b87f3c030fd0d4011b57 GIT binary patch literal 131 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%wB&s^|!f5V(9rqbE2 zHxhqWUT2)dEyA|)(oDCX^Za+6GF!80vv+os95Yw!;)LE{7P#hR4eW_7GSw(|ODqUcbys&47LMum%8+7A>;? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5fb99033a4f6b485a8b7c9a01599a51e229b5a1 GIT binary patch literal 124 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`JY&s-q;W)b6-s8JZGBh1;&sQe*qnKir>%A>&7PUH@Ai6*BQN{Bu3r)h+PdIef^lZ8 e(&X@kleziqmrCCYxg)!Ld(N`5R7piH25SHgfH7|D=_aw(fS$FVtX##Uu(aEGv;fX<-+rBR#LV4UC&!I7#OSp4ap=~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-51.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-51.gif new file mode 100644 index 0000000000000000000000000000000000000000..af1a0fdb022a2077bab67007b19392649147cd21 GIT binary patch literal 106 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf=0&s^|!eZ!n7rrgHo z(wxu7CYm=XCs}2d)GduVy88FYFG}IwJI;RosVrNw*4^O3ZqdL!a|=&Cs_3||P|aO1 J)SZ>V8URj2C@=s3 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-52.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-52.gif new file mode 100644 index 0000000000000000000000000000000000000000..7acb24c87657abdd58788d09cbc3b3b8292838f4 GIT binary patch literal 109 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC;f&s^|!eZ!n7rrgHo z(wzH4LXOBTD4w=ZYKhA49o$-78&+Pu-#cx#PBN?YYKixcw7>P8iv7HGMd&>5ITJnq Nc(@1TEMs7>1^~>IDog+X literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-53.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-53.gif new file mode 100644 index 0000000000000000000000000000000000000000..2add01753623b083157381a0c55d82fe3160b81b GIT binary patch literal 108 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf@1&s^|!eZ!n7rqbE2 z67%>P=PBDgHSJTMweIEjdAI)P-FvgH;^iT`Nbao`hZF)_O(Y}DXBWN9QS0x%`^0^d L*Nh7xj11NQqm3za literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-54.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-54.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd8d235a6d0886f742ddb5eaab82551d8271a122 GIT binary patch literal 125 zcmV-@0D}KVNk%w1VK@K{0Du7iGcz;)|NkNR1OWg50RSuj0000u01W^D0#uBTnV{{j zfSi;yyQ)SQo(_QqW|51>q2u+fZmR~OGn+D;s3eB7)%#$(}C;$LEwUjVd literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-55.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-55.gif new file mode 100644 index 0000000000000000000000000000000000000000..97a39c264b275fe6454b47e8907482d05ed69d30 GIT binary patch literal 115 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRU#&s^|!eZ!n7rqbE2 z67%>Pr>omN^;mXqyOjF&ecg+%2KwAuw(`EkZtjBtTGKyds3=N3P$(bRQjWUvMRo^&dl literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-56.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-56.gif new file mode 100644 index 0000000000000000000000000000000000000000..59a7c8f61191da26c342c70dc0a3ed8188cff3c3 GIT binary patch literal 115 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRU#&s=buzj4kKQ*P#c zk#GORDjL}>y)LSEb_%jV848r+|}9&06QU$G4=oe literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-59.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-59.gif new file mode 100644 index 0000000000000000000000000000000000000000..946ce84f7d8ad997e08c2d2bff4c18318107ce47 GIT binary patch literal 118 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}cM&s=buzj4kKQ|W~V ze--@ITzEtAacSt~;zg+!^5VYDd-e82PWf>|o7+<@>?U*`vsQ|=T4t!x!!-BwN)vX~ WYa2o`uFZb6)+1%&lTr-^25SJv$1jQi literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-6.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..5401a71b44c4390898cfe1c0179fadda97241d69 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqKMFF#%TG9ZV+%KHA1 kHNXDr#!Ty-l9;t*s@Kwry#?Fn6;BEC>dspd#K2$;0OZ^pX8-^I literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-60.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-60.gif new file mode 100644 index 0000000000000000000000000000000000000000..238aec27dc3bfbd93ef6e5dd6c17dd5e6b46ae7f GIT binary patch literal 97 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@34FRwnyKeb!e@7B7d zQs2LaiaAVEY4C+sN3HggsfRUhn1+%9tWMHrc0137&l>h($ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-66.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-66.gif new file mode 100644 index 0000000000000000000000000000000000000000..11675163e91efc39ca1a240034f8d746d95f1391 GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}T_FRwoNYTg{RppuVU zBny5T%8BO9ESoC&a%fXD*FS@nDGm0^oHz`2k^@qL%sgojQx|W4xeChm} VIeX(I@syW;SDh;|3ua)j1^_H-E>{2m literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-67.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-67.gif new file mode 100644 index 0000000000000000000000000000000000000000..220f27a94c49ee96cfab2febd59b9753d34e577a GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRPaFRwoNdfuFlRThSq z#Xfv@oU1zNp=sK^Q|lIRP7d*|j*eZH&b+NKYUW>~!wXW<9i;lD6%A%8o6S7Gw6tom QRb|XdvsFbW`B)jO0cfr%?EnA( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-68.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-68.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5caf812e059d4010f7ffeab67eae14cb48e2807 GIT binary patch literal 117 zcmV-*0E+)dNk%w1VK@K{0Du7iGcz;)|NkNR1OWg50RSuj0000u01W^D0!)kpr+dlo zo|JK#3NOBvft^_n$aM<2pe3q)?)!$*D4HFNe`!hC^eq~(d=232bTk%|y``*)WO}C5 XTJ^faB9tkTm!jiApV92tQ~&@wRm?CR literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-69.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-69.gif new file mode 100644 index 0000000000000000000000000000000000000000..45083f4c6cc091620b21084abc1b8003511ccd87 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}W`FRwoNYTg{Rppv(j zXTGmVOf;@K(79;R^(E_0ZAdXasr+f5x619!`m4^`Dav_R^oW*=%wAgFVzS&b^NQD* XOWW>T?P3ips`XoMQMOBxi@_QI;Q%j2 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-7.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f23fb08097d544109946e6524426d23b38555e0 GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJhE%M)%S@Sh}x-h%hi%0{{^x BBsl;8 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-71.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-71.gif new file mode 100644 index 0000000000000000000000000000000000000000..f42be975cf9f499ec370795e3c685b9a12bc8c15 GIT binary patch literal 105 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(_F7JNBpWKxmR5^92 z_3pmZ1vr1aame~-O=#pTwZ#p!fEN>p?$yPVT9g_wdjTNvU#Ip5SLz>#EqVee#^* Ww=g2zJS;Zzkg7|s*S%?64AuZ~0WIbL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-79.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-79.gif new file mode 100644 index 0000000000000000000000000000000000000000..37d0a7f2c7092c31be8c7b928631724914f53493 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZHF7Mv+a*<8Jw#ejd ziQfMU795M^Z&;=gS@zcB=$aMFVteyN&s<->_4gkygXw1iLsa@bmQIk!vhxjG5!_{( XI?YEp`3YxG=c<=qcW1G3F<1itu?jAX literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-8.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..7451c08f0977a4f0ca3bf0dcc130d2d9538ea129 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqM4H=NF$^TQ|JS+cE%ZK|d#g*rDU^2Khu;k~xWS}q_=B`M?Zv&YMSm2xpy0|4@F BB#Qt5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-81.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-81.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c4b97d85c31ee62b739234a59aa72101ab43eac GIT binary patch literal 110 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC@~H&mbES1vi=s;zp? zME!m4bVVc8jyY!<%_RrTAyaq?~OT8$%~r O^)JiI;?`zhum%8hj3&AO literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-83.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-83.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c05e10c95a60a5314f57d2982f1bee8d0cee5c9 GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRXKH&mbES1vi=x_i|< z(Zrb&_l=vDXf8|WtkO;0l-qnrvi;>-pVVB**WQi@MViktN9leUh&H1 RFkbRtnH8`8`n609)&NGbDog+X literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-84.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-84.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ae4c0229251c5d20356905488ee842f69e823f0 GIT binary patch literal 127 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopHVH&mbES1vi=+P&(Y z)oIt-lgX`YW?hOjPeNQa!iq^v#)m e68_Q!uQwLy>ls{%`7)_)w!u%^zQwMr4AuZZ3oeEL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-85.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-85.gif new file mode 100644 index 0000000000000000000000000000000000000000..d71ebf1bb78f53c56948e104659822d0e4ee6fd5 GIT binary patch literal 119 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}Y!H&mbES1vi=x_i|< z(Zrb&_l=E~vYRDUEee{wRzYWfW=HiMyGuV^7jCUkmv^%$o*8klVv293gH zv!Z`BPG@hEEnbxJa><3_qnq~Z$PYcg%l4z^Y3??&MbYamLKG)&5Z%17MXvLh*43`5 X*QNwt>Db+x*m8Hn&PXc}1_o;Y_s=lJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-87.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-87.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5a0dff43502f2bf9a9aa3d5b87812833fbd8f5a GIT binary patch literal 117 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}VzH&mZ`J#P-5OXWu& z=~;godO9XNzFs)DbD7rdybZgK^|n6$u_F3jRAXn=%A2kcKG&qYXHF_=GRrl2ssCk( VlJmY5n_2#4Z8$oIJCK3F8UVtIFn$04 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-88.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-88.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e15dac9ed3aec4c8251a1d62f9e60f33a5966fc GIT binary patch literal 122 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`F=H&mZ`Kd*(&r84tW zsnPM;xJ!x2!BvV(eyctD@-5G2oQe9iPJeCnrjQ)d3#Z$>vwXIzZaCSa6=^i%O8U~U Z%{Q{SUY%(TOL=I1=jpu5%N-aQtO4h+Fp&TN literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-89.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-89.gif new file mode 100644 index 0000000000000000000000000000000000000000..41ddd8b80e656d8fefb77fb513a273445f793762 GIT binary patch literal 123 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`ClVv291xG zd;Fj4COSu|MoztVblc6$WmhCl%kq@HJ=gW3Y*$2vS;E_8O)B=Mu7AoXahmND9~$*1 bcIAl-UT2=KyTYYM~CgEasa CgC=YM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-91.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-91.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f0307fc69a957a08fd759ce4f3de7eee9955420 GIT binary patch literal 110 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC?HFRwnyuUxX}s`tmO z(P?Zgiy~_8Ci%ronYa48(qo@pZr#ToIDfBPdEjo2)`EBLE}NQ;Jqhfz;Ia-DRyDnP Npkm>o;$Q{_YXJSuDr5iv literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-92.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-92.gif new file mode 100644 index 0000000000000000000000000000000000000000..73612ce10f0ce72edb4a5523d8b5e6fac9f8363a GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{&g5vix}#IGRWEnd9=+>Rw&^_FvTnVUZR68Aws{7ZPD}K!y1eE`#@!sl=fZ-i Oam^P4!nm~=7_0#=k}8D& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-93.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-93.gif new file mode 100644 index 0000000000000000000000000000000000000000..421b8e3b32237865eace430e87383d0fe57680e5 GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRVcFRwnyuUxXpw_$VG z7Nz{gpyL^7u3g?%t%9p}E$*3N*3%@C_rUzygRd4lBUW3?k!+sV7qB9GUB*e(z{_!)*U;w^3xl$=dp(j*X|eOd;QaCzsST?88Owl3Tw?go%%1{4e@l! WT74}vf6C+{gFA)>m$^h37_0#z?<?s?6+2h|r#c5k)dZaJ8w{GeT9w_}jolC_p0g*JyzU5fPi XHg8hqw_SG=7R64PCY>kBz+epkhO#ch literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d7b4c12e6ff84b11a17dcf71792031cb83169d8 GIT binary patch literal 115 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRSbFRwoNdfuEuvuv%) z(}H^v;+UtTX*NA(ZHwe8&s{S2+s?aR&(vAUecqemcyiTqA+27mqlP>0h-UVyfBE$! Sz}$EF^dHHq8g!i*8LR=r{Ve$a literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-98.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-2-98.gif new file mode 100644 index 0000000000000000000000000000000000000000..4724a64e0cec3e62fae32079d582518f4c5508cd GIT binary patch literal 120 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}c|FRwoNeqPID*Ov!! zOW*#gbhBu>RavIe?z1|gDXXXSOWQMzKl^gDi&Mkw6xKcq637*g_n$fE?*x$oxEUgmqfe9G&a@rP~mb}uXxlM$6?Wv~VSmP#W< literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-11.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-11.gif new file mode 100644 index 0000000000000000000000000000000000000000..80c1abb4a2f9bb9a45c146fee1f7e81a4f9634d0 GIT binary patch literal 101 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9<&s^}9|9Z0FrB!*C zE6Ocv7fKXJzMOH5Y0JCYi&R%CY4sd8+k5IkxHXIGVUZ;rj#X}U%|)DFZ7Y3!7#XYq Df<+`y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-12.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4c3494a9d3bf9730f2b405814fc484399206ed5 GIT binary patch literal 100 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EX&s^}9|9Z0FrB!*C zxqrM*ong@{(7td|fRM8318syi*O>{;8AchPIvHktcL$Ba!^bC-o#NPGzI5sVjAn=~_;tADn)v3cvM a4%L?~qD3VeJ(IVlU!8O?+;AHMgEat>t}G(} literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-15.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..505a4c73c1633a608117803d46f02858271ab572 GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>g&s^}9|9Ud-jqa5f z0}JohCYW0#Wlj<*S+}OD=4Q@9O_?npUG8t#*I5vCpzFg9<3~m7(=IGy@`~+v^rXu- OZ2CnmU1n_t25SIT5-V5$ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed952b807e21ccb7ff539cccb96ac37c7e113cac GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>g&s=buU$NTwTG`@L ze$0IhQ3_J28NIXHYu~*tTeb7RH_fx`=PvK`OIlhZkx<|&dawMvVD!5RSlTPceG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-17.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc3fbf1aeba4a89901f468a51ad35296273f943d GIT binary patch literal 108 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf@1&s=bdH@P}kDoXc= z-{*CWv(syrr0Atr=pNuczFzsfhtxw|+4XDW7}#nR7koIeYhi~>Vp>R$=H$!ie!CWn Lb=zh!GFSruBvK`l literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-18.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-18.gif new file mode 100644 index 0000000000000000000000000000000000000000..49012eb1ed2f5a7eb7cc65486bbffdb6b8a7c381 GIT binary patch literal 114 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRX$&s-q;W|7H;Q1*ki z)r@|j&xQ0e QPVLtpi)}ZMguUvhA|8bGfrBix# zw;K4H{I@HnlumPu+O&Aq!O5@s9_k({RsPJ|=l!O|Hff@>wbE2=*36FL1A{dHNC_%3 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-23.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-23.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea86e930f7fd650e743e9bf5367cd67fb0db222e GIT binary patch literal 112 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{iuUvhA|8bGfCALlX zUR>+Tz4f@ZmvhnNU8_{H_iV^H`^eYba`SAG)RVF@Y`)l?PTI6`c4>pma>1;r QZ7alcCVihO!oXk+0K-5m#{d8T literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-24.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-24.gif new file mode 100644 index 0000000000000000000000000000000000000000..485fdd8d5018e633739010c195070b68cfd66f81 GIT binary patch literal 132 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%$DuUvhA|8bGfC6-P1 zB=5d5o%5~cxa&fR9h-VGS2Wh_+W6P+>z;PK7)j1b^FSf{wrQh--vGa6BFB(?^FFD>0G`&f5WyXS_}-<09KhaqW}N^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-25.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1e388bfc5f1e631d075dde5af8c3e4f9488dee9 GIT binary patch literal 121 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`AVuUvhA|8bGfCALlX zUR>+Tz4h2I^|NYv)tam)Q97DO-{wqyRQIg$|194UYhgc&DR(DnCh)Q)nN4)OwdvHS Z4_z9sO|?p@mhRX4niG-hx{`^(8US_FF>?R_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..40f72c9f38b3137588d5c1176e22c04d1ea71e8c GIT binary patch literal 122 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`GXuUviL`Mf!5m(n+$ z5jSIKTVU3k@_ZrB_PngG+va=B);tyWRgQhh8 a8!1{#eO0-8Y|8@!Q|Gd2iP@fv4AuZ!2QR(= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-27.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..807e602bdfccbf0481433f077333133582c3b4c3 GIT binary patch literal 119 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZLuUviL#k@I+m(n+$ z`Tl{cC256kd{Izl`kHws_ZdFk_A2J`V?8sQ>CR^}xbNwT+2l=`tMX>&5nkytT?I3K XO0Eo$PRU}eUc6~zgv_0@TnyF#9Re^V literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..5081607db23d2012bc3329d9fe2c9f96db5bdc14 GIT binary patch literal 124 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`JYuUviL@1l~TTMQYO zO1JYg@ox`MDJsiskJCQ3?c)nK{o?+IdZ)_yWOn;SnRv&}uZ^6G>t crHwXmpS6#MB_P`;lENH^#GsW)PILTUq*Th_Nv z2Yx?MIp4%7v8XK5voU8w(+!zpK3?IoPv2VlUU+Z7o_hfuGOVG?lzS%a)=BbKzZ}WH GU=0B66()ZG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-31.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-31.gif new file mode 100644 index 0000000000000000000000000000000000000000..415a096f988e28583f14d2e4e1d0a4cb42bd3783 GIT binary patch literal 111 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>guUvhA|8Wufjqc3J zfyGa1XP;=9?OC90t=3$r5)t>iB++VW|) P%=FL|mriRiFjxZsXKpLt literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-32.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-32.gif new file mode 100644 index 0000000000000000000000000000000000000000..43a31034424a510c9d318a443ef3a7bd8ead8ec7 GIT binary patch literal 112 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{iuUvhA|8Wufjqc3J zfyGa1r6(sY&S=Tl>bLe5+lSrfVk3{4Sw8%x$22cVM`=Zxjau-Qr2(I0gcA4lY|>mE P7jyE(r0=aF3=Gx)QrRl) literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-33.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..f03a5749e4f013d3a74e3d7ce50e27811a2f5c33 GIT binary patch literal 112 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{iuUvhA|8Wufjqc3k zoyxkZ2^JGCcq~fWT9mtBU!nExqUR^Sw4AStkGkq}_{zJjj$I{QVV47V>=p}V30*tv PVSlsx^UW<<+zi$LZ;~v3 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-34.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-34.gif new file mode 100644 index 0000000000000000000000000000000000000000..78f92613346debdc3425cfd77e5885cd0857851e GIT binary patch literal 132 zcmV-~0DJ#ONk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$YrasjI*b z<8lYsi)ov=BP}IhIF$yajU%~|pBbQ)=*~6MrlEo&>0029wIyyA~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-35.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-35.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f8672c1cb3a39132b12205cabec843351d436aa GIT binary patch literal 123 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`DWuUvhA|8Wufjqc3k zoyxkZ2^OA@-RfQzFM5-;r9feI;Mub!&pXxbJc^8yiOXyCR(0I8#5;WF&3P)%`48!w bT@#cvWz`xE!&{HbxqL6HJ@#J3z+epkO>Hn| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-36.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-36.gif new file mode 100644 index 0000000000000000000000000000000000000000..115f407cd3021ec39fe24a7bd59a2c7e819fe613 GIT binary patch literal 124 zcmV-?0E7QWNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0#l5SsjI-} zo}4CDfU{=y^+s{w^evcFhUo~YDBHqfqt#imdh%u0dyt#qdbuF5@`4#hMoUq)bmb;{j#dBhXQ#OYYQ$?$np0029JaW+2y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-37.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-37.gif new file mode 100644 index 0000000000000000000000000000000000000000..b68483e5b4bd3a8fe335bbc564b08fdb2894c1c7 GIT binary patch literal 119 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZLuUviL#k@I+QVpB8 zbsFCfoNv+S>)H0Q!z*pKp1#Z3oIOt?7O!5p^7dVY*;0CDKBxLl2){`TR$452f2pUb X-D;CJiV-Ed*4$jCA?+v1z+epkw;3(Y literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-38.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-38.gif new file mode 100644 index 0000000000000000000000000000000000000000..17891e378f2049f8ec466447a4dce45cf44635a9 GIT binary patch literal 125 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopE=uUviL@1hd+8{L{c zSM+pq70o3RiuxQ^DXq!2)4zG@sn>Sn>0i^Q2XCyAJGL(3&y@o2rE5Q3F`ercQMyyu dZQ-J*G85^ty`oBOT}EpAgWp=*)nZ_<1^}(RFkS!v literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-39.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-39.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5187ba6f3270dcd29224805ac8717e068b0a28e GIT binary patch literal 125 zcmV-@0D}KVNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0#uBTsjI-} zo}4CDfU{FDgXdGhW0km literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-4.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea6c1e21d69176a04d9721e4150bb0225f63cbf1 GIT binary patch literal 106 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf=0uROiCpkYpk(hDgw z>F--oABYyJYW8J3n45iS)kmM*1s>a%)ts){+ss(Mrjuzpm*a$k%K}~=Fq}NG>#M4b J+h$ee%ThTXT ztj#KYqS@`1xKC}A$hz=yVzO7g{;F#_yuUvhA|8Wu9jc(n= zpFZ~0$e89Se3|>manrM(hcYEE@V^#{MEaL!t5!I(DT$b|lKVYg79i>hj^ fL9v=^jbF2_EfOw>I1?0i`q{cGwQ{qRSsAPWwHhHaRdY*}n$Z4p(Hfie>C*n6H+z-UedZ{idUt(?vsuNVxJjix_olgMl`P4L l&A1xF`{l^1UH9^DYN@rKy|paOrYL`N%JZM=;zSr2tO0jHHw*v( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-44.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-44.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e1bd69eeb03c9021914b09602fec845e6e95108 GIT binary patch literal 146 zcmV;D0B!$ANk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0%?qosjI*b z<8lVri!Gxmdmexi0&N8)XJSEJq~Qxxu{{yvn*N+hPrK#qBs4mzmxE|eEv640029NM?4Y$ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-47.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-47.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8a90899a96fc8091e9a4ae2c594ae4ad77f7c7c GIT binary patch literal 139 zcmV;60CfLHNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0%DAhsjI-~ zo}3|8fU~xVGv84kbVL?tprNEr+?kf6ON-=P#d<@vvc21xew!kuVO#+{uv`!a+4O+V tW|LQAQJuu-ap8M{x7?iSJcX8*YNdPji*HXx4gA4ulh=d literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..22fac8d28e0fb5430ef5820a4616a281eee3f36a GIT binary patch literal 141 zcmV;80CN9FNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0%VMjsjI;K zqI3q>i!Gy%YA9_8=N(*fE~OZPmHEaln~p7t$0Xay>J78$f|=rn7^zKifmM^I@+f_+ v)b2?QLZ?`u)rW!3xZECWiZ%! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-5.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..82223983dc99f24d824a6b71d798e5f9c35977c6 GIT binary patch literal 97 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@5UuROiCp<#}Q+-r%j z->G*??wGgDpRw?|r<=cOguUvhAf1>q*Th_Nv z2O9G=cHUrJQdkvl*_P9_Y0B<|va6@kYA?^;7k##FpSWR}$SXgY8NwZBc&D0XlvIUg Ou3aI$?36A8gEasZYAK)q literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-51.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-51.gif new file mode 100644 index 0000000000000000000000000000000000000000..81c6a8cb8e5c8c3dc376ec5216218ff508f28623 GIT binary patch literal 119 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZLuUvhA|8Wufjqc3J zfyGZ$9~##!s5E-ovMP6j)W#p1UhGNR6?%T#j^-(4R=0Ym6kY9EHiLb8irG}7#4VS8 XhfWN?Q6$n7S1X_7b~{ysfx#L8BW*Ck literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-52.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-52.gif new file mode 100644 index 0000000000000000000000000000000000000000..0709c68f627fc6f893056efb366c0f4a4ceb0c26 GIT binary patch literal 121 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`AVuUvhA|8Wufjqc3J zfyGZ$9~y_<+*+&fbLy&xPK5^R^@EpN)Xg)m(f*od>37l0QLTQL*lML@v$@_6g0pzT YHb-9;U`_3Fa?uh0eYE6k4-Afz^>4b^lH)>iu5B{kzj@-pwz&6` rmfC1}{+5ki>VcosEMEEL1{g=bk)8gySj2G7-q3eH%BAH385pbqejGMM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-55.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-55.gif new file mode 100644 index 0000000000000000000000000000000000000000..8483db4262cd2f629abf74adb1e2d75fa353b7bb GIT binary patch literal 126 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopK?uUvhA|8Wufjqc3k zoyxkZ3nbVci_Be^wIP~oy6BThhPvB-T&et~7yLDAouYbrRYS*i6|L|;4E>wcr>qJ# eYd!Jid^WH3{&1sUZPoH<=bjmNx1Hc(um%8mR4=Lk literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-56.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-56.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a4e4f4973008387efcee5958c023249eb0e42c4 GIT binary patch literal 129 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%tAuUviL`Mf!5VGWzp zzI}BojFYJ0R-3snYGTf(X(~d;zpQ*JX|r8<-RZ9i&Y>I3Iu)wdpZlaPY`8FR8Qa6)vq8i#-_`tO2`gGnD`U literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-57.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-57.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e74945a6aa5335c9d2e61d704a7f8911ddd04eb GIT binary patch literal 126 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopK?uUviL#k@I+QVpB8 zbsFCfywBVh%-PAia?#2sn~X%`w^SW@aV*(a{!plxt!!bj@GgsE!9v?>W+wQ*D6u%5 eRP6N5%WF+uZmdzopQTONYZs~cRC9APSOWmh05Bo| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-58.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-58.gif new file mode 100644 index 0000000000000000000000000000000000000000..eacb9ef8c0430ff34876b25445d4d01342e47457 GIT binary patch literal 131 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%wBuUviL@1hd+8{L{c zSM+pq<1-qP6O=S}PE)bk>2vyO4v+np9P^v`ufD`-KX`Xz;ak5mGXBe(_NAPC9ALTD jX60FzRWq)3?MTkQF8OcP(x+YRGG)^G=_S@d3=Gx)RNXdQ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-59.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-59.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc8de230fbc3dbd232dced7c6a19b4aa49f11626 GIT binary patch literal 131 zcmV-}0DS*PNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$PlZsjI-} zo}4CDfU{hO6ji!yah~RT3$- l&hGkjGJRPskIQU!#W$kG8kUZ+-kf^30{+_WMsQUC06SQpHunGk literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-6.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..f653d7914371c8029ac33ab20255112e573d0e48 GIT binary patch literal 96 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFq!xCS1x$FU#42vD=K1qU)PSOWlH4Idr= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-60.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-60.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce8d2c4dc4efbd0aa925f5cccb45a56b099cb5e6 GIT binary patch literal 112 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC{iS1!nXvnYn|Tteu+ zjPm;pBGWtg)00xdnci{lemLdaYoX`SYh4B6A5X1OUgUCOljzi`w=+3%rRK^_&}@C9 PYag`C_-1b%H-j|*Ac!f2 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-61.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-61.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f63460de70bd5f56109dd092f4e197e33962f6e GIT binary patch literal 119 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}ZLS1!nXvuF-i*sl#+ zs$37$&b3H;A~NlnMAN(9W-F!6Nb^2dh`aT*%IQTB=lsLzhW|2--rFddq8BOtBADyV Xk~EK;Fm0P#Q$&o8S$qrPVz34P)gUgj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-62.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-62.gif new file mode 100644 index 0000000000000000000000000000000000000000..677248252e02f34f6ec39f1728e7c08cd878b988 GIT binary patch literal 120 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQF!}fNS1!nXvuF-i*sl#+ zs$37$%6m)-f8H6=u`DCvSnA;M1& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-63.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-63.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1f58cbba05c415c6f284079815a1b3c019531e7 GIT binary patch literal 122 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`GXS1!nXvuF-i*e{tI zdv1S7^xl%VaK@ZvOX601OY3l-o>$ZTHsrE}#BIkiW#9FVE|a=W$7^xS-Z;lUBlOl1 arb6|p0osp~v~}~>AHE`VI>C#P!5RR7oiGIe literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-64.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-64.gif new file mode 100644 index 0000000000000000000000000000000000000000..73aa31be87d63c15151c58e93c5e3a8d0f94250a GIT binary patch literal 138 zcmV;50CoRINk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0%44gd7y3V zqMQm=`Wo20Z)9O$^iko02G)6s?PzN0n!FS1?wi1fKgM+xsps|l0R srsHXh{+6=s&7iw1&v>uIY4aS5yE1JIw|^x&QzG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-65.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-65.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d0ae5514b804270ae3b671a5fa764a0efd7ef6a GIT binary patch literal 132 zcmV-~0DJ#ONk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$Yrad7y3V zqMQm=`W)E2+wfsav|(X$CMmUM>?^gT>eZ?2#^Sgyws)D}f~ed~W7G6NN2cy+L=06* mDYP2p^-kPtQEOc~!&K}SjNW}#rL%jS7Q=~U+K;m<0028N9ywkB literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-66.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-66.gif new file mode 100644 index 0000000000000000000000000000000000000000..76be2a085fe2915cb52114102e8ec5b2d7af7886 GIT binary patch literal 128 zcmV-`0Du2SNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0#}TWd7y3V zUYv9}SaH;fS9^Jlm;j{omD7o^;FY$eN!Ro^+B)ZUal5nqUa1qL=Q^&2Mj~#Bdd5gR iC`=}u`c#`P_xtmRnpbd?iS1C!v-HpmKRe@*0suQAqBorY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-67.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-67.gif new file mode 100644 index 0000000000000000000000000000000000000000..aead237b0fd67bd03d6e8a1867d4d73e641bf27f GIT binary patch literal 128 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopN@S1!nX6E^3IWklhX zuJFpr-Wd}fw9ja)$`i4kcEIO)@t?Ge-M9bgex6!3&AU)Z=vjvv4>z0Yx*p9Xc_-gw g#NJrEeYfCrp2Z~r=KA@7SS?jj2<8}6Zhnq{UpZ~xKYdjrLR_s|g$fM<_jG~@S mBa}tCG^-;l)p|{?M5e9x)CEFQBygJ5o~qsGdiV`00029B^)|-< literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-69.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-69.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab9d8d6689bebef091044fbe76dc3f78ba139998 GIT binary patch literal 130 zcmV-|0Db>QNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$GfYd7y3V zUYv9}Sn;L0qW*!6_+_3#N+t@lZo8dU_|`DW&7-XHfelPxQmNSPw~7pvKBCTe?BRH% kPVriTo*C1V#pH0DOZX`v3p{ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-70.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-70.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1a49476502158bcaf05209b55f42181b082d32f GIT binary patch literal 111 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFuC>gcP@~9v&bgkYGv>| z?Y!@SF~W9>U(SuSn%3s+b-?GmfA8g4zp{RCHbtyTiE`D9scDu%B&AraDiHQ?VFPL2-Ros{~R>%>NJT*9xIr62d~JDS4f79W?xr=kHH%Au^b#LSG( h(NXA(CT-RzReP;=H`p;5dJdbjWtm4zM0Rim06U`LG(!LY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-76.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-76.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a0c65da8713ac10ac94ceb7deff84aaf8414e2d GIT binary patch literal 127 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopH>cP@~9!_%|H&OG~A z$?eCD_m{Rl+TpTn(=x59qIixg-*VM+FF)GJ-*VJVT0T(uB}cV;YEWC!xjD|_IiW3^ fw%vJpde!f?<4!@}E7|moc5iy37B<}sm0`)aVL0s7AHK2Q2(Xc&xd)%mqVa$etBeaXXAACEqSw79p5=C8{n+zLb-v9tai0u(H5eGI0qoT^YXATM literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-8.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..8895d500a50bac8664eb6ed1f1e9e419bff3845c GIT binary patch literal 97 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@5UuUzo<{4_?xtIzei zs*-2;K2UFUd_FPraN>&Dh3{9cn^t>Wsr!2h`;(V^2PgTLRt9QqPTagwgMq;s03#kH APyhe` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-80.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-80.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b17016d3088990900ede96a58a3c3119ae512ca GIT binary patch literal 113 zcmZ?wbhEHbv|!+6XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFnRR!uUv4OU%Hslry{dP z@~ocggS4Jd&siEXSH$mHDYLEWTJL?`*M;+Igg){u*m$%hsr<#uST0E;^&hXXyipC?W_t^P#tBz)=eY~a>^#xG?06X!bw18D-*el@K6bOg+}!GV?{n)I7_0%&R5e)u literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-86.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-86.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c82ef95424eb0678ba8880311dac41aa9ad6bff GIT binary patch literal 133 zcmV;00DAvNNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$hxbsi51) zo}4LG1MJg#atd|9=TMmkHspwb>m|MM%$jP3=Qy0U;-?FqdLd$M5gF2GGMP%`TS8yX nlJy9E7Oy=Zm-i)Awc9fI96gN5ScuZB-e}e~DZGuI6aWA_%ON(d literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-87.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-87.gif new file mode 100644 index 0000000000000000000000000000000000000000..183a631cd29aa2ad417bdd58823ec37e836bd4d6 GIT binary patch literal 127 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFopH>uUv5ZXH{BN=NrT1gthCukA461?(u^pYoA_`JqI(CX1`{QooC{n8ZxWc fOx5X8(UhxgoA2s>=E-?*Dyi6e@6&H*SQ)GVy&X0` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-88.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-88.gif new file mode 100644 index 0000000000000000000000000000000000000000..df65851dceb88d7c5b980116fd205ae75b109dff GIT binary patch literal 134 zcmV;10D1pMNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$q%csi51< zo}4D82<+3a@=8e`7>pN%iDAc@h)cTgrk3HH)+^aA*$@1kY`UE(<3UZ3CE4z9d?}00 oC(!|&(z09Y=esQOq}H+d%w-M9<*WO}T+88>nK7(p=R*YmJGp&5P5=M^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-89.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-89.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d1deec9a0cc6fea094d16ae4a353c0ab4775ec0 GIT binary patch literal 134 zcmV;10D1pMNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$q%csi51) zo}4LG1MJg{JGzB|_etahmgos}+53v=!A2}iS@n#I9t?z`MkXF+W4jS2x}x!$&)v-}H&z`XURB@v RZPhuSZ>J0sH?uNW0{~NkD=q*4 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-91.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-91.gif new file mode 100644 index 0000000000000000000000000000000000000000..d833b44db30deef827bd0069d2efcd43a5b6427d GIT binary patch literal 121 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFa`AVS1!nXvuF;NnzvzY zmHlfDs6Ii$Vh|cw25j1P@ dsW}Vf3YYRS&3usiwdhODVQ)T79W4e1YXE{pFNy#F literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-94.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-94.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d4901fb1f4b9589b598fbf560df0857e7fbce81 GIT binary patch literal 141 zcmV;80CN9FNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0%VMjd7y3V zqMQmQOYs7{d#q856Go*4p_f=8pEsRjpt`J0&Sq2B_+5JF9uZWAIZA46%Xqa1?azbBRF<311Z)_C%wz8Ppy`}V mqje*lmOw%!wy6tgir(0FHjVbETd4Y+MqfBt*3Y9W0028bQ#N=2 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-96.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-96.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7eaa4404edabd9422f22d3d77d8928d50afbe53 GIT binary patch literal 131 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%wBS1!nX6E~;CG=jM= z`m0Xtf-pw;qG>BmZVH)o;E6=n*5Ykd(w8^?t$tIsFPg1wB5SVEQug*L&)&eOti?Is j8WzV)Wxm(7_WXMBsDHmUyezglrnfIV{N0=&1_o;Y>Pa<^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..f94550e42de90bdff9f67c844ab5356b7a3867d8 GIT binary patch literal 131 zcmZ?wbhEHbbYtLUXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFh%wBS1!nX6E^3IX#{g$ z^w*r&1!1+FkxBJd$dkl jxq2=sGrudg{^7doI=0i7t7Wohg{%(y6m>d+fx#L8_w+O9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-98.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-cn-3-98.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa450a02537624f84989b0b659ecde58ea1957f4 GIT binary patch literal 135 zcmV;20C@jLNk%w1VMYKA0Du7iGcz;)|NkNR1OWg50RSuj0000+01W^D0$z-dd7y3V z5{xuXbZb@+?C@2O6E@`tTB3=0uB*il+;C7!WYeEOou p<4k&;LbEn2_ovKNyWUM^@@a0VtBZL|TrWIuZ=6GyfA6aT06QPKIP?Gj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-1.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..36af2822b605602d2506dab0191fcb2bb9082e78 GIT binary patch literal 67 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFiG|FuRQ&h{~lAwrVP<@ U8O4ul6`zL+q|S;DV_>ib09AeyzW@LL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-10.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-10.gif new file mode 100644 index 0000000000000000000000000000000000000000..622fe0ee85e91b3c7b28ea6e7a7fccf358d84133 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hU)m$VEoAM+ gU+*rLP8X|s&^b#bt?u3Hsf?O>k*sZ{*2><{9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-11.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-11.gif new file mode 100644 index 0000000000000000000000000000000000000000..131602facc4f078b30b0839b887ae07b2a8b728e GIT binary patch literal 78 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb(RuRQ&hUpl~8sUd&c f%D8)h55)W0$`>q<+91}Q$LBV`M0Iu=BZD;nOnMj( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-12.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fc18e6f014865eec8a3dc7e69f190d8b95050f0 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hU)p1VTgdZ^ hjraR<=kKVPp1DA9)w(M`CM8@?npyVPR7RA+8UUxv93ub# literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-13.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-13.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6ae45cbdcba6f9c239725dc8dd4888ad5c94bfc GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hU)p1VTgdZ^ gjraR<=X+Gn_v~A-(N6BVm44<<$(Ztw6`~B*0Ey`uQvd(} literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-14.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..5363bc77b5ac10885f5d3a9608847a0c5ba73d2f GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ%$o*^daYG%VW h@#iX~ap9d3KP!(PU8TL~Xr9YjHTBz1ZIf9UtO1)98n*xd literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-15.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6e9b2e6514b491cf377ce9732f0f370d840bb2a GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hU)o{8wF;f1 gIcfVU+EkmCMkKvtXH(D4d%QzSrRw6_J`o0M0Cr~?(*OVf literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..763cf6e85763058099c01b5a18986c2364a7ddd9 GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hU)p2AxeT3M jjgRXp?u(UOjYyj#u~y~PvgA1{CzQ_G+4;?bk--`O&x0JI literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-17.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..81232c2e8f375a9bec2b63b41054c40eab363d66 GIT binary patch literal 78 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb(RuRQ&hU)o{8wF;fH f6`u`Cr2X4|{feR-@4#b+(ejb>o51^}G38wUUY literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-19.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-19.gif new file mode 100644 index 0000000000000000000000000000000000000000..7224ebe0d856c8e93e668d2beb744c616e64af98 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hU)o{8xr&@+ hGiLuTjkf4|z*)9(T2k)HX&Nb^j=p;z#W65g0|1V+8g~Ey literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-2.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d3f0b003ee0651c77eb79b577fe5e537fd00528 GIT binary patch literal 69 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv;}vuRQ&h?@{oBE1Aa2 WtncR4EVxlS{fkSMN0UDzgEau6G8U)+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-20.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a8e9d97f9b5e35f642d96ef51f3d004c29019f9 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvfsrv8slP ijrZp@K5Va4(wz0|>B<$>o0PAwJKd7Ls&^7AgEauxI~|b# literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-21.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-21.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8b44192e5eca5ce66129e56eec75297acd7ccef GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvdWLk*b^- izh>Rby(iSRxMRk=Rc^Vz8#1{r-#MOn<)l0-gEaue+8pWt literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-22.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-22.gif new file mode 100644 index 0000000000000000000000000000000000000000..097b25d2f5d63002ea36b85a72d4b5a3b6652819 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvfr9Q^a}R i*~yo4A5Jfks+^{=V#fT}Ym;Sy`%@n)?WtpBum%96jvE*N literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-23.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-23.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa5d510e89a0376b9aecf71d20fbcb14027c0d6d GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvfr9Q^a}R i*~yo4A5Jfsg=S*YuI*^=erq1Rq)l2th$%eg+Ak--`O%+MQ` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-25.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..0686005399f15d5340e43cbf1904783c4365124f GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hUvftJt%zcV jh{DgccZK2>Z(BHb#)gU7yZm{wuH+p3t~NiJk--`O!$up> literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..a110f7e1f69ed76b9b20ff7e173cc14eb1e28cc4 GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hUvfsqrHlg? j8_Vb9%HPO%=Gr#*d1KDhZAL%OX{W^gytb^4k--`O>Y*Lj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-27.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..8519568a9897d9a3658611b7901430c271026b75 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvftJt%za< isp8MAH$Igr&zSOj*^0&8>y~;QUhArS<&-=tgEauRQ5-h_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..9de9e92b9791d0d21750652d21e7a995bca1850b GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hUvftJr3hmO j>GprEGmlHkdUVa7I%~1_qM|iZwNqj%TeoF0GFSrut-Knm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-29.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-29.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d569749a4699ad486db3ab72fc3b42244160dec GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUvftJr3hmO k>GprEGmm$&d6YevS|lQMaOw70tJg%Ve>!Pj5CelX0NBPHhX4Qo literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..f325028bb8e1a5211ab2f30fb0953dcb5ea9b888 GIT binary patch literal 69 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv;}vuRQ&h?@{oBE1AY_ WMZxo9W@{uZxo9gG*%ZvkU=09^1QgW( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-30.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-30.gif new file mode 100644 index 0000000000000000000000000000000000000000..7387f5568d1dbe4a150f38b931bdc3c88730e701 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUvfsrv8slP kjrZp@KHOe7&m-@JSJrdRO1*CRbjT7xso;LTz@+J?-otbRGprEGt*;~JfGj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-39.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-39.gif new file mode 100644 index 0000000000000000000000000000000000000000..47dacb2fc73b7a3f977456213d4a864243b8998c GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUvftJr3hmO k>GprEGt*-hcuadSwM$H@arvv0*{0sly0`BOWMHrc0M~vTHvj+t literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-4.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..88fcf179acd8c1cead9c84701b9aad4871cb93a0 GIT binary patch literal 71 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<1wuRJaLK&FS=r|ZGd Y^Eo!P7ghVF9aT+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-40.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-40.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba3c211c553a01146b073d114a419e776205fa6f GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hbDqn`1}nvN k7VRej@1?g~%P70MdFrC_qfab%ecNVMwDQ^42nGgg01coY1ONa4 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-41.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-41.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bad7e10daec5793fe3cbafffd6426af1363332e GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hbDqn@bF5h> je$Bd(doQr{VTjY>A1k$|M{2*UQ$Kw3XW991Mh0sD^}Zes literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-42.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-42.gif new file mode 100644 index 0000000000000000000000000000000000000000..440f06436c0e211ed186335e8401c21bc08d5704 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hbDqn`25V6> k(=RfmNyny2y__jxwQfau?#tKbHvc&i6Z7y(Gy{V*0Oo}qx&QzG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-43.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-43.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a6863febeff7001ae68b14e90f47e1cbdb7b3f1 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hbDqn`25V6> k(=RfmNynyMF%MlaGwSrK7$a`)#XE2QJahF)JOhI@0O0K%KL7v# literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-44.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-44.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc84a15ccac0be81cff5f21c3e3c476de10a0ccb GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRQ&hGo&U*$y=W< n;dw{n&D4m=-{-Vj6=nb27IS^7iC3kX-qqFbCvyt2GFSruC#)R5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-45.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-45.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fa9886eb6032891400541b2638374c50493eb23 GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ&hbDqn^hHCXS ljoG(k?}<;7b(?nQ*Tz#n5@vGxuZz-OVLJb1zXk(?H2@KD9UlMy literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-46.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-46.gif new file mode 100644 index 0000000000000000000000000000000000000000..7799d793ca2ce17bdf0f8ba293bf70357b29eedb GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hbDqn`hUn#I lV{Qke-eZ>%G@JIy)o*TApM-W-oX508(;tc literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-47.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-47.gif new file mode 100644 index 0000000000000000000000000000000000000000..e79fc53774e4323bddea657a2204b63e0a209876 GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hbDqn^hHCXS jjm5H+)5=2bdz59&T=kke>Hf@l#%B{mTDPY#GFSru#P1t^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..2463cdeae9f9c8172406926ce18d21c7edd1bd84 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hbDqn^hG_M* mmR}?br=(4Nrrs&$R@I)Bb>r#2wXyRx4p;51=T_okum%7dHypMA literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-49.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-49.gif new file mode 100644 index 0000000000000000000000000000000000000000..da5d04a14e58a67e4d9e8e734126a00c249c18d9 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hbDqn^hG_M* mmR}?br=(52=h3zNtL4q=wNhfvD!=5mwp8xDw~LdT!5RP~z8ymV literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-5.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..fea6bdffc06eef8b711c3af4460d79329838cf2b GIT binary patch literal 70 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<4xuRQ&hH>rj*AZ`7m X$o6}cZXS(`eonk$vT9K<1A{dHnvoVR literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-50.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-50.gif new file mode 100644 index 0000000000000000000000000000000000000000..cff327b1ffd09291f22050f90d0d83de6f17bdc5 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwp>rD;*7& m8XwQAc;H^Rh@&(_6_cCWmbi}f7dSn~4by)01%25SIk=O7gT literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-51.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-51.gif new file mode 100644 index 0000000000000000000000000000000000000000..84f7d1d7df20eb129bd8e7d2df06ec8980544129 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUwnpevn_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-52.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-52.gif new file mode 100644 index 0000000000000000000000000000000000000000..e30475d191538acef8ad3154fa870164ab62437f GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hUwp>r3mpxY j+LH5IBODqZm6tu9w)U0xE`#S6)rw1(>V0=(WUvMR@%kNm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-53.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-53.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8d7000c7c56b6574d1b23c1e76ef8c76912cde0 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUwp>r3mpxY j+LH5IBODr+a8_#k%2n1}wVtP3c6aEsx_$eC7#OSp;f@=9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-54.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-54.gif new file mode 100644 index 0000000000000000000000000000000000000000..8068d39a3bb84cceedab1106839d7394a7b65cdf GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ%$p2259nAOA> i^Vz+PGgp3sP&D jDu4IIv~v_iB`iw#k-GBdw8twKt#odkvGr0D-lK k+S2c*3W-iidXN}ek)^<~RD;R>)9tItS&OQ)wHO$z0pP+Kn*aa+ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-57.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-57.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2a58ef08e7f5fda5d03820d7976f5b8ddf95613 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUwp>p3sP&D i+MhpAjGGaAd-+nWTb(*Lj%9dUOL12Hc3PU1!5RR%OB>q& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-58.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-58.gif new file mode 100644 index 0000000000000000000000000000000000000000..499bf7e17ab69b53436029a146423bf6db47ad2a GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwp>p00F^k mHtn?y^S=i!bnVNCT)JGtNr7$h=3U$RGe0inHW6W9um%AC%o}L{ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-59.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-59.gif new file mode 100644 index 0000000000000000000000000000000000000000..da87a2d55bc5189acaf17f3f757005002d0892ec GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwp>p00F^k mHtn?y^S=j%O>dl`HEH%uyH!HgpL4F3gnqK*3=v^qum%7McN@h3 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-6.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f6e052a8cc5b106b1f858ad0380c07e8c839205 GIT binary patch literal 70 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<4xuRQ&hPpKkP%A5II XhF4wU?ajRb?9&ugJJo)OFjxZseL@rm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-60.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-60.gif new file mode 100644 index 0000000000000000000000000000000000000000..58a18da9542ebe407c1f9c4252600e738b7093cf GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRQ&hUvkESGc#6Q nl*wOO8{yiiR#Ka|!A`q#%em9Xr^k)ucRt9STPRAY= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-61.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-61.gif new file mode 100644 index 0000000000000000000000000000000000000000..beb35a996593e6c4b039e4c76ab457a8cf26144f GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUvdV+)r|8? iBevfTjk(4;xxH-(W76B`S*zDvh)*szSQIAuGivLCgPhFPOXZv<&xrJum%A9$Qr}| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-67.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-67.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a1b40de24b1e181377445e18129e548583116c3 GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ&hUvkEQ3zGg@ m_Z**_^FTb{6h~s*%*+!V%iiDF^e*@4a?j^q*K05^SOWkj`X5RF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-68.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-68.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6271b79629cda257404076d852acdccebd6c98c GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUvkEQ3sU@i mrJw((&ih_6Ij!+dTkI=|Ws*GSJ<6k>JbJZ!9hVjtgEasrpB;?= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-69.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-69.gif new file mode 100644 index 0000000000000000000000000000000000000000..83088d8173d6d0ed558c26e08469e6c5b74720fd GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRQ&hUvkEQ3sU@i nrJw((&ih_6xpl(1&b%CxsO7hgC`s&=(hd4_`e9=mD}yxvM&TYn literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-7.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d77991b6e29e168847e41ac6c67120b8566be8a GIT binary patch literal 68 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFiH3HuRQ&hH>rkG#(Vw2 Von`+OVrD;*7{ iRwZu=AF)k}k684otM>WLNy$IYiL>07o3o6S!5RR^@EocD literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-71.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-71.gif new file mode 100644 index 0000000000000000000000000000000000000000..c89624199988c5ed1be4373c00946087e3be0041 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hUwnpe?)g(l+d*N*V-2^_9f0VQwv>KDkI8Z4FH=_8%+QJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-72.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-72.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab68859ff6c850aba5ee514dac6795d66a450b94 GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hUwp>r3mpxn hvy$aY9)6qH`D0<)%D$(s_C2^0D(H1{+Zk~NYXHNZ9vuJx literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-73.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-73.gif new file mode 100644 index 0000000000000000000000000000000000000000..1882221e71340f5c30c42ce58f2ae4deb888d2c3 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUwp>r3mpxn ivy$aY9)6oREn-n5r&d-=m%hkk(K#`9&eX9oSOWm4cN&%e literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-74.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-74.gif new file mode 100644 index 0000000000000000000000000000000000000000..31935101d80c7b543a76492300b9bd354447c1eb GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ%$p2259nAJp+ l+28lnUYcI$9+8zbW!}1*o0hx!ZI!v}om=@aUxR_c8UO%P9K`?t literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-75.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-75.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d2f4cbf7d16dabbbaabdfe32b137aaa9ac092dd GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUwp>p3sP?x it<>cj79Q^q->Il(<+bLr0D-l9 jH@@6yov9q8{3-O_&Ta2zEYjJ&RqIRPvgzk@7#XYq<#Zjz literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-77.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-77.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f71f68e41d46e726258c5ffdd5342e6533cba5a GIT binary patch literal 79 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb$QuRQ&hUwp>p3sP?x hccsfUES#R(7175zYg3ljv8CNf0=+jr$cZpm0|1Ai8gc*t literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-78.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-78.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7c0c2dd2ce6cffa222e8fb9d974f184f25a0406 GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRQ&hUwp>p00F^m jiJ$M(#&O8qGi!PrI_q8ZyeRK$DWYqq%)FG!$Y2csxceJ@ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-79.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-79.gif new file mode 100644 index 0000000000000000000000000000000000000000..df823928c5f53fb5e2a8d6f937f37894cccec382 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUwp>p00F^m kiJ$M(#&O8qwn)1-%Pr%olVRk#WtQ4Gt<(1fF)&yI0LDZbxc~qF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-8.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f406a1a9d7c3a3d1266a2144dacf43267138645 GIT binary patch literal 72 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<7yuRQ&hSE(XX&YSt# Z&slRlA8hUwNHTglebJ?>Wxk9I)&R(17eD|2 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-80.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-80.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1b92cfcd4440f93c5ff4c4ad08830268f47d546 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUwj6`*^J^9 k($fD**(C~>wFN$ZF>&hcw1QP@rBAMy)?NKCkb%J(0MWA?cmMzZ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-81.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-81.gif new file mode 100644 index 0000000000000000000000000000000000000000..9301ce266debd74ad741a5ff2def6fea3bd829e2 GIT binary patch literal 80 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFsb+SuRQ&hUwnqb)rxgH iMbekBDjtiByVkgTMO`|_`i;ALgS3L??48HTU=0A4tQwa9 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-82.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-82.gif new file mode 100644 index 0000000000000000000000000000000000000000..afd653338a416534cf75ad92d167e0559c291ff5 GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUwj6`#fmI5 jtCAm?ciD@Cj>U5RY!S=KGkjC^iDi|X>ZT9z3=Gx)xKJ8! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-83.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-83.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4f3755a0a2b588e5f9e94721d4ea3c02e9b67ee GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ&hUwj6`#fmI5 ltCAm?ciD?hwxmvXvQnJA?_S$U#`fUm)MJD%`Chox%92(u7$hOjFl#JeZ4xBJ4A$m!5RPtkQ^ca literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-85.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-85.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3f0ba596f941eaf1bc36183b5829b6d15895168 GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ&hUwp=c3zEKD lt(Mokw2mHsx@K1a{qbfxU?6fP|;25SH$XB~_H literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-89.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-89.gif new file mode 100644 index 0000000000000000000000000000000000000000..b70afd3cec3493fb5076b0f417ab259854ca1972 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRQ&hUwp=c3sSt- o62Je6RAf(5d*mp7b7^0?-{LN+6lzrUowZ>lS5Tum%7dw;fyn literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-93.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-93.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c980674c1ed68212b0c7cad9d83b852300c2ccf GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRQ&hUwj6`#fmI5 ltCAm?cfYrYMW$)IiqT%yA#HX}?)bdmqK6;OYcMca0|4m>92x)s literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-94.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-94.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc4a435878f16a0b10601280796c340efb3f357c GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ%$p225#`fUm%g{$ndy4#=(3olU3$+VSNc>h^*#8D$3}#K!5RQ7{T+w^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-95.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-95.gif new file mode 100644 index 0000000000000000000000000000000000000000..154d3147dff4c3789dd28559267b78c0447a92a0 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwp=c3zEKD lt(MAmiRi}tXI2uctjW&tO4Rq7~%i` literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-96.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-96.gif new file mode 100644 index 0000000000000000000000000000000000000000..cea2de6bdba24b071ed24528c1ed8132cbe3e3ad GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwj6`MJZ;p liu@m;@y8-(nN3tzuhJ@QTcw%)E^5*F)Prw$TtpZctO48a8jSz| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..24ec505b6695cf7836948f4224cc491f82c1102e GIT binary patch literal 82 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqMmuRQ&hUwp=c3zEKD kXFb2mDlIW_$&A)TGovJKs}*p~d$uyhvgzo*Kn4bD0OR`{F#rGn literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-98.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-1-98.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9cff44009405119bb9169c0ff79ce27ff9989eb GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRQ&hUwp=c3sSt- m62Je6RGeOUgR^h4+tRyHGuLTMe04SIm~qMLPI>+2GtR6G)&P&q8l(UK literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-12.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..d78537c0c5c4631be850ac5648e32651c2e1d57e GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%HVPu3>WN l&#En!58S;TNwl`D(t2|#Ym;~Air7OD+si9>TSOQbtN{~#9BBXm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-13.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-13.gif new file mode 100644 index 0000000000000000000000000000000000000000..273c4b51c648ba90fe2c613720c2f03bc9cd9d04 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%HVPu3>WN l&#En!58S=H%-s?r16K>~i@LQ*Y3E7twofLkJt7PY)&TLf8tMQ5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-14.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..c36c61057b787f1213e4a1325301352b4faa5692 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed*0bNY}Pxb on6EOdw-$FkG@ZJ%edYqyqxvmH^EYnVb?3(RiqoxaT}%wt08GXoEdT%j literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-15.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..88c341b5cd6fbe397c63abdb3dbeb27ac7bbb0a4 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%HVPs=;uR lpZvTAZuL5mnVP9PX69~bdR@KqtLNl`w54XOJt7PY)&SI`8e#wd literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..63a5e42002e6abc01c37154a1861c9070c0d03fc GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%HVPt|7Nq nGIDRBIE!9YttLJC8sG(nz_tqlh*T-Uw7Tzc_nVHAEz4^gEasdu^npw literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-19.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-19.gif new file mode 100644 index 0000000000000000000000000000000000000000..78558b904bcf219c174363bef1cbb90c452f8fa3 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%HVPs^M+# l&y3i>YttJ}cQh<(id!`!DUoY_iS2XgDJN?^Ik~tQtN|UW96$g7 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-2.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7bfbeacfc4c7e6661b6512e6ba191b7a301ccc0 GIT binary patch literal 74 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&!*ugpHsFT=Ay?WaLr b!2QY`5sSLXCrY`qre%gj>U&DFGFSru*0vQI literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-20.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..17bc59e394b4a8347ac705b46f01f421469403db GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%Jsq((Gk6 no3;05@N=*|bxWK0uu$viu}#HSizT*y4^K?1jN+7JWv~VS6TutE literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-21.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-21.gif new file mode 100644 index 0000000000000000000000000000000000000000..938f9532247a142af17e24414b5a00133254fbdc GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRP7ed%JtVvd#_G lo3r>5Z>3L=UNPh4))hCoymM>Vl1F literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..4af2202fe539900c124744e0515179b0b773a1f9 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JtVqO9{% nZoPTy7|)=k`aK~{WYXiK`*PI}eR)&zz%OxfellkyD}yxvRy`h6 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-27.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..39b17bd25dfc8d7fb9b5be538212da5c9b2bf194 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%JtVysnE= muD^Nf7%$O~5~7yYHA`Dt>-}n7?Ynae^b!|zb8&GqSOWkT`x}M; literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..403cdcf8dcf4f738fbeac00b48c343c4fd78c97c GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JtVysV2; o%yZ_~ocdO?=tScxF-aA(Z7SZ&^Y&WJ?bMI>_IhhuFB5|`0Aax%ga7~l literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-29.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-29.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f7ab92c8e4f04b14fd8708a654c8136f935844f GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JtVysV2; p%yZ_~ocdO?=)}y#6rU$2XNmDFynA-*f^~rrosk>c4l^-W0|16gATIy_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b316d5e85d6f9622fdd42d832d69bcd2880e0fdc GIT binary patch literal 74 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&!*ugpHsFT=Ay?WaLr bz5Z>3M@nyR~O);vLu_(Yir**3dGqN*Qp^N2ApSOWm{E*bLx literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-32.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-32.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef45b8aaf684b2ff50d0bbfd44cafe86a13cf42c GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JtVA}jy0 nTTf&gPChRU7wLM~F-`q;-m0v1dO9;xbR*@qWpgUBGFSruG}0Ug literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-33.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..4694409ccd07baf1c2eeb4cf40edc65cb60cf9b9 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JtVA}jy0 nTTf&gPChRU7iqfIG40LGE-ja~W!f`M_14bI&*oHSWv~VSK&Bks literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-34.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-34.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3792d26fb601e74f514fc48cf8afb1b1e93627e GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed)`^NY4xg$ otFz`5EOhBgdX^jM!Z!Kjs+Tv;T=#V?K7D<`7we;KolFeY0A-3F+W-In literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-35.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-35.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ddb0decb21a580dc18f4fe84f7d4da6cf3dffb4 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JtVysnE= ouIGGhj1|Zd+?kmAvf{CKr`q#L2G+NKowL67b@kk~fbdv21$x_LgbNKGWF3P?h!}0CyE5^1cmn238YXF1S9&Z2u literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-37.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-37.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b2021c268d755c75d41e08022b081bda32d3704 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%JtVysnE= muD^Nf7%$PVBx9P_s|@bnyH?-0YE-_8b4_Hq948w$gEas_rX5cJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-38.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-38.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdf67253aada8e9328a17979b44dba07bee303e8 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JtVysV2; q%yZ_~ocdO?Xh+I}RjzZ}d)EbS+je=Tx!-0xtDwY^%}Glb7_0%xZ6JgI literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-39.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-39.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f2bda5d8340fae65dc59e6f3c004cdf16c8d437 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JtVysV2; o%yZ_~ocdO?Xh%w#MCp^8Qo?Lm0+zS7-+sB>>+{jJUM2=>0BlMhQ~&?~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-4.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac139f1d7c35403a6bcb75d517f29cae96418637 GIT binary patch literal 75 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&x)ugpI1I-n-qEb8r2 cKX(1xhr*Q$GKvml&Fy;TmEC&PpOL{D01|5$OaK4? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-40.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-40.gif new file mode 100644 index 0000000000000000000000000000000000000000..bedb1cc39b7e62e23d4431a86a0cd55b0bd33017 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7OR*t7Ah~?Eq q-TcF`7nCz&IvQV1FIzox!D^1}e$TFc4w<^q^<#tIfkjIh7_0${v>+k? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-41.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-41.gif new file mode 100644 index 0000000000000000000000000000000000000000..6639395d938ac16464c85698738875d947d45c07 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7OR*t9WQiy-v mf^WGEH(EOuiS-Gp9KlaPVLtDn>boo8LR;fh8w{E literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-42.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-42.gif new file mode 100644 index 0000000000000000000000000000000000000000..44cc31e7f2bfaad0c84c063a0b815d93a66ec660 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7OR*t7Ah^1&% o!0c18b3NJ~e$##CA@}^{u^G2gGHb=H~Gci~L06a4tZvX%Q literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-43.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-43.gif new file mode 100644 index 0000000000000000000000000000000000000000..f02ba45a1bfeb993ccbb227e6248068f3fffd72b GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7OR*t7Ah^1&% o!0c18b3NJ~e#?E{xm56#%$l32ayO!u&hg*&rtoFk1SSS+07%Fl=>Px# literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-44.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-44.gif new file mode 100644 index 0000000000000000000000000000000000000000..9251b42e4ff72990f20dd2191d82714d8ec2de3e GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7OHf~b;p#UdP1UFMxN+)-Q%)&Sl38(9DV literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..7cf3ecb574b9eb138693bfdd68187faced42e119 GIT binary patch literal 89 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jpuRP7OR*t9W5_6I1 r?$o}L*pjIU9G+9Xs??WmJ^gD|=@Q%9d2?;9bsw}lFt0F(fx#L8f0`ba literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-49.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-49.gif new file mode 100644 index 0000000000000000000000000000000000000000..25d5332a1185a080dba9c95df0359d12628def32 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7OR*t9W5_6I1 q?$o}L*pjIU9G+UItkS=3ed1Z0w5s>^i&@*3t~_cmZP7*s25SImJ|86j literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-5.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..c19691893a091740271d6e50c19a4df4ba707a50 GIT binary patch literal 74 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&!*ugpHsFT*m$P2$O= b--V&IH%n@ik|&*A+NU}#Qr}0LmBAVS@){P= literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-50.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-50.gif new file mode 100644 index 0000000000000000000000000000000000000000..23a306289633be8c61a22c247964523765159d62 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JnTwc^WD nvhsW~Pl!*Lm0GjJvT2pX(o}EjJlpo7eaAGeb#u0|GFSruE$|$P literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-51.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-51.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f178dc14e91084db980669d2f9d7bd24ba16123 GIT binary patch literal 83 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqJluRP7ed%Jl-m`UN8 l<9h2F?z&e-dGux}S*g#KnsZ~H@vhiSQ?Fh;uff1z4FKeE93ub# literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-52.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-52.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ffb20294900045bf9f3703a076771961f7768b0 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JnTwdBiF ovhqKdDy;~-*%7EI#J2XZ-uqXVHhNwAsTaH8X(vZ}I}?L70B+PDApigX literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-53.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-53.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f91208a2d3b21f23f1b1a70080a77761c13cf96 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%JnTwdBiF mvhqKdDy;~VESf5_GHK%NO?+<_2FgCzG^MHb9~T!lgEasmK^+(X literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-54.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-54.gif new file mode 100644 index 0000000000000000000000000000000000000000..7df8ea0a2eb458f0962e77a8adef34c86c320aae GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed)|3-V|B1; pb?MLADdH^xVZO^$3)hKlU8%H9f7jJA&VIpVC-)>BiC|=~1^_=D9KQen literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-55.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-55.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ccdce471860687bdbdcdcceaf23ee140f69b4da GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%Jl-Sn~Us oL52Q}e5tvqpE?g7S(@2?>_b=X3GK_j&RI)+d+pjbk%_??0BsQ;>i_@% literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-56.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-56.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddd5a395c800217d27a30bfb2029a49038401b7f GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JnTwdCa& q{W9emI5m`1({dl02Hp5I>*DE&>!MDVpE#a1pj61)rO*yA%bJyu()1OVcy2`cfhyx>oH2{JCAF%)c literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-61.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-61.gif new file mode 100644 index 0000000000000000000000000000000000000000..3acd8049aa8cef0850058221c7a662ec2aa69607 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JsqU$K8& md6Zu3sWzKe+8tdhMDNCl@a(gEau+6B$ha literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-62.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-62.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b888259002d113baefd3cd21c47bad5d5f9d26f GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JtVxrEE5 p>Gyg)PcQGB$<*X=b?Unv$5z~s%JR7V>zuWEnxbo)i!&pGH2|g-A87yp literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-63.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-63.gif new file mode 100644 index 0000000000000000000000000000000000000000..1539aa60de0a1b485198e3f8c8531a14abc69ac6 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JtVxrEE5 r>Gyg)PcQG34ANBanzrJ`%6C87j%~a4{oMC+mEK2{jx1Wpz+epk)uV`n=8UZv}>I>G&AIz+epkk}w|u literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-65.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-65.gif new file mode 100644 index 0000000000000000000000000000000000000000..844bb311e91cf5974f8d9b49f113f6fe3a02a580 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JsqU-ZQ( o&x^L_bj`2{E1!1hnWW0fqpM_2>BN?=JGWj^tI4%(0uzHZ0Ao)c0RR91 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-66.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-66.gif new file mode 100644 index 0000000000000000000000000000000000000000..63b7711bc8946137daf92d863fbdb506b6141f7c GIT binary patch literal 89 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jpuRP7ed%JtVxdi=X r>2Z54xn@j|4U_CQ^^&hrTBg-rqC4*v-^ZFaUMnLGbbO3pV6X-NZp8!E5=t!E=i0G)&PQpA4>oL literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-7.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..eff8cdfd0f208a60e339979eac132a951da30fe9 GIT binary patch literal 72 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFv<7yugpHsFT*m$O(Mmw Z>g2ryMfIk~Po{Rwob*cdm=`01H2}137HR+h literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-70.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-70.gif new file mode 100644 index 0000000000000000000000000000000000000000..194c36f5d6e9e8ea7fac192f85ef7f4347d6d8a3 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%JnTwc^WD nZk)MWc(A=8`N`6UTJzR;Z(O!B=RxnGcXQ6y@b!o=FjxZsbU+}G literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-71.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-71.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e40731ed2619125d4b6bc1594da8f00633c673e GIT binary patch literal 81 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqGkuRP7ed%Jl-m`UN8 j%j^C~CKz;0T&cPA)V3+J_j&F-l%dltR{pJyk--`O%2gaX literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-72.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-72.gif new file mode 100644 index 0000000000000000000000000000000000000000..2796121cec1e67d65b66f6100eb9a0f42df44e8a GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%JnTwdBiF mZoGLL_)wxD)kSI9&JD}kHm&1ct@~?|LTvT5cJ4)74AuZiKptrT literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-73.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-73.gif new file mode 100644 index 0000000000000000000000000000000000000000..5083757a4c8254d6876159f0c6e4df0f719fe649 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JnTwdBiF nZoGLL_)wxD)urm0Pb#zRt9STS~wm} literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-74.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-74.gif new file mode 100644 index 0000000000000000000000000000000000000000..27b1d58418abfb6c0a6d15250a36c2765c176f63 GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed)|3-V|B1; l_0_qV7g*TlN)}Gia#Ow4r|rE|;oGh_oovN9T+6r^tO4278T0@E literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-75.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-75.gif new file mode 100644 index 0000000000000000000000000000000000000000..7048060a25395efb30c2c3e389f223f1e6035b3f GIT binary patch literal 84 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFlqPnuRP7ed%Jl-Sn~Us lMUVN4<`^|Oy1A(kB=6tPe#NQC%3uuuEZiMm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-79.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-79.gif new file mode 100644 index 0000000000000000000000000000000000000000..483c293364b36842c3dd008833251b982ca687c3 GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%Jl-Sn~6W odFMC7D|LHjiA7qzBM$L$5)8e`=<8$tl_xD{-g4QY>d9;v$!5RQ-L>`X- literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-81.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-81.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fa1192f70db05312ef0878c5d3681fba7748e6e GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JnTxne`t n%j@Q(Jlf8xkg;IS@riz`HM6)bCuTn1cx2W!({2t)Rt9STJ9`~O literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-82.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-82.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7c764707ebbed310a844ff5cd8a42c1801cd39c GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JmoU-ISH o>U**c9__LVET*0EOuePGR89Q+tLWA9b#^Y?+Rf44#>8L^06s|_H~;_u literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-83.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-83.gif new file mode 100644 index 0000000000000000000000000000000000000000..d963a6f4721646df7ce82d8d027bf6281d9fc74b GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JmoU-ISH p>U**c9__LVET%2)m^HJ=Yo(j@XY%Ek{Q?c|i?VW4c=e0I^rE8muGb4jF06@JPNB{r; literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-87.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-87.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6eb3c65e268c48a72c246a3e1d7a2c50fed603b GIT binary patch literal 86 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP7ed%JnTxdiQ9 o-RDmyUP`O+nla<0XQcM)3G7K0AV{FZU6uP literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-88.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-88.gif new file mode 100644 index 0000000000000000000000000000000000000000..142d8f3cb87c4d2a70bf670abe39cf40802fd197 GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JnTxrFr> pz3k@~aB%cpDf3xm5w%j pz3k@~aB%cpX_K2{5v94!OYKkVrdwzGDvwU_{_NUz#DS5)8USgi9*_V4 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-9.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-9.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0e10e36bf04c10fa868a1ba284076697b6bc0ef GIT binary patch literal 75 zcmZ?wbhEHb6lLILXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFe&x)ugpHsFT)Zdx7&cv c`q%u%v&n&;;xnbC;wEcrUFEu3%E(|10NN52EC2ui literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-90.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-90.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e4e8498a644e51dff0aaaed6f8c6e041ec3fda7 GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JmoU+~q~ p>MC7D|LHkPB_^yWPRa7#`I5{1M$G+%eY4Xt8RzA=Br!5r0{}_R9H{^R literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-91.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-91.gif new file mode 100644 index 0000000000000000000000000000000000000000..86718d6928c13aed2789d61913e73f011609f980 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JnTxne`t n%j@Q(JW?-Q#x&1y={61PMHAh2C+05Ee4co1>ugSORt9STFCZMo literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-92.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-92.gif new file mode 100644 index 0000000000000000000000000000000000000000..258be053207c5e53d57944183729bc181e8a8aa2 GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JmoU-ISH p>U**c9__LVGWt$w&RpXbx^S0UX5{uCdp`R;WBQeI#DkH+8USs!9|Zsa literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-93.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-93.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fe77700a63b24ec98836302e907139231f5973a GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JmoU-ISH q>U**c9__LVGWr&GOp{n07`kFkpx17z_UHfNPp|RVp0tsH!5RRBfgc+H literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-94.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-94.gif new file mode 100644 index 0000000000000000000000000000000000000000..6edf31811004566466ecf83d727ac8321457eeb2 GIT binary patch literal 89 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jpuRP7ed)|3-V|3~% rt!lZ3TN2Y|yGjacth)4S-nG!M9FruIoj2ybIZ#rjHb*d=fx#L8he{pm literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-95.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-95.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5f101515620cda122a8a945518b945a8c06c7d2 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JnTxdiQ9 q-Tw0$Zg+S-`xx2Pu_)f#Y8J<)xrLP?F^>wD-^!?%xM(8-gEauBGau3b literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-96.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-96.gif new file mode 100644 index 0000000000000000000000000000000000000000..25454207f071188d2752d7abab9c9bbd42b7c191 GIT binary patch literal 87 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP7ed%JmoUvmBh puk)u1JGKX2iio<~X?s;LXnps!z^v(O{0@EM4*r?vlElbh4FHF&A0Ge! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..184a04b9894c7762a37681883c5a668a6c619b32 GIT binary patch literal 85 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP7ed%JnTxdiQ9 n-RDmyUP`O+@{m*PTD9tWpj3_9ySY{sk=|kZH*+eoGFSruFwY!C literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-98.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-2-98.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6d4093582d7e1131a96c96052898dee5dab86e1 GIT binary patch literal 88 zcmZ?wbhEHblwsgyXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNU7uRP7ed%JnTxrFr> qz3k@~aB%cZ>dd{n)Ay!UXl7-HU)195U7!DbS`}F`anVKw25SJE2OvuT literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-1.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e290bca54906996accd19dfb0ac3ee8e7c7a96f GIT binary patch literal 86 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNR6uRP6LD_3HCO*MF% ocrJ5G#Boh|k41}TvMpb=b^Y#T?=Ah!Zy(Cj`1G}{lZn9^037)pMF0Q* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-10.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-10.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5436d5cdf2ef1a4e7e0c247cbf04eede6e83529 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb&>y4AubBW+K!8 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-12.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef0ad2d71990abd0e97e827510893e8a5dd5dcf1 GIT binary patch literal 96 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFq!xCuROi?fmBbY0Smk% Ap#T5? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-14.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..e25aad4872e16aeed43ccfdf2cf636c6ed37b338 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbvZPLA7`;p_gT88}UkeC0Wy;D70VsyVVDFNkjP2XTKFcj=9TujjVo{Uotvz;cT-8-fx{otRG3no0)jYuMHm>Y0X>8y Aod5s; literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-16.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..df43b72987f9c69d62ff3ffb34fd03c0b28ad1be GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbDHEbC&cDp|d3nS{@=H_?|L>CUbzOXf`8ac6z{c literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-18.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-18.gif new file mode 100644 index 0000000000000000000000000000000000000000..6cdc5d0a6d3f5a0ef8d6baf986ceafc613a05eb9 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBbl*VPvod E0G2H#I{*Lx literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-2.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..41113d5cdc721f903dc13ca6c3eeb4dff5976b66 GIT binary patch literal 87 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNO5uRP6LD_3HCO;zxQ pX8hyEY2SL6R7^`eKJ8%EG4Vf1db6HoMW3$T^6){PiyI?@H2{5tADaLG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-20.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..6709b459b098d76e47347edc0c939ae2a73849f7 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9pF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-21.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-21.gif new file mode 100644 index 0000000000000000000000000000000000000000..c102bf25aaf44a4b599136400be39079700f9d70 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb|MvPC`?XY*%QRYU=0A5 CtSPMk literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-24.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-24.gif new file mode 100644 index 0000000000000000000000000000000000000000..a656e453d6a080c009fd486304a61dc0beced6d3 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9fRG3AHw&|I&YeX{IUuow%H+Wj11NQ Dew8FF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-25.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ecf2bd3a1780af32f3b129a794d23a5248beaed GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EXuROi?fmBbdjOX$;CI)K& D#`q}W literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-26.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f5f90d34b2144cabc94a8abb2a7103f61c20420 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9oUewy~~2PebQbzW6!y&n$3)!=JQW<{1!D|AYc^Plg7nh4FER) BBy|7) literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-28.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..3962891cd30a43198093338702d141fa8d9ca982 GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF>uROi?fmBbe;#+>0iNP8G Dc2OpJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-31.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-31.gif new file mode 100644 index 0000000000000000000000000000000000000000..46f837cf164ff783d9576e3fde3926162a53c0ce GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBbU+B^YL54ZbHXpHoDw#uRSWiO_H!@c@k(Z8um%8M COC*2* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-33.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c793bd799afd7075ace75b011d97e3df71dfba9 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbuROi?fmBbuROi?fmBboUewy=hmEee!ztt)qLN*6f#Yhwt-h_(=6Hxv)vR$BK)=8UR+& BCKdny literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-38.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-38.gif new file mode 100644 index 0000000000000000000000000000000000000000..03b25df19e8d5a3802ef42e7aa240ee684ccb0a7 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9;_RRuxM>Pd{$8?(>0~b<@vOeBq5 r54{7Die_x*Bb-*OSQ4VNcCPzruROi?fmBb9miEil z90{K@6*GJvzUY~7Q#IpR)2EMnV`Mg%tULR=XXV!@*?x8RFT4|_74lE&Ol!HIwS|Gf F8UWoeCvgA( literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-41.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-41.gif new file mode 100644 index 0000000000000000000000000000000000000000..11d0387c4453d8b7a60fa75e9d97f6b79e8edf52 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb9miEil zoYLzX=d(_kUDh#S`J$I!OP6!|z3I7UcxhL4l+oUlee#7Tw3QmSDR^>z6=h(s1^^U~ BBe?(o literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-42.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-42.gif new file mode 100644 index 0000000000000000000000000000000000000000..959e4aa9526416c3bb8d0dbd23049daeee99b1e8 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm96}b9u_$1teSAegOR}+ E0G6UAx&QzG literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-43.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-43.gif new file mode 100644 index 0000000000000000000000000000000000000000..7580707d8a9217730c2cd67807518d6369cf05ab GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF>uROi?fmBb9miEil z96wqz9V=?uL?=z;TBxeA?*qrARmtuROi?fmBb9miEil z>=pe9Q3_>YH+x^YuA6;J?efo!1(v&&UcJfFXqGISe@8&0=jId%IaYQlxBio>RxvPG F0|20sB_{v? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-46.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-46.gif new file mode 100644 index 0000000000000000000000000000000000000000..04d2e76a16f5cca72fc2d4366bcb5a37530fefeb GIT binary patch literal 104 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmI?uROi?fmBb9miEil z92Gs8jujP8Z+2!d`KGMuoBps*P5ShXy4R~EHeIQ+3;l4p>0;4oU%?|eWqBT{U!*h{ G7_0#WYA2Hb literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-47.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-47.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad8a03a79bce8ce33946d530b448e029256779f1 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBb9miEil z>=pe9Q3_?(W=@&NweX2)*@xNZ3N1Txa$XeeczDrAKEc<*=3kG8OvX)TuS!-1YXB^$ BBr*U1 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-48.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-48.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b399dfa9cdc8e19395b37136a1610a50119cb69 GIT binary patch literal 105 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFgf(}uROi?fmBb9miEil z>=iN%vob1FnI`dZ`bMl;c-^x*Yub*x=EqCec}}+3DZaX_B-MTT&icyk8$OD06FPOp H7#OSpw>Tuj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-49.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-49.gif new file mode 100644 index 0000000000000000000000000000000000000000..95a2474e227482d4fe528b759ea42272c4c23b05 GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF>uROi?fmBb9miEil z>=iN%vob1FnI`dZ`bMl;cwO>TS&X`#?4gQ#oYQ>v#lKRn`rBfhP&iYiuH0jTQbr=Z#=tO`SC;{dxgLbnPmlgCTmTL@p5Nnum%7~ CE+mBj literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-52.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-52.gif new file mode 100644 index 0000000000000000000000000000000000000000..0856690a92923bdda0f5f1d9cfccd2b890914969 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBb6=H(cBD=nYN#9$2o DfF&g> literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-54.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-54.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bcea13870632a04857ac271ea221c6f10b4e0b6 GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EXuROi?fmBbQfCGJnxj0kDfN4ij_utI%#pwPK4dybil!>_T=Q5Lr12xiX!&I(25SIV C%_MvP literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-55.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-55.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb64506d9505bb14f5d1e6cc5f0039c40abd9b37 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9uROi?fmBbH6H?lKX1IZs#QhJ0tv6RK&UkmQ0-SsCCjQtu+h` F)&Sc7CpZ8A literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-57.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-57.gif new file mode 100644 index 0000000000000000000000000000000000000000..279ecdd77e2a9d17fc236b14e73d82b0801ac8df GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb4D#pNI4FEWX BB`N>_ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-58.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-58.gif new file mode 100644 index 0000000000000000000000000000000000000000..1215d336623de2d94318e420342f0ccb22a14a02 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9v|dNW^IjI>*myV2Fll2t_pXY)$^sfWUYe{7)&MAA BBAWmJ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-6.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3aa07502ded43dd83ad56f92a5e40b1fa9b5488 GIT binary patch literal 90 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6pruRP6LD_3HCO;zxQ s<(Jo*H@}Cfg!rkeH%&8B)6~k|nq9K1_xYaxuUeJXEcmcOgMq;s0H}x`VgLXD literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-60.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-60.gif new file mode 100644 index 0000000000000000000000000000000000000000..9782060e2e4bc43e22c99a7f323060b2fc950420 GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EXuROi?fmBb+$+vtu6N5DX DpMxg5 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-61.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-61.gif new file mode 100644 index 0000000000000000000000000000000000000000..505d4956d5503473cc9a3f73aed585552a282a88 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb-e%#^5U>zpug#iE#R%Tn7<7D(<|UiSE#9QW6n14-E)K7J*uP9OW+$Tsnc2P1uROi?fmBb-e%#^5U>zpug#iE#R%TmQBtvbBxqg~sk|IJgI4lnx1aa+TGkF+c2qYD*>R&8Kl Gum%AAKPf^0 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-64.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-64.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a8dcf04ff887785879be65304290b2e86649c16 GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF>uROi?fmBbxhXRx0Z9x<>`8U;oT<3Fz8Ub#sdMvjAsh*|{fQEoES^ F1^~q5C!hcT literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-65.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-65.gif new file mode 100644 index 0000000000000000000000000000000000000000..31371626a22837e272cb88327d48df0d8e967c9b GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9zpvrV^z$zWvS)obYqsQ%{^|Q&8-^4_we+M!;0QM@xs$t3T=#5h(<9m GSOWmUF(elN literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-67.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-67.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0e1c8f6c454c9296c5d2954b2abf8cf8bb40f39 GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EXuROi?fmBb$F-SKxZQqy1t G25SJ&OD9PH literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-69.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-69.gif new file mode 100644 index 0000000000000000000000000000000000000000..1992c0ecb89e2b4d93ab4a2eb916982ba75d1487 GIT binary patch literal 104 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmI?uROi?fmBb(2t3@ZCnd`SxhOPB-{1-1x H1_o;Y`gA6~ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-7.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8d6dceed040b5284943f18d2c8505fef5a9bc83 GIT binary patch literal 85 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFzNL4uRP6LD_3HCO;!1Z n<(Jo*H@}B2Eol;)yh@R6_fo_2!MeM$FTK)t`ot;C%3uuuB?laF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-70.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-70.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1a7ebe0e915a8b99ab12a10a14396e381b09c31 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbFl|-cI|iZ+C!Yhn;x8XKXfN)=fjDIbG&A=GFSru DZ^$Q| literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-71.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-71.gif new file mode 100644 index 0000000000000000000000000000000000000000..54ae8215e85d6fd2b42dc19da4d34e202df6de97 GIT binary patch literal 97 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@5UuROi?fmBbjrVePoNlxclm2j0gMq;s03(hj A8UO$Q literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-72.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-72.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab6c2325dfccf44335d8e77ecd41f6f4fb882598 GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb!P>bDoP*@aJOhW#eM71^_Yt BBgFs! literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-73.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-73.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bb373010b9abd2ecef4fe408fb2908839fa0272 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbI$M-8{UonUifx^zoqn!Z=lQquuWf@COkY#x{HpKZq*vuVleieH0UePg A_5c6? literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-75.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-75.gif new file mode 100644 index 0000000000000000000000000000000000000000..f96e2510b91a1512e6f778107f9b4d33b73832be GIT binary patch literal 98 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@BWuROi?fmBb~vS`lcLziA>N=7tl3Z1{v{rGN^)*?>}7O|=Bk2f4$Z8`ahHzR{J E0I6vvmjD0& literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-77.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-77.gif new file mode 100644 index 0000000000000000000000000000000000000000..29a03654548a4af8a7f6d5858271e647cff7742a GIT binary patch literal 96 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFq!xCuROi?fmBbv=Utlr9_Rcp0-YSOWky C3nZ%m literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-8.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..05a034aa00928680028c205a6cd0cd9839fae3eb GIT binary patch literal 89 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jpuRP6LD_3HCO;!1Z rX8dE;IEgToqPhi2Q=dM`TeoY`H{bpp9?^BYZ+cU9&npaMV6X-Nd)6LB literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-80.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-80.gif new file mode 100644 index 0000000000000000000000000000000000000000..b22e6896d1ea1ca10c8e996681cd09e944aa0473 GIT binary patch literal 100 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@EXuROi?fmBbC%CxxH8Eq})TRw)9W?`g*o);VQ0r|LCia{rm|MK4QsBWKJY+j11NQ DU)&@7 literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-85.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-85.gif new file mode 100644 index 0000000000000000000000000000000000000000..957a7a6a887d41c50cf0d047c25c51d7a3737b69 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9`F)~;K E0EFEoVgLXD literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-86.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-86.gif new file mode 100644 index 0000000000000000000000000000000000000000..db5297d0c5df0beedd4cb5de86700b17fa81ef40 GIT binary patch literal 101 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxm9NqLHYTl$1nIB)C+`v^NR;|9Uv*~Qxmau>qN=^-)50@`{Eiv(m4+u9B0>zXmZd GSOWmZ6eaio literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-9.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-9.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e18ec03b7926f9ad773f70decd104f84133f2d2 GIT binary patch literal 89 zcmZ?wbhEHbRA%61XkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFd6jpuRP6LD_3HCO;!1Z rX8dE;IEgToqPm3kO{-pXt&GY$?-P7&_q&4AuTNSWSWp;^ literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-90.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-90.gif new file mode 100644 index 0000000000000000000000000000000000000000..038b5ead0fe844e97400c3ebb264962c93c853a1 GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBbC%CxxH8Eq})TRX}Z&obzVLDOLS3M?&>!QtK@TkJlYxHtro}{D$2lM4FFrJa^qbsYnkuROi?fmBbH{HmaB$FW~d@;o%EvVuP!`zcv%NZD~ E0exg7WB>pF literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-95.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-95.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfd3bbb98df001acaa86996404344dbc385c77bd GIT binary patch literal 102 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFxmF>uROi?fmBbNqLHYTl$1s)|oCH*_!Ba`aG^Z#HMGe(;;N!@fP9O3RnM=9zfKn~}j9 E0Ih^3ng9R* literal 0 HcmV?d00001 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-97.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/ueditor-list/list-num-3-97.gif new file mode 100644 index 0000000000000000000000000000000000000000..0379f35f5a6554cde8b99e6a6a7f3dc18bd27ebd GIT binary patch literal 99 zcmZ?wbhEHb)MDUeXkcV8Ha7nM|G(l-7DfgJMg|=QAOOiQFj@8VuROi?fmBb +// Provides an augmented, extensible, cross-browser implementation of regular expressions, +// including support for additional syntax, flags, and methods + +var XRegExp; + +if (XRegExp) { + // Avoid running twice, since that would break references to native globals + throw Error("can't load XRegExp twice in the same frame"); +} + +// Run within an anonymous function to protect variables and avoid new globals +(function (undefined) { + + //--------------------------------- + // Constructor + //--------------------------------- + + // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native + // regular expression in that additional syntax and flags are supported and cross-browser + // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and + // converts to type XRegExp + XRegExp = function (pattern, flags) { + var output = [], + currScope = XRegExp.OUTSIDE_CLASS, + pos = 0, + context, tokenResult, match, chr, regex; + + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) + throw TypeError("can't supply flags when constructing one RegExp from another"); + return clone(pattern); + } + // Tokens become part of the regex construction process, so protect against infinite + // recursion when an XRegExp is constructed within a token handler or trigger + if (isInsideConstructor) + throw Error("can't call the XRegExp constructor within token definition functions"); + + flags = flags || ""; + context = { // `this` object for custom tokens + hasNamedCapture: false, + captureNames: [], + hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, + setFlag: function (flag) {flags += flag;} + }; + + while (pos < pattern.length) { + // Check for custom tokens at the current position + tokenResult = runTokens(pattern, pos, currScope, context); + + if (tokenResult) { + output.push(tokenResult.output); + pos += (tokenResult.match[0].length || 1); + } else { + // Check for native multicharacter metasequences (excluding character classes) at + // the current position + if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { + output.push(match[0]); + pos += match[0].length; + } else { + chr = pattern.charAt(pos); + if (chr === "[") + currScope = XRegExp.INSIDE_CLASS; + else if (chr === "]") + currScope = XRegExp.OUTSIDE_CLASS; + // Advance position one character + output.push(chr); + pos++; + } + } + } + + regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); + regex._xregexp = { + source: pattern, + captureNames: context.hasNamedCapture ? context.captureNames : null + }; + return regex; + }; + + + //--------------------------------- + // Public properties + //--------------------------------- + + XRegExp.version = "1.5.1"; + + // Token scope bitflags + XRegExp.INSIDE_CLASS = 1; + XRegExp.OUTSIDE_CLASS = 2; + + + //--------------------------------- + // Private variables + //--------------------------------- + + var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, + flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags + quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, + isInsideConstructor = false, + tokens = [], + // Copy native globals for reference ("native" is an ES3 reserved keyword) + nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + nativ.test.call(x, ""); + return !x.lastIndex; + }(), + hasNativeY = RegExp.prototype.sticky !== undefined, + nativeTokens = {}; + + // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, + // excluding character classes) + nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; + nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; + + + //--------------------------------- + // Public methods + //--------------------------------- + + // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by + // the XRegExp library and can be used to create XRegExp plugins. This function is intended for + // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can + // be disabled by `XRegExp.freezeTokens` + XRegExp.addToken = function (regex, handler, scope, trigger) { + tokens.push({ + pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), + handler: handler, + scope: scope || XRegExp.OUTSIDE_CLASS, + trigger: trigger || null + }); + }; + + // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag + // combination has previously been cached, the cached copy is returned; otherwise the newly + // created regex is cached + XRegExp.cache = function (pattern, flags) { + var key = pattern + "/" + (flags || ""); + return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); + }; + + // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh + // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` + // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve + // special properties required for named capture + XRegExp.copyAsGlobal = function (regex) { + return clone(regex, "g"); + }; + + // Accepts a string; returns the string with regex metacharacters escaped. The returned string + // can safely be used at any point within a regex to match the provided literal string. Escaped + // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace + XRegExp.escape = function (str) { + return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + // Accepts a string to search, regex to search with, position to start the search within the + // string (default: 0), and an optional Boolean indicating whether matches must start at-or- + // after the position or at the specified position only. This function ignores the `lastIndex` + // of the provided regex in its own handling, but updates the property for compatibility + XRegExp.execAt = function (str, regex, pos, anchored) { + var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), + match; + r2.lastIndex = pos = pos || 0; + match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (anchored && match && match.index !== pos) + match = null; + if (regex.global) + regex.lastIndex = match ? r2.lastIndex : 0; + return match; + }; + + // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing + // syntax and flag changes. Should be run after XRegExp and any plugins are loaded + XRegExp.freezeTokens = function () { + XRegExp.addToken = function () { + throw Error("can't run addToken after freezeTokens"); + }; + }; + + // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. + // Note that this is also `true` for regex literals and regexes created by the `XRegExp` + // constructor. This works correctly for variables created in another frame, when `instanceof` + // and `constructor` checks would fail to work as intended + XRegExp.isRegExp = function (o) { + return Object.prototype.toString.call(o) === "[object RegExp]"; + }; + + // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to + // iterate over regex matches compared to the traditional approaches of subverting + // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop + XRegExp.iterate = function (str, regex, callback, context) { + var r2 = clone(regex, "g"), + i = -1, match; + while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (regex.global) + regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` + callback.call(context, match, ++i, str, regex); + if (r2.lastIndex === match.index) + r2.lastIndex++; + } + if (regex.global) + regex.lastIndex = 0; + }; + + // Accepts a string and an array of regexes; returns the result of using each successive regex + // to search within the matches of the previous regex. The array of regexes can also contain + // objects with `regex` and `backref` properties, in which case the named or numbered back- + // references specified are passed forward to the next regex or returned. E.g.: + // var xregexpImgFileNames = XRegExp.matchChain(html, [ + // {regex: /]+)>/i, backref: 1}, // tag attributes + // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values + // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths + // /[^\/]+$/ // filenames (strip directory paths) + // ]); + XRegExp.matchChain = function (str, chain) { + return function recurseChain (values, level) { + var item = chain[level].regex ? chain[level] : {regex: chain[level]}, + regex = clone(item.regex, "g"), + matches = [], i; + for (i = 0; i < values.length; i++) { + XRegExp.iterate(values[i], regex, function (match) { + matches.push(item.backref ? (match[item.backref] || "") : match[0]); + }); + } + return ((level === chain.length - 1) || !matches.length) ? + matches : recurseChain(matches, level + 1); + }([str], 0); + }; + + + //--------------------------------- + // New RegExp prototype methods + //--------------------------------- + + // Accepts a context object and arguments array; returns the result of calling `exec` with the + // first value in the arguments array. the context is ignored but is accepted for congruity + // with `Function.prototype.apply` + RegExp.prototype.apply = function (context, args) { + return this.exec(args[0]); + }; + + // Accepts a context object and string; returns the result of calling `exec` with the provided + // string. the context is ignored but is accepted for congruity with `Function.prototype.call` + RegExp.prototype.call = function (context, str) { + return this.exec(str); + }; + + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match, name, r2, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.apply(this, arguments); + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + nativ.replace.call((str + "").slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return match; + }; + + // Fix browser bugs in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the altered + // `exec` would take care of the `lastIndex` fixes + var match, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return !!match; + }; + + // Adds named capture support and fixes browser bugs in native method + String.prototype.match = function (regex) { + if (!XRegExp.isRegExp(regex)) + regex = RegExp(regex); // Native `RegExp` + if (regex.global) { + var result = nativ.match.apply(this, arguments); + regex.lastIndex = 0; // Fix IE bug + return result; + } + return regex.exec(this); // Run the altered `exec` + }; + + // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, + // and provides named backreferences to replacement functions as `arguments[0].name`. Also + // fixes cross-browser differences in replacement text syntax when performing a replacement + // using a nonregex search value, and the value of replacement regexes' `lastIndex` property + // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary + // third (`flags`) parameter + String.prototype.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search), + captureNames, result, str, origLastIndex; + + // There are too many combinations of search/replacement types/values and browser bugs that + // preclude passing to native `replace`, so don't try + //if (...) + // return nativ.replace.apply(this, arguments); + + if (isRegex) { + if (search._xregexp) + captureNames = search._xregexp.captureNames; // Array or `null` + if (!search.global) + origLastIndex = search.lastIndex; + } else { + search = search + ""; // Type conversion + } + + if (Object.prototype.toString.call(replacement) === "[object Function]") { + result = nativ.replace.call(this + "", search, function () { + if (captureNames) { + // Change the `arguments[0]` string primitive to a String object which can store properties + arguments[0] = new String(arguments[0]); + // Store named backreferences on `arguments[0]` + for (var i = 0; i < captureNames.length; i++) { + if (captureNames[i]) + arguments[0][captureNames[i]] = arguments[i + 1]; + } + } + // Update `lastIndex` before calling `replacement` (fix browsers) + if (isRegex && search.global) + search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; + return replacement.apply(null, arguments); + }); + } else { + str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) + result = nativ.replace.call(str, search, function () { + var args = arguments; // Keep this function's `arguments` available through closure + return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { + // Numbered backreference (without delimiters) or special variable + if ($1) { + switch ($1) { + case "$": return "$"; + case "&": return args[0]; + case "`": return args[args.length - 1].slice(0, args[args.length - 2]); + case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + // Numbered backreference + default: + // What does "$10" mean? + // - Backreference 10, if 10 or more capturing groups exist + // - Backreference 1 followed by "0", if 1-9 capturing groups exist + // - Otherwise, it's the string "$10" + // Also note: + // - Backreferences cannot be more than two digits (enforced by `replacementToken`) + // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" + // - There is no "$0" token ("$&" is the entire match) + var literalNumbers = ""; + $1 = +$1; // Type conversion; drop leading zero + if (!$1) // `$1` was "0" or "00" + return $0; + while ($1 > args.length - 3) { + literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; + $1 = Math.floor($1 / 10); // Drop the last digit + } + return ($1 ? args[$1] || "" : "$") + literalNumbers; + } + // Named backreference or delimited numbered backreference + } else { + // What does "${n}" mean? + // - Backreference to numbered capture n. Two differences from "$n": + // - n can be more than two digits + // - Backreference 0 is allowed, and is the entire match + // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture + // - Otherwise, it's the string "${n}" + var n = +$2; // Type conversion; drop leading zeros + if (n <= args.length - 3) + return args[n]; + n = captureNames ? indexOf(captureNames, $2) : -1; + return n > -1 ? args[n + 1] : $0; + } + }); + }); + } + + if (isRegex) { + if (search.global) + search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) + else + search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + } + + return result; + }; + + // A consistent cross-browser, ES3 compliant `split` + String.prototype.split = function (s /* separator */, limit) { + // If separator `s` is not a regex, use the native `split` + if (!XRegExp.isRegExp(s)) + return nativ.split.apply(this, arguments); + + var str = this + "", // Type conversion + output = [], + lastLastIndex = 0, + match, lastLength; + + // Behavior for `limit`: if it's... + // - `undefined`: No limit + // - `NaN` or zero: Return an empty array + // - A positive number: Use `Math.floor(limit)` + // - A negative number: No limit + // - Other: Type-convert, then use the above rules + if (limit === undefined || +limit < 0) { + limit = Infinity; + } else { + limit = Math.floor(+limit); + if (!limit) + return []; + } + + // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero + // and restore it to its original value when we're done using the regex + s = XRegExp.copyAsGlobal(s); + + while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (s.lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) + Array.prototype.push.apply(output, match.slice(1)); + + lastLength = match[0].length; + lastLastIndex = s.lastIndex; + + if (output.length >= limit) + break; + } + + if (s.lastIndex === match.index) + s.lastIndex++; + } + + if (lastLastIndex === str.length) { + if (!nativ.test.call(s, "") || lastLength) + output.push(""); + } else { + output.push(str.slice(lastLastIndex)); + } + + return output.length > limit ? output.slice(0, limit) : output; + }; + + + //--------------------------------- + // Private helper functions + //--------------------------------- + + // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` + // instance with a fresh `lastIndex` (set to zero), preserving properties required for named + // capture. Also allows adding new flags in the process of copying the regex + function clone (regex, additionalFlags) { + if (!XRegExp.isRegExp(regex)) + throw TypeError("type RegExp expected"); + var x = regex._xregexp; + regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); + if (x) { + regex._xregexp = { + source: x.source, + captureNames: x.captureNames ? x.captureNames.slice(0) : null + }; + } + return regex; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function runTokens (pattern, index, scope, context) { + var i = tokens.length, + result, match, t; + // Protect against constructing XRegExps within token handler and trigger functions + isInsideConstructor = true; + // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws + try { + while (i--) { // Run in reverse order + t = tokens[i]; + if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { + t.pattern.lastIndex = index; + match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. + if (match && match.index === index) { + result = { + output: t.handler.call(context, match, scope), + match: match + }; + break; + } + } + } + } catch (err) { + throw err; + } finally { + isInsideConstructor = false; + } + return result; + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + + + //--------------------------------- + // Built-in tokens + //--------------------------------- + + // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the + // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` + + // Comment pattern: (?# ) + XRegExp.addToken( + /\(\?#[^)]*\)/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + } + ); + + // Capturing group (match the opening parenthesis only). + // Required for support of named capturing groups + XRegExp.addToken( + /\((?!\?)/, + function () { + this.captureNames.push(null); + return "("; + } + ); + + // Named capturing group (match the opening delimiter only): (? + XRegExp.addToken( + /\(\?<([$\w]+)>/, + function (match) { + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return "("; + } + ); + + // Named backreference: \k + XRegExp.addToken( + /\\k<([\w$]+)>/, + function (match) { + var index = indexOf(this.captureNames, match[1]); + // Keep backreferences separate from subsequent literal numbers. Preserve back- + // references to named groups that are undefined at this point as literal strings + return index > -1 ? + "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : + match[0]; + } + ); + + // Empty character class: [] or [^] + XRegExp.addToken( + /\[\^?]/, + function (match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in Firefox + return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; + } + ); + + // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) + // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. + XRegExp.addToken( + /^\(\?([imsx]+)\)/, + function (match) { + this.setFlag(match[1]); + return ""; + } + ); + + // Whitespace and comments, in free-spacing (aka extended) mode only + XRegExp.addToken( + /(?:\s+|#.*)+/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + }, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("x");} + ); + + // Dot, in dotall (aka singleline) mode only + XRegExp.addToken( + /\./, + function () {return "[\\s\\S]";}, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("s");} + ); + + + //--------------------------------- + // Backward compatibility + //--------------------------------- + + // Uncomment the following block for compatibility with XRegExp 1.0-1.2: + /* + XRegExp.matchWithinChain = XRegExp.matchChain; + RegExp.prototype.addFlags = function (s) {return clone(this, s);}; + RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; + RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; + RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; + */ + +})(); + +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { + +// CommonJS + if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') + { + XRegExp = require('XRegExp').XRegExp; + } + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... + var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : false, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : false, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'unindent' : true, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of + + + + + + + + diff --git a/web/src/main/resources/templates/vue/demo/basic.html b/web/src/main/resources/templates/vue/demo/basic.html new file mode 100644 index 0000000..ed58b3f --- /dev/null +++ b/web/src/main/resources/templates/vue/demo/basic.html @@ -0,0 +1,29 @@ + + + + +

    + +
    + + + + \ No newline at end of file diff --git a/web/src/main/resources/templates/vue/demo/ueditor.html b/web/src/main/resources/templates/vue/demo/ueditor.html new file mode 100644 index 0000000..5992f18 --- /dev/null +++ b/web/src/main/resources/templates/vue/demo/ueditor.html @@ -0,0 +1,51 @@ + + + + +
    +
    + 获取内容 + 写入内容 +
    + + + + \ No newline at end of file -- Gitee From 53a83f0199e768a4e6eae86ea676cb47f158c7c4 Mon Sep 17 00:00:00 2001 From: jeesun Date: Thu, 23 May 2019 14:33:53 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=88=A0=E9=99=A4neditor=202.1.10=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/plug-in/neditor/2.1.10/README.md | 156 - .../neditor/2.1.10/dialogs/anchor/anchor.html | 40 - .../2.1.10/dialogs/attachment/attachment.css | 682 - .../2.1.10/dialogs/attachment/attachment.html | 60 - .../2.1.10/dialogs/attachment/attachment.js | 775 - .../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 .../dialogs/attachment/images/alignicon.gif | Bin 1051 -> 0 bytes .../dialogs/attachment/images/alignicon.png | Bin 3714 -> 0 bytes .../2.1.10/dialogs/attachment/images/bg.png | Bin 2810 -> 0 bytes .../dialogs/attachment/images/file-icons.gif | Bin 20097 -> 0 bytes .../dialogs/attachment/images/file-icons.png | Bin 44070 -> 0 bytes .../dialogs/attachment/images/icons.gif | Bin 453 -> 0 bytes .../dialogs/attachment/images/icons.png | Bin 2678 -> 0 bytes .../dialogs/attachment/images/image.png | Bin 1672 -> 0 bytes .../dialogs/attachment/images/progress.png | Bin 1269 -> 0 bytes .../dialogs/attachment/images/success.gif | Bin 445 -> 0 bytes .../dialogs/attachment/images/success.png | Bin 1621 -> 0 bytes .../2.1.10/dialogs/background/background.css | 97 - .../2.1.10/dialogs/background/background.html | 56 - .../2.1.10/dialogs/background/background.js | 376 - .../2.1.10/dialogs/background/images/bg.png | Bin 2810 -> 0 bytes .../dialogs/background/images/success.png | Bin 1621 -> 0 bytes .../2.1.10/dialogs/charts/chart.config.js | 65 - .../neditor/2.1.10/dialogs/charts/charts.css | 165 - .../neditor/2.1.10/dialogs/charts/charts.html | 89 - .../neditor/2.1.10/dialogs/charts/charts.js | 519 - .../2.1.10/dialogs/charts/images/charts0.png | Bin 25306 -> 0 bytes .../2.1.10/dialogs/charts/images/charts1.png | Bin 19263 -> 0 bytes .../2.1.10/dialogs/charts/images/charts2.png | Bin 23016 -> 0 bytes .../2.1.10/dialogs/charts/images/charts3.png | Bin 7823 -> 0 bytes .../2.1.10/dialogs/charts/images/charts4.png | Bin 8344 -> 0 bytes .../2.1.10/dialogs/charts/images/charts5.png | Bin 47084 -> 0 bytes .../2.1.10/dialogs/emotion/emotion.css | 43 - .../2.1.10/dialogs/emotion/emotion.html | 54 - .../neditor/2.1.10/dialogs/emotion/emotion.js | 186 - .../2.1.10/dialogs/emotion/images/0.gif | Bin 43 -> 0 bytes .../2.1.10/dialogs/emotion/images/bface.gif | Bin 27167 -> 0 bytes .../2.1.10/dialogs/emotion/images/cface.gif | Bin 8603 -> 0 bytes .../2.1.10/dialogs/emotion/images/fface.gif | Bin 18479 -> 0 bytes .../2.1.10/dialogs/emotion/images/jxface2.gif | Bin 40706 -> 0 bytes .../emotion/images/neweditor-tab-bg.png | Bin 216 -> 0 bytes .../2.1.10/dialogs/emotion/images/tface.gif | Bin 19805 -> 0 bytes .../2.1.10/dialogs/emotion/images/wface.gif | Bin 49850 -> 0 bytes .../2.1.10/dialogs/emotion/images/yface.gif | Bin 28409 -> 0 bytes .../2.1.10/dialogs/fonts/buttoniconex.css | 271 - .../neditor/2.1.10/dialogs/fonts/iconfont.eot | Bin 25788 -> 0 bytes .../neditor/2.1.10/dialogs/fonts/iconfont.svg | 410 - .../neditor/2.1.10/dialogs/fonts/iconfont.ttf | Bin 25608 -> 0 bytes .../2.1.10/dialogs/fonts/iconfont.woff | Bin 12848 -> 0 bytes .../2.1.10/dialogs/fonts/images/addfile.svg | 1 - .../2.1.10/dialogs/fonts/images/selected.svg | 1 - .../neditor/2.1.10/dialogs/gmap/gmap.html | 106 - .../neditor/2.1.10/dialogs/help/help.css | 7 - .../neditor/2.1.10/dialogs/help/help.html | 82 - .../neditor/2.1.10/dialogs/help/help.js | 56 - .../neditor/2.1.10/dialogs/image/image.css | 936 - .../neditor/2.1.10/dialogs/image/image.html | 127 - .../neditor/2.1.10/dialogs/image/image.js | 1131 - .../2.1.10/dialogs/image/images/alignicon.jpg | Bin 16101 -> 0 bytes .../2.1.10/dialogs/image/images/bg.png | Bin 2810 -> 0 bytes .../2.1.10/dialogs/image/images/icons.gif | Bin 453 -> 0 bytes .../2.1.10/dialogs/image/images/icons.png | Bin 2678 -> 0 bytes .../2.1.10/dialogs/image/images/image.png | Bin 1672 -> 0 bytes .../2.1.10/dialogs/image/images/progress.png | Bin 1269 -> 0 bytes .../2.1.10/dialogs/image/images/success.gif | Bin 445 -> 0 bytes .../2.1.10/dialogs/image/images/success.png | Bin 1621 -> 0 bytes .../dialogs/insertframe/insertframe.html | 115 - .../neditor/2.1.10/dialogs/internal.js | 81 - .../neditor/2.1.10/dialogs/link/link.html | 135 - .../neditor/2.1.10/dialogs/map/map.html | 159 - .../neditor/2.1.10/dialogs/map/show.html | 118 - .../neditor/2.1.10/dialogs/music/balls.svg | 21 - .../neditor/2.1.10/dialogs/music/music.css | 90 - .../neditor/2.1.10/dialogs/music/music.html | 32 - .../neditor/2.1.10/dialogs/music/music.js | 192 - .../2.1.10/dialogs/preview/preview.html | 40 - .../2.1.10/dialogs/scrawl/images/addimg.png | Bin 628 -> 0 bytes .../2.1.10/dialogs/scrawl/images/brush.png | Bin 608 -> 0 bytes .../2.1.10/dialogs/scrawl/images/delimg.png | Bin 516 -> 0 bytes .../2.1.10/dialogs/scrawl/images/delimgH.png | Bin 578 -> 0 bytes .../2.1.10/dialogs/scrawl/images/empty.png | Bin 519 -> 0 bytes .../2.1.10/dialogs/scrawl/images/emptyH.png | Bin 657 -> 0 bytes .../2.1.10/dialogs/scrawl/images/eraser.png | Bin 43271 -> 0 bytes .../2.1.10/dialogs/scrawl/images/redo.png | Bin 454 -> 0 bytes .../2.1.10/dialogs/scrawl/images/redoH.png | Bin 536 -> 0 bytes .../2.1.10/dialogs/scrawl/images/scale.png | Bin 435 -> 0 bytes .../2.1.10/dialogs/scrawl/images/scaleH.png | Bin 330 -> 0 bytes .../2.1.10/dialogs/scrawl/images/size.png | Bin 775 -> 0 bytes .../2.1.10/dialogs/scrawl/images/undo.png | Bin 444 -> 0 bytes .../2.1.10/dialogs/scrawl/images/undoH.png | Bin 511 -> 0 bytes .../neditor/2.1.10/dialogs/scrawl/scrawl.css | 372 - .../neditor/2.1.10/dialogs/scrawl/scrawl.html | 100 - .../neditor/2.1.10/dialogs/scrawl/scrawl.js | 683 - .../dialogs/searchreplace/searchreplace.html | 127 - .../dialogs/searchreplace/searchreplace.js | 170 - .../2.1.10/dialogs/snapscreen/snapscreen.html | 60 - .../2.1.10/dialogs/spechars/spechars.html | 21 - .../2.1.10/dialogs/spechars/spechars.js | 57 - .../neditor/2.1.10/dialogs/table/dragicon.png | Bin 304 -> 0 bytes .../2.1.10/dialogs/table/edittable.css | 84 - .../2.1.10/dialogs/table/edittable.html | 64 - .../neditor/2.1.10/dialogs/table/edittable.js | 237 - .../neditor/2.1.10/dialogs/table/edittd.html | 61 - .../neditor/2.1.10/dialogs/table/edittip.html | 33 - .../neditor/2.1.10/dialogs/template/config.js | 42 - .../2.1.10/dialogs/template/images/bg.gif | Bin 84 -> 0 bytes .../2.1.10/dialogs/template/images/pre0.png | Bin 250 -> 0 bytes .../2.1.10/dialogs/template/images/pre1.png | Bin 291 -> 0 bytes .../2.1.10/dialogs/template/images/pre2.png | Bin 394 -> 0 bytes .../2.1.10/dialogs/template/images/pre3.png | Bin 485 -> 0 bytes .../2.1.10/dialogs/template/images/pre4.png | Bin 393 -> 0 bytes .../2.1.10/dialogs/template/template.css | 18 - .../2.1.10/dialogs/template/template.html | 26 - .../2.1.10/dialogs/template/template.js | 53 - .../2.1.10/dialogs/video/images/bg.png | Bin 2810 -> 0 bytes .../dialogs/video/images/center_focus.jpg | Bin 3800 -> 0 bytes .../dialogs/video/images/file-icons.gif | Bin 20097 -> 0 bytes .../dialogs/video/images/file-icons.png | Bin 44070 -> 0 bytes .../2.1.10/dialogs/video/images/icons.gif | Bin 453 -> 0 bytes .../2.1.10/dialogs/video/images/icons.png | Bin 2678 -> 0 bytes .../2.1.10/dialogs/video/images/image.png | Bin 1672 -> 0 bytes .../dialogs/video/images/left_focus.jpg | Bin 3970 -> 0 bytes .../dialogs/video/images/none_focus.jpg | Bin 3862 -> 0 bytes .../2.1.10/dialogs/video/images/progress.png | Bin 1269 -> 0 bytes .../dialogs/video/images/right_focus.jpg | Bin 3971 -> 0 bytes .../2.1.10/dialogs/video/images/success.gif | Bin 445 -> 0 bytes .../2.1.10/dialogs/video/images/success.png | Bin 1621 -> 0 bytes .../neditor/2.1.10/dialogs/video/video.css | 644 - .../neditor/2.1.10/dialogs/video/video.html | 85 - .../neditor/2.1.10/dialogs/video/video.js | 812 - .../neditor/2.1.10/dialogs/webapp/webapp.html | 53 - .../dialogs/wordimage/fClipboard_ueditor.swf | Bin 1908 -> 0 bytes .../dialogs/wordimage/imageUploader.swf | Bin 62857 -> 0 bytes .../2.1.10/dialogs/wordimage/tangram.js | 1495 - .../2.1.10/dialogs/wordimage/wordimage.html | 111 - .../2.1.10/dialogs/wordimage/wordimage.js | 157 - .../plug-in/neditor/2.1.10/i18n/en/en.js | 684 - .../2.1.10/i18n/en/images/addimage.png | Bin 3373 -> 0 bytes .../i18n/en/images/alldeletebtnhoverskin.png | Bin 743 -> 0 bytes .../i18n/en/images/alldeletebtnupskin.png | Bin 743 -> 0 bytes .../2.1.10/i18n/en/images/background.png | Bin 3854 -> 0 bytes .../neditor/2.1.10/i18n/en/images/button.png | Bin 4929 -> 0 bytes .../neditor/2.1.10/i18n/en/images/copy.png | Bin 1222 -> 0 bytes .../2.1.10/i18n/en/images/deletedisable.png | Bin 649 -> 0 bytes .../2.1.10/i18n/en/images/deleteenable.png | Bin 664 -> 0 bytes .../2.1.10/i18n/en/images/listbackground.png | Bin 3750 -> 0 bytes .../2.1.10/i18n/en/images/localimage.png | Bin 3083 -> 0 bytes .../neditor/2.1.10/i18n/en/images/music.png | Bin 3599 -> 0 bytes .../i18n/en/images/rotateleftdisable.png | Bin 719 -> 0 bytes .../i18n/en/images/rotateleftenable.png | Bin 952 -> 0 bytes .../i18n/en/images/rotaterightdisable.png | Bin 754 -> 0 bytes .../i18n/en/images/rotaterightenable.png | Bin 1007 -> 0 bytes .../neditor/2.1.10/i18n/en/images/upload.png | Bin 3941 -> 0 bytes .../neditor/2.1.10/i18n/zh-cn/images/copy.png | Bin 4319 -> 0 bytes .../2.1.10/i18n/zh-cn/images/localimage.png | Bin 6979 -> 0 bytes .../2.1.10/i18n/zh-cn/images/music.png | Bin 3453 -> 0 bytes .../2.1.10/i18n/zh-cn/images/upload.png | Bin 6608 -> 0 bytes .../neditor/2.1.10/i18n/zh-cn/zh-cn.js | 669 - .../static/plug-in/neditor/2.1.10/index.html | 179 - .../plug-in/neditor/2.1.10/neditor.all.js | 33077 ---------------- .../plug-in/neditor/2.1.10/neditor.all.min.js | 18 - .../plug-in/neditor/2.1.10/neditor.config.js | 604 - .../plug-in/neditor/2.1.10/neditor.parse.js | 1230 - .../neditor/2.1.10/neditor.parse.min.js | 5 - .../plug-in/neditor/2.1.10/neditor.service.js | 235 - .../plug-in/neditor/2.1.10/package.json | 44 - .../plug-in/neditor/2.1.10/themes/iframe.css | 5 - .../2.1.10/themes/notadd/css/neditor.css | 2355 -- .../2.1.10/themes/notadd/css/neditor.min.css | 8 - .../2.1.10/themes/notadd/dialogbase.css | 104 - .../2.1.10/themes/notadd/fonts/iconfont.eot | Bin 25788 -> 0 bytes .../2.1.10/themes/notadd/fonts/iconfont.js | 1 - .../2.1.10/themes/notadd/fonts/iconfont.svg | 410 - .../2.1.10/themes/notadd/fonts/iconfont.ttf | Bin 25608 -> 0 bytes .../2.1.10/themes/notadd/fonts/iconfont.woff | Bin 12848 -> 0 bytes .../2.1.10/themes/notadd/images/anchor.gif | Bin 975 -> 0 bytes .../2.1.10/themes/notadd/images/arrow.png | Bin 1173 -> 0 bytes .../themes/notadd/images/arrow_down.png | Bin 1610 -> 0 bytes .../2.1.10/themes/notadd/images/arrow_up.png | Bin 1649 -> 0 bytes .../2.1.10/themes/notadd/images/button-bg.gif | Bin 1114 -> 0 bytes .../themes/notadd/images/cancelbutton.gif | Bin 1227 -> 0 bytes .../2.1.10/themes/notadd/images/charts.png | Bin 518 -> 0 bytes .../2.1.10/themes/notadd/images/cursor_h.gif | Bin 253 -> 0 bytes .../2.1.10/themes/notadd/images/cursor_h.png | Bin 175 -> 0 bytes .../2.1.10/themes/notadd/images/cursor_v.gif | Bin 370 -> 0 bytes .../2.1.10/themes/notadd/images/cursor_v.png | Bin 177 -> 0 bytes .../themes/notadd/images/dialog-title-bg.png | Bin 938 -> 0 bytes .../2.1.10/themes/notadd/images/filescan.png | Bin 4282 -> 0 bytes .../themes/notadd/images/highlighted.gif | Bin 111 -> 0 bytes .../2.1.10/themes/notadd/images/icons-all.gif | Bin 3750 -> 0 bytes .../2.1.10/themes/notadd/images/icons.gif | Bin 20947 -> 0 bytes .../2.1.10/themes/notadd/images/icons.png | Bin 19694 -> 0 bytes .../2.1.10/themes/notadd/images/loaderror.png | Bin 3209 -> 0 bytes .../2.1.10/themes/notadd/images/loading.gif | Bin 734 -> 0 bytes .../2.1.10/themes/notadd/images/lock.gif | Bin 1062 -> 0 bytes .../themes/notadd/images/neweditor-tab-bg.png | Bin 216 -> 0 bytes .../2.1.10/themes/notadd/images/pagebreak.gif | Bin 54 -> 0 bytes .../2.1.10/themes/notadd/images/scale.png | Bin 167 -> 0 bytes .../2.1.10/themes/notadd/images/sortable.png | Bin 2851 -> 0 bytes .../2.1.10/themes/notadd/images/spacer.gif | Bin 43 -> 0 bytes .../themes/notadd/images/sparator_v.png | Bin 122 -> 0 bytes .../themes/notadd/images/table-cell-align.png | Bin 1847 -> 0 bytes .../notadd/images/tangram-colorpicker.png | Bin 17355 -> 0 bytes .../themes/notadd/images/toolbar_bg.png | Bin 170 -> 0 bytes .../themes/notadd/images/unhighlighted.gif | Bin 111 -> 0 bytes .../2.1.10/themes/notadd/images/upload.png | Bin 6608 -> 0 bytes .../2.1.10/themes/notadd/images/videologo.gif | Bin 1530 -> 0 bytes .../2.1.10/themes/notadd/images/word.gif | Bin 1019 -> 0 bytes .../2.1.10/themes/notadd/images/wordpaste.png | Bin 6467 -> 0 bytes .../third-party/SyntaxHighlighter/shCore.js | 3655 -- .../SyntaxHighlighter/shCoreDefault.css | 1 - .../third-party/browser-md5-file.min.js | 1 - .../third-party/codemirror/codemirror.css | 104 - .../third-party/codemirror/codemirror.js | 3581 -- .../highcharts/adapters/mootools-adapter.js | 13 - .../adapters/mootools-adapter.src.js | 313 - .../highcharts/adapters/prototype-adapter.js | 15 - .../adapters/prototype-adapter.src.js | 316 - .../adapters/standalone-framework.js | 17 - .../adapters/standalone-framework.src.js | 583 - .../third-party/highcharts/highcharts-more.js | 50 - .../highcharts/highcharts-more.src.js | 2430 -- .../third-party/highcharts/highcharts.js | 283 - .../third-party/highcharts/highcharts.src.js | 16974 -------- .../highcharts/modules/annotations.js | 7 - .../highcharts/modules/annotations.src.js | 401 - .../highcharts/modules/canvas-tools.js | 133 - .../highcharts/modules/canvas-tools.src.js | 3113 -- .../third-party/highcharts/modules/data.js | 17 - .../highcharts/modules/data.src.js | 582 - .../highcharts/modules/drilldown.js | 11 - .../highcharts/modules/drilldown.src.js | 447 - .../highcharts/modules/exporting.js | 22 - .../highcharts/modules/exporting.src.js | 709 - .../third-party/highcharts/modules/funnel.js | 12 - .../highcharts/modules/funnel.src.js | 289 - .../third-party/highcharts/modules/heatmap.js | 1 - .../highcharts/modules/heatmap.src.js | 53 - .../third-party/highcharts/modules/map.js | 27 - .../third-party/highcharts/modules/map.src.js | 1002 - .../highcharts/modules/no-data-to-display.js | 12 - .../modules/no-data-to-display.src.js | 128 - .../highcharts/themes/dark-blue.js | 254 - .../highcharts/themes/dark-green.js | 255 - .../third-party/highcharts/themes/gray.js | 257 - .../third-party/highcharts/themes/grid.js | 103 - .../third-party/highcharts/themes/skies.js | 89 - .../2.1.10/third-party/jquery-1.10.2.js | 9789 ----- .../2.1.10/third-party/jquery-1.10.2.min.js | 6 - .../2.1.10/third-party/jquery-1.10.2.min.map | 1 - .../snapscreen/UEditorSnapscreen.exe | Bin 519936 -> 0 bytes .../2.1.10/third-party/video-js/font/vjs.eot | Bin 3536 -> 0 bytes .../2.1.10/third-party/video-js/font/vjs.svg | 65 - .../2.1.10/third-party/video-js/font/vjs.ttf | Bin 3372 -> 0 bytes .../2.1.10/third-party/video-js/font/vjs.woff | Bin 4228 -> 0 bytes .../2.1.10/third-party/video-js/video-js.css | 766 - .../third-party/video-js/video-js.min.css | 5 - .../2.1.10/third-party/video-js/video-js.swf | Bin 16236 -> 0 bytes .../2.1.10/third-party/video-js/video.dev.js | 7108 ---- .../2.1.10/third-party/video-js/video.js | 129 - .../third-party/webuploader/Uploader.swf | Bin 49382 -> 0 bytes .../third-party/webuploader/webuploader.css | 28 - .../webuploader/webuploader.custom.js | 5670 --- .../webuploader/webuploader.custom.min.js | 2 - .../webuploader/webuploader.flashonly.js | 4176 -- .../webuploader/webuploader.flashonly.min.js | 2 - .../webuploader/webuploader.html5only.js | 5559 --- .../webuploader/webuploader.html5only.min.js | 2 - .../third-party/webuploader/webuploader.js | 6735 ---- .../webuploader/webuploader.min.js | 2 - .../webuploader/webuploader.withoutimage.js | 4593 --- .../webuploader.withoutimage.min.js | 2 - .../zeroclipboard/ZeroClipboard.js | 1256 - .../zeroclipboard/ZeroClipboard.min.js | 9 - .../zeroclipboard/ZeroClipboard.swf | Bin 3933 -> 0 bytes 287 files changed, 134832 deletions(-) delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/README.md delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/anchor/anchor.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_chm.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_default.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_doc.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_exe.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_jpg.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_mp3.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_mv.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_pdf.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_ppt.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_psd.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_rar.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_txt.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_xls.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/alignicon.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/alignicon.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/file-icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/file-icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/image.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/progress.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/images/bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/images/success.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/chart.config.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts0.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts1.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts2.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts3.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts4.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts5.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/0.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/bface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/cface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/fface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/jxface2.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/neweditor-tab-bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/tface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/wface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/yface.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/buttoniconex.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.eot delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.ttf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.woff delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/addfile.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/selected.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/gmap/gmap.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/alignicon.jpg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/image.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/progress.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/insertframe/insertframe.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/internal.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/link/link.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/map.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/show.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/balls.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/preview/preview.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/addimg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/brush.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/delimg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/delimgH.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/empty.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/emptyH.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/eraser.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/redo.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/redoH.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/scale.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/scaleH.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/size.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/undo.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/undoH.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/snapscreen/snapscreen.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/dragicon.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittd.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittip.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/config.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/bg.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre0.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre1.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre2.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre3.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre4.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/center_focus.jpg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/image.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/left_focus.jpg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/none_focus.jpg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/progress.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/right_focus.jpg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/success.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/success.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/webapp/webapp.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/fClipboard_ueditor.swf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/imageUploader.swf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/tangram.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/en.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/addimage.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/alldeletebtnhoverskin.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/alldeletebtnupskin.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/background.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/button.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/copy.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deletedisable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deleteenable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/listbackground.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/localimage.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/music.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftdisable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftenable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotaterightdisable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotaterightenable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/upload.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/copy.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/localimage.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/music.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/upload.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/zh-cn.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/index.html delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.config.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.service.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/package.json delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/iframe.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/css/neditor.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/css/neditor.min.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/dialogbase.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.eot delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.ttf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.woff delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/anchor.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_down.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_up.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/button-bg.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cancelbutton.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/charts.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_h.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_h.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_v.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_v.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/dialog-title-bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/filescan.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/highlighted.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons-all.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loaderror.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loading.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/lock.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/neweditor-tab-bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/pagebreak.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/scale.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sortable.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/spacer.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sparator_v.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/table-cell-align.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/tangram-colorpicker.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/toolbar_bg.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/unhighlighted.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/upload.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/videologo.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/word.gif delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/wordpaste.png delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/SyntaxHighlighter/shCore.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/SyntaxHighlighter/shCoreDefault.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/browser-md5-file.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/codemirror/codemirror.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/codemirror/codemirror.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/mootools-adapter.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/mootools-adapter.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/prototype-adapter.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/prototype-adapter.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/standalone-framework.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/adapters/standalone-framework.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/highcharts-more.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/highcharts-more.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/highcharts.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/highcharts.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/annotations.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/annotations.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/canvas-tools.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/canvas-tools.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/data.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/data.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/drilldown.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/drilldown.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/exporting.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/exporting.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/funnel.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/funnel.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/heatmap.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/heatmap.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/map.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/map.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/no-data-to-display.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/modules/no-data-to-display.src.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/themes/dark-blue.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/themes/dark-green.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/themes/gray.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/themes/grid.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/highcharts/themes/skies.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/jquery-1.10.2.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/jquery-1.10.2.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/jquery-1.10.2.min.map delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/snapscreen/UEditorSnapscreen.exe delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/font/vjs.eot delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/font/vjs.svg delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/font/vjs.ttf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/font/vjs.woff delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/video-js.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/video-js.min.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/video-js.swf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/video.dev.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/video-js/video.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/Uploader.swf delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.css delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.custom.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.custom.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.flashonly.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.flashonly.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.html5only.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.html5only.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.withoutimage.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/webuploader/webuploader.withoutimage.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/zeroclipboard/ZeroClipboard.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/zeroclipboard/ZeroClipboard.min.js delete mode 100644 web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/zeroclipboard/ZeroClipboard.swf diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/README.md b/web/src/main/resources/static/plug-in/neditor/2.1.10/README.md deleted file mode 100644 index dab8c93..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/README.md +++ /dev/null @@ -1,156 +0,0 @@ - -

    - - -

    - -## 新版发布 - -2.1 发布,此次版本移除了后端相关代码,纯 ajax 提交,请配置 `neditor.config.js` `neditor.service.js`,支持各种后端或者云存储。 - -### 关于 HTTPS - -使用了 [又拍云CDN](https://console.upyun.com/register/?invite=r17EYO3BW) 服务,支持跨域 和 https。 - -如果有需要,也可将下面域名改成自己的。 -``` -imgbaidu.b0.upaiyun.com -tingapi.b0.upaiyun.com -``` -Neditor 是我们团队基于 Ueditor 的一款富文本编辑器。 -不论从功能还是从其它各方面来讲, Ueditor 都是一款无以替代的编辑器产品。 -只是已经不符合现代化样式的需求,于是我们修改它的样式,实现了这样的效果: - -![image](https://www.notadd.com/src/neditor.webp) - -## 第一步:下载编辑器 - -**方式一:完整安装包 (推荐)** - -* [Neditor.tar.xz](https://www.notadd.com/download/neditor/Neditor-next-master.tar.xz) - -**方式二: npm安装** - -`npm i @notadd/neditor -S` - -**方式三:编译安装** - -```shell -git clone https://github.com/notadd/neditor.git -npm install -npm run build -``` - -### 第二步:在浏览器打开 index.html ### - -进入到目录 `dist` , 使用浏览器打开文件 `index.html` 。 - -如果看到了下面这样的编辑器,恭喜你,初次部署成功! - -![部署成功](https://www.notadd.com/src/neditor-demo.webp) - -## 相关版本 - -[Angular 版 Neditor](https://github.com/notadd/ngx-neditor) - -其他版本待添加 - -### 自定义的参数 - -编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器: - -```javascript -var ue = UE.getEditor('container', { - autoHeight: false -}); -``` - -配置项也可以通过 `neditor.config.js` 文件修改,具体的配置方法请看 [前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md)、[后端配置项说明](http://fex.baidu.com/ueditor/#server-config) - -### 编辑器图片、视频、涂鸦、附件上传service - -编辑器上传逻辑单独在 `neditor.service.js` 文件配置,具体的配置方法见注释 - -### 设置和读取编辑器的内容 - -通 getContent 和 setContent 方法可以设置和读取编辑器的内容 - -```javascript -var ue = UE.getContent(); -ue.ready(function(){ - //设置编辑器的内容 - ue.setContent('hello'); - //获取html内容,返回:

    hello

    - var html = ue.getContent(); - //获取纯文本内容,返回: hello - var txt = ue.getContentTxt(); -}); -``` - -Ueditor 的更多API请看[API 文档](http://ueditor.baidu.com/doc "ueditor API 文档") - -## 下载地址 - -Neditor 码云: [http://gitee.com/notadd/neditor](http://gitee.com/notadd/neditor "Neditor github 地址") - -Neditor github 地址:[http://github.com/notadd/neditor](http://github.com/notadd/neditor "Neditor github 地址") - -## 相关链接 - -Ueditor 官网:[http://ueditor.baidu.com](http://ueditor.baidu.com "ueditor 官网") - -Ueditor API 文档:[http://ueditor.baidu.com/doc](http://ueditor.baidu.com/doc "ueditor API 文档") - - - -## 详细文档 - -Ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/) - -注: 对IE8以下版本不再承诺兼容 - -## 联系我们 ## - -Neditor官方交流群:257753500 - -QQ 群: 321735506 - -[issue](http://github.com/notadd/neditor/issues) - -## 捐赠 - - -欢迎通过 [捐赠](https://git.oschina.net/notadd/neditor?donate=true) 支持此项目的发展。 - -## Todo - -### 2.x - -- [x] 将上传封装为 service ,支持非 GraphQL 接口。 -- [ ] 细节样式修改(美化) -- [ ] word 内图片自动上传 -- [ ] 粘贴图片转为本地图片 - -### 3.0 - -- [ ] 使用 Typescript 重构 -- [ ] 草稿箱功能与离线保存 -- [ ] service worker 特性 -- [ ] 实现 2.0 的大部分功能 - -## 其他项目:Notadd - -https://github.com/notadd/notadd - - - ## 感谢提供赞助: - - -   - -**UCloud 云服务器限时优惠 — Notadd 项目用户福利** - -[【基础型】1核2G 1M带宽 50GB SSD数据盘 低至250元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd ) - -[【标准型】2核4G 1M带宽 50GB SSD数据盘 低至550元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd ) - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/anchor/anchor.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/anchor/anchor.html deleted file mode 100644 index bacffe9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/anchor/anchor.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - -
    - -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.css deleted file mode 100644 index 15f49ed..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.css +++ /dev/null @@ -1,682 +0,0 @@ -@charset "utf-8"; -/* dialog样式 */ -.wrapper { - zoom: 1; - width: 630px; - *width: 626px; - height: 380px; - margin: 0 auto; - padding: 10px; - position: relative; - font-family: sans-serif; -} - -/*tab样式框大小*/ -.tabhead { - float:left; -} -.tabbody { - width: 100%; - height: 346px; - position: relative; - clear: both; -} - -.tabbody .panel { - position: absolute; - width: 0; - height: 0; - background: #fff; - overflow: hidden; - display: none; -} - -.tabbody .panel.focus { - width: 100%; - height: 346px; - display: block; -} - -/* 上传附件 */ -.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: 346px; - display: block; - clip: auto; -} - -#upload .queueList { - margin: 0; - width: 100%; - height: 100%; - position: absolute; - overflow: hidden; -} - -#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; - /*border: 2px dashed #e6e6e6;*/ - height: 172px; - padding-top: 150px; - text-align: center; - /*background: url(./images/image.png) center 70px no-repeat;*/ - background-color: #f3f3f3; - color: #cccccc; - font-size: 18px; - position: relative; - top:0; - *top: 10px; -} - -#upload .placeholder .webuploader-pick { - font-size: 16px; - background: #f3f3f3; - border-radius: 3px; - line-height: 44px; - padding: 0 30px; - color: #646464; - display: inline-block; - margin: 0 auto 20px auto; - cursor: pointer; - /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */ - border: 1px solid #ccc; -} - -#upload .placeholder .webuploader-pick-hover { - border: 1px solid #00a2d4; - color: #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: 300px; -} - -#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: 9px 0 0 9px; - *margin: 6px 0 0 6px; - 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(../fonts/images/addfile.svg) no-repeat center; - 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; -} - - - -/* 图片管理样式 */ -#online { - width: 100%; - height: 336px; - padding: 10px 0 0 0; -} -#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; - list-style: none; - padding: 0; - width: 113px; - height: 113px; - margin: 0 0 9px 9px; - *margin: 0 0 6px 6px; - background-color: #eee; - overflow: hidden; - cursor: pointer; - position: relative; -} -#online li.clearFloat { - float: none; - clear: both; - display: block; - width:0; - height:0; - margin: 0; - padding: 0; -} -#online li img { - cursor: pointer; -} -#online li div.file-wrapper { - cursor: pointer; - position: absolute; - display: block; - width: 111px; - height: 111px; - border: 1px solid #eee; - background: url("./images/bg.png") repeat; -} -#online li div span.file-title{ - display: block; - padding: 0 3px; - margin: 3px 0 0 0; - font-size: 12px; - height: 15px; - color: #555555; - text-align: center; - width: 107px; - white-space: nowrap; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; -} -#online li .icon { - cursor: pointer; - width: 113px; - height: 113px; - position: absolute; - top: 0; - left: 0; - z-index: 2; - 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; - border: 3px solid #1094fa; - background-position: 72px 72px; -} - - -/* 在线文件的文件预览图标 */ -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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.html deleted file mode 100644 index f698f19..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - neditor图片对话框 - - - - - - - - - - - - - - -
    -
    - - -
    -
    - -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    - - -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.js deleted file mode 100644 index d9598b0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/attachment.js +++ /dev/null @@ -1,775 +0,0 @@ -/** - * User: Jinqn - * Date: 14-04-08 - * Time: 下午16:34 - * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 - */ - -(function () { - - var uploadFile, - onlineFile; - - window.onload = function () { - initTabs(); - initButtons(); - }; - - /* 初始化tab标签 */ - function initTabs() { - var tabs = $G('tabhead').children; - for (var i = 0; i < tabs.length; i++) { - domUtils.on(tabs[i], "click", function (e) { - var target = e.target || e.srcElement; - setTabFocus(target.getAttribute('data-content-id')); - }); - } - - setTabFocus('upload'); - } - - /* 初始化tabbody */ - function setTabFocus(id) { - if(!id) return; - var i, bodyId, tabs = $G('tabhead').children; - for (i = 0; i < tabs.length; i++) { - bodyId = tabs[i].getAttribute('data-content-id') - if (bodyId == id) { - domUtils.addClass(tabs[i], 'focus'); - domUtils.addClass($G(bodyId), 'focus'); - } else { - domUtils.removeClasses(tabs[i], 'focus'); - domUtils.removeClasses($G(bodyId), 'focus'); - } - } - switch (id) { - case 'upload': - uploadFile = uploadFile || new UploadFile('queueList'); - break; - case 'online': - onlineFile = onlineFile || new OnlineFile('fileList'); - break; - } - } - - /* 初始化onok事件 */ - function initButtons() { - - dialog.onok = function () { - var list = [], id, tabs = $G('tabhead').children; - for (var i = 0; i < tabs.length; i++) { - if (domUtils.hasClass(tabs[i], 'focus')) { - id = tabs[i].getAttribute('data-content-id'); - break; - } - } - - switch (id) { - case 'upload': - list = uploadFile.getInsertList(); - var count = uploadFile.getQueueCount(); - if (count) { - $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); - return false; - } - break; - case 'online': - list = onlineFile.getInsertList(); - break; - } - - editor.execCommand('insertfile', list); - }; - } - - - /* 上传附件 */ - 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('fileActionName')), - fileMaxSize = editor.getOpt('fileMaxSize'), - acceptExtensions = (editor.getOpt('fileAllowFiles') || - [".txt",".doc",".docs",".xls",".xlsx",".ppt",".pdf",".odt",".ott",".fodt",".uot",".xml",".dot",".htm",".html",".rtf",".docm",".zip",".rar",".tar",".7z",".tar.gz",".tar.bz",".tar.xz"]).join('').replace(/\./g, ',').replace(/^[,]/, '');; - if (!WebUploader.Uploader.support()) { - $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); - return; - } else if (!editor.getOpt('fileActionName')) { - $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); - return; - } - - uploader = _this.uploader = WebUploader.create({ - pick: { - id: '#filePickerReady', - label: lang.uploadSelectFile - }, - swf: '../../third-party/webuploader/Uploader.swf', - server: actionUrl, - fileVal: editor.getOpt('fileFieldName'), - duplicate: true, - fileSingleSizeLimit: fileMaxSize, - compress: false - }); - 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) { - $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) { - /* 选择文件后设置上传相关的url和自定义参数 */ - editor.getOpt("fileUploadService")(_this, editor).setUploadData(file); - - if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) { - fileCount++; - fileSize += file.size; - } - - if (fileCount === 1) { - $placeHolder.addClass('element-invisible'); - $statusBar.show(); - } - - addFile(file); - }); - - uploader.on('fileDequeued', function (file) { - if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) { - 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': - /* 设置Uploader配置项 */ - editor.getOpt("fileUploadService")(_this, editor).setUploaderOptions(uploader); - setState('uploading', files); - break; - case 'stopUpload': - setState('paused', files); - break; - } - }); - - uploader.on('uploadBeforeSend', function (object, data, headers) { - //这里可以通过data对象添加POST参数 - editor.getOpt("fileUploadService")(_this, editor).setFormData(object, data, headers); - }); - - 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, res) { - var $file = $('#' + file.id); - try { - if (editor.getOpt("fileUploadService")(_this, editor).getResponseSuccess(res)) { - _this.fileList.push(res); - $file.append(''); - } else { - $file.find('.error').text(res.message).show(); - } - } catch (e) { - $file.find('.error').text(lang.errorServerUpload).show(); - } - }); - - 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('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; - }, - getInsertList: function () { - var i, link, data, list = [], - prefix = editor.getOpt('fileUrlPrefix'), - fileSrcField = editor.getOpt("fileUploadService")(this, editor).fileSrcField || 'url', - fileSrc = '', - fileSrcFieldKeys = fileSrcField.split('.'); - - for (i = 0; i < this.fileList.length; i++) { - data = this.fileList[i]; - if(fileSrcFieldKeys.length > 1) { - function setFileSrc(obj, keys, index) { - obj = obj[keys[index]]; - if (index < keys.length - 1) { - setFileSrc(obj, keys, index += 1) - } else { - fileSrc = obj; - } - } - - setFileSrc(data, fileSrcFieldKeys, 0); - } else { - fileSrc = data[fileSrcField]; - } - link = fileSrc; - list.push({ - title: data.original || link.substr(link.lastIndexOf('/') + 1), - url: prefix + link - }); - } - return list; - } - }; - - - /* 在线附件 */ - function OnlineFile(target) { - this.container = utils.isString(target) ? document.getElementById(target) : target; - this.init(); - } - OnlineFile.prototype = { - init: function () { - this.initContainer(); - this.initEvents(); - this.initData(); - }, - /* 初始化容器 */ - initContainer: function () { - this.container.innerHTML = ''; - this.list = document.createElement('ul'); - this.clearFloat = document.createElement('li'); - - domUtils.addClass(this.list, 'list'); - domUtils.addClass(this.clearFloat, 'clearFloat'); - - this.list.appendChild(this.clearFloat); - this.container.appendChild(this.list); - }, - /* 初始化滚动事件,滚动到地步自动拉取数据 */ - initEvents: function () { - var _this = this; - - /* 滚动拉取图片 */ - domUtils.on($G('fileList'), 'scroll', function(e){ - var panel = this; - if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { - _this.getFileData(); - } - }); - /* 选中图片 */ - domUtils.on(this.list, 'click', function (e) { - var target = e.target || e.srcElement, - li = target.parentNode; - - if (li.tagName.toLowerCase() == 'li') { - if (domUtils.hasClass(li, 'selected')) { - domUtils.removeClasses(li, 'selected'); - } else { - domUtils.addClass(li, 'selected'); - } - } - }); - }, - /* 初始化第一次的数据 */ - initData: function () { - - /* 拉取数据需要使用的值 */ - this.state = 0; - this.listSize = editor.getOpt('fileManagerListSize'); - this.listIndex = 0; - this.listEnd = false; - - /* 第一次拉取数据 */ - this.getFileData(); - }, - /* 向后台拉取图片列表数据 */ - getFileData: function () { - var _this = this; - - 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')), - method: 'get', - onsuccess: function (r) { - try { - var json = 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) { - _this.listEnd = true; - } - _this.isLoadingData = false; - } - } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { - var list = r.responseText.split(r.responseText); - _this.pushData(list); - _this.listIndex = parseInt(list.length); - _this.listEnd = true; - _this.isLoadingData = false; - } - } - }, - onerror: function () { - _this.isLoadingData = false; - } - }); - } - }, - /* 添加图片到列表界面上 */ - pushData: function (list) { - 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) { - 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 ) { - preview = document.createElement('img'); - 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) ); - } else { - var ic = document.createElement('i'), - textSpan = document.createElement('span'); - textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); - preview = document.createElement('div'); - preview.appendChild(ic); - preview.appendChild(textSpan); - domUtils.addClass(preview, 'file-wrapper'); - domUtils.addClass(textSpan, 'file-title'); - domUtils.addClass(ic, 'file-type-' + filetype); - domUtils.addClass(ic, 'file-preview'); - } - domUtils.addClass(icon, 'icon'); - item.setAttribute('data-url', urlPrefix + list[i].url); - if (list[i].original) { - item.setAttribute('data-title', list[i].original); - } - - item.appendChild(preview); - item.appendChild(icon); - this.list.insertBefore(item, this.clearFloat); - } - } - }, - /* 改变图片大小 */ - scale: function (img, w, h, type) { - var ow = img.width, - oh = img.height; - - if (type == 'justify') { - if (ow >= oh) { - img.width = w; - img.height = h * oh / ow; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w * ow / oh; - img.height = h; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } else { - if (ow >= oh) { - img.width = w * ow / oh; - img.height = h; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w; - img.height = h * oh / ow; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } - }, - getInsertList: function () { - var i, lis = this.list.children, list = []; - for (i = 0; i < lis.length; i++) { - if (domUtils.hasClass(lis[i], 'selected')) { - var url = lis[i].getAttribute('data-url'); - var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); - list.push({ - title: title, - url: url - }); - } - } - return list; - } - }; - - -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_chm.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_default.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_doc.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_mp3.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_mv.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_pdf.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_ppt.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_psd.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/fileTypeImages/icon_xls.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/alignicon.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/alignicon.gif deleted file mode 100644 index 005a5ac65a3ddc9cdac037abdb5fe92267155a0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/file-icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/file-icons.png deleted file mode 100644 index 3ff82c8c488f53a7aff67fbe39742e3321183eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44070 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

    *vGSxI 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.gif deleted file mode 100644 index 78459dea7b12ccbeec81d19ecdab22b1658e93b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/icons.png deleted file mode 100644 index 12e4700163ac87fa38ae3d92a2c39d0fb4690fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/progress.png deleted file mode 100644 index 717c4865c90a959c6a0e9ad1af9c777d900a2e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.gif deleted file mode 100644 index 8d4f3112b9d1df2147ed3b67d9736163dedd11e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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? diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/attachment/images/success.png deleted file mode 100644 index 94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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# - - - - - - - -

    -
    - - -
    -
    -
    -
    - -
    -
    - - -
    -
    -
    - : -
    -
    -
    -
    -
    - -
    -
    - : -
    -
    - :x:px  y:px -
    -
    -
    - -
    -
    -
    -
    -
    -
    - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.js deleted file mode 100644 index 9a4a131..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/background.js +++ /dev/null @@ -1,376 +0,0 @@ -(function () { - - var onlineImage, - backupStyle = editor.queryCommandValue('background'); - - window.onload = function () { - initTabs(); - initColorSelector(); - }; - - /* 初始化tab标签 */ - 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){ - tabs[j].className = "focus"; - var contentId = tabs[j].getAttribute('data-content-id'); - $G(contentId).style.display = "block"; - if(contentId == 'imgManager') { - initImagePanel(); - } - }else { - tabs[j].className = ""; - $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; - } - } - }); - } - } - - /* 初始化颜色设置 */ - function initColorSelector () { - var obj = editor.queryCommandValue('background'); - if (obj) { - var color = obj['background-color'], - repeat = obj['background-repeat'] || 'repeat', - image = obj['background-image'] || '', - position = obj['background-position'] || 'center center', - pos = position.split(' '), - x = parseInt(pos[0]) || 0, - y = parseInt(pos[1]) || 0; - - if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; - - image = image.match(/url[\s]*\(([^\)]*)\)/); - image = image ? image[1]:''; - updateFormState('colored', color, image, repeat, x, y); - } else { - updateFormState(); - } - - var updateHandler = function () { - updateFormState(); - updateBackground(); - } - 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); - }); - } - updateHandler(); - }); - domUtils.on($G('repeatType'), 'change', updateHandler); - domUtils.on($G('x'), 'keyup', updateBackground); - domUtils.on($G('y'), 'keyup', updateBackground); - - initColorPicker(); - } - - /* 初始化颜色选择器 */ - function initColorPicker() { - var me = editor, - cp = $G("colorPicker"); - - /* 生成颜色选择器ui对象 */ - var popup = new UE.ui.Popup({ - content: new UE.ui.ColorPicker({ - noColorText: me.getLang("clearColor"), - editor: me, - onpickcolor: function (t, color) { - updateFormState('colored', color); - updateBackground(); - UE.ui.Popup.postHide(); - }, - onpicknocolor: function (t, color) { - updateFormState('colored', 'transparent'); - updateBackground(); - UE.ui.Popup.postHide(); - } - }), - editor: me, - onhide: function () { - } - }); - - /* 设置颜色选择器 */ - domUtils.on(cp, "click", function () { - popup.showAnchor(this); - }); - domUtils.on(document, 'mousedown', function (evt) { - var el = evt.target || evt.srcElement; - UE.ui.Popup.postHide(el); - }); - domUtils.on(window, 'scroll', function () { - UE.ui.Popup.postHide(); - }); - } - - /* 初始化在线图片列表 */ - function initImagePanel() { - onlineImage = onlineImage || new OnlineImage('imageList'); - } - - /* 更新背景色设置面板 */ - 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(color) { - domUtils.setStyle($G("colorPicker"), "background-color", color); - } - - 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); - } - - 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(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'; - } - - /* 更新背景颜色 */ - function updateBackground () { - if ($G('coloredRadio').checked) { - var color = domUtils.getStyle($G("colorPicker"), "background-color"), - bgimg = $G("url").value, - align = $G("repeatType").value, - backgroundObj = { - "background-repeat": "no-repeat", - "background-position": "center center" - }; - - if (color) backgroundObj["background-color"] = color; - if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; - if (align == 'self') { - backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; - } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { - backgroundObj["background-repeat"] = align; - } - - editor.execCommand('background', backgroundObj); - } else { - editor.execCommand('background', null); - } - } - - - /* 在线图片 */ - function OnlineImage(target) { - this.container = utils.isString(target) ? document.getElementById(target) : target; - this.init(); - } - OnlineImage.prototype = { - init: function () { - this.reset(); - this.initEvents(); - }, - /* 初始化容器 */ - initContainer: function () { - this.container.innerHTML = ''; - this.list = document.createElement('ul'); - this.clearFloat = document.createElement('li'); - - domUtils.addClass(this.list, 'list'); - domUtils.addClass(this.clearFloat, 'clearFloat'); - - this.list.id = 'imageListUl'; - this.list.appendChild(this.clearFloat); - this.container.appendChild(this.list); - }, - /* 初始化滚动事件,滚动到地步自动拉取数据 */ - initEvents: function () { - var _this = this; - - /* 滚动拉取图片 */ - domUtils.on($G('imageList'), 'scroll', function(e){ - var panel = this; - if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { - _this.getImageData(); - } - }); - /* 选中图片 */ - domUtils.on(this.container, 'click', function (e) { - var target = e.target || e.srcElement, - li = target.parentNode, - nodes = $G('imageListUl').childNodes; - - if (li.tagName.toLowerCase() == 'li') { - updateFormState('nocolor', null, ''); - for (var i = 0, node; node = nodes[i++];) { - if (node == li && !domUtils.hasClass(node, 'selected')) { - domUtils.addClass(node, 'selected'); - updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); - } else { - domUtils.removeClasses(node, 'selected'); - } - } - updateBackground(); - } - }); - }, - /* 初始化第一次的数据 */ - initData: function () { - - /* 拉取数据需要使用的值 */ - this.state = 0; - this.listSize = editor.getOpt('imageManagerListSize'); - this.listIndex = 0; - this.listEnd = false; - - /* 第一次拉取数据 */ - this.getImageData(); - }, - /* 重置界面 */ - reset: function() { - this.initContainer(); - this.initData(); - }, - /* 向后台拉取图片列表数据 */ - getImageData: function () { - var _this = this; - - 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':'', - 'data': utils.extend({ - start: this.listIndex, - size: this.listSize - }, editor.queryCommandValue('serverparam')), - 'method': 'get', - 'onsuccess': function (r) { - try { - 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) { - _this.listEnd = true; - } - _this.isLoadingData = false; - } - } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { - var list = r.responseText.split(r.responseText); - _this.pushData(list); - _this.listIndex = parseInt(list.length); - _this.listEnd = true; - _this.isLoadingData = false; - } - } - }, - 'onerror': function () { - _this.isLoadingData = false; - } - }); - } - }, - /* 添加图片到列表界面上 */ - pushData: function (list) { - var i, item, img, icon, _this = this, - urlPrefix = editor.getOpt('imageManagerUrlPrefix'); - for (i = 0; i < list.length; i++) { - 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(){ - _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); - domUtils.addClass(icon, 'icon'); - - item.appendChild(img); - item.appendChild(icon); - this.list.insertBefore(item, this.clearFloat); - } - } - }, - /* 改变图片大小 */ - scale: function (img, w, h, type) { - var ow = img.width, - oh = img.height; - - if (type == 'justify') { - if (ow >= oh) { - img.width = w; - img.height = h * oh / ow; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w * ow / oh; - img.height = h; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } else { - if (ow >= oh) { - img.width = w * ow / oh; - img.height = h; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w; - img.height = h * oh / ow; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } - }, - getInsertList: function () { - var i, lis = this.list.children, list = [], align = getAlign(); - for (i = 0; i < lis.length; i++) { - if (domUtils.hasClass(lis[i], 'selected')) { - var img = lis[i].firstChild, - src = img.getAttribute('_src'); - list.push({ - src: src, - _src: src, - floatStyle: align - }); - } - - } - return list; - } - }; - - dialog.onok = function () { - updateBackground(); - editor.fireEvent('saveScene'); - }; - dialog.oncancel = function () { - editor.execCommand('background', backupStyle); - }; - -})(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/background/images/bg.png deleted file mode 100644 index 580be0a01dff4c70c72f78a3f40186660ee8eee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2810 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'+ this.point.name +'
    : '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; - } - } - } - } - } -]; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.css deleted file mode 100644 index ac3c764..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.css +++ /dev/null @@ -1,165 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - overflow-x: hidden; -} - -.main { - width: 100%; - overflow: hidden; -} - -.table-view { - height: 100%; - float: left; - margin: 20px; - width: 40%; -} - -.table-view .table-container { - width: 100%; - margin-bottom: 50px; - overflow: scroll; -} - -.table-view th { - padding: 5px 10px; - background-color: #F7F7F7; -} - -.table-view td { - width: 50px; - text-align: center; - padding:0; -} - -.table-container input { - width: 40px; - padding: 5px; - border: none; - outline: none; -} - -.table-view caption { - font-size: 18px; - text-align: left; -} - -.charts-view { - /*margin-left: 49%!important;*/ - width: 50%; - margin-left: 49%; - height: 400px; -} - -.charts-container { - border-left: 1px solid #c3c3c3; -} - -.charts-format fieldset { - padding-left: 20px; - margin-bottom: 50px; -} - -.charts-format legend { - padding-left: 10px; - padding-right: 10px; -} - -.format-item-container { - padding: 20px; -} - -.format-item-container label { - display: block; - margin: 10px 0; -} - -.charts-format .data-item { - border: 1px solid black; - outline: none; - padding: 2px 3px; -} - -/* 图表类型 */ - -.charts-type { - margin-top: 50px; - height: 300px; -} - -.scroll-view { - border: 1px solid #c3c3c3; - border-left: none; - border-right: none; - overflow: hidden; -} - -.scroll-container { - margin: 20px; - width: 100%; - overflow: hidden; -} - -.scroll-bed { - width: 10000px; - _margin-top: 20px; - -webkit-transition: margin-left .5s ease; - -moz-transition: margin-left .5s ease; - transition: margin-left .5s ease; -} - -.view-box { - display: inline-block; - *display: inline; - *zoom: 1; - margin-right: 20px; - border: 2px solid white; - line-height: 0; - overflow: hidden; - cursor: pointer; -} - -.view-box img { - border: 1px solid #cecece; -} - -.view-box.selected { - border-color: #7274A7; -} - -.button-container { - margin-bottom: 20px; - text-align: center; -} - -.button-container a { - display: inline-block; - width: 100px; - height: 25px; - line-height: 25px; - border: 1px solid #c2ccd1; - margin-right: 30px; - text-decoration: none; - color: black; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -.button-container a:HOVER { - background: #fcfcfc; -} - -.button-container a:ACTIVE { - border-top-color: #c2ccd1; - box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); -} - -.edui-charts-not-data { - height: 100px; - line-height: 100px; - text-align: center; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.html deleted file mode 100644 index 70e2314..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - chart - - - - - -
    -
    -

    -
    -

    -
    -
    -
    - -
    - - -
    -
    -
    -
    - -
    - - - - -
    -
    -
    - -
    - -

    -
    -
    -
    - -
    - -

    -
    -
    -
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.js deleted file mode 100644 index 37344fd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/charts.js +++ /dev/null @@ -1,519 +0,0 @@ -/* - * 图片转换对话框脚本 - **/ - -var tableData = [], - //编辑器页面table - editorTable = null, - chartsConfig = window.typeConfig, - resizeTimer = null, - //初始默认图表类型 - currentChartType = 0; - -window.onload = function () { - - editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); - - //未找到表格, 显示错误页面 - if ( !editorTable ) { - document.body.innerHTML = "
    未找到数据
    "; - return; - } - - //初始化图表类型选择 - initChartsTypeView(); - renderTable( editorTable ); - initEvent(); - initUserConfig( editorTable.getAttribute( "data-chart" ) ); - $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); - updateViewType( currentChartType ); - - dialog.addListener( "resize", function () { - - if ( resizeTimer != null ) { - window.clearTimeout( resizeTimer ); - } - - resizeTimer = window.setTimeout( function () { - - resizeTimer = null; - - renderCharts(); - - }, 500 ); - - } ); - -}; - -function initChartsTypeView () { - - var contents = []; - - for ( var i = 0, len = chartsConfig.length; i
    ' ); - - } - - $( "#scrollBed" ).html( contents.join( "" ) ); - -} - -//渲染table, 以便用户修改数据 -function renderTable ( table ) { - - var tableHtml = []; - - //构造数据 - for ( var i = 0, row; row = table.rows[ i ]; i++ ) { - - tableData[ i ] = []; - tableHtml[ i ] = []; - - for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { - - var value = getCellValue( cell ); - - if ( i > 0 && j > 0 ) { - value = +value; - } - - if ( i === 0 || j === 0 ) { - tableHtml[ i ].push( ''+ value +'' ); - } else { - tableHtml[ i ].push( '' ); - } - - tableData[ i ][ j ] = value; - - } - - tableHtml[ i ] = tableHtml[ i ].join( "" ); - - } - - //draw 表格 - $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
    ' ); - -} - -/* - * 根据表格已有的图表属性初始化当前图表属性 - */ -function initUserConfig ( config ) { - - var parsedConfig = {}; - - if ( !config ) { - return; - } - - config = config.split( ";" ); - - $.each( config, function ( index, item ) { - - item = item.split( ":" ); - parsedConfig[ item[ 0 ] ] = item[ 1 ]; - - } ); - - setUserConfig( parsedConfig ); - -} - -function initEvent () { - - var cacheValue = null, - //图表类型数 - typeViewCount = chartsConfig.length- 1, - $chartsTypeViewBox = $( '#scrollBed .view-box' ); - - $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { - - renderCharts(); - - } ) - - $( ".table-view" ).delegate( ".data-item", "focus", function () { - - cacheValue = this.value; - - } ).delegate( ".data-item", "blur", function () { - - if ( this.value !== cacheValue ) { - renderCharts(); - } - - cacheValue = null; - - } ); - - $( "#buttonContainer" ).delegate( "a", "click", function (e) { - - e.preventDefault(); - - if ( this.getAttribute( "data-title" ) === 'prev' ) { - - if ( currentChartType > 0 ) { - currentChartType--; - updateViewType( currentChartType ); - } - - } else { - - if ( currentChartType < typeViewCount ) { - currentChartType++; - updateViewType( currentChartType ); - } - - } - - } ); - - //图表类型变化 - $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { - - var index = $( this ).attr( "data-chart-type" ); - $chartsTypeViewBox.removeClass( "selected" ); - $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); - - currentChartType = index | 0; - - //饼图, 禁用部分配置 - if ( currentChartType === chartsConfig.length - 1 ) { - - disableNotPieConfig(); - - //启用完整配置 - } else { - - enableNotPieConfig(); - - } - - renderCharts(); - - } ); - -} - -function renderCharts () { - - var data = collectData(); - - $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { - - credits: { - enabled: false - }, - exporting: { - enabled: false - }, - title: { - text: data.title, - x: -20 //center - }, - subtitle: { - text: data.subTitle, - x: -20 - }, - xAxis: { - title: { - text: data.xTitle - }, - categories: data.categories - }, - yAxis: { - title: { - text: data.yTitle - }, - plotLines: [{ - value: 0, - width: 1, - color: '#808080' - }] - }, - tooltip: { - enabled: true, - valueSuffix: data.suffix - }, - legend: { - layout: 'vertical', - align: 'right', - verticalAlign: 'middle', - borderWidth: 1 - }, - series: data.series - - } )); - -} - -function updateViewType ( index ) { - - $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); - -} - -function collectData () { - - var form = document.forms[ 'data-form' ], - data = null; - - if ( currentChartType !== chartsConfig.length - 1 ) { - - data = getSeriesAndCategories(); - $.extend( data, getUserConfig() ); - - //饼图数据格式 - } else { - data = getSeriesForPieChart(); - data.title = form[ 'title' ].value; - data.suffix = form[ 'unit' ].value; - } - - return data; - -} - -/** - * 获取用户配置信息 - */ -function getUserConfig () { - - var form = document.forms[ 'data-form' ], - info = { - title: form[ 'title' ].value, - subTitle: form[ 'sub-title' ].value, - xTitle: form[ 'x-title' ].value, - yTitle: form[ 'y-title' ].value, - suffix: form[ 'unit' ].value, - //数据对齐方式 - tableDataFormat: getTableDataFormat (), - //饼图提示文字 - tip: $( "#tipInput" ).val() - }; - - return info; - -} - -function setUserConfig ( config ) { - - var form = document.forms[ 'data-form' ]; - - config.title && ( form[ 'title' ].value = config.title ); - config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); - config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); - config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); - config.suffix && ( form[ 'unit' ].value = config.suffix ); - config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); - config.tip && ( form[ 'tip' ].value = config.tip ); - currentChartType = config.chartType || 0; - -} - -function getSeriesAndCategories () { - - var form = document.forms[ 'data-form' ], - series = [], - categories = [], - tmp = [], - tableData = getTableData(); - - //反转数据 - if ( getTableDataFormat() === "-1" ) { - - for ( var i = 0, len = tableData.length; i < len; i++ ) { - - for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { - - if ( !tmp[ j ] ) { - tmp[ j ] = []; - } - - tmp[ j ][ i ] = tableData[ i ][ j ]; - - } - - } - - tableData = tmp; - - } - - categories = tableData[0].slice( 1 ); - - for ( var i = 1, data; data = tableData[ i ]; i++ ) { - - series.push( { - name: data[ 0 ], - data: data.slice( 1 ) - } ); - - } - - return { - series: series, - categories: categories - }; - -} - -/* - * 获取数据源数据对齐方式 - */ -function getTableDataFormat () { - - var form = document.forms[ 'data-form' ], - items = form['charts-format']; - - return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; - -} - -/* - * 禁用非饼图类型的配置项 - */ -function disableNotPieConfig() { - - updateConfigItem( 'disable' ); - -} - -/* - * 启用非饼图类型的配置项 - */ -function enableNotPieConfig() { - - updateConfigItem( 'enable' ); - -} - -function updateConfigItem ( value ) { - - var table = $( "#showTable" )[ 0 ], - isDisable = value === 'disable' ? true : false; - - //table中的input处理 - for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { - - for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { - - $( "input", cell ).attr( "disabled", isDisable ); - - } - - } - - //其他项处理 - $( "input.not-pie-item" ).attr( "disabled", isDisable ); - $( "#tipInput" ).attr( "disabled", !isDisable ) - -} - -/* - * 获取饼图数据 - * 饼图的数据只取第一行的 - **/ -function getSeriesForPieChart () { - - var series = { - type: 'pie', - name: $("#tipInput").val(), - data: [] - }, - tableData = getTableData(); - - - for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { - - var title = tableData[ 0 ][ j ], - val = tableData[ 1 ][ j ]; - - series.data.push( [ title, val ] ); - - } - - return { - series: [ series ] - }; - -} - -function getTableData () { - - var table = document.getElementById( "showTable" ), - xCount = table.rows[0].cells.length - 1, - values = getTableInputValue(); - - for ( var i = 0, value; value = values[ i ]; i++ ) { - - tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; - - } - - return tableData; - -} - -function getTableInputValue () { - - var table = document.getElementById( "showTable" ), - inputs = table.getElementsByTagName( "input" ), - values = []; - - for ( var i = 0, input; input = inputs[ i ]; i++ ) { - values.push( input.value | 0 ); - } - - return values; - -} - -function getCellValue ( cell ) { - - var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); - - return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); - -} - - -//dialog确认事件 -dialog.onok = function () { - - //收集信息 - var form = document.forms[ 'data-form' ], - info = getUserConfig(); - - //添加图表类型 - info.chartType = currentChartType; - - //同步表格数据到编辑器 - syncTableData(); - - //执行图表命令 - editor.execCommand( 'charts', info ); - -}; - -/* - * 同步图表编辑视图的表格数据到编辑器里的原始表格 - */ -function syncTableData () { - - var tableData = getTableData(); - - for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { - - for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { - - cell.innerHTML = tableData[ i ] [ j ]; - - } - - } - -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts0.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts0.png deleted file mode 100644 index 9485e5ed8f83888e782eafae6f7505c79671a985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25306 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts2.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts2.png deleted file mode 100644 index 7c91a39ffac43e0867bec1df89b73e10e0b28c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23016 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 PFatGZEv0+~v#0+BCDM7e diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts4.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts4.png deleted file mode 100644 index 742006adc9cee3c07b1a390da6991a84d1da99d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8344 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts5.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/charts/images/charts5.png deleted file mode 100644 index c49a29609d8e8f9bdf101e91021d40c1cb3d4175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47084 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'*4h4^s0#X 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 g*Z&=uhxp - - - - - - - - - -
    -
    - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.js deleted file mode 100644 index 2978faa..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/emotion.js +++ /dev/null @@ -1,186 +0,0 @@ -window.onload = function () { - editor.setOpt({ - emotionLocalization:false - }); - - emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "//imgbaidu.b0.upaiyun.com/hi/"; - emotion.SmileyBox = createTabList( emotion.tabNum ); - emotion.tabExist = createArr( emotion.tabNum ); - - initImgName(); - initEvtHandler( "tabHeads" ); -}; - -function initImgName() { - for ( var pro in emotion.SmilmgName ) { - var tempName = emotion.SmilmgName[pro], - tempBox = emotion.SmileyBox[pro], - tempStr = ""; - - if ( tempBox.length ) return; - for ( var i = 1; i <= tempName[1]; i++ ) { - tempStr = tempName[0]; - if ( i < 10 ) tempStr = tempStr + '0'; - tempStr = tempStr + i + '.gif'; - tempBox.push( tempStr ); - } - } -} - -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 ) { - return function () { - switchTab( index ); - }; - })( j ) ); - j++; - } - } - switchTab( 0 ); - $G( "tabIconReview" ).style.display = 'none'; -} - -function InsertSmiley( url, evt ) { - var obj = { - src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url - }; - obj._src = obj.src; - editor.execCommand( 'insertimage', obj ); - if ( !evt.ctrlKey ) { - dialog.popup.hide(); - } -} - -function switchTab( index ) { - - autoHeight( index ); - if ( emotion.tabExist[index] == 0 ) { - emotion.tabExist[index] = 1; - createTab( 'tab' + index ); - } - //获取呈现元素句柄数组 - var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), - tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), - i = 0, L = tabHeads.length; - //隐藏所有呈现元素 - for ( ; i < L; i++ ) { - tabHeads[i].className = ""; - tabBodys[i].style.display = "none"; - } - //显示对应呈现元素 - tabHeads[index].className = "focus"; - tabBodys[index].style.display = "block"; -} - -function autoHeight( index ) { - var iframe = dialog.getDom( "iframe" ), - parent = iframe.parentNode.parentNode; - switch ( index ) { - case 0: - iframe.style.height = "380px"; - parent.style.height = "392px"; - break; - case 1: - iframe.style.height = "220px"; - parent.style.height = "232px"; - break; - case 2: - iframe.style.height = "260px"; - parent.style.height = "272px"; - break; - case 3: - iframe.style.height = "300px"; - parent.style.height = "312px"; - break; - case 4: - iframe.style.height = "140px"; - parent.style.height = "152px"; - break; - case 5: - iframe.style.height = "260px"; - parent.style.height = "272px"; - break; - case 6: - iframe.style.height = "230px"; - parent.style.height = "242px"; - break; - default: - - } -} - - -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; - - for ( ; i < imgNum; ) { - textHTML.push( '' ); - for ( var j = 0; j < imgColNum; j++, i++ ) { - faceImage = emotion.SmileyBox[tabName][i]; - 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( '' ); - } else { - textHTML.push( '' ); - } - textHTML.push( '
    ' ); - textHTML = textHTML.join( "" ); - tab.innerHTML = textHTML; -} - -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'; -} - -function out( td ) { - td.style.backgroundColor = "transparent"; - var tabIconRevew = $G( "tabIconReview" ); - tabIconRevew.className = ""; - tabIconRevew.style.display = 'none'; -} - -function createTabList( tabNum ) { - var obj = {}; - for ( var i = 0; i < tabNum; i++ ) { - obj["tab" + i] = []; - } - return obj; -} - -function createArr( tabNum ) { - var arr = []; - for ( var i = 0; i < tabNum; i++ ) { - arr[i] = 0; - } - return arr; -} - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/0.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/0.gif deleted file mode 100644 index 6964168b947afc2cf76780a85f43d4f77c257b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 qcmZ?wbhEHbWMp7uXkcLY4+e@qSs2-Y0y+#p0Fq%~V)9{Rum%7ZDGCMv diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/bface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/bface.gif deleted file mode 100644 index 14fe618ab58a9d46fee90074386b5581d47b92c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27167 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/cface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/cface.gif deleted file mode 100644 index bff947f5216a49d8cd7fdd8d4e825808b3d14f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8603 zcmWlcc{~%2kqV&%wgbPsK)6@?To$QL2c7jB?+-q^;|!}ux<9qppb@I7W{ zXLs?Uw|!_t?0MH%2VX{OyB^NQujp!r*J|=j{J+ zxZ3X&GkWdX&zqFeZ1eJZ>j#go-cOEg=sef;ChWS2gR!gZ0tLulda(1-J&H zuMM^Kp!}cl3LlM0qx!DXmWG4j0;5rihvtAid+md8zz2Ktai^f6tB#Y5n2+aa8&*-@ z0^Rn5e4oUX{?;tsc23^4ZT=C>{?2GF%@NJYKhd2b+>v;!rA{a#$F?XZIKB0JMpsZ< zmRo0DXhV}zSFK;tuulFFBzN4cU@#5k+&4iyAVJfMxXg#FHU+|R!Hi9_3{_1mbw zzR`Jku_Ny2Zs1X;-=AmUL z{}{Jf8wptHySX(T`f>L9;i%8iz_mZ~fd@0Of0i8%HX?F!b6K}5+0FTxk6*OrCw6zF zG&S9C>>8>VOsME@OxjIt9?xqY?QGr5xxe3?+4nAU?pN1LZ{7RdM;m{}^D-t2YepaD zOm)>Bq!k?$HEgx951QM4<_;Y`8SLdI^v-4U|6BfHg!TSq$-+e9++h3IZpP^5gSFX= z-PaF(ek(ipSvU52Wa`7}hi|WEzV2^NPaM8o`M5T`wfy1pe`9MqANE%Vey`6R9=tl( zd;4j9dE@i<&E2()ABR6aZX9my{NDR`czAepRC;tY3IG6z`(Qo*;0U1pKMnZ*O;BM+ zfPFaLnnUP`fe5SW1YG&soCOopD7beTr|MkbUZv&Qe7DOLZxpTIsv)dkU60R_vQk~5 z#?D%#|8j1=V4X{Ol{LMRJn_$GFQ-PoYuE5?)sTJq;@1BDWX8*!#lCos zM^#=?Mtjumh(nk6m$gE*Rf@@%r??8?!2Pkw>$MH-vdYsn=OFqWk1PUHYP;@RUH@Wu zZU4%D`LmPgwF<6hRpFCnt?k>jx^`!-+m}ULTi5z+^LjF8bJOwMb&tU2vj!)}j7}f@ zRfg8@EWfO~dp-x=)D`z-;I&IydX@y4-p|u-tIfKlO`GqKl{(x{U0}^^tQL4~Hfclk z<~Vn0da)`o7q9fe+fhmAv7G|XIh{Fzo_*I{8z-nn0E-`AvAmQay1n$?(CYz7@Z|C4 zdZ^U`K(WwjAwaIkU?}~ZFva9_vVy^i;Gm0v2CDze3E)D>QsIH`5ISG(v^LV87un|F zzFG*ews)m0rrMXSEGwBhC-d2eWK*yyIwg_S*5YUB;Wh@m&b}O%efEC{#Wmx}bR{>v zGPaTB`Iy^o%aO~{4Czo^aS@3pl~(*au2?j8GOieVbF`5}oK%@NscN}U)J*3r!t55g3B&!%Rh#$CT*xX2In#V+Q{_Xp@`!W`U4}_~Q3zn$@x0Hx8bBU?C+DULxAb zTn?#F*k5h0XeJ&81bY({nJp<49S^Jh^}5|Pq1^J#=%fZBejzqGUSyQZe3-J z@68f51ji}&6ZlmWdOQt$Q$%YZCrwDbLM|N1e*~&6j^?U0+aN0ON)K;0sv^TYNQ zFCNTU8ULuS>2R)=BQ?NOldP?mD1ypUj6&;yf+9(AD%hR@6ln+Wt5B-Ik!{@mBv?r> zh2_e8m-WlSuSDp19pO$_#?@cjS*iP8%vAswSIsM*3~4DI8|E5zi&xNoL-q z{zXp=saeFW2lV0>s2~=?m+;ot$DH5hos&XR?F}}`OyTzFCbKtcFeDh?!cI}KCBmIJ zRhNU#LyhFX#EQlU;@b@~v9T68u^l;CvLqnWTLE{{O+ZpEmS3mF^m!Ot#o*MaAmKZ< zjOAuSbi*&3%xWT60;`YjoOaM1h#|^nfCKsYylIWCdD(2GfGw?55yxDFbLEQMmFqw& z?_8`EX$dZ7!>=G3mTP#zR45A3clP!$I_!j?vZ+yU@ciO~+nu{qZ_`&gT0RelMOW+& zCZHE;^D-mT677bqE%jAr-qVlhsh$hlAju)_gu{Xkhj>mA6Im2CmlyU*&a2TUdJH`dw!ORawJ z-d{xKB4o&OAld%lqU$mwWH->t#A1#UK;wzSu4F~*CBHYd1L1QTj+-_LwIM(}!Q=Ni zfE6w&!K=lS@-ans$O~DaQ%osUvDUw{)G7Lu5(J(D5H4fVBsY04Y4>-CNvtH54SKXP zwTG%|^(bF`M1f5zpN^RjfDwA2MXhB*hz`KL6XwzfbjX_`hlY323PGh8Okq?epB+;J z;ZVXAuHH`4)Au@p2d5;I{oB2!b5{a!mYGoTpP;|a@v729a=#waJh>u3PAH{>HFaky zQ+vU;e`Kbgzz(ZiVVYYnmkg%cl|K{q&$TT&Hi#R#X3XJ0^zUCx)7QyO`S^%Wa$yL1 zP0^SgC}OBR2mY*{3>GCWS_l`!k05_A1-o-GA(!p>ckE!=tSL&s44pi~7&6%)eqDcOl!)^fbc45|@Ih=z z5sc0;n5i(>Ygd$39L)Qtg0~D z*D9*)h?CNtWbyBV%tTR>+*49gifF3}U;IkSX_JjGOOJk^Szs1)M#@VoQ^e0FEriPY z;n%&6Wwvx*%g;lp#*pf?rc@#971{F-TC6vF+XValzKT2i6DQ4PJXyj+rbqk!F5l=9v|`~|_mH(Vy=ZV6P`zR<%2W6$lci*)meN(*ZW67eeE z=*wZK-+2+gi{*API&RgGpekuD*tS&Yrho&<%|daN2exIxFKJRO-6Uvys69UZJqOwv zTWLq(Y~U2MMhLN07rDZ{I57cv!*vLu62Mc*p#Vteb~1id_6-yA&>1Tpyc zSh7c9vOzrA5c&!G7IdB#@|CHJZ=u`?91+~&lvE;W5+&wNyiQC;DjcaGOj^h(1mVD~Ak6DgYf%451si zh$c27mjFdiISGm-9&nsR$$-;^a@Kx)mW7$Neo`fL)mfVJI>VXVDv#InFr73Rm;`_( z0P}NMSgw$~xX2ARbXg(#lOL*&m3>*0^lMFIYe1>yl((ff>OBJm3`2RIl2KDSF6|(2 zz{vsj2mn=tx-_NHmRM;gfhhp0m&WcD&%LLMv(-Ym(p3yKv8PkB&T6{9@{2kU6;aqh zKtOm%7pi32ZK>B7#0Lx1*ZEG)tBrE^X23HlVOd86j2B1XELq?;E#C{nUqVxks)jjo zU~CM;iwwWH>YCt(uhkSN+XhEr`QL!u*irCeg4^$Hw^STN%r6ORpql3`@@Y{Vs)e*P z<(H^8eoV|+r6UXSgqw5G|4>!no!E!mT$HtZ$tiw9EWusqsp#(<7kP1wLt5HVIdRSR@JjwzL(kNv~ zluZ;pEyc(LS}XwgZ!#TjPSVGYe8XhY95xjd2FxYjoyUCP1erR;_wc!+A1n5;>>+){ zrmUMlB6jn9$zf^HTdD%aNtoz$2~k)4wHn^oDlJxm5u5RXnTtg69~Yd&(88<@G*Rn* znBQFaBbD5Ju86_1RFQ$!CL4N#A@~!FFD$*G=8kHtHvDCv<+%tAq#~8336mh`b0+=I zd5mYm)ka4o;2LtdM0Ao`(^##l|Ld--dvWH5WH^RTQyVbJMmh(10eQp-2YyjK=qxoz zu8Ke|L61AJhVyfa&!HwHM6LiY1{tF4GfrD1NNnvYUN1g{Oq2HihH#%0N-EW-=+!5= z*B_4tv^jxOPV2TEX&XW5;NdU;lnHdY3u7}ZTNv0EJe_U;Un3W0A1kO#1MqRhM>)FL z5!fy!dYyqa6-s*9!%>K^b!R^n1GuM zxFgf1Bni~k22^A}+{<|QBje%zuZI9BU|U#|o9QK6Q`7PoawiOhgR4gtuAdI=DX*vH+FSLanyX%6U=Z9~>&SR%kkmkm0$*(wzb(?8p{*Ia#3ZMyXIc{l_4{V{{0`b@mw#TzNJ@9gXHk*2`G=W;9EBb!vo8b#xz zD}OB8HA|vZ2XV-0uRxYcaf0<@K08W;aDdSbn3>JIQMiw?OlG z_9<#4SBlbsqA8GmSK?W7lKM@z6%RzN526?7LRqbPVnUW0VT2sswFDhi+o`@ zy+-Sw<7-)>=A&3!)HJHyjm}LgCgAi2AfI3#*h;2vRrVBZV#ej07>Y11}c4xFI z>n#T1bPtiuwz5^nSgTtLh^1mADtWM5KPyT&9^@l8^R_c4YfQLh0&YMaQ$t3C z;2r7u!ooqKy8)u{Blfm(LfALd_;Z;Z2p~G1mmG zn}uRFd?T3cu(y*{y%o`kE$Gf3?oh=j#X0FG$f<%vcITNpT4acCNy2;t+6}N zEr=pi4_QS0oFK1q;LdEY2Q{{E5K@6rXtc#Vrvtbj%S*1sdQ|cg$SpKeKr8?#M*u2N zfkz(tV2)DpjjCk=QnwOt*B=ne(I%35TC~uGz~j<}ShTU~XTaD99=BGcTI_~-F^HNb zBpDVe4!NdviHR_K!13g%-&FnpKEb{tfALT2k8HW6FYcj#)1?;&Z@4jwu(?y$Odahf z$Ze65lIv5ZC(dB2Ou%9MB9*7xB5^m#c1${M%wIe?*JY1Fn&N?*9A-M!T-FH5J60IK zRj9Q&zh|h0zSl)s7!LUj_wT-j>jU8hj>K13j~oznE4p;UAL-S|+)v7IH`Smo;+_4B z3%|`g;6sT3WSa8vgh`qOt7BVS@C+uoW)a-|hW)h(BX1gi{zQJWri(6)Pk;F&xvL z7h|b#?TTsU&*+t{&}@xm`N%4;`7y3$(^0mr+9NHnjBTGPB`d38b+ z{1;wi96>O4LkEkgjgtd!bM5O#=fez@xMbvM)NC^i$Rq4R*4M|qMuTOqY=zYUMnw*5y19IKYNjYNQ>~W|ZLqB-Cr_DA z?i-Tpt<2#+zJrG6Vkh}4DkI@1cY0|%AOfG7e9iKQt<#}>LfHUoL_X9^jv29pNQ8qO=#-)NU9aa7I=$EwhMWO%=IjmO@CkZ zEhdl^r1(0lS}*AR>PLYkmb6&HGD9iw+Nr|-T?_$bg;M5Q3DGW#1m?EJsY$5(7&SgvjLb4yg^(w>71%F z=vdG0 zt zi7ZlYUA=R0VOVWlEaZAvg0A1#{PlZAajk05CRd=^J@!_Tntemmf%v*9Rp+Cnunw(H zp)I&c>NF{yvO|+CUE&L_c$@(8mkg|P(CoxkNv6Imb)2R>3PcEu;O(NP9UdvPZttY2 z7r8B=jTgX4v9ryo9=7|E9%iFuzt-rhK}iDMk}9W|&tc%lhqD=tle z<)0mH4NC`ZB#cOgf5G1?*E;rRSn7qx)@2UI;Z+NDx z9Y8bHqKSLn>Q0}=@0nAlZjD&oabHj=H2z>aALbr(|IrWkkl4mu3z1rhX`O(Z-_|6< zmwIy*>*J9f%8Zf-=Z8~2dPbzL$-MDx)Y}x;ntq$oSlr%T(>hQV`D&4@%y^QX`FG${ z_>2)VjNd3~HpTl{{(rCa>)|+qJf> zN=h3j=Dx~MDnD!-p4bjXT~R9wZX7Nz6EuJ2FM0Btfo9f7LYpo6)h(BsQM0jq16kTD zCFUD<=6coyk&X3rWiY_DG?NcfZ`lyS+5dCRV2mQegsqUyFqh@)*D}Ji{+4fUZ8R`v z!Wt{?X|J?N4;!&e?d5Ft5`QBg6Y}KZF#n^vu8`(Tny4CtVD5IjM+l)#3 zX#RrJ`Y13{{y5m_h;&rE!PmSRHT3SK6di%)S=v?&0DExk{U$4NGyBcjpVyc2@n7?wB~mCEf` zvE`zysVPW1E=WEz5Cr9UW1L~>VfE&jn@kH#789&MP7uPv6Uk3l03fYL!jjy>m&P@- zrdDHjIZz6Lm_)$yps1K$tWqVynfgBn9C6TBD=#ZEM zFu4bQV9f^;qyjFJ&6QLlXWZFgz5GX{K5>jN*mJ za{&5ZsYDlJ%=P`~W|vp;WcSEKtt3w7^%M0{DjqB?7XT1L2MGVgG^4<|EdNS!+2jpN zx`H{1VLX*IK4FCrlmudQ=t8&MlFT&;BWcYv@u9t!h804S1Wb>_E4Ln_+vxxjmB$Ar z0Dw2%J5?Tv)SD;!I3&JzqWo|c^oI30iV3BhQeT35yMdkVO7b^m5E18ARh=5%&yd>f zn|x|r`V7yhUFBc5Um#zw_hu)WVzN}vNkDOHZyHSdE5nQ>!0M2XdfY9P71U8`aV>2x5gJ4sI4@9$4 z!|n?8q6F1dcONz!!evRernq)5Bd>b+Do9;lxl3M#6@-^WG?{o*1^ER%bSx7s`h}{s zzk!v42bvuRn7>2^axI*7Sa4E+I_0C^$k`EAdeDlz)YJPAqd5npL4aJ8R9@c~9w$XN zvQsj&lXrGr$jG3EBK3xx^;YC@Hhw1&AIJlr+}dHGws4wd+Yp0;2_#@LQA}cwnSCab zf|f6AB;q)nnX17d5>l!F#BX*qU;SGh=@=S&V6Qv z)~EFUn;ix-@hDZgPO&tc^+K7=^YnKc&K9m?bFSmf@H-SpWfecl3}kprIKts(JRIll zuPnO_&>{8<gtu4Y8Yp_UItd65+YtN*3WR8O6LkF59JY}b-Eo11 zpgRAa6V`@y4Nk(G`>WpxZ4M*%2-#BI-t((tLuyy3u;I);Y*7hJA-q;3i`%64dt>}4 z6m@O;6ZwAs$p%Y3{NZ+pFG|xReNtC0emm7u-Xtz%Pq%)upwGb^CAVHN_(&1`*U5_B z(q)eft1*Kh>y+M^O3TqeU{|J3=bGHxi1D+Q$YHO8#qXpKwy1mIxj7!=pLv$kyEn3m zK^MbOp3t7)JaifKVtAaW)pVC>&P`wWPfxGM%;;Xq&->cl7Z*Qh6sNJfP+RfI|8Mv@ z-ag{dbhj<7xNk9~SiemIwWR$s=Jnu}upnRaR^>#>*!>ptn9x6q*y1f+SUh9wrNwsE z3reWgwQaA@iC^dm^Lci+;({LOD({noBWC-Pu6*w~M?2JtSaC!>btyIQTNM6#I)-2U z)`F|LNtLUU&VMQcvv3Tws-Mzc9Y=ita#Hx~bfIaLfQpAHqF{pmd!UwNJKoYMi`^^d z_&?4L2zrCS>v0~q}um%s0} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/fface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/fface.gif deleted file mode 100644 index 0d8a6afeb1cb2cc40c5d76f90630d8a9c1323ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18479 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 Z1*(9jYzjdPQwkU=rV+{lAZZd106V&Waa;fZ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/jxface2.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/jxface2.gif deleted file mode 100644 index a959c90f7eb17adc455982b040244fd583eed888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40706 zcmW)ncRUr2_y6y{mwR!!cE-K-cFk<}+T+T#ciE#TBFV^Iwz5M>W=7Gq%Bt?QvWg@m z6;jcgB9!L+eZIf*IDeh?QIMUgJc1z$R8ZQ|Kfb_r_e{Z9w5lq*XQcc z9jVL6+Z7d@0e-Xx^soxJ!g&+_IKmeR_|x)cG)v5|>2%*>(b9OMU6b@q|En{{Mc>Fd zmAqBv=v4OHAng6n6B89pNx4*7QZPUF^6&SRMFNih3@mB5qAAnw?U?%>hx72^!5P}kmX;QMmWJ{1@n2Fw;g#Vtu4MMN(f#!H zXB|_tz)fkBO&l>)6C=DtUUmnTxRQsRw8{4rwUKskKS!E-V3Yyezf=Q#gm%1l#kzM{%aVio9lmP6|zV{ z1>aIGIoEb=%4a$p@b5!lSs=M}SM$_elk9Q7Pd`3|-f`NRs_Yo;XG}(LcK#b)n`mro zc=hFtX1?5;H*e0de0q9%6fTQ6HAO7|U>CR{?Y22qj_J`i2Al)bFf* z%b&fIpP%>d!Fx0s&A40oHE-%GXT_*Sd2V;IxFfr8y!=A<*=c$|4u|{jZRFn({oDOu z#lT}ad9r9O{_DX;*uC7&U-eFzj_4dp{K1_Vu`H_*4oEL+fHy*QC6WZWL|i`n(4p{rUnS@N2ks{X2mo*ZYX7H%|I-8j!2$f`lCWd0 zvV0`lMg5P?;n>>$E)UW-3x-P+LCQwaoA`QjV=E)8jn#r|i*#|G^Zs^wa2wvPaGw1i zRzZ`c|2z}bx~8PnFkb`9*h_IWC$h}5OD{c%@NR2JY+qGNn#aMVyArt$KLv>b&D^dC z3vE&?F;Kv^JG`a$R>JLKw!=nNx#hDQ&gj%jE?s+kXuubtR5(7Hy|`URc$!jY>Ab7MVNQ;8V&Gr&(FwV2RfwG{=fYoxhVN(QR05?( z?8A)q?$mD3!vWocD)5;OTjRS1;l}^2=+6ob{5j;a?pn!wg?HWzd!kWI6kJFR=CQJ( z{M;$N8pRux08KXfxhmodidzj3OFXzwrZ)?@JECT}KAut+&;2y(tZudegrgVgZV{Zf z>lQU~)i->v!UBS5Tn=TxsmuT7wM#6e&>kK{CsS%|;A`~*`b95+4NH_YZ^MTZc18)e zi9Pdro)uzofLn3h7ZOJCL2Q_!gH?ik#C7Du_n&U1{A-yr&sJ#NtjpJ5Zmx}-yY|VO zE)|MxkVJGi`dT%VTusmDbgzcbBp5oP(r64{F|QVWef%Q&>E}*h6I=nXsecH5%kzg^-JTi#qgd&_tt%giqOt#R5{gEGDy*K*`I}~d zM3FT!<=1Zsy}t_GF*E2?@%s>y_W>hfmu9U3bj|ijqU777R4(R{-Em*3NbUz?QvAA( zMg|#Nd0SfvtCkKPDmPDzdtFCc-kyn$O;+#1i`^qC+)ikOZ%qeB!v_#+2Jqj{Pn%ki z=_mbA1535K7FvKRPn03}*DM`VJ{XhqW2eVaT|8s*G|2)zfL41(l!yj+mr5gW>0`>^ z@!a#~_4siakxLdv-$&cytqZ}!2r#q}%2w<>O9)sBM4>DwJo-3!X~A)b@)4@)ZtN-G zA0Xh5Vh>Lu@GOXb2=-TT81LSSnpwg=;#?=Nd6b-dxwT)wT&@*izufVJ6a|U≶_= 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/neweditor-tab-bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/neweditor-tab-bg.png deleted file mode 100644 index 8f398b0958cdc5136a23b9745becc23a833aa325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^96&72!3HGF`uUCmDVAa<&kznEsNqQI0P;BtJR*x3 z7^L@rFypT63w8qqANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/tface.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/emotion/images/tface.gif deleted file mode 100644 index 1354f54b961211fb0253ccbd27a81da5dab5a639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19805 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
    Q#B)e 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℞!!p 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 Yl`jGz%R9~u(Lcw{+`;~ZL;$@14{R%g2><{9 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/buttoniconex.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/buttoniconex.css deleted file mode 100644 index 5a32251..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/buttoniconex.css +++ /dev/null @@ -1,271 +0,0 @@ - -@font-face {font-family: "edui-notadd"; - src: url('../fonts/iconfont.eot?t=1506766254785'); /* IE9*/ - src: url('../fonts/iconfont.eot?t=1506766254785#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), - url('../fonts/iconfont.ttf?t=1506766254785') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ - url('../fonts/iconfont.svg?t=1506766254785#edui-notadd') format('svg'); /* iOS 4.1- */ -} - -.edui-notadd .edui-icon{ - font-family:"edui-notadd" !important; - font-size:16px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.edui-iconfont { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; -} -.edui-for-close .edui-icon:before { content: "\e654"; } - -.edui-for-italic .edui-icon:before { content: "\e62d"; } - -.edui-for-insertcaption .edui-icon:before { content: "\e657"; } - -.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; } - -.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; } - -.edui-for-insertimage .edui-icon:before { content: "\e617"; } - -.edui-for-previousstep .edui-icon:before { content: "\e630"; } - -.edui-for-nextstep .edui-icon:before { content: "\e631"; } - -.edui-for-scaleboard .edui-icon:before { content: "\e632"; } - -.edui-for-brush .edui-icon:before { content: "\e633"; } - -.edui-for-background .edui-icon:before { content: "\e65d"; } - -.edui-for-strikethrough .edui-icon:before { content: "\e60c"; } - -.edui-for-spechars .edui-icon:before { content: "\e603"; } - -.edui-for-clearboard .edui-icon:before { content: "\e634"; } - -.edui-for-bold .edui-icon:before { content: "\e604"; } - -.edui-for-fullscreen .edui-icon:before { content: "\e656"; } - -.edui-for-formatmatch .edui-icon:before { content: "\e60d"; } - -.edui-for-underline .edui-icon:before { content: "\e605"; } - -.edui-for-removeformat .edui-icon:before { content: "\e60e"; } - -.edui-for-blockquote .edui-icon:before { content: "\e60f"; } - -.edui-for-anchor .edui-icon:before { content: "\e618"; } - -.edui-for-help .edui-icon:before { content: "\e619"; } - -.edui-for-horizontal .edui-icon:before { content: "\e638"; } - -.edui-for-simpleupload .edui-icon:before { content: "\e61a"; } - -.edui-for-indent .edui-icon:before { content: "\e61b"; } - -.edui-for-justifycenter .edui-icon:before { content: "\e61c"; } - -.edui-for-justifyleft .edui-icon:before { content: "\e61d"; } - -.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; } - -.edui-for-justifyright .edui-icon:before { content: "\e61f"; } - -.edui-for-link .edui-icon:before { content: "\e620"; } - -.edui-for-cleardoc .edui-icon:before { content: "\e621"; } - -.edui-for-drafts .edui-icon:before { content: "\e610"; } - -.edui-for-subscript .edui-icon:before { content: "\e611"; } - -.edui-for-unlink .edui-icon:before { content: "\e622"; } - -.edui-for-superscript .edui-icon:before { content: "\e612"; } - -.edui-for-forecolor .edui-icon:before { content: "\e63a"; } - -.edui-for-backcolor .edui-icon:before { content: "\e655"; } - -.edui-for-touppercase .edui-icon:before { content: "\e623"; } - -.edui-for-tolowercase .edui-icon:before { content: "\e624"; } - -.edui-for-insertvideo .edui-icon:before { content: "\e627"; } - -.edui-for-emotion .edui-icon:before { content: "\e606"; } - -.edui-for-pasteplain .edui-icon:before { content: "\e613"; } - -.edui-for-preview .edui-icon:before { content: "\e63b"; } - -.edui-for-print .edui-icon:before { content: "\e63c"; } - -.edui-for-searchreplace .edui-icon:before { content: "\e65e"; } - -.edui-for-selectall .edui-icon:before { content: "\e614"; } - -.edui-for-mergecells .edui-icon:before { content: "\e63d"; } - -.edui-for-deletecol .edui-icon:before { content: "\e63e"; } - -.edui-for-deleterow .edui-icon:before { content: "\e63f"; } - -.edui-for-attachment .edui-icon:before { content: "\e628"; } - -.edui-for-music .edui-icon:before { content: "\e640"; } - -.edui-for-gmap .edui-icon:before { content: "\e629"; } - -.edui-for-insertframe .edui-icon:before { content: "\e645"; } - -.edui-for-pdfformat .edui-icon:before { content: "\e62f"; } - -.edui-for-word .edui-icon:before { content: "\e646"; } - -.edui-for-excel .edui-icon:before { content: "\e647"; } - -.edui-for-time .edui-icon:before { content: "\e64a"; } - -.edui-for-snapscreen .edui-icon:before { content: "\e650"; } - -.edui-for-wordimage .edui-icon:before { content: "\e652"; } - -.edui-for-edittd .edui-icon:before { content: "\e65a"; } - -.edui-for-lineheight .edui-icon:before { content: "\e62a"; } - -.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; } - -.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; } - -.edui-for-scrawl .edui-icon:before { content: "\e616"; } - -.edui-for-redo .edui-icon:before { content: "\e609"; } - -.edui-for-undo .edui-icon:before { content: "\e600"; } - -.edui-for-inserttitle .edui-icon:before { content: "\e65b"; } - -.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; } - -.edui-for-aligntable .edui-icon:before { content: "\e662"; } - -.edui-for-table .edui-icon:before { content: "\e664"; } - -.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; } - -.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; } - -.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; } - -.edui-for-paste .edui-icon:before { content: "\e667"; } - -.edui-for-map .edui-icon:before { content: "\e668"; } - -.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; } - -.edui-for-imagecenter .edui-icon:before { content: "\e602"; } - -.edui-for-imagenone .edui-icon:before { content: "\e607"; } - -.edui-for-fontborder .edui-icon:before { content: "\e608"; } - -.edui-for-edittable .edui-icon:before { content: "\e60a"; } - -.edui-for-imageleft .edui-icon:before { content: "\e60b"; } - -.edui-for-imageright .edui-icon:before { content: "\e615"; } - -.edui-for-insertcol .edui-icon:before { content: "\e625"; } - -.edui-for-insertcolnext .edui-icon:before { content: "\e626"; } - -.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; } - -.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; } - -.edui-for-insertrow .edui-icon:before { content: "\e637"; } - -.edui-for-insertrownext .edui-icon:before { content: "\e639"; } - -.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; } - -.edui-for-mergeright .edui-icon:before { content: "\e642"; } - -.edui-for-mergedown .edui-icon:before { content: "\e643"; } - -.edui-for-inserttable .edui-icon:before { content: "\e644"; } - -.edui-for-pagebreak .edui-icon:before { content: "\e648"; } - -.edui-for-source .edui-icon:before { content: "\e649"; } - -.edui-for-splittorows .edui-icon:before { content: "\e64b"; } - -.edui-for-splittocols .edui-icon:before { content: "\e64c"; } - -.edui-for-splittocells .edui-icon:before { content: "\e64d"; } - -.edui-for-arrow .edui-icon:before { content: "\e64f"; } - -.edui-for-aligntd .edui-icon:before { content: "\e651"; } - -.edui-for-autotypeset .edui-icon:before { content: "\e653"; } - -.edui-for-charts .edui-icon:before { content: "\e658"; } - -.edui-for-closeerror .edui-icon:before { content: "\e65c"; } - -.edui-for-copy .edui-icon:before { content: "\e65f"; } - -.edui-for-date .edui-icon:before { content: "\e661"; } - -.edui-for-deletetable .edui-icon:before { content: "\e669"; } - -.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; } - -.edui-for-arrowright .edui-icon:before { content: "\e66b"; } - -.edui-for-tableleft .edui-icon:before { content: "\e66c"; } - -.edui-for-tableright .edui-icon:before { content: "\e66d"; } - -.edui-for-tablecenter .edui-icon:before { content: "\e66e"; } - -.edui-for-videoleft .edui-icon:before { content: "\e66f"; } - -.edui-for-videocenter .edui-icon:before { content: "\e670"; } - -.edui-for-videonone .edui-icon:before { content: "\e671"; } - -.edui-for-videoright .edui-icon:before { content: "\e672"; } - -.edui-for-template .edui-icon:before { content: "\e64e"; } - -.edui-for-addfile .edui-icon:before { content: "\e673"; } - -.edui-for-selected .edui-icon:before { content: "\e674"; } - -.edui-for-pickarea .edui-icon:before { content: "\e675"; } - -.edui-for-overlay .edui-icon:before { content: "\e676"; } - -.edui-for-preitem .edui-icon:before { content: "\e677"; } - -.edui-for-preitem1 .edui-icon:before { content: "\e678"; } - -.edui-for-preitem2 .edui-icon:before { content: "\e679"; } - -.edui-for-preitem3 .edui-icon:before { content: "\e67a"; } - -.edui-for-preitem4 .edui-icon:before { content: "\e67b"; } - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.eot b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.eot deleted file mode 100644 index cd8f41f77c7d5f36d8bf42cebfaf30766103d6b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25788 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 F`M=t5Rl)!O diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.svg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.svg deleted file mode 100644 index 7bbbafe..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.svg +++ /dev/null @@ -1,410 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.ttf b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/iconfont.ttf deleted file mode 100644 index f8a15465d6cd67623be8186f5bdb96988308ac0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25608 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/addfile.svg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/addfile.svg deleted file mode 100644 index 89b7ccd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/addfile.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/selected.svg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/selected.svg deleted file mode 100644 index f29c5a1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/fonts/images/selected.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/gmap/gmap.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/gmap/gmap.html deleted file mode 100644 index c8786f3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/gmap/gmap.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - -

    - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.css deleted file mode 100644 index 4478475..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.css +++ /dev/null @@ -1,7 +0,0 @@ -.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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.html deleted file mode 100644 index 9e50060..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - 帮助 - - - - - -
    -
    - - -
    -
    -
    -

    UEditor

    -

    -

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ctrl+b
    ctrl+c
    ctrl+x
    ctrl+v
    ctrl+y
    ctrl+z
    ctrl+i
    ctrl+u
    ctrl+a
    shift+enter
    alt+z
    -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.js deleted file mode 100644 index 9a2272e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/help/help.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-9-26 - * Time: 下午1:06 - * To change this template use File | Settings | File Templates. - */ -/** - * tab点击处理事件 - * @param tabHeads - * @param tabBodys - * @param obj - */ -function clickHandler( tabHeads,tabBodys,obj ) { - //head样式更改 - 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 body = tabBodys[j], - id = body.getAttribute( "id" ); - body.onclick = function(){ - this.style.zoom = 1; - }; - if ( id != tabSrc ) { - body.style.zIndex = 1; - } else { - body.style.zIndex = 200; - } - } - -} - -/** - * TAB切换 - * @param tabParentId tab的父节点ID或者对象本身 - */ -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++ ) { - var head = tabHeads[i]; - if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); - head.onclick = function () { - clickHandler(tabHeads,tabBodys,this); - } - } -} -switchTab("helptab"); - -document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.css deleted file mode 100644 index 4a36f5c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.css +++ /dev/null @@ -1,936 +0,0 @@ -@charset "utf-8"; -/* dialog样式 */ -.wrapper { - zoom: 1; - width: 600px; - height: 412px; - margin: 0 auto; - padding: 20px; - position: relative; - font-family: sans-serif; -} - -/*tab样式框大小*/ -.tabhead { - float:left; -} -.tabbody { - width: 100%; - height: 346px; - position: relative; - clear: both; -} - -.tabbody .panel { - position: absolute; - width: 0; - height: 0; - background: #fff; - overflow: hidden; - display: none; -} - -.tabbody .panel.focus { - width: 100%; - height: 380px; - display: block; -} - -/* 图片对齐方式 */ -.alignBar{ - float:right; - margin-top: 5px; - position: relative; -} - -.alignBar .algnLabel{ - float:left; - height: 20px; - line-height: 20px; -} - -.alignBar #alignIcon{ - zoom:1; - _display: inline; - display: inline-block; - position: relative; -} -.alignBar #alignIcon span{ - float: left; - cursor: pointer; - display: block; - width: 19px; - height: 17px; - margin-right: 3px; - margin-left: 3px; - background-image: url(./images/alignicon.jpg); -} -.alignBar #alignIcon .none-align{ - background-position: 0 -18px; -} -.alignBar #alignIcon .left-align{ - background-position: -20px -18px; -} -.alignBar #alignIcon .right-align{ - background-position: -40px -18px; -} -.alignBar #alignIcon .center-align{ - background-position: -60px -18px; -} -.alignBar #alignIcon .none-align.focus{ - background-position: 0 0; -} -.alignBar #alignIcon .left-align.focus{ - background-position: -20px 0; -} -.alignBar #alignIcon .right-align.focus{ - background-position: -40px 0; -} -.alignBar #alignIcon .center-align.focus{ - background-position: -60px 0; -} - - - - -/* 远程图片样式 */ -#remote { - z-index: 200; -} - -#remote .top{ - width: 100%; - margin-top: 20px; -} -#remote .left{ - display: block; - float: left; - width: 240px; - height:10px; -} -#remote .right{ - display: block; - float: right; - width: 345px; - height:10px; -} -#remote .row{ - /*margin-left: 20px;*/ - display: flex; - clear: both; - height: 30px; - line-height: 30px; - margin-bottom: 20px; -} - -#remote .row label{ - text-align: center; - width: 50px; - zoom:1; - _display: inline; - display:inline-block; - vertical-align: middle; - margin-right: 10px; -} -#remote .row label.algnLabel{ - float: left; - -} - -#remote input.text{ - height: 28px; - width: 150px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -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 { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); -} -#remote textarea.text{ - width: 160px; - height: 120px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -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; - resize: none; -} -#remote textarea.text:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); -} -#remote #url{ - width: 537px; - height: 28px; -} -#remote #width, -#remote #height{ - width: 60px; - height: 28px; - margin-left: 8px; - margin-right: 8px; -} -#remote .top .row:nth-child(2) span:nth-child(1) , -#remote .top .row:nth-child(2) span:nth-child(2) { - display: block; - margin-right: 18px; -} - -#remote .top .row:nth-child(2) span:last-child { - margin-left: 15px; -} -#remote #border, -#remote #vhSpace, -#remote #title{ - width: 145px; - margin-right: 8px; -} -#remote #lock{ - margin-top: 11px; -} -#remote #lockicon{ - zoom: 1; - _display:inline; - display: inline-block; - height: 20px; - background: url("../../themes/notadd/images/lock.gif") -13px -13px no-repeat; - vertical-align: middle; -} -#remote #preview{ - clear: both; - width: 345px; - height: 261px; - z-index: 9999; - background-color: #f3f3f3; - overflow: hidden; -} - -/* 上传图片 */ -.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: 373px; - display: block; - clip: auto; - margin-top: 12px; -} - -#upload .queueList { - margin: 0; - width: 100%; - height: 100%; - position: absolute; - overflow: hidden; -} - -#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; - height: 212px; - padding-top: 160px; - text-align: center; - /*background: url(./images/image.png) center 130px no-repeat #f3f3f3;*/ - background-color: #f3f3f3; - color: #cccccc; - font-size: 18px; - position: relative; - top: 0; -} - -#upload .placeholder .webuploader-pick { - font-size: 16px; - background: #f3f3f3; - border-radius: 3px; - line-height: 44px; - padding: 0 30px; - color: #646464; - display: inline-block; - margin: 0 auto 20px auto; - cursor: pointer; - /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */ - border: 1px solid #ccc; -} - -#upload .placeholder .webuploader-pick-hover { - border: 1px solid #00a2d4; - color: #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: 300px; -} - -#upload .filelist:after { - content: ''; - display: block; - width: 0; - height: 0; - overflow: hidden; - clear: both; - position: relative; -} - -#upload .filelist li { - width: 135px; - height: 135px; - background: url(./images/bg.png); - text-align: center; - margin: 9px 0 0 9px; - *margin: 6px 0 0 6px; - 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: 135px; - vertical-align: middle; - overflow: hidden; - width: 135px; - height: 135px; - - -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 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(../fonts/images/selected.svg) no-repeat right bottom; -} - -#upload .filelist li.filePickerBlock { - width: 135px; - height: 135px; - background: url(../fonts/images/addfile.svg) no-repeat center; - 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; -} - - - -/* 图片管理样式 */ -#online { - width: 100%; - height: 336px; - padding: 10px 0 0 0; -} -#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; - list-style: none; - padding: 0; - width: 135px; - height: 135px; - margin: 0 0 9px 9px; - *margin: 0 0 6px 6px; - background-color: #eee; - overflow: hidden; - cursor: pointer; - position: relative; -} -#online li.clearFloat { - float: none; - clear: both; - display: block; - width:0; - height:0; - margin: 0; - padding: 0; -} -#online li img { - cursor: pointer; - width: 135px !important; - height: 135px !important; - margin-top: 0px !important; -} -#online li .icon { - cursor: pointer; - width: 135px; - height: 135px; - position: absolute; - top: 0; - left: 0; - z-index: 2; - border: 0; - background-repeat: no-repeat; -} -#online li .icon:hover { - width: 129px; - height: 129px; - border: 3px solid #1094fa; -} -#online li.selected .icon { - background-image: url(images/success.png); - background-image: url(images/success.gif)\9; - background-position: 95px 95px; -} -#online li.selected .icon:hover { - width: 129px; - height: 129px; - border: 3px solid #1094fa; - background-position: 92px 92px; -} - - -/* 图片搜索样式 */ -#search .searchBar { - width: 100%; - height: 30px; - margin: 10px 0 5px 0; - padding: 0; -} - -#search input.text{ - width: 150px; - padding: 3px 6px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -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; -} -#search input.text:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); -} -#search input.searchTxt { - margin-left:5px; - padding-left: 5px; - background: #FFF; - width: 300px; - *width: 260px; - height: 21px; - line-height: 21px; - float: left; - dislay: block; -} -#search .pagination{ - margin-top: 5px; -} -#search input.num{ - width: 80px; -} - -#search .searchType { - width: 95px; - height: 28px; - padding:0; - line-height: 28px; - border: 1px solid #d7d7d7; - border-radius: 0; - vertical-align: top; - margin-left: 5px; - float: left; - dislay: block; -} - -#search #searchBtn, -#search #searchReset { - display: inline-block; - margin-bottom: 0; - margin-right: 5px; - padding: 4px 10px; - font-weight: 400; - text-align: center; - vertical-align: middle; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - font-size: 14px; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - vertical-align: top; - float: right; -} - -#search #searchBtn { - color: white; - border-color: #285e8e; - background-color: #3b97d7; -} -#search #searchReset { - color: #333; - border-color: #ccc; - background-color: #fff; -} -#search #searchBtn:hover { - background-color: #3276b1; -} -#search #searchReset:hover { - background-color: #eee; -} - -#search .msg { - margin-left: 5px; -} - -#search .searchList{ - width: 100%; - height: 300px; - overflow: hidden; - clear: both; -} -#search .searchList ul{ - margin:0; - padding:0; - list-style:none; - clear: both; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - zoom: 1; - position: relative; -} - -#search .searchList li { - list-style:none; - float: left; - display: block; - width: 115px; - margin: 5px 10px 5px 20px; - *margin: 5px 10px 5px 15px; - padding:0; - font-size: 12px; - box-shadow: 0 1px 3px rgba(0, 0, 0, .3); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); - position: relative; - vertical-align: top; - text-align: center; - overflow: hidden; - cursor: pointer; - filter: alpha(Opacity=100); - -moz-opacity: 1; - opacity: 1; - border: 2px solid #eee; -} - -#search .searchList li.selected { - filter: alpha(Opacity=40); - -moz-opacity: 0.4; - opacity: 0.4; - border: 2px solid #00a0e9; -} - -#search .searchList li p { - background-color: #eee; - margin: 0; - padding: 0; - position: relative; - width:100%; - height:115px; - overflow: hidden; -} - -#search .searchList li p img { - cursor: pointer; - border: 0; -} - -#search .searchList li a { - color: #999; - border-top: 1px solid #F2F2F2; - background: #FAFAFA; - text-align: center; - display: block; - padding: 0 5px; - width: 105px; - height:32px; - line-height:32px; - white-space:nowrap; - text-overflow:ellipsis; - text-decoration: none; - overflow: hidden; - word-break: break-all; -} - -#search .searchList a:hover { - text-decoration: underline; - color: #333; -} -#search .searchList .clearFloat{ - clear: both; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.html deleted file mode 100644 index f490247..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - neditor图片对话框 - - - - - - - - - - - - - - - -
    -
    - - - - -
    -
    - - - - - - - - - - -
    -
    - - -
    -
    -
    - - -
    -
    - -   px -   px - -
    -
    -
    -
    - - px -
    -
    - - px -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    - - -
    -
    -
    - - - - -
    -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.js deleted file mode 100644 index 18f70c9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/image.js +++ /dev/null @@ -1,1131 +0,0 @@ -/** - * User: Jinqn - * Date: 14-04-08 - * Time: 下午16:34 - * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 - */ - -(function () { - - var remoteImage, - uploadImage, - onlineImage, - searchImage; - - window.onload = function () { - initTabs(); - initAlign(); - initButtons(); - }; - - /* 初始化tab标签 */ - function initTabs() { - var tabs = $G('tabhead').children; - for (var i = 0; i < tabs.length; i++) { - domUtils.on(tabs[i], "click", function (e) { - var target = e.target || e.srcElement; - setTabFocus(target.getAttribute('data-content-id')); - }); - } - - var img = editor.selection.getRange().getClosedNode(); - if (img && img.tagName && img.tagName.toLowerCase() == 'img') { - setTabFocus('remote'); - } else { - setTabFocus('upload'); - } - } - - /* 初始化tabbody */ - function setTabFocus(id) { - if(!id) return; - var i, bodyId, tabs = $G('tabhead').children; - for (i = 0; i < tabs.length; i++) { - bodyId = tabs[i].getAttribute('data-content-id'); - if (bodyId == id) { - domUtils.addClass(tabs[i], 'focus'); - domUtils.addClass($G(bodyId), 'focus'); - } else { - domUtils.removeClasses(tabs[i], 'focus'); - domUtils.removeClasses($G(bodyId), 'focus'); - } - } - switch (id) { - case 'remote': - remoteImage = remoteImage || new RemoteImage(); - break; - case 'upload': - setAlign(editor.getOpt('imageInsertAlign')); - uploadImage = uploadImage || new UploadImage('queueList'); - break; - case 'online': - setAlign(editor.getOpt('imageManagerInsertAlign')); - onlineImage = onlineImage || new OnlineImage('imageList'); - onlineImage.reset(); - break; - case 'search': - setAlign(editor.getOpt('imageManagerInsertAlign')); - searchImage = searchImage || new SearchImage(); - break; - } - } - - /* 初始化onok事件 */ - function initButtons() { - - dialog.onok = function () { - var remote = false, list = [], id, tabs = $G('tabhead').children; - for (var i = 0; i < tabs.length; i++) { - if (domUtils.hasClass(tabs[i], 'focus')) { - id = tabs[i].getAttribute('data-content-id'); - break; - } - } - - switch (id) { - case 'remote': - list = remoteImage.getInsertList(); - break; - case 'upload': - list = uploadImage.getInsertList(); - var count = uploadImage.getQueueCount(); - if (count) { - $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); - return false; - } - break; - case 'online': - list = onlineImage.getInsertList(); - break; - case 'search': - list = searchImage.getInsertList(); - remote = true; - break; - } - - if(list) { - editor.execCommand('insertimage', list); - remote && editor.fireEvent("catchRemoteImage"); - } - }; - } - - - /* 初始化对其方式的点击事件 */ - function initAlign(){ - /* 点击align图标 */ - domUtils.on($G("alignIcon"), 'click', function(e){ - var target = e.target || e.srcElement; - if(target.className && target.className.indexOf('-align') != -1) { - setAlign(target.getAttribute('data-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) { - domUtils.addClass(aligns[i], 'focus'); - $G("align").value = aligns[i].getAttribute('data-align'); - } else { - domUtils.removeClasses(aligns[i], 'focus'); - } - } - } - /* 获取对齐方式 */ - function getAlign(){ - var align = $G("align").value || 'none'; - return align == 'none' ? '':align; - } - - - /* 在线图片 */ - function RemoteImage(target) { - this.container = utils.isString(target) ? document.getElementById(target) : target; - this.init(); - } - RemoteImage.prototype = { - init: function () { - this.initContainer(); - this.initEvents(); - }, - initContainer: function () { - this.dom = { - 'url': $G('url'), - 'width': $G('width'), - 'height': $G('height'), - 'border': $G('border'), - 'vhSpace': $G('vhSpace'), - 'title': $G('title'), - 'align': $G('align') - }; - var img = editor.selection.getRange().getClosedNode(); - if (img) { - this.setImage(img); - } - }, - initEvents: function () { - var _this = this, - locker = $G('lock'); - - /* 改变url */ - domUtils.on($G("url"), 'keyup', updatePreview); - 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'); - $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'); - $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); - locker.setAttribute('data-proportion', proportion); - }); - - function updatePreview(){ - _this.setPreview(); - } - }, - updateLocker: function(){ - var width = $G('width').value, - height = $G('height').value, - locker = $G('lock'); - if(width && height && width == parseInt(width) && height == parseInt(height)) { - locker.disabled = false; - locker.title = ''; - } else { - locker.checked = false; - locker.disabled = 'disabled'; - locker.title = lang.remoteLockError; - } - }, - setImage: function(img){ - /* 不是正常的图片 */ - if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; - - var wordImgFlag = img.getAttribute("word_img"), - src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), - align = editor.queryCommandValue("imageFloat"); - - /* 防止onchange事件循环调用 */ - if (src !== $G("url").value) $G("url").value = src; - if(src) { - /* 设置表单内容 */ - $G("width").value = img.width || ''; - $G("height").value = img.height || ''; - $G("border").value = img.getAttribute("border") || '0'; - $G("vhSpace").value = img.getAttribute("vspace") || '0'; - $G("title").value = img.title || img.alt || ''; - setAlign(align); - this.setPreview(); - this.updateLocker(); - } - }, - getData: function(){ - var data = {}; - for(var k in this.dom){ - data[k] = this.dom[k].value; - } - return data; - }, - setPreview: function(){ - var url = $G('url').value, - ow = $G('width').value, - oh = $G('height').value, - border = $G('border').value, - title = $G('title').value, - preview = $G('preview'), - 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; - - if(url) { - preview.innerHTML = ''; - } - }, - getInsertList: function () { - var data = this.getData(); - if(data['url']) { - return [{ - src: data['url'], - _src: data['url'], - width: data['width'] || '', - height: data['height'] || '', - border: data['border'] || '', - floatStyle: data['align'] || '', - vspace: data['vhSpace'] || '', - alt: data['title'] || '', - style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" - }]; - } else { - return []; - } - } - }; - - - - /* 上传图片 */ - function UploadImage(target) { - this.$wrap = target.constructor == String ? $('#' + target) : $(target); - this.init(); - } - UploadImage.prototype = { - init: function () { - this.imageList = []; - 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('imageActionName')), - acceptExtensions = (editor.getOpt('imageAllowFiles') || [".png", ".jpg", ".jpeg", ".gif", ".bmp"]).join('').replace(/\./g, ',').replace(/^[,]/, ''), - imageMaxSize = editor.getOpt('imageMaxSize'), - imageCompressBorder = editor.getOpt('imageCompressBorder'); - if (!WebUploader.Uploader.support()) { - $('#filePickerReady').after($('
    "},postRender:function(){for(var a=this.getDom(),c=0;c
    ').html(lang.errorNotSupport)).hide(); - return; - } else if (!editor.getOpt('imageActionName')) { - $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); - return; - } - - /* 上传插件 */ - uploader = _this.uploader = WebUploader.create({ - pick: { - id: '#filePickerReady', - label: lang.uploadSelectFile - }, - accept: { - title: 'Images', - extensions: acceptExtensions, - mimeTypes: 'image/jpeg,image/png,image/svg,image/webp,image/gif' - }, - swf: '../../third-party/webuploader/Uploader.swf', - server: actionUrl, - fileVal: editor.getOpt('imageFieldName'), - duplicate: true, - fileSingleSizeLimit: imageMaxSize, // 默认 2 M - compress: false - }); - 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 (browser.ie && browser.version <= 7) { - $wrap.text(lang.uploadNoPreview); - } else { - uploader.makeThumb(file, function (error, src) { - if (error || !src) { - $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) { - /* 选择文件后设置上传相关的url和自定义参数 */ - editor.getOpt("imageUploadService")(_this, editor).setUploadData(file); - - fileCount++; - fileSize += file.size; - - if (fileCount === 1) { - $placeHolder.addClass('element-invisible'); - $statusBar.show(); - } - addFile(file); - }); - - uploader.on('fileDequeued', function (file) { - if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= imageMaxSize) { - 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': - /* 设置Uploader配置项 */ - editor.getOpt("imageUploadService")(_this, editor).setUploaderOptions(uploader); - setState('uploading', files); - break; - case 'stopUpload': - setState('paused', files); - break; - } - }); - - uploader.on('uploadBeforeSend', function (object, data, headers) { - //这里可以通过data对象添加POST参数 - editor.getOpt("imageUploadService")(_this, editor).setFormData(object, data, headers); - }); - - 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, res) { - var $file = $('#' + file.id); - try { - if (editor.getOpt("imageUploadService")(_this, editor).getResponseSuccess(res)) { - _this.imageList.push(res); - $file.append(''); - } else { - $file.find('.error').text(res.message).show(); - } - } catch (e) { - $file.find('.error').text(lang.errorServerUpload).show(); - } - }); - - 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('uploadComplete', function (file, ret) { - }); - - /* 上传按钮 */ - $upload.on('click', function () { - if ($(this).hasClass('disabled')) { - return false; - } - - if (state === 'ready') { - window.setTimeout(function() { - uploader.upload(); - }, 500); - } else if (state === 'paused') { - window.setTimeout(function() { - uploader.upload(); - }, 500); - } 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; - }, - destroy: function () { - this.$wrap.remove(); - }, - getInsertList: function () { - var i, data, list = [], - align = getAlign(), - prefix = editor.getOpt('imageUrlPrefix'), - imageSrcField = editor.getOpt("imageUploadService")(this, editor).imageSrcField || 'url', - imageSrc = '', - imageSrcFieldKeys = imageSrcField.split('.'); - - for (i = 0; i < this.imageList.length; i++) { - data = this.imageList[i]; - - if(imageSrcFieldKeys.length > 1) { - function setImageSrc(obj, keys, index) { - obj = obj[keys[index]]; - if (index < keys.length - 1) { - setImageSrc(obj, keys, index += 1) - } else { - imageSrc = obj; - } - } - - setImageSrc(data, imageSrcFieldKeys, 0); - } else { - imageSrc = data[imageSrcField]; - } - - list.push({ - src: prefix + imageSrc, - _src: prefix + imageSrc, - alt: data.original, - floatStyle: align - }); - } - return list; - } - }; - - - /* 在线图片 */ - function OnlineImage(target) { - this.container = utils.isString(target) ? document.getElementById(target) : target; - this.init(); - } - OnlineImage.prototype = { - init: function () { - this.reset(); - this.initEvents(); - }, - /* 初始化容器 */ - initContainer: function () { - this.container.innerHTML = ''; - this.list = document.createElement('ul'); - this.clearFloat = document.createElement('li'); - - domUtils.addClass(this.list, 'list'); - domUtils.addClass(this.clearFloat, 'clearFloat'); - - this.list.appendChild(this.clearFloat); - this.container.appendChild(this.list); - }, - /* 初始化滚动事件,滚动到地步自动拉取数据 */ - initEvents: function () { - var _this = this; - - /* 滚动拉取图片 */ - domUtils.on($G('imageList'), 'scroll', function(e){ - var panel = this; - if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { - _this.getImageData(); - } - }); - /* 选中图片 */ - domUtils.on(this.container, 'click', function (e) { - var target = e.target || e.srcElement, - li = target.parentNode; - - if (li.tagName.toLowerCase() == 'li') { - if (domUtils.hasClass(li, 'selected')) { - domUtils.removeClasses(li, 'selected'); - } else { - domUtils.addClass(li, 'selected'); - } - } - }); - }, - /* 初始化第一次的数据 */ - initData: function () { - - /* 拉取数据需要使用的值 */ - this.state = 0; - this.listSize = editor.getOpt('imageManagerListSize'); - this.listIndex = 0; - this.listEnd = false; - - /* 第一次拉取数据 */ - this.getImageData(); - }, - /* 重置界面 */ - reset: function() { - this.initContainer(); - this.initData(); - }, - /* 向后台拉取图片列表数据 */ - getImageData: function () { - var _this = this; - - 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':'', - 'data': utils.extend({ - start: this.listIndex, - size: this.listSize - }, editor.queryCommandValue('serverparam')), - 'method': 'get', - 'onsuccess': function (r) { - try { - 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) { - _this.listEnd = true; - } - _this.isLoadingData = false; - } - } catch (e) { - if(r.responseText.indexOf('ue_separate_ue') != -1) { - var list = r.responseText.split(r.responseText); - _this.pushData(list); - _this.listIndex = parseInt(list.length); - _this.listEnd = true; - _this.isLoadingData = false; - } - } - }, - 'onerror': function () { - _this.isLoadingData = false; - } - }); - } - }, - /* 添加图片到列表界面上 */ - pushData: function (list) { - var i, item, img, icon, _this = this, - urlPrefix = editor.getOpt('imageManagerUrlPrefix'); - for (i = 0; i < list.length; i++) { - 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(){ - _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); - domUtils.addClass(icon, 'icon'); - - item.appendChild(img); - item.appendChild(icon); - this.list.insertBefore(item, this.clearFloat); - } - } - }, - /* 改变图片大小 */ - scale: function (img, w, h, type) { - var ow = img.width, - oh = img.height; - - if (type == 'justify') { - if (ow >= oh) { - img.width = w; - img.height = h * oh / ow; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w * ow / oh; - img.height = h; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } else { - if (ow >= oh) { - img.width = w * ow / oh; - img.height = h; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w; - img.height = h * oh / ow; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - } - }, - getInsertList: function () { - var i, lis = this.list.children, list = [], align = getAlign(); - for (i = 0; i < lis.length; i++) { - if (domUtils.hasClass(lis[i], 'selected')) { - var img = lis[i].firstChild, - src = img.getAttribute('_src'); - list.push({ - src: src, - _src: src, - alt: src.substr(src.lastIndexOf('/') + 1), - floatStyle: align - }); - } - - } - return list; - } - }; - - /*搜索图片 */ - function SearchImage() { - this.init(); - } - SearchImage.prototype = { - init: function () { - this.initEvents(); - }, - initEvents: function(){ - var _this = this; - - /* 点击搜索按钮 */ - domUtils.on($G('searchBtn'), 'click', function(){ - var key = $G('searchTxt').value; - if(key && key != lang.searchRemind) { - _this.getImageData(); - } - }); - /* 点击清除妞 */ - domUtils.on($G('searchReset'), 'click', function(){ - $G('searchTxt').value = lang.searchRemind; - $G('searchListUl').innerHTML = ''; - $G('searchType').selectedIndex = 0; - }); - /* 搜索框聚焦 */ - domUtils.on($G('searchTxt'), 'focus', function(){ - var key = $G('searchTxt').value; - if(key && key == lang.searchRemind) { - $G('searchTxt').value = ''; - } - }); - /* 搜索框回车键搜索 */ - domUtils.on($G('searchTxt'), 'keydown', function(e){ - var keyCode = e.keyCode || e.which; - if (keyCode == 13) { - $G('searchBtn').click(); - } - }); - - /* 选中图片 */ - domUtils.on($G('searchList'), 'click', function(e){ - var target = e.target || e.srcElement, - li = target.parentNode.parentNode; - - if (li.tagName.toLowerCase() == 'li') { - if (domUtils.hasClass(li, 'selected')) { - domUtils.removeClasses(li, 'selected'); - } else { - domUtils.addClass(li, 'selected'); - } - } - }); - }, - /* 改变图片大小 */ - scale: function (img, w, h) { - var ow = img.width, - oh = img.height; - - if (ow >= oh) { - img.width = w * ow / oh; - img.height = h; - img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; - } else { - img.width = w; - img.height = h * oh / ow; - img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; - } - }, - getImageData: function(){ - var _this = this, - key = $G('searchTxt').value, - type = $G('searchType').value, - keepOriginName = editor.options.keepOriginName ? "1" : "0", - pageNum = $G('pageNum').value, - url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + key + "&cl=2" + type + "&ie=utf-8&oe=utf-8&adpicid=&z=&ic=0&word=" + key + "&se=&tab=&width=&height=&istype=2&qc=&nc=1&fr=&pn=60&rn=" + pageNum + "&gsm=78&" + new Date() + "="; - - $G('searchListUl').innerHTML = lang.searchLoading; - ajax.request(url, { - 'dataType': 'jsonp', - 'onsuccess':function(json){ - var list = []; - if(json && json.data) { - for(var i = 0; i < json.data.length; i++) { - if(json.data[i].objURL) { - list.push({ - title: json.data[i].fromPageTitleEnc, - src: json.data[i].thumbURL, - url: json.data[i].thumbURL - }); - } - } - } - _this.setList(list); - }, - 'onerror':function(){ - $G('searchListUl').innerHTML = lang.searchRetry; - } - }); - }, - /* 添加图片到列表界面上 */ - setList: function (list) { - var i, item, p, img, link, _this = this, - listUl = $G('searchListUl'); - - listUl.innerHTML = ''; - if(list.length) { - for (i = 0; i < list.length; i++) { - item = document.createElement('li'); - p = document.createElement('p'); - img = document.createElement('img'); - link = document.createElement('a'); - - img.onload = function () { - _this.scale(this, 113, 113); - }; - img.width = 113; - img.setAttribute('src', list[i].src); - - link.href = list[i].url; - link.target = '_blank'; - link.title = list[i].title; - link.innerHTML = list[i].title; - - p.appendChild(img); - item.appendChild(p); - item.appendChild(link); - listUl.appendChild(item); - } - } else { - listUl.innerHTML = lang.searchRetry; - } - }, - getInsertList: function () { - var child, - src, - align = getAlign(), - list = [], - items = $G('searchListUl').children; - for(var i = 0; i < items.length; i++) { - child = items[i].firstChild && items[i].firstChild.firstChild; - if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { - src = child.src; - list.push({ - src: src, - _src: src, - alt: src.substr(src.lastIndexOf('/') + 1), - floatStyle: align - }); - } - } - return list; - } - }; - -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/alignicon.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/alignicon.jpg deleted file mode 100644 index 754755b1b6e2b37d6090f68b80e91867fdcf1042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16101 zcmeHuc|4Te7x){uRTWZyz$%~BdOV+^w}3(}%})0;@5eS2x8l~Sp+Xi-8* zrIJFHM3Exqcb^%g_kF+1=llEo{`z%!?sM)r=bn4+x#!;JE^`G9g12Ie-BanY0QmU< z0|0;+AfOZg20|$K2T+p%P6z`KgPJl9$D?M9@}MD)8Gtb$!iR%07s5&q&fY)=Sonrg zz)|=-0TMq}0-z^1_I9SQW2nS{I5v;XjbkSgU4yKNGyF(oItxMQ19MX|OFL65J5y_- znYo>njh%%l6az2^P(SrMfF3Wy{{Utj)618>AwSaMd^xDs@- zgL>ZflDSqYht96ib=w|Haj!Vcvz}BN(oFq)ZtcxF{<|+8dO1hdo!@cm$@{)PFWi3G z(jOX|ygs*} zKnf!)Qyw@1_H)Pij^AGk!1JoiAK4%5!oFP@-1H>TplUd)J?-+<{q(y$CilePqI2nd z%JB9-(_03-1fZeBU^&~S)|ST`IojD-@JESbA-^$da>{OYiOd`y4QlRSa#)!F48HlM zld>z*fatKRxw(EzX5kM#`>g$T9Qmqfg7}FoTAde1IxqLH=_r0uzJ1fC_1&3Yw{WTT z_0{KJKP=`ZbzXXT)${7eVg17+FBj}TGw1NjkmmADi|jiO4Mp;whx?x@IDYbKQCXQr z=bYl2k?l3ZCWBUFOx^ttIhP%e2W@G6|5~-X@M+vb?)oZ!=B&Jj%t*r@UF^cJV;usp z!Tl(&%8cLDx!3LiZc<4Jnf5f~_NU|bk1J6k2kngd)nDzr_Pw}Gp;A4p`~Cf^-D>=u z4?CJ_!fB6&yTqbjeLFa4S|sa#spI=Ta>u7Gjqf+=984O@i(h5AB?bljMorfD`hwsz~z>%60gWGFQEncdB-DtMP^M;#$*q@0Qvi2X;L(E#-5w0p- zuyW8KcaqBMmp(_X3c!bm$WnJ>-=vMF*`ZS5v{~}gT`pUlopZcz*O~Y`Wmk016ra6= zS>?>Q5?uN5MC={MKHoRAZ~m~PLm}5%i`|G_C-9XZO7->b%!?nVl$0c>w-kQevi0DW z2g`S=T>YrK{#u-T_(0l2*~UXJjK~cBh1}C&vCTbA4GjWNcU7BaW4AloSj+g?<3{Gp77K+L2{mm3(AwrE z02dq5hqm7KJkhbiyJTl$<1%8s@0z+ZH0R3$^UI&E5&%yA2y_3ScVuP9EAx{+^kg5O z{bgd*tfMbS{?M;f%{vxqukt|-*^jSQ()`j?T6J7es1K1@q|c7 zvlAko!5E<<-&+7A6FG2R;LqnJ@_8_cOiDlimlqVnW;28w-Yg!K%HlH-0s;%)Od1is zWrcZz=&1;Y3!R7LLC7MRRL(pSlN#*4AQ+-Vg^4l*aM2QNbe2#Eq>Br=UH!s+MD@2vM4*je^s|l%6YA)n z$fL7aTu7gUaJnY)SYv7fS4IqHJP}Ca`i&=CIV{(o2^Q~X!Z(J&9jDBr@sh_A?o5W; zcmi7Pr)U>)0&TSFBD;VRl_W4i629X&ed;o{+6ply`201c^ofsBJg^de+lFp)ynNJ2G1VWu$ z*gPJa$zZc+qgkZJD2NIZ@X}-WKsqgMB0+MD0CgMZM|ub5qezF*xhQ(d8*84 zq44Fn5{UdwT8KmDePTOgug z-9)v+B5Rp3-9)xC6=E=Oo-9fux+5HjzhQ(D#Dtj9o{V;a!r(J%d36L5t|~;iCnHIW zCyYe(N0I&QllVNgCzVCz zka$!IM1bHWiDRDz2@x}bK`7p$55)iL`eXPU#xEZjq49sk_;G2!euVHO1}~UI`-Mw} zOl2^Fsi{0~u2-<1@7SOxHirI%Sv-!-Npoh6;TAe8gvf>QLOz585L{q{bdIrJ19K1`L%c3f zg{$`8tNP!o`roVi->drHtNP!o`roVif3d0;eodz%UsDhQA2>6H%WU8bC~(3W1E_!q z0ze#udGO&1p+v}`_#Zfkz!d}mYeb;v`z@Lw6W~5R+>Ay6!CM)VI36$2&cuYpH6|hF z2gYPJ(p*9 z8k9CKn4FeCo<-4goI{+QYM07PWKww~Vk(ot;@YJ;XbOefK^Q@sXcC1iyaWeL;SN7> zfnNa8mCd0Nt&A;<$fjmyL~CnfGfOLLYqOa|cyM8EVhaDQjo=A}m9?F@4RJJR!qPaD zSi3+skI}MV%0Y9qQYk4Z#wixYY!1!DY}Tw{YP7kF;d9me2H+HDlD8rHlZ@8Oe%}Vg?2SVsxK6p zICfSup5+(O<78oDjAeqR_4E7Z3}fxaWR4fX<+&%rYW%xa<|0#0lRzq$&F7G*?#WP1 zEu^qSJ68^s1os1i;a^$6UJj~2&EKP09O|5Os%xulgojokvJ=Fm7+O{ zrvFo||D)z2ktuLf=ifSlh>gpR<)x4~RA(Br(0}$clYgl>n}sa8e(Ih`;=sK~9+ks& z(2V72AQB$IlMr!u zBm>VpNMvrJUyuiK9t_~TnutuW5%_2LS})u{26aYW0Yu_Y{C@?>lM^}c)Dsl|xh*Jg z83*CD5N4$C5)ph4gq30v5EzY|z9?~^f)G|kV44V?DdZ8sP6$k4vfx<<8qqnC!lWSZ zEeLN+<|Ahy7+(mlPo`5-Ap8Wv+6+FE4q@cjO^Hb*!E+fbvN^8JqmttwYzkp1PH> zVl4qcRA(d?Q25*8MTizf|CTs`@85w)+luI4<_p^lrBd}1_cP~D9QzPFxPwQWm~B6C zG5G+Lt^+{z#ZR2}0l4L{7J!oK3H4Dy{AI#wo=znjBL*E0|B+#w^IroK$}>jF8(;Vl z-9)E3M8vDf@N|aHA#&k{2$g8`S110TGfq%zf*vyisj*ZJ6)rZ3q0r0VnK*227KM(i z(1>)_FU!*j68^_*6C@y@$gd%wcw_`9MH>UTY9)aASOu_(k^mF64^mL$?dB^U3iqY} z2-9d2`8|XoT^Roop)+9;&85?b2--C;m`LVxk`Y*Rq6B|~A_4cjlz+(1*|`(Iw~`=m+Sh=q7Y0x*z^>RuZFvnT|2S*kW8U{+I|%EQW(w zf!U17#T>#EVahO-m^w@orVH~Oi^nQriC817J=O~wf+b^CykqmGsM~9ym1R~G+YX9JuVklfV+UZjeCk~!F|Q!@hW&dybaz9AC8a5FU4=c z@5LA6uj6a*@9_Nu0zr*nNN^zd6G#LeVLc(AaFTG1P)lebd=rxt(-1Qk^AL*=V~MR6 z%N08=RxVa6)+RP2E+?)dZYS<9P7z-so+*AryiB}WyhVISLS8~o!a*WfB3@#ZM4m*E z#BGU2i7%3plA4mUB(FuY?^GY>^a$L z*)BP8IbAtdIg;E8x!rP?RSmCC^ zJ4KA5mZGa7S#gcx5yjhzElPMLJtc3Yc%=-bQ%aANdXyEEEtNx+Q^rLLmxq#m!Hqh7AwuA!(gM}w}Bqj626gQ!e&CNhY5#9PFk=~JhBP3KQPIQ`M| zAx%Ba5Y5$^#hS0QB(!X`VzqL#DztjEHMIS-mua8SexW0-W2+OVvs0&1XFyj^H%xbf zZmI4EJykt#y)?ZOdW|!rXE@GCnsI2x6MekCt$u?3Uj4@gXag&QID_2=)rM$8YeTx> zUc;K1xS6wNvSuEd`OHYl$k`~_=!DT*V-;gxNrf?Ra))?LOHX*(cZ^xBoC(Z#H%I zk=gGYG#y9|2OXN`5a%qOb6`%B<8()o;~~dpCoLz6Q-M>Pv%Yh@^GWA!7gHCG%LSJK zS3B3`uGif#Zk}$N-5$9sxQDp!a)0fi=|S^2;nCx1<+;@Jx);vN$1BV0nfEkrviC9X zp1C%2m(RWBBjpq1v&*O1*T9$KTjq!Mo9nmTuW_EvJl4EYf8g)!zuo^;fL=gSz~%Y) z`2q8H&uAUE?@m}%!;|CJ_6ABXqj4(zqQ;fNod5NXKN?_e$tFu$tHHn6a>l2%j?2>jQ^>BPR z1zZ$&A@?Fr2~MV}_%rzH_-~WvB=1iCmJ*tBE>%92m0GpLV9BN>ZD}59e=fx?B`>X5 zHhtNuWp9@|FF&{fwIXIkMY>k{+Vqx{o-2>8l310n>fvhB)!D22)`YDoTRUy-%C+y- zd9FLLUS>UK{j&}B8}@I+ZlrH~w8>&q{-%-5l+E`uOfzyberzFcx&MdRA9;TWw#IIK zlxdy0ZySCaYg>JmW7g4Z`Rugpcia88m*fz0Hs|#1h~9B8*D`niPKllTolSYZc^C7w z^S9;y*cG?y>28zK{4W5=f+&pd%X!9US{GV0{xQ*Ng&78w;C zELJJbI1NtoPj{SIe5U@a&)JG|w&#k@>zv&~OlAhAI(x!{y7i%ufy;McT^-hZi1MKPsuVslNDl*5k68*)`?0 zjAa^k^&#~Q&!V0+HBcHpJZC)beUbcP=;g{rT;t|fa<6hDJsfjkaSS%s*Ud_h^6I5!unwnb|0$35LMy3c=d`c&1kpr@sm(<}JA<%`;v!amEsivEE9*I$`mhXyu(Q~P%GyY2VN z!LY%$p_CtlA9=(2!(}5rBaH$k{2^L5m_B;h!wF6ZP#7SGL1QNVq6-M`f1t+$20|Dt zjNyF+ED~^doG{?=1cDfWfEO2+kbw6@ehnxL27|-m#PN7>X$f%&X<6j{hb+8B0>kJ_ zN|gFF-*`$;F@FC8UYHQw|F{J&dNDRf+AtMl9{rY zv!;2imW7qdB-{BhL1fDu9UE0IQc_kO?}^?FUF*#fpyACDlo)Ys3tF1*I1u;ZoxyD>{6#@ z*ZCY<-qq|xO{+l9?BUDQag@#vYK<_Cd-QI$ienqjl`BUlh){;N*7T(%$ zOSQLl`OH$E?BLG^%Waih17_DGP4X&~tlG6neN%CT&gQb*RUuaILnP)joATO}V%JF$ z&w`_eA0KVX4 zxfJD_7A;f--tfVJFF2dfSsYoy26j-gS4(wY&<=;JlHJ?)>9_2NVB7o6(0r{MTyWg$ zn0N7={69P5JvY<_m(BDr@RT__<&NCF)O>^N7w$oI-_P>EH|bS}59A(DmXzJ^tRk@? zi|m|Nc}cQ{Pprhhm#Vd0f)BYBvPPabUH6o?Jf)^AQ8F6ZU z^7i(j7mD`^RYroikJ`1&jGbRe=)9Y3eq+tP>YH4@H?=xzmlwLRQqCsd5kD#a=buM9 zpYOfouCWu>eeK7r6i$?+AvgzozeX%q{EGTCiz{^!a_W6ZBfcsn?R* z%a$9;Gad7Li%Kld>Mk%IP@g?3skOJcKQu$v7~Fd0vwo<>)i?5zrl!Bdr(o*8%JQeMy72N{yOF7uUrahn40dyhvotO0T+@u+PJz9`^fx z0RHs@6-Dj6kIMcqyxhOF%%DQ-@Z!Aw<>$k5LEqN$fEzr!Zo7_Waw#L4rHi&d_1ThT zq<+dbv1qVwb4-E9?zD9dRoFYNwspA0^LESM;v6tOux{$Rb?77VZ0jqnC9GA?ytiQ_ z)vrqR4vIPoMrftNA;-1_KVIcVJLH!c#azDr);?6@UhlHV^8Pc-YqfPYY1SuK1hsUP zcRw9)KOUJt5PP%JWaszDD>jt<3c9tSF*g;bco%$8*VvGdlTp-Q=vy&jba+>}x&~DM z0zkAf2)N2H$_~qT)gxl2EiKRy?%AOx-iTQlV%Xp`ExYqfq7hVK%#pz|2HNT}i ze808-jLL}>iuR!g&9Ps%_jTHAyYnciwXE6e;-Z66at9ce+xSHS@Z?qSG^t|;n=R+P zP%J$f;6^8ZaExm)sK%<=sUN?rmSy(Hac@fG0e)R<05d#)(_{b1-K%{-MX`P55&2ZEGs!`A0EQ5jcvH(%Q#YZ%n92jf7yH5bB=M%w#^q< z`Xx3qKYm=|m_a#j>3T`2enq{*b^DNuY8T^oTn$kO^OZ^iUFkt1lLy~C>tr7v-0-q6 z;>)zSH$K}sGtYhB(pTI1V|`lu_t_0{8Wp9AkC(qqs2eilMq-}JMgMWh;IqlT{=qh% z$n6V0#M8eJ9_-ek=h1t%PCgxdt}P(q>yBrp&APAq&o=Y3er#7gG>2cc=85t&N`8s1 zt5{AM-w4}wbY(K*{I?#Bl26gkMvmNR?shAt-Oc@yn;F@k5V}*k(PP7Vt-#dWV@i7i z-US^cG73#(Hp@<(GE~|%GSzeCn=Q+tm`|^j40Uz1{!#id$SN=UMNwVoiZ{+*I{oI_ zE9k2kyrMo!6tnfQ-<(rm>~_7}%Z*tXx$au>@PUt~Iyrw%6@ZkKk~i1(&h{lA@TD}& zb33%1Q?Rkue!ekpom2459h|_{i)zV*&%e`kzn;2ZKiT?8V?*AO+xyGcrPkzY9eK6W zdHbq`G4zW8*khA7i~HrSIq$cK724t$*V?zryKd5O(aFgCL-+PMqxV`hJwIo-NxKT; zYUOpEUvW&%>5f#=tA$ShCTXPK`s-dtf>uVwd-971r1|7TKgaCYjEs+~LJa0LPK!aW z3@~%L9<(lwBr)Kr(lI5isP^l6@{-27%B=mQ%k>Y>XsDmVCpLxNN;1_kys#xq?TKd8 zeB-?R)r$C$Z4r&=@-Oxad*H>Oj6!B}iOcmQLJId4rTq=v?}GhV?nkkQ3$+TeDH8Ig z3a!&G_C2v(9Dg%@?b5?ts~boB#jcUq%%JsKE$D__yXuWNd2?q=HDGO54w#`BzPI4z zG2i#^-!~AK7ng?7kM^s~I7!LhaVFc{8NaDxMgV38$oC8I%Hf!O9eM6!?_Accu!VN+ zYt0^$16eziYV=>oNpVqb63P;pQsJMgO8nOP+`V^kfT<&XF0?9q_l%63NA9bJ5}(Fv z%V84q-st(>ZdTR!pq(P${#7kL_2ROU4 zD6e^?=aZ}c(Bkv!g6OB@0(e0;vt(g*r_mUhI{wk&sRO>5a; za&PcW6|Gf#r)U1>S)ENCDLZ;DhH3P^@gI7on4l##92~OZeY=6j{k#JG9j2=`6C=dL zNJ{LT36Up!u5nV|?~MD<8hrFfqs(G#w(Ux=$Bw?J&FS5bfhqmo(eIONu+4pp6i(Em z)tk;{E8Pr7ABn1%dEI68)Huvd%qRKGDi6((;j5Yg@G#Buq2-`w)sM_O^_8t!a*iuT mvJ%=eJ(tuDTePkSYJN7(JuKp`IycIFedreXi+rZw`TqeLcoh!- diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/bg.png deleted file mode 100644 index 580be0a01dff4c70c72f78a3f40186660ee8eee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2810 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/icons.png deleted file mode 100644 index 12e4700163ac87fa38ae3d92a2c39d0fb4690fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 zcmbVOX;>5I79PY3QcMF;v=DTJ2Cao`KoWu|Aqfy6h(IyOQj#!`2w6-5AW&qm{A@Vn47?^n2aU%})k0wvK3C07Okv?vJ=0$Cz%3={xy zqf~pe&}INI6bOSj3J%+s%9n_++yxtKqDTs(0bujiL@Ada3n@Sz6eAS7+30KQY(Qa@ zo6SyVHl8h|Ljs}qUKtd)*Dr{_HCwk^{ks>P(^% z$>3j?4eU)86-^Cbc>d)J9=X{F6bdO7hf^w*SfwLYB8$NhTwGihIEX|C*up`s5-Yfg z4r00OA_D`G^JPM*LMRb~3yfTzBwpcW14sHc1(B4^{+n1V|4S%XGF&28iX&k0IFV=} zuQ%3mMF8}lF#ge69;A{&xBy5liI?%={fM?*1jE|>yQ2j|I2!79nGoI-ZX83xj~78= z1&iTk1FvACgi%yHfdZ>YcEXd1coKy`pb&{P3YkJCkmxiDok&~c_(v?PIup$-B z5`{!AkVrv#APL;a=JJK&g^3RrHt21>3`izSfTBEQ5)t@DVXE*SA|O%d45o(%o=Ey% znZLzG{XeSV;9zhI* z*~k0Z^G~&Z-c7Xw#U+Dr?Cg&42yA(9*^$glv(nbKwok8JbGh^2fn9ZV^^MlnECDr% zb8Rs8C8IoDeQzNCoR;2}!wUCvRMpV!J9E|5P56qVSBFh4T0Y;2i6|=%vhzEOZ^qncd+?}N_bX*{ znIC?`)c7~$4FQSwzwzCOojcU0H=er9Th5iEB3DIX5_dF9pacXTJI>B~>68qESsvP2=ichF(pvo+k4SU)M~s z3+?sA#l_+!^_(ni$K3hWpYvO@(V>(R7s{iDO6K~mgMjhb#~a;iLRMs%6Morxqp@)+ zJ11v+j#Q)R8@*bY-^NRurddL=!0Kz49SxqGJ&)t#ALNBh9UchxYqVgy=FS2Q)2-GG zBd14SCdB|xCIa#W@6`ozw2tq(*SqVL6m(b4BgGYUcz8H7tm5RY4LjVYtB#yD%WIiL z^ok2`{E08ble_h+YjPxp-p^aDd8axLc2xNv4I44|GNGnPPd*e)aneY2alYqb9*45qn=`wHT|PE1MH)jbikTfENQ(LU04R%o4GX7X;)Jz~k@;+*h@ujN~uo%_H2Vt#)9-SuZ8 zD(`znx@z1*Fc?})4yp3{yMwz%f3p3^_`td}jYgB*JZ<~5{o^*n97-MLN`u1+WP=og zG~N;$va+wQFMG^R<8tg!zbtv)zmj%$*=6~JHf{#PVsN6mpPUoW!COmjHa8>BpFe-| zviJ7wsWesFOw!q|0Zmd!GK3nK4i|YKKmE;d9H9tD?#s9pU3R==t>dhsJ`NpNT6t@# z>bvSrv*xK&x%1B=UMGzB-BC7Vw2ftZ@0X$v&Y840W1O8Q6#!^1lgqc)kL(yB)Le=8 z=T=v)?T?7Ey|HH4%EB;>|Af=wc|K2&Wo#TaFw`-{JDys3#>dB}&&TIO#g8>AVApU$ zt=rXe@74BHRaNmELusolZfLdI$M(mvG@O(Dz4?yH_d|!{EIB#j0Rtzj`|*uIYILgq ztW8PmrPs*^+){hCug`mGw|PnDebMsUP`H=IzTQ4QV{GIFucdh)Jw4siba)hSNtxXH z<2!>gR4NgL3iX`KelH{#*9jjIIct8zmJ`on8|gx>n+4xbJ{ci_{515Ueb%M z_d;CG<=vC_{(f=;@|oKWby1nsZbV)PaPKK@(zYTx7wEe1W*3B_g@$xR${3`=9{n z^jx{5(=Foe&%s~(I@!H?NRo?N70XHp3J$g$LnK`+9O&;)_SPBXc|eDW1uGJ2lQU?? z(3=`x>_4uiufh3t9_?yDa8SXgm1%3n5UqP~Dx+6k>B=WpjNSD0C$ny$TjRe?G_AmISp9T7R8oQndf>2sl4f z*Q+)Z)u<0zW)SlFM=k911pK9m9=J$kKII$NfP=n8d9 z_5R=XSPzxewWHyWjb|>hqTEDBdpM&qYK*jR3}fpN>&FrOc8Nw01u7#{_#oBA;+Qag z98vNrKKd&}z6#EjbJU=q-&*=dcaJp(ISHq7v%_OxSG{XiR(gB)=^pEQUR|QJs_=g6 z0z4yL6Rn)4v zv)yNtNTj)n2&tMFwZy-gMkf07%J%iduo#zV@n|#ww?G(766w)+7*H6YEwCDf^l94~ z;7}6D-rJzj;#%bzP=^|skPXAM8chV7L<(JLH9@*07zg6vEe0fv@uKDu12E{r7#sLX zw$dbl6AcmDF*tgAlt#BbNf)ALtPBT2tso&_gmDP48j}$-XboeG>w?7Gw#{My;}AS4 zj4@$Kt5g9J6oUailNX?4b2xxNz~lt-1p#5{RT#D%e}kcq`%vTaA20xFgN4>cO6(Pmr?|Lb=~ zVY4R91hdqz8BM`-#KR?c*-Du}2?j$rifK?ZdFmEbi71Ym6HyZ&i537pN=RowY#YAg z45boOAZ8pwbg)7i#vnA927?~tOJt%Tb|9C-W%D^4880|QAQ8)WQofuMEEaJjQ(P&k zOEJO-KE>7l%jJEPYYT(XL{yf-m?0I`%Q4glj2{{_%;1I13uFtpaz3HQo7u|*S3iT7 zNv`0dToz%5WqaEHJoVHTkssT1I=IAQI{Gj|s zLrABQMF5Sm8=zAjTlVMGdII}WHeGsvSex8>aPW*~dEN^00n4|U<+`F)0+VSYbQ~WV z?F%~8cr8%bc)qMXNq@X|msi$rCx(p8ocoxvx95hP+ww7tVLzn=Dw}7u}%eHk8iyK22DPh{^tP z;8yePo+0GIiepheWjSKe7i~Cr%%6U%^FRaT+&;zKWI;yr)=Htb`;H~Dtv3>QdomZO zx?7%U#21`hX#U}z&+kj(Dq>0t3fzD1{LAk;=X>(P~1p?y-g&qe1}@0io|o5x=H z{k~yG;hpr+z9nb%C)FKYW7g36$AgPzSF1B*L3P7~x01H!jfYh9zSJYpH-vWSwGS*0 z9k5wfq^Y87ZYAwKPqD=-7B9#ulJ4(Z?b}N2rRFd6tR&}rUQ;I@OUoYF_>%W{SBSG; zOJyu`iA??nIWcheW%Lt#9#xJy!m>d^1>^7*Xzr3{YHG7TH`UuA+7(^ zqh7~c*~n7gqt4%h2dR`(bxr1l4`SNv%@iD(L0l(bA7m-!EPjeb=C diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/progress.png deleted file mode 100644 index 717c4865c90a959c6a0e9ad1af9c777d900a2e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.gif deleted file mode 100644 index 8d4f3112b9d1df2147ed3b67d9736163dedd11e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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? diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/image/images/success.png deleted file mode 100644 index 94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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# - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - -
    - - -
    px
    px
    - -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/internal.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/internal.js deleted file mode 100644 index fb845c3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/internal.js +++ /dev/null @@ -1,81 +0,0 @@ -(function () { - var parent = window.parent; - //dialog对象 - dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; - //当前打开dialog的编辑器实例 - editor = dialog.editor; - - UE = parent.UE; - - domUtils = UE.dom.domUtils; - - utils = UE.utils; - - browser = UE.browser; - - ajax = UE.ajax; - - $G = function ( id ) { - return document.getElementById( id ) - }; - //focus元素 - $focus = function ( node ) { - setTimeout( function () { - if ( browser.ie ) { - var r = node.createTextRange(); - r.collapse( false ); - r.select(); - } else { - node.focus() - } - }, 0 ) - }; - utils.loadFile(document,{ - href:"../../themes/" + 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 () { - - var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; - //针对静态资源 - for ( var i in lang["static"] ) { - var dom = $G( i ); - if(!dom) continue; - var tagName = dom.tagName, - content = lang["static"][i]; - if(content.src){ - //clone - 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) - } - switch ( tagName.toLowerCase() ) { - case "var": - dom.parentNode.replaceChild( document.createTextNode( content ), dom ); - break; - case "select": - var ops = dom.options; - 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] ); - } - break; - default : - domUtils.setAttributes( dom, content); - } - } - } ); - } - - -})(); - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/link/link.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/link/link.html deleted file mode 100644 index 8da8550..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/link/link.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/map.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/map.html deleted file mode 100644 index a4c6a9f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/map.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - -
    - - - - - - - - - -
    ::
    -
    - -
    - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/show.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/show.html deleted file mode 100644 index b150898..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/map/show.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - 百度地图API自定义地图 - - - - - - - -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/balls.svg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/balls.svg deleted file mode 100644 index 07130c6..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/balls.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.css deleted file mode 100644 index 8ec98b9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.css +++ /dev/null @@ -1,90 +0,0 @@ -.wrapper{margin: 20px;} - -.searchBar{height:30px;text-align:left;} -.searchBtn{ - font-size: 13px; - height: 28px; - border-radius: 5px; - border: 1px solid #3498db; - width: 80px; - background-color: #3498db; - color: #fff; - margin-left: 6px; -} - -.resultBar{width:589px;height:357px;margin-top: 20px;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} - -.listPanel{overflow: hidden;} -.panelon{display:block;} -.paneloff{display:none} - -.page{width:220px;margin:20px auto;overflow: hidden;display: flex;justify-content: center;flex-direction: row-reverse;} -.pageon{float:right;width:26px;line-height:26px;height:26px;margin-right: 5px;border: none;color: #fff;font-weight: bold;text-align:center; - background-color: #3498db;border-radius: 5px;} -.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; - color: #ccc;margin-right: 5px;text-decoration: none;text-align:center;} - -.m-box{width:589px;} -.m-m{float: left;line-height: 26px;height: 26px;display: flex;} -.m-h{height:30px;line-height:30px;padding-left: 70px;background-color:#f3f3f3;font-weight: bold;font-size: 12px;color: #666;} -.m-l{float:left;width:40px; margin-top: 8px; margin-left: 17px;margin-right: 10px;} -.m-t{float:left;width:142px;} -.m-s{float:left;width:142px;} -.m-z{float:left;width:142px;} -.m-try-t{float: left;width: 60px;;} - -/*.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}*/ -.m-try { - width: 4px; - display: flex; - height: 0; - border-top: 5px solid transparent; - border-left: 8px solid #9e9e9e; - border-bottom: 5px solid transparent; - margin-top: 8px; -} -/*.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}*/ - -.m-trying { - display: flex; - width: 3px; - height: 12px; - background-color: #3498db; - margin-top: 8px; - position: relative; -} -.m-trying:after { - width: 3px; - height: 12px; - background-color: #3498db; - left : 5px; - display: block; - position: absolute; - content: " "; -} -.loading{ - width: 113px; - height: 95px; - font-size: 7px; - margin: 114px auto; - background: url(balls.svg) no-repeat; -} -.empty{ - width: 300px; - height: 40px; - padding: 2px; - margin: 157px auto; - line-height: 40px; - color: #666; - text-align: center; -} - -#J_searchName{ - height: 26px; - width: 295px; - border-radius: 5px; - border: 1px solid #ccc; -} -.listPanel input[type="radio"] { - background-color: #fff; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.html deleted file mode 100644 index e7ef04f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 插入音乐 - - - - -
    - -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.js deleted file mode 100644 index 97cfc36..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/music/music.js +++ /dev/null @@ -1,192 +0,0 @@ -function Music() { - this.init(); -} -(function () { - var pages = [], - panels = [], - selectedItem = null; - Music.prototype = { - total:70, - pageSize:10, - dataUrl:"https://tingapi.b0.upaiyun.com/v1/restserver/ting?method=baidu.ting.search.common", - playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", - - init:function () { - var me = this; - domUtils.on($G("J_searchName"), "keyup", function (event) { - var e = window.event || event; - if (e.keyCode == 13) { - me.dosearch(); - } - }); - domUtils.on($G("J_searchBtn"), "click", function () { - me.dosearch(); - }); - }, - callback:function (data) { - var me = this; - me.data = data.song_list; - setTimeout(function () { - $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); - }, 300); - }, - dosearch:function () { - var me = this; - selectedItem = null; - var key = $G('J_searchName').value; - if (utils.trim(key) == "")return false; - key = encodeURIComponent(key); - me._sent(key); - }, - doselect:function (i) { - var me = this; - if (typeof i == 'object') { - selectedItem = i; - } else if (typeof i == 'number') { - selectedItem = me.data[i]; - } - }, - onpageclick:function (id) { - var me = this; - for (var i = 0; i < pages.length; i++) { - $G(pages[i]).className = 'pageoff'; - $G(panels[i]).className = 'paneloff'; - } - $G('page' + id).className = 'pageon'; - $G('panel' + id).className = 'panelon'; - }, - listenTest:function (elem) { - var me = this, - view = $G('J_preview'), - is_play_action = (elem.className == 'm-try'), - old_trying = me._getTryingElem(); - - if (old_trying) { - old_trying.className = 'm-try'; - view.innerHTML = ''; - } - if (is_play_action) { - elem.className = 'm-trying'; - view.innerHTML = me._buildMusicHtml(me._getUrl(true)); - } - }, - _sent:function (param) { - var me = this; - $G('J_resultBar').innerHTML = '
    '; - - utils.loadFile(document, { - src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), - tag:"script", - type:"text/javascript", - defer:"defer" - }); - }, - _removeHtml:function (str) { - var reg = /<\s*\/?\s*[^>]*\s*>/gi; - return str.replace(reg, ""); - }, - _getUrl:function (isTryListen) { - var me = this; - var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' - + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' - + encodeURIComponent(me._removeHtml(selectedItem.album_title)) - + '&autoPlay='+isTryListen+'' + '&loop=true'; - return me.playerUrl + "?" + param; - }, - _getTryingElem:function () { - var s = $G('J_listPanel').getElementsByTagName('span'); - - for (var i = 0; i < s.length; i++) { - if (s[i].className == 'm-trying') - return s[i]; - } - return null; - }, - _buildMusicHtml:function (playerUrl) { - var html = ' 12) - return s.substring(0, 5) + '...'; - if (!s) s = " "; - return s; - }, - _rebuildData:function (data) { - var me = this, - newData = [], - d = me.pageSize, - itembox; - for (var i = 0; i < data.length; i++) { - if ((i + d) % d == 0) { - itembox = []; - newData.push(itembox) - } - itembox.push(data[i]); - } - return newData; - }, - _renderTemplate:function (data) { - var me = this; - if (data.length == 0)return '
    ' + lang.emptyTxt + '
    '; - data = me._rebuildData(data); - var s = [], p = [], t = []; - s.push('
    '); - p.push('
    '); - for (var i = 0, tmpList; tmpList = data[i++];) { - panels.push('panel' + i); - pages.push('page' + i); - if (i == 1) { - s.push('
    '); - if (data.length != 1) { - t.push('
    ' + (i ) + '
    '); - } - } else { - s.push('
    '); - t.push('
    ' + (i ) + '
    '); - } - s.push('
    '); - s.push('
    ' + lang.chapter + '' + lang.singer - + '' + lang.special + '' + lang.listenTest + '
    '); - for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { - s.push(''); - } - s.push('
    '); - s.push('
    '); - } - t.reverse(); - p.push(t.join('')); - s.push('
    '); - p.push('
    '); - return s.join('') + p.join(''); - }, - exec:function () { - var me = this; - if (selectedItem == null) return; - $G('J_preview').innerHTML = ""; - editor.execCommand('music', { - url:me._getUrl(false), - width:400, - height:95 - }); - } - }; -})(); - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/preview/preview.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/preview/preview.html deleted file mode 100644 index 42849bb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/preview/preview.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - -
    - -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/addimg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/addimg.png deleted file mode 100644 index 03a87135bab65fa2633156789ed0f4a906d6c48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)LlfO?CQ4q&JZ};uuDR(Ob))OTXC`@eBz!@zF z+HgV%Hu^952Y4l=g(2n$i9ae63lhXcqYyM9#DWA|@b(rsk9+f;1wl+yj4;&{^Z8EZ zJ2T2T$4NrJSzdPEvg}xJM?R0MBtb zF(d!&V7bvXOyyt%V+_VxCMVl|G4K0L2`GSu4nDMoTw7VvC?4}634OnCk@;@JLnc3FEH3Q_>)m5edixGKIt7FkHcF4 O0000LlRapYQ51%sn|z5A!;eU>8r+{HJr7$}yPjp=Xw4K1Ua#f7iuXvM4a5!@5mnb6Jy5;4f zq^GClVK^)=CMV^$zAd#p)X9w(bjvTJaV6W6Y< zHElN4Fd9h58CQpMwnbCF0&&|nt--a91jfSjz&XY;RG1F=2?rH8AKl0($O&qx#;_=`eAIGPkrEiZ*t@m5rL2F^2%$?h~iba07-RvG6!+$Z#-hF)* z*wUa-u1NavBOIv|-+OxK963tx@)g|sy&J-7BIJt|`BL~qAQEA|QlZmXAv_UdV92*A z3}9Ln#}*y)LEQe`d0jImLzJL!8vd uXg6z^rfGozG)+U(G#m~GPN$P@*OZ@vE+GjWfY&Ji0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzf=NU{R5(w?lReA9Q5c8MckvC3CRr4rWH3k}lHF)Du^B`%h=dG6 zguL4*gWaS^NGOSZ`kg^f{XGLc^_;r8yYF+Z`@GZ<;@`(&vA|?9`3kyXJRalQL01fi zLp&Z2WV6|iphH*mdOh6lcNB}ox0FgHl*{E8%(<2hUD0m0al73R4u_FWr%|m|U({+f zG#U+byIr{(BXid2&=t*Q6W8k%I-L%By=@ zm&*kzl?rOL8d|Lu!C(;4XcW0z4*h-~yWI|l!$HRBbc(@XARW4*QmNo{I>BPGNUT;X zoK7cPE*HFBFG8UZX0sXA>ow-{IbyLG;_u=hIe}(G|5Z=0000LlRs}0K@i1%ySKhz{O1fJ$i!Hn&_fERK@ibd zbP=ieOf+<);v-NHQBXy)C?X|I5W=L1LJA~<17{zJ<9KG5!k{1wk%*@njpn`4doyD~ z2uu@pDm37>c6P$IEISwYQmKSH==W(ZE}o0v_2wonsNzFl`^D^kf$u!}LQutt_h<;j zar~DygE3(2IEO&+5CUiji1#=ZK||o}yDIhi33JuKDcl%rWQp=QqMSoVf(}M_9S>Cz zoT{SUv$l2tmn+e19`WG*;h4Z$Tz-aRexA6TaMJJ5+ucP5L)3dz6(_2Uyk~!Jk0eQW z^|DCs>qV~3L9K47-Y79!zJ;+$TrLymKV!r*@*Yt=mC$IUKuQ!vbUH=4-H3MEa`k$j zhnMqIZzgp1JzK3F1=nNY_D=~Sf_Tr$%FJ)(9slx>D9Y%(@ACbV<1iJj6ctqv?-3E) zNCY1O8yiQHJFtexf@?2R{@BJ?i!}ygEd8hVIIh)jS(Xvyay))=@XwvUSz2QG?!rX< zd8>shILEWq)iaM~SSaveeSM-{Y&0;#;gB>(^b diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/empty.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/empty.png deleted file mode 100644 index 0375196257ac3c859373b3ebebbabe6f16105587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519 zcmV+i0{H!jP)Ll09-0Q4oZ`x4R&OpbGFo(29U6rOK6a3v&a7 z_DM+WM6pqhRKi!#4G@N6DKtGpus^URVFFJ&)8BN@dnqD#NM-jmudlA&{11>?2dmYJ zq9_;)28>1{cDr5ttSY|V-7%R=l6xQ-X2x_n?EuB!wC#2qd7hIOIeC_oWf>_YHk(bz zMaX$Q9;cHIE-o(@kBWl9lL2S1&UiW;@}sKQ@Am+B1TJ9`@6XQ{M-IY$At_veyCZkh z2#A0HNw}-$pgZDtT-F2Ob2F>OW^-Ac+hlWdQI_N05jzL&!X;$ZZFh;o!GLIH95bB; zNW$DPvl`UcHyv6%9(DgT!0PRm7pMi8VTV70h}zld2%+{!9YE@DjHv&@KO#8t7UG=) zNe~cC4#|6f?iJh}mm_H@6X8y{FD13$rOa5b*F8Xr2vSNfffuvc>}^?=9}+-HBod@% zcfjrE+jln~Z$1J0i1=~@0GiDNLcJQPqF|2002ov JPDHLkV1nZ!(%Jw3 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/emptyH.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/emptyH.png deleted file mode 100644 index 838ca723119499465f29e881a745f4d8a051e22c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cMyUXw5Z8P6?!9~W&Mteod+EB17cYi1ZuhR-c=YJe)QJao zoqKZj)+^_N)hDk%kM7vxU%SOIZ)HU5u5H`4rB6P*;n@A6IVa_d+Vkc6Z`Cb3f9%S$swHPL zrX0?laV)ZJmtD^C)Jcaf-hX@G%JYPteGa)RpT7ON{^-5+yDx<|?_9t8V%D^yUKQ)t z9lf{e;O)TrtuBRYf*Q8PcI>guUcUO!os-vJoWJvW)22-q?!7sF_4&EmuM_+BN4D;= z&slDtz2el37q(f;)*ZQN z=N^Z=m4&lU_*8HD|Np=0=2?Njpo}XC@(TuXX$KfKp3qYR+O*iy#WAGfR#Jy6Gf%)R z4qpdHXJJo=hVYQC!~KV2MYI-VrJh`QUQ;LM&1;6x#M9b~#Ma7WK4-jqNPV%W#5&yr zqHMw)6OH>XB&SZ@(#H8io2zq2%cn~1gDgj6o15p{xKW{#z;wrkO(^fonRSm08Z|^C z74@VuOY>$h1UKwir)j@Gk;A27;=wb==bbzq+_Gcd9- Y9E)+P-Fqc+HPE>Xp00i_>zopr0P;w4-2eap diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/eraser.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/eraser.png deleted file mode 100644 index 63e87cecb90ed3ac0e4acbc257c6dddae5311e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43271 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
    h>dGcdSlWeEFl}k2MrUUS^bR;=$@vE@GsDa9 zCRVfkO!iK!WhO`#u+q=#eY5hUOO`Ia4IA?6aYQQ5Oo47lSGM#GI6zV?e z;527R?<4z6_MOt(m$AE{v*68ILkKSTOdLso6hxT23gt6K8~fl1Fgf@DPPU|? zOGj9!l+baJd-hOCsg8CCKLbD5ilk1-Dm^td@7f(&jJKq}`JH;z@h%shHd!kdH5o{L z0yf^w$SpZmk938d@9r2=|; zI#!tIUYACF9!^Z6be#R7mX4!bhOKBmLEbGPL&$B;9lb$lNP7#V@}Z^ZW$KJI)-U1V zl4c&UAC0}7q0gHpmz1$=FiS`f@J*(Onl-^ES6Ymm*te3hnQ3IZ=Io9IdTi}a5zFQS zxdcpF#a8={UYgRn_98IfhEj9J>a^x)yPeZ&xsevrLLo&MSx3H2BBCL}IjT8$9kOef z?pb79Jm$F@fdIzAu%7#9^sIKF&~8>Ns+XPKG*v>@D@ZGOWSQK*Di*4ymo6y+ytSpM zgBKZ9!+@H-B@5h6B#=ZY*?`BmJy0+Qvj@<{e}+AN54azzp#NkN9vFdJmrHU#!_FD? z2JWX%=5)c`s&94PjL=eW`j}2>vpt+1UG7G z%gq{wct^kX16D8Uf}mT@np3@-?u*?WYpQa^mG_B5{VYHRZ(Sx>q+XZq=RF7yPv`ZY z55h`8Ds_7;JSbg?$>J2d5B{Iu)_c#2m`*TA{rZ-KxOWF4ouZ{JKpD$&`S|qEHBxx3 z8ST4#oV-Jt-$gMcnnFjC#{u3E)=&$#6Cn;xc*-03i;Jws!sHM=45zNPnvI9a(%GN=Mwvnr4E#`Mn4rn|;Hs``VC!Zett3`3dllh7e$(VWe%MDRb}y|E-lbCF zR;=Y~M^|sUEq7Hqq7sNVZnKZv7sl z&wSWhwZqFj@A$opr+3fiOb1&wcd_jqYTQe&RSS&IR$7alU8|8UrG~`f6LN4{;^*#R z+5&&B5=3|V?T#tY=FLE$4E4JC!;TL;#`w`>&pR#m-{dYcY~pmZ{E|!a+d^*`u@pYa z1@WB}Ft!t5+|9k-w@)T>^pwNk$6|y-0ij^oZ&=T3zg}pB@d|l8xGBel`E10F_0GTL zdD?02GB{E~FE(X4+@%6Y&mVv~)$xwDNr0ERVH4Em1HeRzcKnrXL?=Jc_#b3v= zV)-H2+^ev*Y1!c3li07*AKK!fC<4OPXm;x|O$_oi6;4D}ZxI`zOouB>J@lc}iH@3! zIiuf#+tW#1=!b3Wb=BElVmj^?C*Y7%m@WuCx+3|F_V!=ftFw?uH*{Y48*{el$7$Yx z4#N1oxUq$5((zj{wvpiW0%zPne#PhIV!5=`fn`cn2gH5|(D>^juh)FQAGSx0dWa7# zUVa($s$R||%fvosKdEcr0g2n^tV0~Okf@_)bmLt4)WU0I3gYP4d*{fkxW zyobg;eSpE3!7OA%kyp7-O8FLn8bi#xk$-$eSgx)TaX$Y*E)y{V#_p^bhDTnu zW0|d?Ba1v>%j(2pMYSh2=Bh?Rb4qpK&m1R{Lx@dj)E!UD477&hZwN3-4hE0YCHz z1uKY!QU4DmDOA7CH}xGQ_WJrjyK@ipuw30b6E%Az!ld@`>eR%l@)}U1!esw$q7ol_ zvMQdt+^?YI(_-DUALpa1m&>20r8`=qsq$*=rqiIDx_EB;r21`kT8!&a>u6$Rr)^<| zhbgdwVNG)<7&!?>Hp@=$5c{d1o4yC~rB;y@r{>oIeJe1X4wDJa4qAd7vnqO>>wV-+ zPw*u9WU+s7^>?5$|4b}N^;_Lja~{ za$k7Q5Q7rm7&r%*462991gf6}}dO&2XINF45@&Jndp_x)nqiS*57>D71^PM$Q}l5S=2iQI#e(qu(x?2`Ly*q@ z0R1-7eh9rrry_4>xjPANIyOB$9k^N?E0%Uqs!Q#A?{8jHL+j@8Rx;~4$LCmG1pU_ zV?<>37NJ5*uMLBtrUgV7G%aB+zHTILZGyEFXfly%t`7HeJP#~(+!J+Wm8vC5x8p_& zIh}xhmE8bt@zP=e+n)OV4fYvp)lO>By1irEes(3djmof@~tcWVZJU@0e%pR2)2Ja1!NMpsfj-b`L zo9u(JhvJFZqhleE-gL^C_HYvC_YBWDSN-F%z|&**KH(vChd48vhW^{d{iObXsEhml znHOGp?>77Y^c~GpkovlluIHtpBIot@ynKPLri$9nOO;{dG81lGk^TLLg{D%eY&_oM z%45vKV(}ys#(o^w+!8+Ktuec@5&+QY^nl3rpe%9A0R_u?SZJu$Ag8rckVgR+42IH` zpxiJ}2H?&>O#sRI`udT>Tmjr(8ToQAgByb$_s6dbcGcZ{AJm~)Qc5ogx+dHU`fPn& zpEHYXz~|@I?p6Sn8P5U-87~=10MAgBPnG;rJ7^i-pMs~}yBWW=wnrDGCwCg&6el}* zwynt9et}!0-W0i1V^PnEZclj%4Om=UT#9`P4f#Svnn**>rbyQIPNl9HG1INY+BIsE z;vJ|^{WtEt>D9#wSkd))Hr#yNbC0CB%M43~r1yMa9rU>KoevI6^S-}WbbAd?NTJk4XdI3ar0KtBfsn5#mWjvP zb#h4i<38mvba!Ib8wFUOV*QC(Ne1|BlQ!dsSg`Nw|QZ<@}0!EhUp zS!`C%ljy|=52v14JjQBZY<2JX5;AuXaMNu*MwaU2jH%XJU>5vwrP9rlhOwQ2Bo`&x zKmuMesqi*bq_f_GPW=TgTMI1%J7Sjtry`&KVUQVhbW~#z7h)JG4 z8En)ok#bj1y~pV_>)KJI!n}0uO5RS8l@cMz$pNT1N*opSHCyFiwctn z@Q)+E186X*m6NNCF`z^hp5w$uRf*|PB3}n7tS-w!A0nQ%>y}%ttJJt1E}vm(V{bS6 zPTj$lo(WG|SEHVcd;1XPv3%4^#;YxTs0GMSg|8^KMA{C>LX9w8)pz20Yz#+D3b1I_ z5To(E@At%ox3_;itoqE*z><434x^~pi=nH^!v>faCL#wwE9q~msAa}?-RlhW>M4l7 z3gjQ9(*CN>zW?J}yv~e7bW-fSA)VM%E-r5Ke=DKP$Nz^ap@B*FhmHrInDP4UtyJa!TL22>=+`r93O6_ zg@@0Er9m0ZLx^gJK301`J&7}A1U58s7=$JOP?wP~BAPT(&Z2ivu?QBTfG&=v=1>jt z`yq@}!+tpD*DwDhjZXc&NW*_`TQ>mhqUBcJ7(V67#kJ4>U%WXzoB+80dx8AVRh-9| zc6lYam3@(b`mz1OFJ8X!xSD+1*y*Pixtqz@yt9=&g@-eC)3rK7d-IaV27|oLo)nOY802Y#;C63= zbDr!2P^~-Z?Y8e7f|kbd2BHZLu?Ec5?RIzK_q}<9Oj~_(O3I_gLi|LC1uiEfb#RKT zj*v;HkZ*S`^@o#E0zFiGN`JBnKTl9yQ_nTxL`V2q8#IJKwG9T#qI8rTg;i79|utOa8 zdSkh2e=hgJZ%j>BV|J~`;3DJ?T>en2U0d&Qol9*$ zKZT1LV*69=$-x66mjia@tIa6(s4rmVsE?+41rNBM-=iYbUZ*`(u*@%$Vd8Gi?VXj{tGt@pteA?(L}uYPB|IycPo>c=ymG9bC`#`BAU$idTmA*Jc!T%w*( zjC%8-PMZ_!_m5oSs;+Qm-xRBdBUlkqRnSTD@W8iPz)_BMLag7^*|dO(FXoMD%}(WQ z5)(J$N_@2Lmn$&G$-v=6lvTOh*9HFo+l-XH^i!;0|DMM)*}Q}B-nMbvp$DJ$CRTna zil554@ylI8d!Iaa8SN`l%h35?v|N(m+u<|)vD zEG}gui)&Q1E22v+K3c|s$DrD5uYJz~z%aI8HamDpEIzK%cMjIoAih3rWWDAU7#9h* z3Sxl{uxuK=aedu^U=lEP!>Uy%C0(=Ag~tt~i)75KDU}*#L)>uhJj!en@2I<8do6of zNbl#K-#qTA5SU{}d(N6Ok->F?fLaMRuHGQpiT?oFblhM4_>l`p8}!6Jr=L>XE2~UD z;l{dvjuQX*{_CQ(HyP}<#lYvDpU=z?%pDK5PBmuTTWU#Zf+7I((NQjnf?$)q2_~kg(UZ zVl+~3PG4)r#$I2Yz69PC6;g8e(tQNSb*Xu)v#VNne6;Wg`I$~1>)`dTfBz(X3>l-;|1-*h56pI20lZe@Li=^1CT>AE_uZiz&xm0Qz>@v_d&@4}_A7`ti zUGmne)yao3e{=`mE37m-M5;g#ATI$CL${0IX@|lXhfW;Fi<&|=SCYTH=k)q)j_&(l z-+|2DZJyX54h`(dK5{IvuSg-j*l?$bjnIvDGy@@X88iKTxd;XZ>gLWih&4N+1gF?0 zdst@&Z?qg;9I6ps*v63;XF?BP@eO>gp(7RG(P zy~D>wLM3oG52#y+QRq^WjRsN?eCHZ|3#Q<}-uG*L>yr!CB?xxbcHbwdrzI;5)K%EK zfOidcp;RND?WNozdD(g(%b2s_LWg!oZ}lY}q)IcLw5q54W*NJ*_`px@V4ssmL=zX8 z2@3UTtt+YzzFlwRZEA8lWH3?_nwdtH!^4%g(ks<4W2a69NS)H6A1uFgUtw^?CUDGc zBH}m*8a;G?ataH!0p<@R=(URoB${{kcp`F3uZ(s8=j^8QQWxwwa_IK!>; zQkozb6flk+(=V6zpTz_}RPw$aGkIIK!X?(@olxnH_KTGBsLPG}@u^h-*Wd;WlV`hM z7*ja)vLr0?%i`DmJ<~})ACJEuvZov8$XQ)weiQrT#y_YTe!tV=!-d~=Ua_8T_TG~_ zqtAb^$=_Auy?BPmv8o$(hl||u6%-Fx{Gbc3%z4a_iww7!E%2@fM525av|E#Q%GHUH zfEE?8fheK0fx@k@^6!pw$1Zk6b=Vp3?hC#CkwctYNFV?rLJuaa6SamymmCkomZW0b zls#-y?+F~dK+|*4FFb9vc8QDoWubX6|5PZac>B_pyPr>tlr=4C=^>`?5A1~mf&BC5 z32Q&jX|C;hH!ON+t@H$wf8T*8oTNXP@>eHJTzc7|ux@;ptB`^ziMRFGSBt;C!*TgZ zf)>dy)9ADf5+2r}jlOW(UPi|UTOB%PooFX30M{=Ly!>}QRK%D!Bw)s)yPzXRM7 zTs-mM+AqpyHf5>#3(o5u_4qN)&w!q0NJYzbw%T6ImMQhi806Gi-BWv-M;G&I z`aO}n>dWfac_uRVcJp2^&eMicc?}FZe0OyPG|h90!o+MA!Oc`JeA^q#+qT~g8t+$I z?|=|r-T0*zaVO<`i);~h;poXV&J{a3mA`sH*v_Fm@i~U8(Et4X1naQ_qqtuSpsFPo z{k8qa{1tlqvwp{Yy)RvzQ_E+^!RvQv^JZ-QRa)+RpcxiGjL032uT%B(AS( z&?U6MUTEJl)F`ei&UoPRYNgAkp8J`p%YL&Vjpu9%J1(AqNOSYA49fquj3Z`T)5mcj z{{;I`jz%h>q+R>`737ifIOiEH+dFf`Q?Irr$07!&rpA7YXDZFm!|L{(F%$g)MpxGa zdAS1K!=9Yak2vbN#k{;_X8*lNO1r;RYdr$M-59hL& zjYmF(og%&5;%g0&(|COSs^f>)cLA!OJQ`)ji>(HwJXkGd0hG*ZH0D;I_=fW8qpShD zRf(IwR(*7`aksL){KP9w4Pr;{J^(Gy{}Ib^+e>mHT?A(S8`pw6I46zmD`f zm4MS=w=U^4&%c4#tz2X)>lP-qL{&G8a~cczS(zHsd!u7p%vq84G$y25JZ0k1qhnlY zv4{6J(giBP3zYMi#-yXWo{w%@<>_=%V_JM?N-9L!Geeq$=qNhMBVeTxjr zhHF^{^y0u56sTJi`;?d04!yTg$H}_#9ntG zyPm16ISKj)H?%y;T+(5>=fT3Ej7K zuMAA`L)H$q*{uM5)^~{sfi`V|pC)7A+p>(XJW1UKh^Y?daTMv$8X4|c&U(IkXP;Ee zGyIL8C88yLi-*qz6Y&g*w8siH%Xj7O>K@Z~eEo2HN`n;fi#kuKFmcDXu6p8KlS8iD zFVsFO#eVD*g zWWFlecA3)(vD6V8Y!-_Bz%??&&%*$NrIo+wW-HW-BO^PxzJ13vgWjvfEUhw8jfTYw zdrQm;FwJSPaw9N*%4A|{LrK@iL0ut#`5gF!?_HExb(lo#02l=vv6~s%c6TmW=qr93 zVY*#+;zL2l#S3iiDeygreUac7oTvkB%c1?94+nmru`p9?q{sq4=->?hs(6ZvnC7wV zH%=BPD2y|5MZ}q@L%I{23SrjzM zPq@!>ipkdL#jU!3K{L3y*WqmH| zSBOXiWO($L@8xEJpi+-paaD+~>ipvnRexhXjSB-xM6d+#L-y+VI-8Osl)Sc&-sXEn z>|b-61Nd&BCs;X3qME#;qA?FF83AP*`DISqC}SrV4i4t=pD;>|)61OlIP~s#cgFhm zJx9A2KbnzK`_O0vW4NR=uaaG-zN%i4pRtN^p3Zjo+PZXZ<;2}qnTZk}wNIbTv`4@b zK0f@g_j8g}0$g_^g0YhaJkml*tR=S->HgbSJ4mSEp`wBpv@o{4#`t#nx$yDPZSLNe z_;utXiEa;5h*^zHL9Vfnkeu{AtJJF;XZR!4j$RFUBT)f)9j$i9PS;65{&E96ZU3<- z?=SZLt8r;DQHZpJNC4?bLt^7 zCk?BvpY@fr+qwmBofBsah{^3}Fz|y7TlZ;VbSU>g<965l(E-f8rl_4ACjxgObvX~z z`?TgBRY#_6-Te!p$H!juYh>vrCnPTr3u=6?dIhys$G)0|els+B0-p!0v$hW7f?rsE z-fnPZVMfsY!^)%#IVPzY-W6~|^o049qi%-}tcL+figHryxFPy9P8QUx_D_YSg?gF6$j4UK`-oHH+s4{*LO=e_BLmoIz7HiAMLttuZOYc z+syKQOX76H}Yui)(Dvid}ZJ@D{nPTn~uVEyosD$JxWTMk3|PO znT|Z>$#dgTdpF2StvBvSwT?WVop?sIKh2>B9L9-W@>^7lj#zck9`?PSfkihqqw*7| zmRSEV6}3yRKy!by{`3$-O)N|NpmyxDW82hV3~0;8(E%=V8ml zzfWHpj{VP{sr>gp;XHlmFS>W|>|x#|=wnBj&n>&RdK8VEmhHvvl#k%|dVNZ^zJyer*-$8SD@abuSGXSpL>lrL{ zg@iW%uaPAlg@Ed1X-H3X+j-7wclgMC+D%meA^|cA&)oAfP@B~kRS&6WMmq(vjuv0z zWrqm_lEP^MNZhPtkbkJ)5WvYf(&n`g9d`6j-C0vKl~P*PP@P|?&@QPEaWmHcay(%;27()D+C)xL4z;$IPRUg=5Q4Gi?vR#JjM zAc_z*MIV1RB^50#EhS~u-@$Mc3IUY=A5X@p`v}>-{p3okH3YF zkEi~hdH+vK(CRAvSJA(*{(HX5h1-EH`l`w*DhkS43aZK$%39j0oL%|We>ne7(SJGp zs*kg~Yv}*;>1WjcI{iP0{yJS(={Jb~0Ok+szw`88-v56C=IrzjFW(@4&p$4Uvy+mG zr;C@1cVGaAnaY1==Io^H>f`TqJ5b-<>$aPVlCQU$uF}76{x8$_XR0~2;CNE$A5;FF z^nWhp|CNJ(x&L1Y{?9-+BiRt#O~YeNJ!B;It_Caw(;*pPVBU7NTzL|{YWO?PeL+7N*ai8tM~iEBdy zHYDD3*CwtF5!jG;(_NdmHbh`U;!SsL;@S{_4T(41wTWv(1U4l8U%G48zr#FSyg6e# zAe=!QQ?u9s&N!gp%NNdCXvW06LKttkEgB7{K0T&<(#P*vV!l=8hbKqQ?TAjeTMUzo zK9c%=lrQ?0XImsczuDEO(-#hN_G9dQoi|=NLc}9PD9oVr)u^OtC<&TQU8%ovVct}; z9-}8Hxii&jmpj^_v#j?y?A}g;TbKimHKu&`kMuS~aesv-_`YXmofY6)3acCOR<+n0 zORAYbKHO${InMDgq5s0O9RfDSZX5QcOx3i27B6$E8kYo``yO=~(fO!Xubk?*X2JxPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzL`g(JR5(v#U>Fi0G&GbsGc&WABFAQBW&H;lG7V%HSq6a&=p3^@!o0LWNZTU!fu9x(;+;T6gAK| zUX3q)K?dNALXZKDj*f0X1N4B{3W%M7*b|6-p|o>kWaLs-R#pQbUlE7}(JkW!3Wxx) wG!QERu?7%p1F;U22Ju1SAbF5FkorLa0CKM2R>lkau>b%707*qoM6N<$f*t~~2mk;8 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/redoH.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/redoH.png deleted file mode 100644 index d9f33d38a3d11ce10447830ce409a0890ecad264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmV+z0_XjSP)LlRro!K@`S+vst67f)FhPH9;i)IZy=QifsP%Q^7=yx~FIm{DVqJh#8yN2on55 zK6niC-hAJD?=d5!lvD$)D)w6iOxq2aw)?eGO}w=Q({?4W2uyj7_3$nS0b08|CV^$s zcEc4Nn6?`Q=790%;vf4s`J3kd?(rXB%yX=pvVdv3pMkYfEM|mb9T>VsU5&ud zHR{zG?2nRrWd3EgfMHFMKLD%wc#k35+Fxy@XQ-Rrp?E*AqO06&F51~7BhBb9F%{CA zdmJPWQouxT{!<~+LW6%qD0@z^RN@x6tuTZA%{2bb;RZ0`Io4$$5UD%$(J!*|z&Fpa za?fuyZTGrH*P6~!{%Io9+`*3VLY0+{d|s}SVM0@>uRpF)fd0F8hF zgjKx=6b8R6tZy&P{3zz{+r)RSrIc5o-hmLJL6K@zgnPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzF-b&0R5(wyQ*Ba%Fc9qxdXyf4gZLw&GE-Zj!G1tU_|R6xf-Mzw ztkqtHqs45L76*QWA2RbM@MiON_wCZ@{O7ZK+oR9deF10dJg3G9@~FqDz{krMf6sUA zM9%t%Ge#w-z&79UR#oU%de6AjwTpqy2_YI|tk+7Q3^s=6YMHYnLz^_O1&3i+?2mwN&7$-;U#S!Q9m{<3SMoh?w@E00BVyxZ+RCwFLF4JWG!G zOmY$;RtOYQz#3aQ*W5#AiVywHJM`%L@4v^Nzsx*vCin1#lEeQmy!?Oq z<)3F?{!hO2^5n}ed515YeEH$t2cY2pvoHVmpTDyB(*MfC{~Hedzw_aD z|6#-Q0^JY(AHHp1XAM(|igs|-_4sV4KK0;p@m*h1S8U_x=m<-jvZ+JR;{IBr4+&>f zSEaF?oUyAYF85cQWPSYh#i0ycQ4jWf_nW(8?Ylo51`N|SiTvgEn+*yn22WQ%mvv4F FO#t{IsF?r& diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/size.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/size.png deleted file mode 100644 index 8366845059c94089aef92aa3aeeee79e242732eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^Iv_R&Gmw0`s%8O@k}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^@^W{ zcO82EKXB&y{MKgq%sz{fI)==3d^r;&6MFPw(_IV71M|xGvv%v3_j2X!dGPP#L^Pja~hhtj9%m4qMKL2y%^Z&`q z=WTfUnlHCkByWLuLg&Z-{~5B^aHX`VrcW0wpCeN?gQ0YF|Ek^0Wm|o-iywUa@%aCL z)%2NBbM`Q#t<@@?!;!p&H+$mBlaI^_YB&B#>#{8s<9mu2JY zGd5l4N$XHbnR5BlcfNx4cmMupDBR$-Y>#a9e1@#m@BaT>^X!XNW-&wBx||KyZ~Xty zRkTzmtwcMm#U?#ZF@LgB=2WKq4bg@9JjHY3ON;;i|F13o-WwPzN)S72Y1Qc%6 zcJYYNXcAOgEAc9NiWcu<*Ig$*&7M7NgR1o_Dx<9^s3W?&d{SwZWC%AQ=Vq^CQZBv#02ZVBfRNMNWq`8qHxO6)(-0}P(7 KelF{r5}E+VpO-NJ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/undo.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/images/undo.png deleted file mode 100644 index 084c7cc73f4058c8084e5ea3ab4e51fd105b7991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0YmPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzI!Q!9R5(v#U>KAjGc&U&EiH|oEXQSKWlhM*$@yPcSjb6|0imIx zY(ULRYin!&1L^-HX$ETG0XlnEb#?Xs>C>nGudAyA8-k93YSsZ=r-))WP>}=>pQ);< z`afyXB(MQ<=FIuOaN)xL%ayrnkSp|9?S2!GDaj0*gvQ(FlretOfvW z6$E0%n3$MFK-vn3oq^aBh<%|nh;Lrlg%pxVI0RlGdnYDm%@o%7K^0FfxN6OiJOCi zi#RxuqoSN#Tot)WQew-+VO#$I2f6IQORU!0vXfFu4udr_4m%hxc|CaQ+tc&%`}Y0* zp6?@=rpaH1_@`<>2#kh5+8+kyfa~8Vm_`&Qf&1?$uoEc2lIZmeVHg0~PYAMri0Se6 zisfa<1zrI21FQgkJAn`w4d(-ql&7Fh^q1h21YD9xhMb<=^2_=%c1k>YpaK0r=t;rC zt=CtVDk}a`Zc&w=rjAAzFb_055%guKXWR05;yaef&C8{>rA7h90VLo8XqA)a5z{mR zl$UZFi*u7y-#5(Rpt#aUb$tcVwXHUL6R&`FK~-0c!y{7ZV&N?eU3VYvo=oj*?jtLb z0%Y5tQ3JY+q#F9ffd-5m?iOx)5tafl#kIoD<11{3}kbno$;nIA;p5?+| zPj_N{G3Qm3Edm$dw4eYE%Yq5$7Rj9jP5AfU_y|@8ao4ld0UH1S002ovPDHLkV1l6! B+-3j( diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.css deleted file mode 100644 index f5d35d8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.css +++ /dev/null @@ -1,372 +0,0 @@ -/*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; -} - -/*module -*/ -.main { - margin: 20px 20px 0; - overflow: hidden; -} - -.hot { - float: left; -} - -.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; - margin-right: 18px; -} - -.drawToolbar { - float: right; - width: 175px; - height: 372px; - overflow: hidden; -} - -.colorBar { - margin-top: 10px; - margin-left: 10px; - font-size: 12px; - text-align: center; -} - -#J_removeImg { - display: block; - margin-top: 18px; -} - -#J_addImg { - display: block; - margin-top: 16px; -} - -.colorBar #J_colorList tr { - height: 32px; -} - -.colorBar a { - display: block; - width: 16px; - height: 16px; - border: 1px solid #1006F1; - border-radius: 8px; - box-shadow: 2px 2px 5px #d3d6da; - opacity: 0.6 -} - -.sectionBar { - margin-top: 20px; - font-size: 12px; - text-align: center; - display: flex; - justify-content: center; - align-items: 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;}*/ - -.size1 { - width: 4px; - height: 4px; - border-radius: 2px; - text-indent: -999px; - opacity: 0.3; - display: block; - background-color: #3498db; - margin-right: 17px; - margin-left: 15px; -} - -.size2 { - width: 8px; - height: 8px; - border-radius: 4px; - text-indent: -999px; - opacity: 0.3; - display: block; - margin-right: 17px; - background-color: #3498db; - -} - -.size3 { - width: 12px; - height: 12px; - border-radius: 6px; - text-indent: -999px; - opacity: 0.3; - display: block; - background-color: #3498db; - margin-right: 17px; -} - -.size4 { - width: 16px; - height: 16px; - border-radius: 8px; - text-indent: -999px; - opacity: 0.3; - display: block; - background-color: #3498db; -} - -.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: 410px; - z-index: 1000; -} - -.maskLayer input { - border-radius: 2px; - border: 1px solid #ccc; - padding: 4px 12px; -} - -/*btn state -*/ -.previousStepH .icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.previousStepH .text { - color: #888; - cursor: pointer; -} - -.previousStep .icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.previousStep .text { - color: #ccc; - cursor: default; -} - -.nextStepH .icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.nextStepH .text { - color: #888; - cursor: pointer; -} - -.nextStep .icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.nextStep .text { - color: #ccc; - cursor: default; -} - -.clearBoardH .icon { - display: inline-block; - width: 16px; - height: 16px; - /*background-image: url('images/empty.png');*/ - cursor: default; -} - -.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; -} - -.scaleBoardH .text { - color: #888; - cursor: pointer; -} - -.scaleBoard .icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.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: #fff; - cursor: default; - padding: 7px 12px; - border-radius: 6px; - background-color: #f25f5f; -} - -.addImgH .icon { - vertical-align: top; - display: inline-block; - width: 16px; - height: 16px; - background-image: url('images/addimg.png') -} - -.addImgH .text { - color: #888; - cursor: pointer; - padding: 7px 12px; - border-radius: 6px; - background-color: #f3f3f3; -} - -/*icon -*/ -.brushIcon { - display: inline-block; - width: 16px; - height: 16px; - font-size: 16px; - margin-top: -5px; -} - -.eraserIcon { - display: inline-block; - width: 16px; - height: 16px; - font-size: 18px !important; - margin-top: -16px; -} - -.icon { - font-size: 18px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.html deleted file mode 100644 index 6e8db0e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - -
    -
    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    - - 1 - 3 - 5 - 7 -
    -
    - - 1 - 3 - 5 - 7 -
    -
    -
    - - -
    - -
    - -
    -
    -
    - - - - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.js deleted file mode 100644 index a8cbce1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/scrawl/scrawl.js +++ /dev/null @@ -1,683 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-5-22 - * Time: 上午11:38 - * To change this template use File | Settings | File Templates. - */ -var scrawl = function (options) { - options && this.initOptions(options); -}; -(function () { - var canvas = $G("J_brushBoard"), - context = canvas.getContext('2d'), - drawStep = [], //undo redo存储 - drawStepIndex = 0; //undo redo指针 - - scrawl.prototype = { - isScrawl:false, //是否涂鸦 - brushWidth:-1, //画笔粗细 - brushColor:"", //画笔颜色 - - initOptions:function (options) { - var me = this; - me.originalState(options);//初始页面状态 - me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 - - me._addBoardListener(options.saveNum);//添加画板处理 - me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 - me._addColorBarListener();//添加颜色选择处理 - me._addBrushBarListener();//添加画笔大小处理 - me._addEraserBarListener();//添加橡皮大小处理 - me._addAddImgListener();//添加增添背景图片处理 - me._addRemoveImgListenter();//删除背景图片处理 - me._addScalePicListenter();//添加缩放处理 - me._addClearSelectionListenter();//添加清楚选中状态处理 - - me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 - me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 - me._clearSelection();//清楚选中状态 - }, - - originalState:function (options) { - var me = this; - - me.brushWidth = options.drawBrushSize;//同步画笔粗细 - me.brushColor = options.drawBrushColor;//同步画笔颜色 - - context.lineWidth = me.brushWidth;//初始画笔大小 - context.strokeStyle = me.brushColor;//初始画笔颜色 - context.fillStyle = "transparent";//初始画布背景颜色 - context.lineCap = "round";//去除锯齿 - context.fill(); - }, - _buildToolbarColor:function (colorList) { - var tmp = null, arr = []; - arr.push(""); - for (var i = 0, color; color = colorList[i++];) { - if ((i - 1) % 5 == 0) { - if (i != 1) { - arr.push(""); - } - arr.push(""); - } - tmp = '#' + color; - arr.push(""); - } - arr.push("
    "); - $G("J_colorBar").innerHTML = arr.join(""); - }, - - _addBoardListener:function (saveNum) { - var me = this, - margin = 0, - startX = -1, - startY = -1, - isMouseDown = false, - isMouseMove = false, - isMouseUp = false, - buttonPress = 0, button, flag = ''; - - margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); - drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); - drawStepIndex += 1; - - domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { - button = browser.webkit ? e.which : buttonPress; - switch (e.type) { - case 'mousedown': - buttonPress = 1; - flag = 1; - isMouseDown = true; - isMouseUp = false; - isMouseMove = false; - me.isScrawl = true; - startX = e.clientX - margin;//10为外边距总和 - startY = e.clientY - margin; - context.beginPath(); - break; - case 'mousemove' : - if (!flag && button == 0) { - return; - } - if (!flag && button) { - startX = e.clientX - margin;//10为外边距总和 - startY = e.clientY - margin; - context.beginPath(); - flag = 1; - } - if (isMouseUp || !isMouseDown) { - return; - } - var endX = e.clientX - margin, - endY = e.clientY - margin; - - context.moveTo(startX, startY); - context.lineTo(endX, endY); - context.stroke(); - startX = endX; - startY = endY; - isMouseMove = true; - break; - case 'mouseup': - buttonPress = 0; - if (!isMouseDown)return; - if (!isMouseMove) { - context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); - context.fillStyle = context.strokeStyle; - context.fill(); - } - context.closePath(); - me._saveOPerate(saveNum); - isMouseDown = false; - isMouseMove = false; - isMouseUp = true; - startX = -1; - startY = -1; - break; - case 'mouseout': - flag = ''; - buttonPress = 0; - if (button == 1) return; - context.closePath(); - break; - } - }); - }, - _addOPerateListener:function (saveNum) { - var me = this; - domUtils.on($G("J_previousStep"), "click", function () { - if (drawStepIndex > 1) { - drawStepIndex -= 1; - context.clearRect(0, 0, context.canvas.width, context.canvas.height); - context.putImageData(drawStep[drawStepIndex - 1], 0, 0); - // me.btn2Highlight("J_nextStep"); - // drawStepIndex == 1 && me.btn2disable("J_previousStep"); - } - }); - domUtils.on($G("J_nextStep"), "click", function () { - if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { - context.clearRect(0, 0, context.canvas.width, context.canvas.height); - context.putImageData(drawStep[drawStepIndex], 0, 0); - drawStepIndex += 1; - // me.btn2Highlight("J_previousStep"); - // drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); - } - }); - domUtils.on($G("J_clearBoard"), "click", function () { - context.clearRect(0, 0, context.canvas.width, context.canvas.height); - drawStep = []; - me._saveOPerate(saveNum); - drawStepIndex = 1; - me.isScrawl = false; - // me.btn2disable("J_previousStep"); - // me.btn2disable("J_nextStep"); - // me.btn2disable("J_clearBoard"); - }); - }, - _addColorBarListener:function () { - var me = this; - domUtils.on($G("J_colorBar"), "click", function (e) { - var target = me.getTarget(e), - color = target.title; - if (!!color) { - me._addColorSelect(target); - - me.brushColor = color; - context.globalCompositeOperation = "source-over"; - context.lineWidth = me.brushWidth; - context.strokeStyle = color; - } - }); - }, - _addBrushBarListener:function () { - var me = this; - domUtils.on($G("J_brushBar"), "click", function (e) { - var target = me.getTarget(e), - size = browser.ie ? target.innerText : target.text; - if (!!size) { - me._addBESelect(target); - - context.globalCompositeOperation = "source-over"; - context.lineWidth = parseInt(size); - context.strokeStyle = me.brushColor; - me.brushWidth = context.lineWidth; - } - }); - }, - _addEraserBarListener:function () { - var me = this; - domUtils.on($G("J_eraserBar"), "click", function (e) { - var target = me.getTarget(e), - size = browser.ie ? target.innerText : target.text; - if (!!size) { - me._addBESelect(target); - - context.lineWidth = parseInt(size); - context.globalCompositeOperation = "destination-out"; - context.strokeStyle = "#FFF"; - } - }); - }, - _addAddImgListener:function () { - var file = $G("J_imgTxt"); - if (!window.FileReader) { - $G("J_addImg").style.display = 'none'; - $G("J_removeImg").style.display = 'none'; - $G("J_sacleBoard").style.display = 'none'; - } - domUtils.on(file, "change", function (e) { - var frm = file.parentNode; - addMaskLayer(lang.backgroundUploading); - - var target = e.target || e.srcElement, - reader = new FileReader(); - reader.onload = function(evt){ - var target = evt.target || evt.srcElement; - ue_callback(target.result, 'SUCCESS'); - }; - reader.readAsDataURL(target.files[0]); - frm.reset(); - }); - }, - _addRemoveImgListenter:function () { - var me = this; - domUtils.on($G("J_removeImg"), "click", function () { - $G("J_picBoard").innerHTML = ""; - // me.btn2disable("J_removeImg"); - // me.btn2disable("J_sacleBoard"); - }); - }, - _addScalePicListenter:function () { - domUtils.on($G("J_sacleBoard"), "click", function () { - var picBoard = $G("J_picBoard"), - scaleCon = $G("J_scaleCon"), - img = picBoard.children[0]; - - if (img) { - if (!scaleCon) { - picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; - img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; - var scale = new ScaleBoy(); - picBoard.appendChild(scale.init()); - scale.startScale(img); - } else { - if (scaleCon.style.visibility == "visible") { - scaleCon.style.visibility = "hidden"; - picBoard.style.position = ""; - picBoard.style.zIndex = ""; - } else { - scaleCon.style.visibility = "visible"; - picBoard.style.cssText += "position:relative;z-index:999"; - } - } - } - }); - }, - _addClearSelectionListenter:function () { - var doc = document; - domUtils.on(doc, 'mousemove', function (e) { - if (browser.ie && browser.version < 11) - doc.selection.clear(); - else - window.getSelection().removeAllRanges(); - }); - }, - _clearSelection:function () { - var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; - for (var i = 0, group; group = list[i++];) { - domUtils.unSelectable($G(group)); - } - }, - - _saveOPerate:function (saveNum) { - var me = this; - if (drawStep.length <= saveNum) { - if(drawStepIndex"); - } - scale.innerHTML = arr.join(""); - return scale; - } - - var rect = [ - //[left, top, width, height] - [1, 1, -1, -1], - [0, 1, 0, -1], - [0, 1, 1, -1], - [1, 0, -1, 0], - [0, 0, 1, 0], - [1, 0, -1, 1], - [0, 0, 0, 1], - [0, 0, 1, 1] - ]; - ScaleBoy.prototype = { - init:function () { - _appendStyle(); - var me = this, - scale = me.dom = _getDom(); - - me.scaleMousemove.fp = me; - domUtils.on(scale, 'mousedown', function (e) { - var target = e.target || e.srcElement; - me.start = {x:e.clientX, y:e.clientY}; - if (target.className.indexOf('hand') != -1) { - me.dir = target.className.replace('hand', ''); - } - domUtils.on(document.body, 'mousemove', me.scaleMousemove); - e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; - }); - domUtils.on(document.body, 'mouseup', function (e) { - if (me.start) { - domUtils.un(document.body, 'mousemove', me.scaleMousemove); - if (me.moved) { - me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); - } - delete me.start; - delete me.moved; - delete me.dir; - } - }); - return scale; - }, - startScale:function (objElement) { - var me = this, Idom = me.dom; - - Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; - me.scalingElement = objElement; - }, - updateScaledElement:function (objStyle) { - var cur = this.scalingElement, - pos = objStyle.position, - size = objStyle.size; - if (pos) { - typeof pos.x != 'undefined' && (cur.style.left = pos.x); - typeof pos.y != 'undefined' && (cur.style.top = pos.y); - } - if (size) { - size.w && (cur.style.width = size.w); - size.h && (cur.style.height = size.h); - } - }, - updateStyleByDir:function (dir, offset) { - var me = this, - dom = me.dom, tmp; - - rect['def'] = [1, 1, 0, 0]; - 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'; - } - if (dir === 'def') { - me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); - } - }, - scaleMousemove:function (e) { - var me = arguments.callee.fp, - start = me.start, - dir = me.dir || 'def', - offset = {x:e.clientX - start.x, y:e.clientY - start.y}; - - me.updateStyleByDir(dir, offset); - arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; - arguments.callee.fp.moved = 1; - }, - _validScaledProp:function (prop, value) { - var ele = this.dom, - wrap = $G("J_picBoard"); - - 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; - } - } - }; -})(); - -//后台回调 -function ue_callback(url, state) { - var doc = document, - picBorard = $G("J_picBoard"), - img = doc.createElement("img"); - - //图片缩放 - function scale(img, max, oWidth, oHeight) { - var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; - if (ow > max || oh > max) { - if (ow >= oh) { - if (width = ow - max) { - percent = (width / ow).toFixed(2); - img.height = oh - oh * percent; - img.width = max; - } - } else { - if (height = oh - max) { - percent = (height / oh).toFixed(2); - img.width = ow - ow * percent; - img.height = max; - } - } - } - } - - //移除遮罩层 - removeMaskLayer(); - //状态响应 - if (state == "SUCCESS") { - picBorard.innerHTML = ""; - img.onload = function () { - scale(this, 300); - picBorard.appendChild(img); - - var obj = new scrawl(); - // obj.btn2Highlight("J_removeImg"); - //trace 2457 - // obj.btn2Highlight("J_sacleBoard"); - }; - img.src = url; - } else { - alert(state); - } -} -//去掉遮罩层 -function removeMaskLayer() { - var maskLayer = $G("J_maskLayer"); - maskLayer.className = "maskLayerNull"; - maskLayer.innerHTML = ""; - dialog.buttons[0].setDisabled(false); -} -//添加遮罩层 -function addMaskLayer(html) { - var maskLayer = $G("J_maskLayer"); - dialog.buttons[0].setDisabled(true); - maskLayer.className = "maskLayer"; - maskLayer.innerHTML = html; -} -//执行确认按钮方法 -function exec(scrawlObj) { - if (scrawlObj.isScrawl) { - addMaskLayer(lang.scrawlUpLoading); - var base64 = scrawlObj.getCanvasData(); - var file = scrawlObj.dataURLtoFile(base64, 'scrawl-image.png'); - /* 上传涂鸦图片 */ - editor.getOpt("scrawlUploadService")(scrawlObj, editor).uploadScraw(file, base64, function(data) { - if (!scrawlObj.isCancelScrawl) { - if (data.responseSuccess) { - var imgObj = {}, - srcField = data.scrawlSrcField || 'url', - src = '', - srcFieldKeys = srcField.split('.'), - prefix = editor.options.scrawlUrlPrefix; - - if(srcFieldKeys.length > 1) { - function setSrc(obj, keys, index) { - obj = obj[keys[index]]; - if (index < keys.length - 1) { - setSrc(obj, keys, index += 1) - } else { - src = obj; - } - } - setSrc(data, srcFieldKeys, 0); - } else { - src = data[srcField]; - } - - imgObj.src = prefix + src; - imgObj._src = prefix + src; - imgObj.alt = data.original || ''; - editor.execCommand("insertImage", imgObj); - dialog.close(); - } else { - addMaskLayer(data.message + "   "); - } - } - }, function(err) { - addMaskLayer(lang.imageError + "   "); - }); - } else { - addMaskLayer(lang.noScarwl + "   "); - } -} - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.html deleted file mode 100644 index 8234fe2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    :
    - -
    - - -
    -   -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    - -
    - - - - -
    -   -
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.js deleted file mode 100644 index 02fa46c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/searchreplace/searchreplace.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-9-26 - * Time: 下午12:29 - * To change this template use File | Settings | File Templates. - */ - -//清空上次查选的痕迹 -editor.firstForSR = 0; -editor.currentRangeForSR = null; -//给tab注册切换事件 -/** - * tab点击处理事件 - * @param tabHeads - * @param tabBodys - * @param obj - */ -function clickHandler( tabHeads,tabBodys,obj ) { - //head样式更改 - 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 body = tabBodys[j], - id = body.getAttribute( "id" ); - if ( id != tabSrc ) { - body.style.zIndex = 1; - } else { - body.style.zIndex = 200; - } - } - -} - -/** - * TAB切换 - * @param tabParentId tab的父节点ID或者对象本身 - */ -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++ ) { - var head = tabHeads[i]; - if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); - head.onclick = function () { - clickHandler(tabHeads,tabBodys,this); - } - } -} -$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; - if (!findtxt) { - return false; - } - obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase") - }; - if (!frCommond(obj)) { - var bk = editor.selection.getRange().createBookmark(); - $G('search-msg').innerHTML = lang.getEnd; - editor.selection.getRange().moveToBookmark(bk).select(); - - - } -}; -$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { - var findtxt = $G("findtxt1").value, obj; - if (!findtxt) { - return false; - } - obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase1") - }; - frCommond(obj); -}; -$G("preFindBtn").onclick = function (txt, dir, mcase) { - var findtxt = $G("findtxt").value, obj; - if (!findtxt) { - return false; - } - obj = { - searchStr:findtxt, - dir:-1, - casesensitive:getMatchCase("matchCase") - }; - if (!frCommond(obj)) { - $G('search-msg').innerHTML = lang.getStart; - } -}; -$G("preReplaceBtn").onclick = function (txt, dir, mcase) { - var findtxt = $G("findtxt1").value, obj; - if (!findtxt) { - return false; - } - obj = { - searchStr:findtxt, - dir:-1, - casesensitive:getMatchCase("matchCase1") - }; - frCommond(obj); -}; -//替换 -$G("repalceBtn").onclick = function () { - editor.trigger('clearLastSearchResult'); - var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, - replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); - if (!findtxt) { - return false; - } - if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { - return false; - } - obj = { - searchStr:findtxt, - dir:1, - casesensitive:getMatchCase("matchCase1"), - replaceStr:replacetxt - }; - frCommond(obj); -}; -//全部替换 -$G("repalceAllBtn").onclick = function () { - var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, - replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); - if (!findtxt) { - return false; - } - if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { - return false; - } - obj = { - searchStr:findtxt, - casesensitive:getMatchCase("matchCase1"), - replaceStr:replacetxt, - all:true - }; - var num = frCommond(obj); - if (num) { - $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); - } -}; -//执行 -var frCommond = function (obj) { - return editor.execCommand("searchreplace", obj); -}; -switchTab("searchtab"); - - -dialog.onclose = function(){ - editor.trigger('clearLastSearchResult') -}; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/snapscreen/snapscreen.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/snapscreen/snapscreen.html deleted file mode 100644 index a05d101..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/snapscreen/snapscreen.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - -
    -

    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.html deleted file mode 100644 index 0b5c416..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.js deleted file mode 100644 index f4c155e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/spechars/spechars.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-9-26 - * Time: 下午1:09 - * 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("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} -]; -(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"; - domUtils.on(span, "click", function () { - var tmps = $G("tabHeads").children; - for (var k = 0, sk; sk = tmps[k++];) { - sk.className = ""; - } - tmps = $G("tabBodys").children; - for (var k = 0, sk; sk = tmps[k++];) { - sk.style.display = "none"; - } - this.className = "focus"; - $G(this.getAttribute("tabSrc")).style.display = ""; - }); - $G("tabHeads").appendChild(span); - domUtils.insertAfter(span, document.createTextNode("\n")); - var div = document.createElement("div"); - div.id = ci.name; - div.style.display = (i == 1) ? "" : "none"; - var cons = ci.content; - for (var j = 0, con; con = cons[j++];) { - var charSpan = document.createElement("span"); - charSpan.innerHTML = con; - domUtils.on(charSpan, "click", function () { - editor.execCommand("insertHTML", this.innerHTML); - dialog.close(); - }); - div.appendChild(charSpan); - } - $G("tabBodys").appendChild(div); - } -})(charsContent); -function toArray(str) { - return str.split(","); -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/dragicon.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/dragicon.png deleted file mode 100644 index f26203bf3f0026891fc8374f109724a69eb38b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)p00001b5ch_0Itp) z=>Px#=t)FDR47x8lCciKP#A@KY2U+Oz-BN?3|$yZoaJ-YrY6>w+wB>;0|AN6r2r z_B6y2bQp%1X$_7DP`QFiq0z;_c3wk<3Lh&$^V;p?#e$PywxH71VT^XlHZ=jml#@|NVkRMLVaC0F_%) zcB=vWe$h}nSjAV$|0D - - - - - - - -
    -
    -
    -

    -
      -
    • - -
    • -
    • - -
    • -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -

    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -

    -
      -
    • - - -
    • -
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.js deleted file mode 100644 index 11dbee7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittable.js +++ /dev/null @@ -1,237 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-12-19 - * Time: 下午4:55 - * To change this template use File | Settings | File Templates. - */ -(function () { - var title = $G("J_title"), - titleCol = $G("J_titleCol"), - caption = $G("J_caption"), - sorttable = $G("J_sorttable"), - autoSizeContent = $G("J_autoSizeContent"), - autoSizePage = $G("J_autoSizePage"), - tone = $G("J_tone"), - me, - preview = $G("J_preview"); - - var editTable = function () { - me = this; - me.init(); - }; - editTable.prototype = { - init:function () { - var colorPiker = new UE.ui.ColorPicker({ - editor:editor - }), - colorPop = new UE.ui.Popup({ - editor:editor, - content:colorPiker - }); - - title.checked = editor.queryCommandState("inserttitle") == -1; - titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; - caption.checked = editor.queryCommandState("insertcaption") == -1; - sorttable.checked = editor.queryCommandState("enablesort") == 1; - - var enablesortState = editor.queryCommandState("enablesort"), - disablesortState = editor.queryCommandState("disablesort"); - - sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); - sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); - sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; - - me.createTable(title.checked, titleCol.checked, caption.checked); - me.setAutoSize(); - me.setColor(me.getColor()); - - domUtils.on(title, "click", me.titleHanler); - domUtils.on(titleCol, "click", me.titleColHanler); - domUtils.on(caption, "click", me.captionHanler); - domUtils.on(sorttable, "click", me.sorttableHanler); - domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); - domUtils.on(autoSizePage, "click", me.autoSizePageHanler); - - domUtils.on(tone, "click", function () { - colorPop.showAnchor(tone); - }); - domUtils.on(document, 'mousedown', function () { - colorPop.hide(); - }); - colorPiker.addListener("pickcolor", function () { - me.setColor(arguments[1]); - colorPop.hide(); - }); - colorPiker.addListener("picknocolor", function () { - me.setColor(""); - colorPop.hide(); - }); - }, - - createTable:function (hasTitle, hasTitleCol, hasCaption) { - var arr = [], - sortSpan = '^'; - arr.push(""); - if (hasCaption) { - arr.push("") - } - if (hasTitle) { - arr.push(""); - if(hasTitleCol) { arr.push(""); } - for (var j = 0; j < 5; j++) { - arr.push(""); - } - arr.push(""); - } - for (var i = 0; i < 6; i++) { - arr.push(""); - if(hasTitleCol) { arr.push("") } - for (var k = 0; k < 5; k++) { - arr.push("") - } - arr.push(""); - } - arr.push("
    " + lang.captionName + "
    " + lang.titleName + "" + lang.titleName + "
    " + lang.titleName + "" + lang.cellsName + "
    "); - preview.innerHTML = arr.join(""); - this.updateSortSpan(); - }, - titleHanler:function () { - var example = $G("J_example"), - frg=document.createDocumentFragment(), - color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), - colCount = example.rows[0].children.length; - - if (title.checked) { - example.insertRow(0); - for (var i = 0, node; i < colCount; i++) { - node = document.createElement("th"); - node.innerHTML = lang.titleName; - frg.appendChild(node); - } - example.rows[0].appendChild(frg); - - } else { - domUtils.remove(example.rows[0]); - } - me.setColor(color); - me.updateSortSpan(); - }, - titleColHanler:function () { - var example = $G("J_example"), - color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), - colArr = example.rows, - colCount = colArr.length; - - if (titleCol.checked) { - for (var i = 0, node; i < colCount; i++) { - node = document.createElement("th"); - node.innerHTML = lang.titleName; - colArr[i].insertBefore(node, colArr[i].children[0]); - } - } else { - for (var i = 0; i < colCount; i++) { - domUtils.remove(colArr[i].children[0]); - } - } - me.setColor(color); - me.updateSortSpan(); - }, - captionHanler:function () { - var example = $G("J_example"); - if (caption.checked) { - var row = document.createElement('caption'); - row.innerHTML = lang.captionName; - example.insertBefore(row, example.firstChild); - } else { - domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); - } - }, - sorttableHanler:function(){ - me.updateSortSpan(); - }, - autoSizeContentHanler:function () { - var example = $G("J_example"); - example.removeAttribute("width"); - }, - autoSizePageHanler:function () { - var example = $G("J_example"); - var tds = example.getElementsByTagName(example, "td"); - utils.each(tds, function (td) { - td.removeAttribute("width"); - }); - example.setAttribute('width', '100%'); - }, - updateSortSpan: function(){ - var example = $G("J_example"), - row = example.rows[0]; - - 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){ - var span = document.createElement("span"); - span.innerHTML = "^"; - cell.appendChild(span); - }); - } - }, - 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"; - return color; - }, - setColor:function (color) { - var example = $G("J_example"), - arr = domUtils.getElementsByTagName(example, "td").concat( - domUtils.getElementsByTagName(example, "th"), - domUtils.getElementsByTagName(example, "caption") - ); - - tone.value = color; - utils.each(arr, function (node) { - node.style.borderColor = color; - }); - - }, - setAutoSize:function () { - var me = this; - autoSizePage.checked = true; - me.autoSizePageHanler(); - } - }; - - new editTable; - - dialog.onok = function () { - editor.__hasEnterExecCommand = true; - - var checks = { - title:"inserttitle deletetitle", - titleCol:"inserttitlecol deletetitlecol", - caption:"insertcaption deletecaption", - sorttable:"enablesort disablesort" - }; - editor.fireEvent('saveScene'); - 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]); - } - } - - editor.execCommand("edittable", tone.value); - 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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittd.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittd.html deleted file mode 100644 index 49a52f7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittd.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - -
    - - -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittip.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittip.html deleted file mode 100644 index 954f7bb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/table/edittip.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - 表格删除提示 - - - - -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/config.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/config.js deleted file mode 100644 index 20d0d4c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/config.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-8-8 - * Time: 下午2:00 - * To change this template use File | Settings | File Templates. - */ -var templates = [ - { - "pre":"pre0.png", - 'title':lang.blank, - 'preHtml':'

     欢迎使用UEditor!

    ', - "html":'

    欢迎使用UEditor!

    ' - - }, - { - "pre":"pre1.png", - 'title':lang.blog, - 'preHtml':'

    深入理解Range

    UEditor二次开发

    什么是Range

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


    Range能干什么

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

    ', - "html":'

    [键入文档标题]

    [键入文档副标题]

    [标题 1]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

    [标题 2]

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

    [标题 3]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


    ' - - }, - { - "pre":"pre2.png", - 'title':lang.resume, - 'preHtml':'

    WEB前端开发简历


    联系电话:[键入您的电话]

    电子邮件:[键入您的电子邮件地址]

    家庭住址:[键入您的地址]

    目标职位

    WEB前端研发工程师

    学历

    1. [起止时间] [学校名称] [所学专业] [所获学位]

    工作经验


    ', - "html":'

    [此处键入简历标题]


    【此处插入照片】


    联系电话:[键入您的电话]


    电子邮件:[键入您的电子邮件地址]


    家庭住址:[键入您的地址]


    目标职位

    [此处键入您的期望职位]

    学历

    1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    工作经验

    1. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

      2. [键入负责项目] [键入项目简介]

    2. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

    掌握技能

     [这里可以键入您所掌握的技能]

    ' - - }, - { - "pre":"pre3.png", - 'title':lang.richText, - 'preHtml':'

    [此处键入文章标题]

    图文混排方法

    图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!

    ', - "html":'


    [此处键入文章标题]

    图文混排方法

    1. 图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


    2. 图片居右,文字围绕图片排版

    方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


    3. 图片居中环绕排版

    方法:亲,这个真心没有办法。。。



    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!


    占位


    占位


    占位


    占位


    占位



    ' - }, - { - "pre":"pre4.png", - 'title':lang.sciPapers, - 'preHtml':'

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的


    ', - 'html':'

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    来个列表瞅瞅:

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的

    这里可以多行

    右边是图片

    绝对没有问题的,不信你也可以试试看


    ' - } -]; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/bg.gif deleted file mode 100644 index 8c1d10ad1933e02086e8a1b3c807c7d1e57d51db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmZ?wbhEHb6kw2GXkcLY|NsA)GiMZkvM_*v4u}BBFfeKN|6H_V+Po~-c70vN1t=1+A%PQ29uxwx4>qZSNmg$Vo0WSSm;`Hl{Ww|6H_V+Po~-c6&>|-aSW-r_2!NtU#o%$i-Y0&su(f8j@G?~f`NtGer^@M zrYdIdrP)2_bk~ELr2i)^H(PkDy?QdpIbuVC@BX&$s!L5iRYqm|O_N&n@I;(N<+i7f+;9Z? Phk?P<)z4*}Q$iB}^elK+ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre2.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre2.png deleted file mode 100644 index 5a55672c1f9c4d41d5b5cf52d76bb2b7e7c6b186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffi(Px;TbZ+h>KHoj_IVWAxIr&Fiabo)3x94Up%M35SEe^0#X9dS;F-9{&3Ljos=IM}2LB&w>e?K^KZ|9tHA z)W~h}eTfo>R&7s^?LYqdE7+t-Dv4L4H{``lKYf(JYIB0^>jrz9Khf>{)o!mlw-~mt za!)h6<9vO9zW09 gTfg@IqFVdQ&MBb@0QJAA?EnA( diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre3.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre3.png deleted file mode 100644 index d852d29f13bcf743e15df824901ab568123a5aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmVTEH>0M4JV5-1QxJ>b$K`ZPMW6ena#ScoGi+aGE}QBI9b2~7O)VofCVgI z0Sj2@r|V8tRYg%8l35(bVHm0eOOPtd@{r7;D7wSi^O|UT7k&b(?|avE4}m2@pKY0^ zX8{XXz`D@ra0V&khG!6NNY4Tm0v50s9T*)L9q3sISir&!aYH5D@CmFqjy=yiBr_3O zu`P1E)qr;HnlAuCCeD2n8T2!dey#!;npC;SpUiv|xYU?E`rwKTr@$H|hS bPXPu1`Qm#ITgjGb00000NkvXXu0mjf8+_C8 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre4.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/images/pre4.png deleted file mode 100644 index 0d7bc72ab99fe2c0ed9de1d89fd1c3e82ac3fd43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfeL+x;TbZ+5xOQzYV@t-I~V=Oc$U@%9?>h?uf)>*!tD zz9*sh?!vZ&M%HQV5wX`#zTA@g`shVPPoZs!AO#y_jv5_v2~@eKa{lwdV71lh?Z-1u+JRxq;OXk;vd$@?2>^GKp!om* diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.css b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.css deleted file mode 100644 index f2bae3c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.css +++ /dev/null @@ -1,18 +0,0 @@ -.wrap{ padding: 20px;font-size: 14px;} -.left{width:425px;float: left;} -.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} -.right .pre{height: 332px;overflow-y: auto;} -.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} -.right .preitem:hover{background-color: #f3f3f3;cursor: pointer;border: #ccc 1px solid;} -.right .preitem img{display: block;margin: 0 auto;width:100px;} -.clear{clear: both;} -.top{height:26px;line-height: 26px;padding: 5px;} -.bottom{height:320px;width:100%;margin: 0 auto;} -.transparent{ background: url("images/bg.gif") repeat;} -.bottom table tr td{border:1px dashed #ccc;} -#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} -.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} -p{margin: 5px 0} -table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} -li{clear:both} -ol{padding-left:40px; } \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.html deleted file mode 100644 index d9903a4..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.js deleted file mode 100644 index d40e4dd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/template/template.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: xuheng - * Date: 12-8-8 - * Time: 下午2:09 - * To change this template use File | Settings | File Templates. - */ -(function () { - var me = editor, - preview = $G( "preview" ), - preitem = $G( "preitem" ), - tmps = templates, - currentTmp; - var initPre = function () { - var str = ""; - for ( var i = 0, tmp; tmp = tmps[i++]; ) { - str += '
    '; - } - preitem.innerHTML = str; - }; - var pre = function ( n ) { - var tmp = tmps[n - 1]; - currentTmp = tmp; - clearItem(); - domUtils.setStyles( preitem.childNodes[n - 1], { - "background-color":"#f3f3f3", - "border":"#ccc 1px solid" - } ); - preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; - }; - var clearItem = function () { - var items = preitem.children; - for ( var i = 0, item; item = items[i++]; ) { - domUtils.setStyles( item, { - "background-color":"", - "border":"white 1px solid" - } ); - } - }; - dialog.onok = function () { - if ( !$G( "issave" ).checked ){ - me.execCommand( "cleardoc" ); - } - var obj = { - html:currentTmp && currentTmp.html - }; - me.execCommand( "template", obj ); - }; - initPre(); - window.pre = pre; - pre(2) - -})(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/bg.png deleted file mode 100644 index 580be0a01dff4c70c72f78a3f40186660ee8eee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2810 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.gif deleted file mode 100644 index d8c02c27e242f0584fc6b214f35b4f6d8caec332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20097 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/file-icons.png deleted file mode 100644 index 3ff82c8c488f53a7aff67fbe39742e3321183eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44070 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

    *vGSxI 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.gif deleted file mode 100644 index 78459dea7b12ccbeec81d19ecdab22b1658e93b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/icons.png deleted file mode 100644 index 12e4700163ac87fa38ae3d92a2c39d0fb4690fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/left_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/left_focus.jpg deleted file mode 100644 index e0b2834cc82184835d01a68de6caf30408b8b5fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3970 zcmeHJYd92W8-C|t7;+f0PRW=VwN7)wm>I@6Ry!9tCx@@a7{}&-$xOp4t5uPZV-}UZ zuB>5{qP0`9`q-7Eh7R(j*lm}D4cXdgzR{}PpZouFU)OuR&-*@y`+4qPkMf~%92t-( z6bk4B0xumO6UUF`;MsgGK^!9>knltTaAk@GG3*qM5FN`&Na8UtbMosLbW$7x6XxVc z^b>e-5|egF(m27Aogr*V3Y!*(VY;DR#dI-Oz~u;I&|>ahUOHXOz`QR`SJ|uI1PuCp zh%kkL@mOU=@AeBod-2maXeT_yo=tKjqn&AZ5`{=3JKCYiM3OUs=u99v*b_-~B8Bci zL$3j&VoQsQrw4g&TjNr_7?`!8L?RJh}9(uK6Oe}w&kb%JvR1AbQidFODY;GTVSijd5SXW?OfprDe6UVFlwAO&0dQao z44?o61%aX<%Kw0R0AK(HS)FDL>KaIZ&{Tr}h#KVY{{XIrP}hJV^#DLX0St~%)BZC9 z0)@SI0i-_4z~uf$W76*OdxnPm~%Meqv;d4GIa(IdfN`d;~VYRPCdnD8K|$b54^_>}>PGIwM<~ zNkren<(ooFYG}txw7qe=@dHOV2?;{OGenVVoq3zJE9EAHX z=p~Fr?G$8lUDwR`hQ$R%-@Ma?bSras^fyke)7+~H&1v74A%Wi(TbSj3UD8XY9+^^? zXiF}n*}SvAs{|HJ7Sx~e1v{4tCh-3cwOi*CMW@HoN_Kx#OY{ME9fB6G(TZiCY2Tzln1$Xzq6P2; z1BxRA`#RPuT;lBZ|0#xfPsL5a?96ZNdt zmy3KZJFu2}(bd!!1sT8L1xl%Ee zK$?FyKv|X+&%7G3iEK#WcHc;hPB_tGEcZaZ2@5(s&>vH{TT{+t&EATw>0$Z@WM)G9 zt|X6g8F0r1N+2$^?L0s|KS*|79FNnE?Amrgo-BFW1~22CZIo8T&oBlA`qu_Wu+ek8 z`#MNd^ zq>r=*qYI0h(rl$RW$|}(MtXd%@5M)l9w|vDYfos@dyV08GQWoyAl4Ma$hqX`lB?$Cn~RJ&r_b{4!O2< zeO32&*DkZtoljrLeu%%?95JvzmbU_f6$IDh7nB~CwfX$Jqq*1@@<)n~7g01;UV1Kg T%FyMa8r(OKsK>HApd9%h!OrDj diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/none_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/none_focus.jpg deleted file mode 100644 index 0e729fc59272fc2a5a5fcc8d3f09516e1bf8c14b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3862 zcmex=fQ*uo0xNy}ykfn?l>DSrz2y8{{ffi_eM3D1eFhu*ih{)C?9>v4q}24x zJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i=|mer{ z{GxPyLrY6beFGzXBO_g)3ft z^no_$L#+TY;eNA&xnYzZ4S~@R7!85Z5Eu=C(GVCxA%JKdrRD*fMCHJ?&;Pd!IsqB^ zCHch}`2`BbdIk&@PM*Fjsth0?a7DJ~WqaBLhgIAe)dPyP>I> zV_-??rp+9pN`;dqi-}7p2Ze+-F1&c@|1Aa{W}xE*nFJZ^8NPg<^(Fr>*Tbprr@dLN za&(>BmK#fS#8r5wuj%3O{ORg?rLkYG=isGYt3JMD?xHV(a_gEVv@lJOQQUH8d5<@b z&@SU6&VKwmU9-2I>)#f-uWjE`chQt|zT_o&m;D1J?^GSUC$RhU<3sGO8#n%OFGH5t83AeDR$x8>@rd(m^+>5 zT5(!}W0TuoCFzOHGx+tKWGt^Y;dzq}It14D$-0|S=J$UxS zV@X-%C9)+gU7UIi4NYk{!16mijx3pw;Hgwy6zVXI9U&uI;L2 zO=5CgvS7h%P4{zBYAg08P29a#_E4kCQUj6W%pCFmFRY8^|MqjX-M;#{HO()7{T168 z=lHk5V$YgClf7>~{=oWd-M;5%pYPS$^L@d4J}s4X)7v6C9?bUO=x9jQT<4(t;?MNu z{R)2_&v$K)E?QGNcc1#&^)DWu>00-B^2y~P(H%t>xC<2P|6hdIVt-na``^0g?o;Pa zn(Uot&k&dO`d!Vv>PxH7SMhy#w8(37R+{&|q*%A@(HoCRZb`4!EViEU>7tfV;l!Z( zDwUC|rXD#s=j2zlv>arEM|92%0v)?WLwT0T9$_jT4Ui(<9)dsRMZUJw29 z?)Lka6X)9fyjFYnh-HS#(bs9m({)Z~&uu(q)jG-ala$_`%rddlyAb^)_5JfUCr7c5>s9Wkv~!-2X3q**xQq{bt|&T2HKN%eDrajAo)C`ZI@wXMC?U2$+wO>$<+LP?EXh|;rutL z^Ls23!o%F)Prhs?^}y*K zvXnOOgUdUtwKv{euN}5IE@Jk6hXaqUJXc!uP-M~M!xX? diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/progress.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/progress.png deleted file mode 100644 index 717c4865c90a959c6a0e9ad1af9c777d900a2e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/right_focus.jpg b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/right_focus.jpg deleted file mode 100644 index 0ce626c4babe9288c8ab5c84e4bf66fad7ee8ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3971 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/success.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/images/success.png deleted file mode 100644 index 94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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# - - - - - - - - -

    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    -
    -
    - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.js deleted file mode 100644 index 7772e43..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/video/video.js +++ /dev/null @@ -1,812 +0,0 @@ -/** - * Created by JetBrains PhpStorm. - * User: taoqili - * Date: 12-2-20 - * Time: 上午11:19 - * To change this template use File | Settings | File Templates. - */ - -(function(){ - - var video = {}, - uploadVideoList = [], - isModifyUploadVideo = false, - uploadFile; - - window.onload = function(){ - $focus($G("videoUrl")); - initTabs(); - initVideo(); - 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'); - } - } - }); - } - } - - function initVideo(){ - createAlignButton( ["videoFloat", "upload_alignment"] ); - addUrlChangeListener($G("videoUrl")); - addOkListener(); - - //编辑视频时初始化相关信息 - (function(){ - var img = editor.selection.getRange().getClosedNode(),url; - if(img && img.className){ - var hasFakedClass = (img.className == "edui-faked-video"), - hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; - if(hasFakedClass || hasUploadClass) { - $G("videoUrl").value = url = img.getAttribute("_url"); - $G("videoWidth").value = img.width; - $G("videoHeight").value = img.height; - var align = domUtils.getComputedStyle(img,"float"), - parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); - updateAlignButton(parentAlign==="center"?"center":align); - } - if(hasUploadClass) { - isModifyUploadVideo = true; - } - } - createPreviewVideo(url); - })(); - } - - /** - * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 - */ - function addOkListener(){ - dialog.onok = function(){ - $G("preview").innerHTML = ""; - var currentTab = findFocus("tabHeads","tabSrc"); - switch(currentTab){ - case "video": - return insertSingle(); - break; - case "videoSearch": - return insertSearch("searchList"); - break; - case "upload": - return insertUpload(); - break; - } - }; - dialog.oncancel = function(){ - $G("preview").innerHTML = ""; - }; - } - - /** - * 依据传入的align值更新按钮信息 - * @param align - */ - function updateAlignButton( align ) { - var aligns = $G( "videoFloat" ).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 width = $G("videoWidth"), - height = $G("videoHeight"), - url=$G('videoUrl').value, - align = findFocus("videoFloat","name"); - - var newurl = convert_url(url); - if (newurl.startsWith("")) { - var arr = newurl.split(" "); - for (var i=0; i>arr.length; i++) { - if (arr[i].startsWith("src")) { - newurl = arr[i].replace("src=", ""); - } - if (arr[i].startsWith("width")) { - if (!width) { - width = arr[i].replace("width=", ""); - } - } - if (arr[i].startsWith("height")) { - if (!height) { - height = arr[i].replace("height=", ""); - } - } - } - } - - if(!newurl) return false; - if ( !checkNum( [width, height] ) ) return false; - editor.execCommand('insertvideo', { - url: newurl, - width: width.value, - height: height.value, - align: align - }, isModifyUploadVideo ? 'upload':null); - } - - /** - * 将元素id下的所有代表视频的图片插入编辑器中 - * @param id - */ - function insertSearch(id){ - var imgs = domUtils.getElementsByTagName($G(id),"img"), - videoObjs=[]; - for(var i=0,img; img=imgs[i++];){ - if(img.getAttribute("selected")){ - videoObjs.push({ - url:img.getAttribute("ue_video_url"), - width:420, - height:280, - align:"none" - }); - } - } - editor.execCommand('insertvideo',videoObjs); - } - - /** - * 找到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; - } - function convert_url(url){ - if ( !url ) return ''; - url = utils.trim(url) - .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') - .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") - .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") - .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") - .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") - .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") - .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") - .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") - .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") - .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") - .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") - .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); - return url; - } - - /** - * 检测传入的所有input框中输入的长宽是否是正数 - * @param nodes input框集合, - */ - function checkNum( nodes ) { - for ( var i = 0, ci; ci = nodes[i++]; ) { - var value = ci.value; - if ( !isNumber( value ) && value) { - alert( lang.numError ); - ci.value = ""; - ci.focus(); - return false; - } - } - return true; - } - - /** - * 数字判断 - * @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 () { - createPreviewVideo( this.value ); - } - } else { - url.addEventListener( "input", function () { - createPreviewVideo( this.value ); - }, false ); - } - } - - /** - * 根据url生成视频预览 - * @param url - */ - function createPreviewVideo(url){ - if ( !url ) return; - - if (url.startsWith("http") && url.indexOf(".mp4") > 0) { - $G("preview").innerHTML = '
    '+lang.urlError+'
    '+ - ''; - } - if (url.startsWith("")) { - $G("preview").innerHTML = '
    '+lang.urlError+'
    '+url; - } - } - - - /* 插入上传视频 */ - function insertUpload(){ - var videoObjs=[], - uploadDir = editor.getOpt('videoUrlPrefix'), - width = parseInt($G('upload_width').value, 10) || 420, - height = parseInt($G('upload_height').value, 10) || 280, - align = findFocus("upload_alignment","name") || 'none'; - for(var key in uploadVideoList) { - var file = uploadVideoList[key]; - videoObjs.push({ - url: uploadDir + file.url, - width:width, - height:height, - align:align - }); - } - - var count = uploadFile.getQueueCount(); - if (count) { - $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); - return false; - } else { - editor.execCommand('insertvideo', videoObjs, '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('videoActionName')), - fileMaxSize = editor.getOpt('videoMaxSize'), - acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; - - if (!WebUploader.Uploader.support()) { - $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); - return; - } else if (!editor.getOpt('videoActionName')) { - $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); - return; - } - - uploader = _this.uploader = WebUploader.create({ - pick: { - id: '#filePickerReady', - label: lang.uploadSelectFile - }, - swf: '../../third-party/webuploader/Uploader.swf', - server: actionUrl, - fileVal: editor.getOpt('videoFieldName'), - duplicate: true, - fileSingleSizeLimit: fileMaxSize, - compress: false - }); - 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参数 - 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); - if (json.state == 'SUCCESS') { - uploadVideoList.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, file) { - if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { - addFile(file); - } - }); - 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/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/webapp/webapp.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/webapp/webapp.html deleted file mode 100644 index 1614377..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/webapp/webapp.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/fClipboard_ueditor.swf b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/fClipboard_ueditor.swf deleted file mode 100644 index ac5d27f81d2111c8581a042564c5275edd751e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 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 - * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
    - * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 - * - * @shortcut insertHTML - * @meta standard - * - * @returns {HTMLElement} 目标元素 - */ -baidu.dom.insertHTML = function (element, position, html) { - element = baidu.dom.g(element); - var range,begin; - if (element.insertAdjacentHTML && !baidu.browser.opera) { - element.insertAdjacentHTML(position, html); - } else { - range = element.ownerDocument.createRange(); - position = position.toUpperCase(); - if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { - range.selectNodeContents(element); - range.collapse(position == 'AFTERBEGIN'); - } else { - begin = position == 'BEFOREBEGIN'; - range[begin ? 'setStartBefore' : 'setEndAfter'](element); - range.collapse(begin); - } - range.insertNode(range.createContextualFragment(html)); - } - return element; -}; - -baidu.insertHTML = baidu.dom.insertHTML; - -/** - * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 - * @namespace baidu.swf - */ -baidu.swf = baidu.swf || {}; - - -/** - * 浏览器支持的flash插件版本 - * @property version 浏览器支持的flash插件版本 - * @grammar baidu.swf.version - * @return {String} 版本号 - * @meta standard - */ -baidu.swf.version = (function () { - var n = navigator; - if (n.plugins && n.mimeTypes.length) { - var plugin = n.plugins["Shockwave Flash"]; - if (plugin && plugin.description) { - return plugin.description - .replace(/([a-zA-Z]|\s)+/, "") - .replace(/(\s)+r/, ".") + ".0"; - } - } else if (window.ActiveXObject && !window.opera) { - for (var i = 12; i >= 2; i--) { - try { - var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); - if (c) { - var version = c.GetVariable("$version"); - return version.replace(/WIN/g,'').replace(/,/g,'.'); - } - } catch(e) {} - } - } -})(); - -/** - * 操作字符串的方法 - * @namespace baidu.string - */ -baidu.string = baidu.string || {}; - - -/** - * 对目标字符串进行html编码 - * @name baidu.string.encodeHTML - * @function - * @grammar baidu.string.encodeHTML(source) - * @param {string} source 目标字符串 - * @remark - * 编码字符有5个:&<>"' - * @shortcut encodeHTML - * @meta standard - * @see baidu.string.decodeHTML - * - * @returns {string} html编码后的字符串 - */ -baidu.string.encodeHTML = function (source) { - return String(source) - .replace(/&/g,'&') - .replace(//g,'>') - .replace(/"/g, """) - .replace(/'/g, "'"); -}; - -baidu.encodeHTML = baidu.string.encodeHTML; - -/** - * 创建flash对象的html字符串 - * @name baidu.swf.createHTML - * @function - * @grammar baidu.swf.createHTML(options) - * - * @param {Object} options 创建flash的选项参数 - * @param {string} options.id 要创建的flash的标识 - * @param {string} options.url flash文件的url - * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 - * @param {string} options.ver 最低需要的flash player版本号 - * @param {string} options.width flash的宽度 - * @param {string} options.height flash的高度 - * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom - * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL - * @param {string} options.bgcolor swf文件的背景色 - * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br - * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false - * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false - * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false - * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best - * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit - * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent - * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain - * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none - * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false - * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false - * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false - * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false - * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 - * - * @see baidu.swf.create - * @meta standard - * @returns {string} flash对象的html字符串 - */ -baidu.swf.createHTML = function (options) { - options = options || {}; - var version = baidu.swf.version, - needVersion = options['ver'] || '6.0.0', - vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, - encodeHTML = baidu.string.encodeHTML; - for (k in options) { - tmpOpt[k] = options[k]; - } - options = tmpOpt; - if (version) { - version = version.split('.'); - needVersion = needVersion.split('.'); - for (i = 0; i < 3; i++) { - vUnit1 = parseInt(version[i], 10); - vUnit2 = parseInt(needVersion[i], 10); - if (vUnit2 < vUnit1) { - break; - } else if (vUnit2 > vUnit1) { - return ''; - } - } - } else { - return ''; - } - - var vars = options['vars'], - objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; - options['align'] = options['align'] || 'middle'; - options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; - options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; - options['movie'] = options['url'] || ''; - delete options['vars']; - delete options['url']; - if ('string' == typeof vars) { - options['flashvars'] = vars; - } else { - var fvars = []; - for (k in vars) { - item = vars[k]; - fvars.push(k + "=" + encodeURIComponent(item)); - } - options['flashvars'] = fvars.join('&'); - } - var str = [''); - var params = { - 'wmode' : 1, - 'scale' : 1, - 'quality' : 1, - 'play' : 1, - 'loop' : 1, - 'menu' : 1, - 'salign' : 1, - 'bgcolor' : 1, - 'base' : 1, - 'allowscriptaccess' : 1, - 'allownetworking' : 1, - 'allowfullscreen' : 1, - 'seamlesstabbing' : 1, - 'devicefont' : 1, - 'swliveconnect' : 1, - 'flashvars' : 1, - 'movie' : 1 - }; - - for (k in options) { - item = options[k]; - k = k.toLowerCase(); - if (params[k] && (item || item === false || item === 0)) { - str.push(''); - } - } - options['src'] = options['movie']; - options['name'] = options['id']; - delete options['id']; - delete options['movie']; - delete options['classid']; - delete options['codebase']; - options['type'] = 'application/x-shockwave-flash'; - options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; - str.push(''); - - return str.join(''); -}; - - -/** - * 在页面中创建一个flash对象 - * @name baidu.swf.create - * @function - * @grammar baidu.swf.create(options[, container]) - * - * @param {Object} options 创建flash的选项参数 - * @param {string} options.id 要创建的flash的标识 - * @param {string} options.url flash文件的url - * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 - * @param {string} options.ver 最低需要的flash player版本号 - * @param {string} options.width flash的宽度 - * @param {string} options.height flash的高度 - * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom - * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL - * @param {string} options.bgcolor swf文件的背景色 - * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br - * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false - * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false - * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false - * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best - * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit - * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent - * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain - * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none - * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false - * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false - * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false - * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false - * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 - * - * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 - * @meta standard - * @see baidu.swf.createHTML,baidu.swf.getMovie - */ -baidu.swf.create = function (options, target) { - options = options || {}; - var html = baidu.swf.createHTML(options) - || options['errorMessage'] - || ''; - - if (target && 'string' == typeof target) { - target = document.getElementById(target); - } - baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); -}; -/** - * 判断是否为ie浏览器 - * @name baidu.browser.ie - * @field - * @grammar baidu.browser.ie - * @returns {Number} IE版本号 - */ -baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; - -/** - * 移除数组中的项 - * @name baidu.array.remove - * @function - * @grammar baidu.array.remove(source, match) - * @param {Array} source 需要移除项的数组 - * @param {Any} match 要移除的项 - * @meta standard - * @see baidu.array.removeAt - * - * @returns {Array} 移除后的数组 - */ -baidu.array.remove = function (source, match) { - var len = source.length; - - while (len--) { - if (len in source && source[len] === match) { - source.splice(len, 1); - } - } - return source; -}; - -/** - * 判断目标参数是否Array对象 - * @name baidu.lang.isArray - * @function - * @grammar baidu.lang.isArray(source) - * @param {Any} source 目标参数 - * @meta standard - * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate - * - * @returns {boolean} 类型判断结果 - */ -baidu.lang.isArray = function (source) { - return '[object Array]' == Object.prototype.toString.call(source); -}; - - - -/** - * 将一个变量转换成array - * @name baidu.lang.toArray - * @function - * @grammar baidu.lang.toArray(source) - * @param {mix} source 需要转换成array的变量 - * @version 1.3 - * @meta standard - * @returns {array} 转换后的array - */ -baidu.lang.toArray = function (source) { - if (source === null || source === undefined) - return []; - if (baidu.lang.isArray(source)) - return source; - if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { - return [source]; - } - if (source.item) { - var l = source.length, array = new Array(l); - while (l--) - array[l] = source[l]; - return array; - } - - return [].slice.call(source); -}; - -/** - * 获得flash对象的实例 - * @name baidu.swf.getMovie - * @function - * @grammar baidu.swf.getMovie(name) - * @param {string} name flash对象的名称 - * @see baidu.swf.create - * @meta standard - * @returns {HTMLElement} flash对象的实例 - */ -baidu.swf.getMovie = function (name) { - var movie = document[name], ret; - return baidu.browser.ie == 9 ? - movie && movie.length ? - (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ - return item.tagName.toLowerCase() != "embed"; - })).length == 1 ? ret[0] : ret - : movie - : movie || window[name]; -}; - - -baidu.flash._Base = (function(){ - - var prefix = 'bd__flash__'; - - /** - * 创建一个随机的字符串 - * @private - * @return {String} - */ - function _createString(){ - return prefix + Math.floor(Math.random() * 2147483648).toString(36); - }; - - /** - * 检查flash状态 - * @private - * @param {Object} target flash对象 - * @return {Boolean} - */ - function _checkReady(target){ - if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ - return true; - }else{ - return false; - } - }; - - /** - * 调用之前进行压栈的函数 - * @private - * @param {Array} callQueue 调用队列 - * @param {Object} target flash对象 - * @return {Null} - */ - function _callFn(callQueue, target){ - var result = null; - - callQueue = callQueue.reverse(); - baidu.each(callQueue, function(item){ - result = target.call(item.fnName, item.params); - item.callBack(result); - }); - }; - - /** - * 为传入的匿名函数创建函数名 - * @private - * @param {String|Function} fun 传入的匿名函数或者函数名 - * @return {String} - */ - function _createFunName(fun){ - var name = ''; - - if(baidu.lang.isFunction(fun)){ - name = _createString(); - window[name] = function(){ - fun.apply(window, arguments); - }; - - return name; - }else if(baidu.lang.isString){ - return fun; - } - }; - - /** - * 绘制flash - * @private - * @param {Object} options 创建参数 - * @return {Object} - */ - function _render(options){ - if(!options.id){ - options.id = _createString(); - } - - var container = options.container || ''; - delete(options.container); - - baidu.swf.create(options, container); - - return baidu.swf.getMovie(options.id); - }; - - return function(options, callBack){ - var me = this, - autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), - createOptions = options.createOptions || {}, - target = null, - isReady = false, - callQueue = [], - timeHandle = null, - callBack = callBack || []; - - /** - * 将flash文件绘制到页面上 - * @public - * @return {Null} - */ - me.render = function(){ - target = _render(createOptions); - - if(callBack.length > 0){ - baidu.each(callBack, function(funName, index){ - callBack[index] = _createFunName(options[funName] || new Function()); - }); - } - me.call('setJSFuncName', [callBack]); - }; - - /** - * 返回flash状态 - * @return {Boolean} - */ - me.isReady = function(){ - return isReady; - }; - - /** - * 调用flash接口的统一入口 - * @param {String} fnName 调用的函数名 - * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 - * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 - * @return {Null} - */ - me.call = function(fnName, params, callBack){ - if(!fnName) return null; - callBack = callBack || new Function(); - - var result = null; - - if(isReady){ - result = target.call(fnName, params); - callBack(result); - }else{ - callQueue.push({ - fnName: fnName, - params: params, - callBack: callBack - }); - - (!timeHandle) && (timeHandle = setInterval(_check, 200)); - } - }; - - /** - * 为传入的匿名函数创建函数名 - * @public - * @param {String|Function} fun 传入的匿名函数或者函数名 - * @return {String} - */ - me.createFunName = function(fun){ - return _createFunName(fun); - }; - - /** - * 检查flash是否ready, 并进行调用 - * @private - * @return {Null} - */ - function _check(){ - if(_checkReady(target)){ - clearInterval(timeHandle); - timeHandle = null; - _call(); - - isReady = true; - } - }; - - /** - * 调用之前进行压栈的函数 - * @private - * @return {Null} - */ - function _call(){ - _callFn(callQueue, target); - callQueue = []; - } - - autoRender && me.render(); - }; -})(); - - - -/** - * 创建flash based imageUploader - * @class - * @grammar baidu.flash.imageUploader(options) - * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 - * @config {Object} vars 创建imageUploader时所需要的参数 - * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 - * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 - * @config {Number} vars.picWidth 单张预览图片的宽度 - * @config {Number} vars.picHeight 单张预览图片的高度 - * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' - * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' - * @config {Number} vars.maxSize 文件的最大体积,单位'MB' - * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 - * @config {Number} vars.maxNum:32 最大上传多少个文件 - * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 - * @config {String} vars.url 上传的url地址 - * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 - * @see baidu.swf.createHTML - * @param {String} backgroundUrl 背景图片路径 - * @param {String} listBacgroundkUrl 布局控件背景 - * @param {String} buttonUrl 按钮图片不背景 - * @param {String|Function} selectFileCallback 选择文件的回调 - * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 - * @param {String|Function} deleteFileCallback 删除文件的回调 - * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 - * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 - * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 - * @param {String|Function} allCompleteCallback 全部上传完成时的回调 - * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 - */ -baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ - - var me = this, - options = options || {}, - _flash = new baidu.flash._Base(options, [ - 'selectFileCallback', - 'exceedFileCallback', - 'deleteFileCallback', - 'startUploadCallback', - 'uploadCompleteCallback', - 'uploadErrorCallback', - 'allCompleteCallback', - 'changeFlashHeight' - ]); - /** - * 开始或回复上传图片 - * @public - * @return {Null} - */ - me.upload = function(){ - _flash.call('upload'); - }; - - /** - * 暂停上传图片 - * @public - * @return {Null} - */ - me.pause = function(){ - _flash.call('pause'); - }; - me.addCustomizedParams = function(index,obj){ - _flash.call('addCustomizedParams',[index,obj]); - } -}; - -/** - * 操作原生对象的方法 - * @namespace baidu.object - */ -baidu.object = baidu.object || {}; - - -/** - * 将源对象的所有属性拷贝到目标对象中 - * @author erik - * @name baidu.object.extend - * @function - * @grammar baidu.object.extend(target, source) - * @param {Object} target 目标对象 - * @param {Object} source 源对象 - * @see baidu.array.merge - * @remark - * -1.目标对象中,与源对象key相同的成员将会被覆盖。
    -2.源对象的prototype成员不会拷贝。 - - * @shortcut extend - * @meta standard - * - * @returns {Object} 目标对象 - */ -baidu.extend = -baidu.object.extend = function (target, source) { - for (var p in source) { - if (source.hasOwnProperty(p)) { - target[p] = source[p]; - } - } - - return target; -}; - - - - - -/** - * 创建flash based fileUploader - * @class - * @grammar baidu.flash.fileUploader(options) - * @param {Object} options - * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 - * @config {String} createOptions.width - * @config {String} createOptions.height - * @config {Number} maxNum 最大可选文件数 - * @config {Function|String} selectFile - * @config {Function|String} exceedMaxSize - * @config {Function|String} deleteFile - * @config {Function|String} uploadStart - * @config {Function|String} uploadComplete - * @config {Function|String} uploadError - * @config {Function|String} uploadProgress - */ -baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ - var me = this, - options = options || {}; - - options.createOptions = baidu.extend({ - wmod: 'transparent' - },options.createOptions || {}); - - var _flash = new baidu.flash._Base(options, [ - 'selectFile', - 'exceedMaxSize', - 'deleteFile', - 'uploadStart', - 'uploadComplete', - 'uploadError', - 'uploadProgress' - ]); - - _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); - - /** - * 设置当鼠标移动到flash上时,是否变成手型 - * @public - * @param {Boolean} isCursor - * @return {Null} - */ - me.setHandCursor = function(isCursor){ - _flash.call('setHandCursor', [isCursor || false]); - }; - - /** - * 设置鼠标相应函数名 - * @param {String|Function} fun - */ - me.setMSFunName = function(fun){ - _flash.call('setMSFunName',[_flash.createFunName(fun)]); - }; - - /** - * 执行上传操作 - * @param {String} url 上传的url - * @param {String} fieldName 上传的表单字段名 - * @param {Object} postData 键值对,上传的POST数据 - * @param {Number|Array|null|-1} [index]上传的文件序列 - * Int值上传该文件 - * Array一次串行上传该序列文件 - * -1/null上传所有文件 - * @return {Null} - */ - me.upload = function(url, fieldName, postData, index){ - - if(typeof url !== 'string' || typeof fieldName !== 'string') return null; - if(typeof index === 'undefined') index = -1; - - _flash.call('upload', [url, fieldName, postData, index]); - }; - - /** - * 取消上传操作 - * @public - * @param {Number|-1} index - */ - me.cancel = function(index){ - if(typeof index === 'undefined') index = -1; - _flash.call('cancel', [index]); - }; - - /** - * 删除文件 - * @public - * @param {Number|Array} [index] 要删除的index,不传则全部删除 - * @param {Function} callBack - * */ - me.deleteFile = function(index, callBack){ - - var callBackAll = function(list){ - callBack && callBack(list); - }; - - if(typeof index === 'undefined'){ - _flash.call('deleteFilesAll', [], callBackAll); - return; - }; - - if(typeof index === 'Number') index = [index]; - index.sort(function(a,b){ - return b-a; - }); - baidu.each(index, function(item){ - _flash.call('deleteFileBy', item, callBackAll); - }); - }; - - /** - * 添加文件类型,支持macType - * @public - * @param {Object|Array[Object]} type {description:String, extention:String} - * @return {Null}; - */ - me.addFileType = function(type){ - var type = type || [[]]; - - if(type instanceof Array) type = [type]; - else type = [[type]]; - _flash.call('addFileTypes', type); - }; - - /** - * 设置文件类型,支持macType - * @public - * @param {Object|Array[Object]} type {description:String, extention:String} - * @return {Null}; - */ - me.setFileType = function(type){ - var type = type || [[]]; - - if(type instanceof Array) type = [type]; - else type = [[type]]; - _flash.call('setFileTypes', type); - }; - - /** - * 设置可选文件的数量限制 - * @public - * @param {Number} num - * @return {Null} - */ - me.setMaxNum = function(num){ - _flash.call('setMaxNum', [num]); - }; - - /** - * 设置可选文件大小限制,以兆M为单位 - * @public - * @param {Number} num,0为无限制 - * @return {Null} - */ - me.setMaxSize = function(num){ - _flash.call('setMaxSize', [num]); - }; - - /** - * @public - */ - me.getFileAll = function(callBack){ - _flash.call('getFileAll', [], callBack); - }; - - /** - * @public - * @param {Number} index - * @param {Function} [callBack] - */ - me.getFileByIndex = function(index, callBack){ - _flash.call('getFileByIndex', [], callBack); - }; - - /** - * @public - * @param {Number} index - * @param {function} [callBack] - */ - me.getStatusByIndex = function(index, callBack){ - _flash.call('getStatusByIndex', [], callBack); - }; -}; - -/** - * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 - * @namespace baidu.sio - */ -baidu.sio = baidu.sio || {}; - -/** - * - * @param {HTMLElement} src script节点 - * @param {String} url script节点的地址 - * @param {String} [charset] 编码 - */ -baidu.sio._createScriptTag = function(scr, url, charset){ - scr.setAttribute('type', 'text/javascript'); - charset && scr.setAttribute('charset', charset); - scr.setAttribute('src', url); - document.getElementsByTagName('head')[0].appendChild(scr); -}; - -/** - * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 - * - * @param {HTMLElement} src script节点 - */ -baidu.sio._removeScriptTag = function(scr){ - if (scr.clearAttributes) { - scr.clearAttributes(); - } else { - for (var attr in scr) { - if (scr.hasOwnProperty(attr)) { - delete scr[attr]; - } - } - } - if(scr && scr.parentNode){ - scr.parentNode.removeChild(scr); - } - scr = null; -}; - - -/** - * 通过script标签加载数据,加载完成由浏览器端触发回调 - * @name baidu.sio.callByBrowser - * @function - * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) - * @param {string} url 加载数据的url - * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 - * @param {Object} opt_options 其他可选项 - * @config {String} [charset] script的字符集 - * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 - * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 - * @remark - * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 - * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 - * @meta standard - * @see baidu.sio.callByServer - */ -baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { - var scr = document.createElement("SCRIPT"), - scriptLoaded = 0, - options = opt_options || {}, - charset = options['charset'], - callback = opt_callback || function(){}, - timeOut = options['timeOut'] || 0, - timer; - scr.onload = scr.onreadystatechange = function () { - if (scriptLoaded) { - return; - } - - var readyState = scr.readyState; - if ('undefined' == typeof readyState - || readyState == "loaded" - || readyState == "complete") { - scriptLoaded = 1; - try { - callback(); - clearTimeout(timer); - } finally { - scr.onload = scr.onreadystatechange = null; - baidu.sio._removeScriptTag(scr); - } - } - }; - - if( timeOut ){ - timer = setTimeout(function(){ - scr.onload = scr.onreadystatechange = null; - baidu.sio._removeScriptTag(scr); - options.onfailure && options.onfailure(); - }, timeOut); - } - - baidu.sio._createScriptTag(scr, url, charset); -}; - -/** - * 通过script标签加载数据,加载完成由服务器端触发回调 - * @name baidu.sio.callByServer - * @function - * @grammar baidu.sio.callByServer(url, callback[, opt_options]) - * @param {string} url 加载数据的url. - * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. - * @param {Object} opt_options 加载数据时的选项. - * @config {string} [charset] script的字符集 - * @config {string} [queryField] 服务器端callback请求字段名,默认为callback - * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 - * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 - * @remark - * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 - * @meta standard - * @see baidu.sio.callByBrowser - */ -baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { - var scr = document.createElement('SCRIPT'), - prefix = 'bd__cbs__', - callbackName, - callbackImpl, - options = opt_options || {}, - charset = options['charset'], - queryField = options['queryField'] || 'callback', - timeOut = options['timeOut'] || 0, - timer, - reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), - matches; - - if (baidu.lang.isFunction(callback)) { - callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); - window[callbackName] = getCallBack(0); - } else if(baidu.lang.isString(callback)){ - callbackName = callback; - } else { - if (matches = reg.exec(url)) { - callbackName = matches[2]; - } - } - - if( timeOut ){ - timer = setTimeout(getCallBack(1), timeOut); - } - url = url.replace(reg, '\x241' + queryField + '=' + callbackName); - - if (url.search(reg) < 0) { - url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; - } - baidu.sio._createScriptTag(scr, url, charset); - - /* - * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 - */ - function getCallBack(onTimeOut){ - /*global callbackName, callback, scr, options;*/ - return function(){ - try { - if( onTimeOut ){ - options.onfailure && options.onfailure(); - }else{ - callback.apply(window, arguments); - clearTimeout(timer); - } - window[callbackName] = null; - delete window[callbackName]; - } catch (exception) { - } finally { - baidu.sio._removeScriptTag(scr); - } - } - } -}; - -/** - * 通过请求一个图片的方式令服务器存储一条日志 - * @function - * @grammar baidu.sio.log(url) - * @param {string} url 要发送的地址. - * @author: int08h,leeight - */ -baidu.sio.log = function(url) { - var img = new Image(), - key = 'tangram_sio_log_' + Math.floor(Math.random() * - 2147483648).toString(36); - window[key] = img; - - img.onload = img.onerror = img.onabort = function() { - img.onload = img.onerror = img.onabort = null; - - window[key] = null; - img = null; - }; - img.src = url; -}; - - - -/* - * Tangram - * Copyright 2009 Baidu Inc. All rights reserved. - * - * path: baidu/json.js - * author: erik - * version: 1.1.0 - * date: 2009/12/02 - */ - - -/** - * 操作json对象的方法 - * @namespace baidu.json - */ -baidu.json = baidu.json || {}; -/* - * Tangram - * Copyright 2009 Baidu Inc. All rights reserved. - * - * path: baidu/json/parse.js - * author: erik, berg - * version: 1.2 - * date: 2009/11/23 - */ - - - -/** - * 将字符串解析成json对象。注:不会自动祛除空格 - * @name baidu.json.parse - * @function - * @grammar baidu.json.parse(data) - * @param {string} source 需要解析的字符串 - * @remark - * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 - * @meta standard - * @see baidu.json.stringify,baidu.json.decode - * - * @returns {JSON} 解析结果json对象 - */ -baidu.json.parse = function (data) { - //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 - return (new Function("return (" + data + ")"))(); -}; -/* - * Tangram - * Copyright 2009 Baidu Inc. All rights reserved. - * - * path: baidu/json/decode.js - * author: erik, cat - * version: 1.3.4 - * date: 2010/12/23 - */ - - - -/** - * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 - * @name baidu.json.decode - * @function - * @grammar baidu.json.decode(source) - * @param {string} source 需要解析的字符串 - * @meta out - * @see baidu.json.encode,baidu.json.parse - * - * @returns {JSON} 解析结果json对象 - */ -baidu.json.decode = baidu.json.parse; -/* - * Tangram - * Copyright 2009 Baidu Inc. All rights reserved. - * - * path: baidu/json/stringify.js - * author: erik - * version: 1.1.0 - * date: 2010/01/11 - */ - - - -/** - * 将json对象序列化 - * @name baidu.json.stringify - * @function - * @grammar baidu.json.stringify(value) - * @param {JSON} value 需要序列化的json对象 - * @remark - * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 - * @meta standard - * @see baidu.json.parse,baidu.json.encode - * - * @returns {string} 序列化后的字符串 - */ -baidu.json.stringify = (function () { - /** - * 字符串处理时需要转义的字符表 - * @private - */ - var escapeMap = { - "\b": '\\b', - "\t": '\\t', - "\n": '\\n', - "\f": '\\f', - "\r": '\\r', - '"' : '\\"', - "\\": '\\\\' - }; - - /** - * 字符串序列化 - * @private - */ - 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 + '"'; - } - - /** - * 数组序列化 - * @private - */ - 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(baidu.json.stringify(item)); - preComma = 1; - } - } - result.push("]"); - return result.join(""); - } - - /** - * 处理日期序列化时的补零 - * @private - */ - function pad(source) { - return source < 10 ? '0' + source : source; - } - - /** - * 日期序列化 - * @private - */ - 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 (value instanceof Array) { - return encodeArray(value); - } else if (value instanceof Date) { - return encodeDate(value); - } else { - var result = ['{'], - encode = baidu.json.stringify, - 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(''); - } - } - }; -})(); -/* - * Tangram - * Copyright 2009 Baidu Inc. All rights reserved. - * - * path: baidu/json/encode.js - * author: erik, cat - * version: 1.3.4 - * date: 2010/12/23 - */ - - - -/** - * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 - * @name baidu.json.encode - * @function - * @grammar baidu.json.encode(value) - * @param {JSON} value 需要序列化的json对象 - * @meta out - * @see baidu.json.decode,baidu.json.stringify - * - * @returns {string} 序列化后的字符串 - */ -baidu.json.encode = baidu.json.stringify; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.html deleted file mode 100644 index 670db71..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - : -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.js deleted file mode 100644 index b3a075d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/dialogs/wordimage/wordimage.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Created by JetBrains PhpStorm. - * User: taoqili - * Date: 12-1-30 - * Time: 下午12:50 - * To change this template use File | Settings | File Templates. - */ - - - -var wordImage = {}; -//(function(){ -var g = baidu.g, - flashObj,flashContainer; - -wordImage.init = function(opt, callbacks) { - showLocalPath("localPath"); - //createCopyButton("clipboard","localPath"); - createFlashUploader(opt, callbacks); - addUploadListener(); - addOkListener(); -}; - -function hideFlash(){ - flashObj = null; - flashContainer.innerHTML = ""; -} -function addOkListener() { - dialog.onok = function() { - if (!imageUrls.length) return; - var urlPrefix = editor.getOpt('imageUrlPrefix'), - images = domUtils.getElementsByTagName(editor.document,"img"); - editor.fireEvent('saveScene'); - for (var i = 0,img; img = images[i++];) { - var src = img.getAttribute("word_img"); - if (!src) continue; - for (var j = 0,url; url = imageUrls[j++];) { - if (src.indexOf(url.original.replace(" ","")) != -1) { - img.src = urlPrefix + url.url; - img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 - img.setAttribute("title",url.title); - domUtils.removeAttributes(img, ["word_img","style","width","height"]); - editor.fireEvent("selectionchange"); - break; - } - } - } - editor.fireEvent('saveScene'); - hideFlash(); - }; - dialog.oncancel = function(){ - hideFlash(); - } -} - -/** - * 绑定开始上传事件 - */ -function addUploadListener() { - g("upload").onclick = function () { - flashObj.upload(); - this.style.display = "none"; - }; -} - -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 ? "/":"\\" ; - - path = path.substring(0, path.lastIndexOf(separater)+1); - g(id).value = path; -} - -function createFlashUploader(opt, callbacks) { - //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 - var i18n = utils.extend({},lang.flashI18n); - //处理图片资源地址的编码,补全等问题 - for(var i in i18n){ - if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ - i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); - } - } - opt = utils.extend(opt,i18n,false); - var option = { - createOptions:{ - id:'flash', - url:opt.flashUrl, - width:opt.width, - height:opt.height, - errorMessage:lang.flashError, - wmode:browser.safari ? 'transparent' : 'window', - ver:'10.0.0', - vars:opt, - container:opt.container - } - }; - - option = extendProperty(callbacks, option); - flashObj = new baidu.flash.imageUploader(option); - flashContainer = $G(opt.container); -} - -function extendProperty(fromObj, toObj) { - for (var i in fromObj) { - if (!toObj[i]) { - toObj[i] = fromObj[i]; - } - } - return toObj; -} - -//})(); - -function getPasteData(id) { - baidu.g("msg").innerHTML = lang.copySuccess + "
    "; - setTimeout(function() { - baidu.g("msg").innerHTML = ""; - }, 5000); - return baidu.g(id).value; -} - -function createCopyButton(id, dataFrom) { - baidu.swf.create({ - id:"copyFlash", - url:"fClipboard_neditor.swf", - width:"58", - height:"25", - errorMessage:"", - bgColor:"#CBCBCB", - wmode:"transparent", - ver:"10.0.0", - vars:{ - tid:dataFrom - } - }, id - ); - - var clipboard = baidu.swf.getMovie("copyFlash"); - var clipinterval = setInterval(function() { - if (clipboard && clipboard.flashInit) { - clearInterval(clipinterval); - clipboard.setHandCursor(true); - clipboard.setContentFuncName("getPasteData"); - //clipboard.setMEFuncName("mouseEventHandler"); - } - }, 500); -} -createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/en.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/en.js deleted file mode 100644 index 0ccead1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/en.js +++ /dev/null @@ -1,684 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: taoqili - * Date: 12-6-12 - * Time: 下午6:57 - * To change this template use File | Settings | File Templates. - */ -UE.I18N['en'] = { - 'labelMap':{ - 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', - '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', 'map':'BaiduMap', 'gmap':'GoogleMap', - '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', - 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', - 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', - 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' - }, - '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...' - }, - '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':{ - 'songti':'Sim Sun', - 'kaiti':'Sim Kai', - 'heiti':'Sim Hei', - 'lishu':'Sim Li', - 'yahei': 'Microsoft YaHei', - 'andaleMono':'Andale Mono', - 'arial': 'Arial', - 'arialBlack':'Arial Black', - 'comicSansMs':'Comic Sans MS', - 'impact':'Impact', - 'timesNewRoman':'Times New Roman' - }, - '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", - 'errorLoadConfig': 'Server config not loaded, upload can not work.', - }, - 'simpleupload':{ - 'exceedSizeError': 'File Size Exceed', - 'exceedTypeError': 'File Type Not Allow', - 'jsonEncodeError': 'Server Return Format 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!", - 'loadconfigError': 'Get server config error.', - 'loadconfigFormatError': 'Server config format error.', - 'loadconfigHttpError': 'Get server config http error.', - 'snapScreen_plugin':{ - 'browserMsg':"Only IE supported!", - 'callBackErrorMsg':"The callback data is wrong,please check the config!", - 'uploadErrorMsg':"Upload error,please check your server environment! " - }, - '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!" - }, - 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", - 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", - 'anthorMsg':"Link", - 'clearColor':'Clear', - 'standardColor':'Standard color', - 'themeColor':'Theme color', - 'property':'Property', - 'default':'Default', - 'modify':'Modify', - 'justifyleft':'Justify Left', - 'justifyright':'Justify Right', - 'justifycenter':'Justify Center', - 'justify':'Default', - 'clear':'Clear', - 'anchorMsg':'Anchor', - '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"]} - }, - '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':["All", "Avatar", "Facial", "Cartoon", "StickFigure", "GIF", "StaticImage"]}, - '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', - '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!" - }, - '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" - }, - '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.' - }, - - '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_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!", - - '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', - '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.' - }, - 'webapp':{ - 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", - 'tip2':"And then open the file neditor.config.js to set it! ", - 'applyFor':"APPLY FOR", - 'anthorApi':"Baidu API" - }, - '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" - }, - 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...' - }, - 'music':{ - 'static':{ - 'lang_input_tips':"Input singer/song/album, search you interested in music!", - 'J_searchBtn':{value:'Search songs'} - }, - 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', - 'chapter':'Songs', - 'singer':'Singer', - 'special':'Album', - 'listenTest':'Audition' - }, - anchor:{ - 'static':{ - 'lang_input_anchorName':'Anchor Name:' - } - }, - 'charts':{ - 'static':{ - 'lang_data_source':'Data source:', - 'lang_chart_format': 'Chart format:', - 'lang_data_align': 'Align', - 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', - 'lang_chart_align_reverse': 'X-axis Y-axis opposite', - 'lang_chart_title': 'Title', - 'lang_chart_main_title': 'main title:', - 'lang_chart_sub_title': 'sub title:', - 'lang_chart_x_title': 'X-axis title:', - 'lang_chart_y_title': 'Y-axis title:', - 'lang_chart_tip': 'Prompt', - 'lang_cahrt_tip_prefix': 'prefix:', - 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', - 'lang_chart_data_unit': 'Unit', - 'lang_chart_data_unit_title': 'unit:', - 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', - 'lang_chart_type': 'Chart type:', - 'lang_prev_btn': 'Previous', - 'lang_next_btn': 'Next' - } - }, - 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' - } - }, - gmap:{ - 'static':{ - 'lang_input_address':'Address:', - 'lang_input_search':'Search', - 'address':{value:"Beijing"} - }, - searchError:'Unable to locate the address!' - }, - help:{ - 'static':{ - 'lang_input_about':'About', - 'lang_input_shortcuts':'Shortcuts', - 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", - '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"]} - }, - '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:' - }, - 'validLink':'Supports only effective when a link is selected', - 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' - }, - map:{ - 'static':{ - lang_city:"City", - lang_address:"Address", - city:{value:"Beijing"}, - lang_search:"Search", - lang_dynamicmap:"Dynamic map" - }, - cityMsg:"Please enter the city name!", - errorMsg:"Can't find the place!" - }, - 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)!" - }, - snapscreen:{ - 'static':{ - lang_showMsg:"You should install the UEditor screenshots program first!", - lang_download:"Download!", - lang_step1:"Step1:Download the program and then run it", - lang_step2:"Step2:After complete install,try to click the button again" - } - }, - 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:' - }, - 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' - } - }, - 'edittd':{ - 'static':{ - lang_tdBkColor:'Background Color:' - } - }, - '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." - }, - 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' - } - }, - 'autosave': { - 'success':'Local conservation success' - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/addimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/addimage.png deleted file mode 100644 index 3a2fd17121b9e0d435b2ca082d696c33b9f27b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3373 zcmV+|4bt+7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00075Nkl3`{TEJie8u#ZKCX-pjWHM`TbtWcWh*2now&&s;3`jv3 z8BYw~jZ)fbpT6HuOAd#Fpp?3}F|9R}Qcz047z1Mr2q7SZfKm!dDICYaluc``m z=TJ&vHk%;`0&vc+&`PLMN@Q6E$8kUinJmN_K&2G2ECXW<%jFWD=QReDAUWp2I$*oq)}A+;jTPd2K1Y%y({kZ5+pbothh30!4k1Kshd$ok@%jB_?f>!i4gih! zZSA%`RqN{iYc5?P))@(p)Rt07acK?7qJ?xw0?iT$m!UW4 z;_ve6`Q=OWE`x&L;|Sk-_kHjE-~YYuUHTi1M&Cn|fxZVQgPMN$yS{f^E1&%f8ADSq z!|x|zo*kp7-nDG~D91*gPQD0tjoZfb@^*2?I${CbknseSM_v`GHp$!@m&79CO>wW8 zwhl_<_wB=EG8z&~a&#Eb{N5YEJ-3IoUjm$m7(un2i_SA-&*p5tCVN(AUeQaMo#LA5 z=aTKm-IG|@u=fAh&iSXs*A(4zg@4{=^M6_3M7#wBO+1c4s`lD^8`ms!*sOI#;9YZ^ zBcF3+RO-Xpv$G95RYC>5o6JFJV=jSxbi`1-&2Ro}Iu{#rNf5J5((^6sf6&bqqXh8H z5+W1P5QK>etklXEj4aG_oOr@I>a(S6<;)SE*toYxk1;0R% z`>N8PF(SZ{LKiA_vD#EOz+YEyts^yeMAV&P)rM?lKv2-qXPi+RPDT$Pv?ig%s%zFz zCG7!vVGg4=d2SK*5JI{rGZyLjB4$#Ntz1RL2M%seBHGsIcn6uf4HY9@%l`b@8)*-W zzOms*n^yqn?Tbi9a=W=1G9Zb%yj^hdrQ=!`QcZyZ8Y0e zxMGl0+n6TZ9dn#u)9Z&Gsa!a92udR{2e{@uVnM}7S7eWCB!C67-N}`6FM!r>s^FQP zh9+-P@!+I$WNFgh`G*Of7$(EUkOsH&gU>Hmr61I@n(=mlUC8F11eskof`0s$cPDZw ZzyK$sgmq7P@T33$002ovPDHLkV1jUEUt0hG diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/alldeletebtnupskin.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/alldeletebtnupskin.png deleted file mode 100644 index 61658ce6f10164478ce293c05f1f0485a8fa1fc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 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 P9go0R-$Jhf?tK5Bgo^WU diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/button.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/button.png deleted file mode 100644 index 098874cb1fa85852d77ba9acbb5850c91c341fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4929 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deletedisable.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deletedisable.png deleted file mode 100644 index c8ee75094f59f0c1262806fd294d361f30f64f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmV;40(Sk0P)!u-Pc3GOd!YPO+bG=gGoA_gW7h+<&i6W@>CzIUsorkT}tXKy|I-GoR_nf%RY$+yzqrWn_y0c| zycG_I116IRG@DK0sZ-E55u|Ou1fok>7zp9LsHJgReXhe;7C4$VS;)mE^wOWxM5!>w+j7B4b z!(p<+cswRyO2rY#*XuP527_xko|w>=_a0qmu_(~#bP__L5ZG)saJ${)TYOfjR7kAi zYvg9L`EQ38LQ-=rdwc{0EpJ`Z=~U9|_2kw4eh&tN0eJ55 jcWg?)n1^9d$t00000NkvXXu0mjfULPWN diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deleteenable.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/deleteenable.png deleted file mode 100644 index 26acc883567c5d7fde8de3ba052d7754a5b1c539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 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 F`FAsl-Jbve diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/localimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/localimage.png deleted file mode 100644 index 12c8e6aefa8fd16287ac77bbecd7d5b58c3fc837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3083 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 Z1^`gxH94g;riuUn002ovPDHLkV1oEm+S&jB diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/music.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/music.png deleted file mode 100644 index 69c5a9a7e1cecdf78902fc11178313f7f33d1f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3599 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 QgFz3XqhWyfq;3=XFFr8S`Tzg` diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftdisable.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftdisable.png deleted file mode 100644 index 741526e0d5e6eb5c30eb0a62c9b1d6d558ed9cdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xVLm}k=YQ<2%m+GNILKMZ4Wj)Eo{6dA(i=1OgO`#k70DYI-BmRjYes)SkU2cI0GZBR;y4N3I~Hh!d`9*7LUg-fQ!ZA17DgvC%W<{o)0F! zU*`EmuKGZYN~Kcs0v3uoolcs~W&&`zTnccgjDVT|^mshtI#kAIIINifC7$1T{?yd~ z`f398$nzJ^&xXUj%I~;@1tb~>YHqh%0jWR{cz-&b2!6()Y&M(t%#{JqZzlB@o&~uo zRdFYN7<*g3d>y0SFTSsu}||KmrzxrzXV}0f4+Nl`U`wo^<=3%s|h|0ur}Z0m~6a z)9IA5+3a~Uyo=N{O{`Z26ni!(U6x=a31615Uq6I}2cZ-|0a2}1X+EF7+lbqaCbL*9 zVjpaCBO8zeF31Bljb43c1B|5gdMy+K1i&JZ2&owiAH&aRFjxU~zu$k$sq`Wh)qB?* z7JdW}ya?6MP#9CN2390Mab0C5lljw}edEbwzR6l%S5ujn*P2rK!bg5RKf!pHvr45x zq@5Lg56Rlp|dF?<); zZnrB`Ycv`HPI*-K+S{`L4RzyPXZYcl&002ovPDHLkV1lL= BGwT2V diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftenable.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/rotateleftenable.png deleted file mode 100644 index e164ddbd62a232f3a89826158c9795f6c082cc89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmV;p14sOcP)B{+A~4pJXZ}t_3ogEQ=EtDt@NW=ovC^1YY3D0f#y*iY)MG5<8F z!|f{@kKz7^5#8k3NZf?c9K_t5iFB?APcn|7{XXn#Ybhtak0o(qW)4fuAr!0vET4{< zSc+h47GQ*Qo%FCG#zDtxKn;d}ii3LDciA+S|Xdhl! zB4Tth6pKaVi#F1YAvCEHTFJM^bUHnP0sSYFPoVrcDQm)w^;g8!)bGBFx|JW?%CGA- z&{PEjJ5@v`9|31h11Z`(8l4W74acX!rYt{M#7D#XGmFrJ8p1{(Q)@sv8@F2OUzvR1 zx9$d0kvWXM{tBEwN0$R4YNDW*#-^%Df&-Q6zoW#Uu@ZDmhS%$@-$mxZRD^B@1aSM_ zhL@++3|_o?ixNDPXhWAA>})fj>w5hzGPAR@B4aE>&p+Mbf*>$imMuk5EW2c0000?hzPCHlRk++nh`E3!rKF3htnTQ@ z$gI|MU8lEVHuFTg-PR|Q2`!gP+H5wYX&N~k4)SU74-bY78_Ii7=yw!+~9z)9EC?-%tI1pNtpOgTWwx zYc~hmYPIxUug9z{77N<%_sk-|f_a_y+;xqv4+oe^KHq!n0!Sli2@LjQ?eJI-PQw!5kz2kP;{i1#vW)J3m7@ilvOQx*+0gD21yWM29TG_#>*)V5x3eEte0rs!7XTfq- zNpDVBe^HqJA^?xgte(JHEEaB201ADoR;^a);o$)-i`fNGNCD$l*jUkV&ZOJ#g6-=H z48;P#aDbi7X5{nvH~?d$9K9Fo01LT5x392A!Cv-)3}9cydREAx^dDF>`_*d2002m8 z7y1N?u~>`?4DAa45ev4jw7ek*Sw2XA4L&zdS z9A4&}t`&psbm3W({))<)8k1Mzq-LMgHh4P0I-QOV5C8-H!ohO6T&8$D&Va$Z(UY0s zOeS;lL%|{kl3A%;S#MlC&Amg&cpiN1r-rvC| zuQ1Fer=aUPn>g6re+%A~4HxgfoyFs_jfT}hvT2|~buTAFG7cgsM5)fELnz*RfYsA+ z%+JjZfW5eCXjGl)8+s)4P|lCQu*F>n-SXLP{rpv`@{BNE{IcsI8B@_npSvh)X*hNpW_TLgr2`Ju@0bJqvCruO={o6E(Z3`5{jw@Hv`M-m z=H><1m4WE;;`c%mkz)x|ObZEnAD_J*B%s8ej2PcmwhgRZado>%)jtid7zm=SE zQ*F%`{_{RP6wdfheSj59}E|h^E{{P*E_)R6H^3NW^13gC8C>dV0CgKv@POF4dxfvY6kSFwxaNHki&!>3-Y^~4kn%F>oC=IgN4BfYTUZZWo z4NgH0Fff*Y6!1`OQEtkV%qBhmGZEnCEqwT{hG--_gp%$=?(C?C;zb^jm66PHQ4|^R zkb*cmi1NcmKm&YfVi#crNDyF;_V&?5G diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/en/images/upload.png deleted file mode 100644 index 7bb15b3d6d6799504cf7093a1600bd7ece0d9ef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3941 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/copy.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/copy.png deleted file mode 100644 index b2536aac72e763b9a872b507462458ecb96990f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4319 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 N002ovPDHLkV1nv#UQ7T0 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/localimage.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/i18n/zh-cn/images/localimage.png deleted file mode 100644 index 7303c364318b6ac27dc4a8ae6717124d8dafaff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6979 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 O0000字数超出最大允许值,服务器可能拒绝保存!', - 'ok':"确认", - 'cancel':"取消", - 'closeDialog':"关闭对话框", - 'tableDrag':"表格拖动必须引入uiUtils.js文件!", - 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", - 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', - 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', - 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', - 'snapScreen_plugin':{ - 'browserMsg':"仅支持IE浏览器!", - 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", - 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " - }, - '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)", - 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", - 'paste':"粘贴(Ctrl + v)", - 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" - }, - 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", - 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", - 'anthorMsg':"链接", - 'clearColor':'清空颜色', - 'standardColor':'标准颜色', - 'themeColor':'主题颜色', - 'property':'属性', - 'default':'默认', - 'modify':'修改', - 'justifyleft':'左对齐', - 'justifyright':'右对齐', - 'justifycenter':'居中', - 'justify':'默认', - 'clear':'清除', - 'anchorMsg':'锚点', - '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':["居中", "横向重复", "纵向重复", "平铺","自定义"]} - - }, - 'noUploadImage':"当前未上传过任何图片!", - 'toggleSelect':"单击可切换选中状态\n原图尺寸: " - }, - //===============dialog i18N======================= - 'insertimage':{ - 'static':{ - 'lang_tab_remote':"插入图片", //节点 - 'lang_tab_upload':"本地上传", - 'lang_tab_online':"在线管理", - 'lang_tab_search':"图片搜索", - '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':'不能预览', - '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':" :( ,抱歉,没有找到图片!请重试一次!" - }, - 'attachment':{ - 'static':{ - 'lang_tab_upload': '上传附件', - 'lang_tab_online': '在线附件', - 'lang_start_upload':"开始上传", - 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" - }, - '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':'服务器返回出错' - }, - '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_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':"    抱歉,找不到对应的视频,请重试!", - - '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':'服务器返回出错' - }, - 'webapp':{ - 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", - 'tip2':"申请完成之后请至neditor.config.js中配置获得的appkey! ", - 'applyFor':"点此申请", - 'anthorApi':"百度API" - }, - '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:'添加背景图片'} - }, - 'noScarwl':"尚未作画,白纸一张~", - 'scrawlUpLoading':"涂鸦上传中,别急哦~", - 'continueBtn':"继续", - 'imageError':"糟糕,图片读取失败了!", - 'backgroundUploading':'背景图片上传中,别急哦~' - }, - 'music':{ - 'static':{ - 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", - 'J_searchBtn':{value:'搜索歌曲'} - }, - 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', - 'chapter':'歌曲', - 'singer':'歌手', - 'special':'专辑', - 'listenTest':'试听' - }, - 'anchor':{ - 'static':{ - 'lang_input_anchorName':'锚点名字:' - } - }, - 'charts':{ - 'static':{ - 'lang_data_source':'数据源:', - 'lang_chart_format': '图表格式:', - 'lang_data_align': '数据对齐方式', - 'lang_chart_align_same': '数据源与图表X轴Y轴一致', - 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', - 'lang_chart_title': '图表标题', - 'lang_chart_main_title': '主标题:', - 'lang_chart_sub_title': '子标题:', - 'lang_chart_x_title': 'X轴标题:', - 'lang_chart_y_title': 'Y轴标题:', - 'lang_chart_tip': '提示文字', - 'lang_cahrt_tip_prefix': '提示文字前缀:', - 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', - 'lang_chart_data_unit': '数据单位', - 'lang_chart_data_unit_title': '单位:', - 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', - 'lang_chart_type': '图表类型:', - 'lang_prev_btn': '上一个', - 'lang_next_btn': '下一个' - } - }, - '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':'有啊' - } - }, - 'gmap':{ - 'static':{ - 'lang_input_address':'地址', - 'lang_input_search':'搜索', - 'address':{value:"北京"} - }, - searchError:'无法定位到该地址!' - }, - 'help':{ - 'static':{ - 'lang_input_about':'关于UEditor', - 'lang_input_shortcuts':'快捷键', - 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', - '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:["默认", "左对齐", "右对齐", "居中"]} - }, - 'enterAddress':'请输入地址!' - }, - 'link':{ - 'static':{ - 'lang_input_text':'文本内容:', - 'lang_input_url':'链接地址:', - 'lang_input_title':'标题:', - 'lang_input_target':'是否在新窗口打开:' - }, - 'validLink':'只支持选中一个链接时生效', - 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' - }, - 'map':{ - 'static':{ - lang_city:"城市", - lang_address:"地址", - city:{value:"北京"}, - lang_search:"搜索", - lang_dynamicmap:"插入动态地图" - }, - cityMsg:"请选择城市", - errorMsg:"抱歉,找不到该位置!" - }, - '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}处!" - }, - 'snapscreen':{ - 'static':{ - lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", - lang_download:"点此下载", - lang_step1:"第一步,下载UEditor截图插件并运行安装。", - lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" - } - }, - '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':'颜色:' - }, - captionName:'表格名称', - titleName:'标题', - cellsName:'内容', - errorMsg:'有合并单元格,不可排序' - }, - 'edittip':{ - 'static':{ - lang_delRow:'删除整行', - lang_delCol:'删除整列' - } - }, - 'edittd':{ - 'static':{ - lang_tdBkColor:'背景颜色:' - } - }, - '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、点击打开后选择图片上传流程。" - }, - 'fileType':"图片", - 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", - 'netError':"网络连接错误,请重试!", - 'copySuccess':"图片地址已经复制!", - 'flashI18n':{} //留空默认中文 - }, - 'autosave': { - 'saving':'保存中...', - 'success':'本地保存成功' - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/index.html b/web/src/main/resources/static/plug-in/neditor/2.1.10/index.html deleted file mode 100644 index e87f959..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/index.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - 完整demo - - - - - - - - - - - - - -
    -

    完整demo

    - -
    -
    -
    - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - - -
    - -
    -
    - - -
    - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.js deleted file mode 100644 index 647c973..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.js +++ /dev/null @@ -1,33077 +0,0 @@ -/*! - * neditor - * version: 2.1.6 - * build: Thu Nov 29 2018 09:38:10 GMT+0000 (UTC) - */ - -(function(){ - -// editor.js -UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}; - -var baidu = window.baidu || {}; - -window.baidu = baidu; - -window.UE = baidu.editor = { - plugins: {}, - commands: {}, - instants: {}, - I18N: {}, - _customizeUI: {}, - version: "1.5.0" -}; -var dom = (UE.dom = {}); - - -// core/browser.js -/** - * 浏览器判断模块 - * @file - * @module UE.browser - * @since 1.2.6.1 - */ - -/** - * 提供浏览器检测的模块 - * @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), - - /** - * @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} 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} 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 - * ```javascript - * if ( UE.browser.ie9Compat ) { - * console.log( '当前浏览器运行在IE9兼容模式下' ); - * } - * ``` - */ - browser.ie9Compat = document.documentMode == 9; - - /** - * @property { boolean } ie8 检测浏览器是否是IE8浏览器 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie8 ) { - * console.log( '当前浏览器是IE8浏览器' ); - * } - * ``` - */ - browser.ie8 = !!document.documentMode; - - /** - * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie8Compat ) { - * console.log( '当前浏览器运行在IE8兼容模式下' ); - * } - * ``` - */ - browser.ie8Compat = document.documentMode == 8; - - /** - * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie7Compat ) { - * console.log( '当前浏览器运行在IE7兼容模式下' ); - * } - * ``` - */ - browser.ie7Compat = - (version == 7 && !document.documentMode) || document.documentMode == 7; - - /** - * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie6Compat ) { - * console.log( '当前浏览器运行在IE6模式或者怪异模式下' ); - * } - * ``` - */ - browser.ie6Compat = version < 7 || browser.quirks; - - browser.ie9above = version > 8; - - browser.ie9below = version < 9; - - 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; - } - } - - /** - * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号 - * @warning 如果浏览器不是chrome, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.chrome ) { - * console.log( '当前浏览器是Chrome' ); - * } - * ``` - */ - if (/chrome\/(\d+\.\d)/i.test(agent)) { - browser.chrome = +RegExp["\x241"]; - } - - /** - * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号 - * @warning 如果浏览器不是safari, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.safari ) { - * console.log( '当前浏览器是Safari' ); - * } - * ``` - */ - 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()); - - // WebKit 522+ (Safari 3+) - if (browser.webkit) - version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); - - /** - * @property { Number } version 检测当前浏览器版本号 - * @remind - *
      - *
    • IE系列返回值为5,6,7,8,9,10等
    • - *
    • gecko系列会返回10900,158900等
    • - *
    • webkit系列会返回其build号 (如 522等)
    • - *
    - * @example - * ```javascript - * console.log( '当前浏览器版本号是: ' + UE.browser.version ); - * ``` - */ - browser.version = version; - - /** - * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容 - * @example - * ```javascript - * if ( UE.browser.isCompatible ) { - * console.log( '浏览器与UEditor能够良好兼容' ); - * } - * ``` - */ - 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; - - -// core/utils.js -/** - * 工具函数包 - * @file - * @module UE.utils - * @since 1.2.6.1 - */ - -/** - * UEditor封装使用的静态工具函数 - * @module UE.utils - * @unfile - */ - -var utils = (UE.utils = { - /** - * 用给定的迭代器遍历对象 - * @method each - * @param { Object } obj 需要遍历的对象 - * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key - * @example - * ```javascript - * var demoObj = { - * key1: 1, - * key2: 2 - * }; - * - * //output: key1: 1, key2: 2 - * UE.utils.each( demoObj, funciton ( value, key ) { - * - * console.log( key + ":" + value ); - * - * } ); - * ``` - */ - - /** - * 用给定的迭代器遍历数组或类数组对象 - * @method each - * @param { Array } array 需要遍历的数组或者类数组 - * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key - * @example - * ```javascript - * var divs = document.getElmentByTagNames( "div" ); - * - * //output: 0: DIV, 1: DIV ... - * UE.utils.each( divs, funciton ( value, key ) { - * - * console.log( key + ":" + value.tagName ); - * - * } ); - * ``` - */ - 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 该对象将作为新创建对象的原型 - * @return { Object } 新的对象, 该对象的原型是给定的protoObject对象 - * @example - * ```javascript - * - * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } }; - * - * var newObject = UE.utils.makeInstance( protoObject ); - * //output: Hello UEditor! - * newObject.sayHello(); - * ``` - */ - 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 ); - * - * ``` - */ - - /** - * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与 - * 源对象属性名相同的属性值。 - * @method extend - * @param { Object } target 目标对象, 新的属性将附加到该对象上 - * @param { Object } source 源对象, 该对象的属性会被附加到target对象上 - * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性 - * @return { Object } 返回target对象 - * @example - * ```javascript - * - * var target = { name: 'target', sex: 1 }, - * source = { name: 'source', age: 17 }; - * - * UE.utils.extend( target, source, true ); - * - * //output: { name: 'target', sex: 1, age: 17 } - * console.log( target ); - * - * ``` - */ - extend: function(t, s, b) { - if (s) { - for (var k in s) { - if (!b || !t.hasOwnProperty(k)) { - t[k] = s[k]; - } - } - } - return t; - }, - - /** - * 将给定的多个对象的属性复制到目标对象target上 - * @method extend2 - * @remind 该方法将强制把源对象上的属性复制到target对象上 - * @remind 该方法支持两个及以上的参数, 从第二个参数开始, 其属性都会被复制到第一个参数上。 如果遇到同名的属性, - * 将会覆盖掉之前的值。 - * @param { Object } target 目标对象, 新的属性将附加到该对象上 - * @param { Object... } source 源对象, 支持多个对象, 该对象的属性会被附加到target对象上 - * @return { Object } 返回target对象 - * @example - * ```javascript - * - * var target = {}, - * source1 = { name: 'source', age: 17 }, - * source2 = { title: 'dev' }; - * - * UE.utils.extend2( target, source1, source2 ); - * - * //output: { name: 'source', age: 17, title: 'dev' } - * console.log( target ); - * - * ``` - */ - 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; - }, - - /** - * 模拟继承机制, 使得subClass继承自superClass - * @method inherits - * @param { Object } subClass 子类对象 - * @param { Object } superClass 超类对象 - * @warning 该方法只能让subClass继承超类的原型, subClass对象自身的属性和方法不会被继承 - * @return { Object } 继承superClass后的子类对象 - * @example - * ```javascript - * function SuperClass(){ - * this.name = "小李"; - * } - * - * SuperClass.prototype = { - * hello:function(str){ - * console.log(this.name + str); - * } - * } - * - * function SubClass(){ - * this.name = "小张"; - * } - * - * UE.utils.inherits(SubClass,SuperClass); - * - * var sub = new SubClass(); - * //output: '小张早上好! - * 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); - }, - - /** - * 用指定的context对象作为函数fn的上下文 - * @method bind - * @param { Function } fn 需要绑定上下文的函数对象 - * @param { Object } content 函数fn新的上下文对象 - * @return { Function } 一个新的函数, 该函数作为原始函数fn的代理, 将完成fn的上下文调换工作。 - * @example - * ```javascript - * - * var name = 'window', - * newTest = null; - * - * function test () { - * console.log( this.name ); - * } - * - * newTest = UE.utils.bind( test, { name: 'object' } ); - * - * //output: object - * newTest(); - * - * //output: window - * test(); - * - * ``` - */ - bind: function(fn, context) { - return function() { - return fn.apply(context, arguments); - }; - }, - - /** - * 创建延迟指定时间后执行的函数fn - * @method defer - * @param { Function } fn 需要延迟执行的函数对象 - * @param { int } delay 延迟的时间, 单位是毫秒 - * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, - * 而不能保证刚好到达延迟时间时执行。 - * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 - * @example - * ```javascript - * var start = 0; - * - * function test(){ - * console.log( new Date() - start ); - * } - * - * var testDefer = UE.utils.defer( test, 1000 ); - * // - * start = new Date(); - * //output: (大约在1000毫秒之后输出) 1000 - * testDefer(); - * ``` - */ - - /** - * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值, - * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。 - * @method defer - * @param { Function } fn 需要延迟执行的函数对象 - * @param { int } delay 延迟的时间, 单位是毫秒 - * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数,该值将决定是否取消执行前一次函数的执行, - * 值为true表示取消执行, 反之则将在执行前一次函数之后才执行本次函数调用。 - * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, - * 而不能保证刚好到达延迟时间时执行。 - * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 - * @example - * ```javascript - * - * function test(){ - * console.log(1); - * } - * - * var testDefer = UE.utils.defer( test, 1000, true ); - * - * //output: (两次调用仅有一次输出) 1 - * testDefer(); - * testDefer(); - * ``` - */ - defer: function(fn, delay, exclusion) { - var timerID; - return function() { - if (exclusion) { - clearTimeout(timerID); - } - timerID = setTimeout(fn, delay); - }; - }, - - /** - * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1 - * @method indexOf - * @remind 该方法的匹配过程使用的是恒等“===” - * @param { Array } array 需要查找的数组对象 - * @param { * } item 需要在目标数组中查找的值 - * @return { int } 返回item在目标数组array中首次出现的位置, 如果在数组中未找到item, 则返回-1 - * @example - * ```javascript - * var item = 1, - * arr = [ 3, 4, 6, 8, 1, 1, 2 ]; - * - * //output: 4 - * console.log( UE.utils.indexOf( arr, item ) ); - * ``` - */ - - /** - * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。 - * @method indexOf - * @remind 该方法的匹配过程使用的是恒等“===” - * @param { Array } array 需要查找的数组对象 - * @param { * } item 需要在目标数组中查找的值 - * @param { int } start 搜索的起始位置 - * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置, 如果在数组中未找到item, 则返回-1 - * @example - * ```javascript - * var item = 1, - * arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ]; - * - * //output: 9 - * 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; - }, - - /** - * 移除数组array中所有的元素item - * @method removeItem - * @param { Array } array 要移除元素的目标数组 - * @param { * } item 将要被移除的元素 - * @remind 该方法的匹配过程使用的是恒等“===” - * @example - * ```javascript - * var arr = [ 4, 5, 7, 1, 3, 4, 6 ]; - * - * UE.utils.removeItem( arr, 4 ); - * //output: [ 5, 7, 1, 3, 6 ] - * console.log( arr ); - * - * ``` - */ - 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 需要删除首尾空格的字符串 - * @return { String } 删除了首尾的空格后的字符串 - * @example - * ```javascript - * - * var str = " UEdtior "; - * - * //output: 9 - * console.log( str.length ); - * - * //output: 7 - * console.log( UE.utils.trim( " UEdtior " ).length ); - * - * //output: 9 - * console.log( str.length ); - * - * ``` - */ - trim: function(str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); - }, - - /** - * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 - * @method listToMap - * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 - * @param { String } str 该字符串将被以','分割为数组, 然后进行转化 - * @return { Object } 转化之后的hash对象 - * @example - * ```javascript - * - * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} - * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) ); - * - * ``` - */ - - /** - * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 - * @method listToMap - * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 - * @param { Array } arr 字符串数组 - * @return { Object } 转化之后的hash对象 - * @example - * ```javascript - * - * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} - * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) ); - * - * ``` - */ - 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 需要转义的字符串 - * @return { String } 转义后的字符串 - * @example - * ```javascript - * var html = '&'; - * - * //output: <body>&</body> - * console.log( UE.utils.unhtml( html ) ); - * - * ``` - */ - 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 - * @param { String } str 需要逆转义的字符串 - * @return { String } 逆转义后的字符串 - * @example - * ```javascript - * - * var str = '<body>&</body>'; - * - * //output: & - * console.log( UE.utils.html( str ) ); - * - * ``` - */ - 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样式名 - * @return { String } 转换成驼峰形式后的css样式名 - * @example - * ```javascript - * - * var str = 'border-top'; - * - * //output: borderTop - * console.log( UE.utils.cssStyleToDomStyle( str ) ); - * - * ``` - */ - 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(); - })) - ); - }; - })(), - - /** - * 动态加载文件到doc中 - * @method loadFile - * @param { DomDocument } document 需要加载资源文件的文档对象 - * @param { Object } options 加载资源文件的属性集合, 取值请参考代码示例 - * @example - * ```javascript - * - * UE.utils.loadFile( document, { - * src:"test.js", - * tag:"script", - * type:"text/javascript", - * defer:"defer" - * } ); - * - * ``` - */ - - /** - * 动态加载文件到doc中,加载成功后执行的回调函数fn - * @method loadFile - * @param { DomDocument } document 需要加载资源文件的文档对象 - * @param { Object } options 加载资源文件的属性集合, 该集合支持的值是script标签和style标签支持的所有属性。 - * @param { Function } fn 资源文件加载成功之后执行的回调 - * @warning 对于在同一个文档中多次加载同一URL的文件, 该方法会在第一次加载之后缓存该请求, - * 在此之后的所有同一URL的请求, 将会直接触发回调。 - * @example - * ```javascript - * - * UE.utils.loadFile( document, { - * src:"test.js", - * tag:"script", - * type:"text/javascript", - * defer:"defer" - * }, function () { - * console.log('加载成功'); - * } ); - * - * ``` - */ - 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(); - } - } - element.onload = element.onreadystatechange = null; - } - }; - element.onerror = function() { - throw Error( - "The load " + - (obj.href || obj.src) + - " fails,check the url settings of file neditor.config.js " - ); - }; - doc.getElementsByTagName("head")[0].appendChild(element); - }; - })(), - - /** - * 判断obj对象是否为空 - * @method isEmptyObject - * @param { * } obj 需要判断的对象 - * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空, - * 返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true - * @return { Boolean } 对象是否为空 - * @example - * ```javascript - * - * //output: true - * console.log( UE.utils.isEmptyObject( {} ) ); - * - * //output: true - * console.log( UE.utils.isEmptyObject( [] ) ); - * - * //output: true - * console.log( UE.utils.isEmptyObject( "" ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( { key: 1 } ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( [1] ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( "1" ) ); - * - * ``` - */ - 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格式的颜色值 - * @param { String } - * @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; - }, - /** - * 只针对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; - } - } - 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 + ";;" : ";"; - }); - }, - - /** - * 克隆对象 - * @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; - } - } - } - return target; - }, - - /** - * 把cm/pt为单位的值转换为px为单位的值 - * @method transUnitToPx - * @param { String } 待转换的带单位的字符串 - * @return { String } 转换为px为计量单位的值的字符串 - * @example - * ```javascript - * - * //output: 500px - * console.log( UE.utils.transUnitToPx( '20cm' ) ); - * - * //output: 27px - * console.log( UE.utils.transUnitToPx( '20pt' ) ); - * - * ``` - */ - 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, 那么回调函数将立刻执行 - * @param { Function } fn dom树ready之后的回调函数 - * @example - * ```javascript - * - * UE.utils.domReady( function () { - * - * console.log('123'); - * - * } ); - * - * ``` - */ - 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; - } - 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 } 节点名称 - * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上']) - * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null //给body添加背景颜色 - * @grammar UE.utils.cssRule('body') =>样式的字符串 //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc} - * @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; - }, - 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)); - } - } - } - result.push("}"); - return result.join(""); - } - } - }; - } - })(), - renderTplstr: function(tpl, data) { - return tpl.replace(/\$\{\s*(\w*?)\s*\}/g, function (match, variable) { - if (data.hasOwnProperty(variable)) { - return data[variable]; - } - }); - } -}); -/** - * 判断给定的对象是否是字符串 - * @method isString - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是字符串 - */ - -/** - * 判断给定的对象是否是数组 - * @method isArray - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是数组 - */ - -/** - * 判断给定的对象是否是一个Function - * @method isFunction - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Function - */ - -/** - * 判断给定的对象是否是Number - * @method isNumber - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Number - */ - -/** - * 判断给定的对象是否是一个正则表达式 - * @method isRegExp - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是正则表达式 - */ - -/** - * 判断给定的对象是否是一个普通对象 - * @method isObject - * @param { * } object 需要判断的对象 - * @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 + "]"; - }; - } -); - - -// core/EventBase.js -/** - * UE采用的事件基类 - * @file - * @module UE - * @class EventBase - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -/** - * UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。 - * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。 - * @unfile - * @module UE - * @class EventBase - */ - -/** - * 通过此构造器,子类可以继承EventBase获取事件监听的方法 - * @constructor - * @example - * ```javascript - * UE.EventBase.call(editor); - * ``` - */ -var EventBase = (UE.EventBase = function() {}); - -EventBase.prototype = { - /** - * 注册事件监听器 - * @method addListener - * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔 - * @param { Function } fn 监听的事件被触发时,会执行该回调函数 - * @waining 事件被触发时,监听的函数假如返回的值恒等于true,回调函数的队列中后面的函数将不执行 - * @example - * ```javascript - * editor.addListener('selectionchange',function(){ - * console.log("选区已经变化!"); - * }) - * editor.addListener('beforegetcontent aftergetcontent',function(type){ - * if(type == 'beforegetcontent'){ - * //do something - * }else{ - * //do something - * } - * console.log(this.getContent) // this是注册的事件的编辑器实例 - * }) - * ``` - * @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); - } - }, - - 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 移除的事件名称,同时移除多个事件使用空格分隔 - * @param { Function } fn 移除监听事件的函数引用 - * @example - * ```javascript - * //changeCallback为方法体 - * 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); - } - }, - - /** - * 触发事件 - * @method fireEvent - * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 - * @remind 该方法会触发addListener - * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 - * @example - * ```javascript - * editor.fireEvent("selectionchange"); - * ``` - */ - - /** - * 触发事件 - * @method fireEvent - * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 - * @param { *... } options 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数 - * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 - * @example - * ```javascript - * - * editor.addListener( "selectionchange", function ( type, arg1, arg2 ) { - * - * console.log( arg1 + " " + arg2 ); - * - * } ); - * - * //触发selectionchange事件, 会执行上面的事件监听器 - * //output: Hello World - * 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; - } - } - } - if ((t = this["on" + ti.toLowerCase()])) { - r = t.apply(this, arguments); - } - } - return r; - } -}; -/** - * 获得对象所拥有监听类型的所有监听器 - * @unfile - * @module UE - * @since 1.2.6.1 - * @method getListener - * @public - * @param { Object } obj 查询监听器的对象 - * @param { String } type 事件类型 - * @param { Boolean } force 为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组 - * @return { Array } 监听器数组 - */ -function getListener(obj, type, force) { - var allListeners; - type = type.toLowerCase(); - return ( - (allListeners = - obj.__allListeners || (force && (obj.__allListeners = {}))) && - (allListeners[type] || (force && (allListeners[type] = []))) - ); -} - - -// core/dtd.js -///import editor.js -///import core/dom/dom.js -///import core/utils.js -/** - * dtd html语义化的体现类 - * @constructor - * @namespace dtd - */ -var dtd = (dom.dtd = (function() { - function _(s) { - for (var k in s) { - s[k.toUpperCase()] = s[k]; - } - 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 - }); - - 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 - }); -})()); - - -// core/domUtils.js -/** - * Dom操作工具包 - * @file - * @module UE.dom.domUtils - * @since 1.2.6.1 - */ - -/** - * Dom操作工具包 - * @unfile - * @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; - } - tmpNode = parent[ltr]; - } - 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*/ - }, - /** - * 获取节点A相对于节点B的位置关系 - * @method getPosition - * @param { Node } nodeA 需要查询位置关系的节点A - * @param { Node } nodeB 需要查询位置关系的节点B - * @return { Number } 节点A与节点B的关系 - * @example - * ```javascript - * //output: 20 - * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body ); - * - * switch ( position ) { - * - * //0 - * case UE.dom.domUtils.POSITION_IDENTICAL: - * console.log('元素相同'); - * break; - * //1 - * case UE.dom.domUtils.POSITION_DISCONNECTED: - * console.log('两个节点在不同的文档中'); - * break; - * //2 - * case UE.dom.domUtils.POSITION_FOLLOWING: - * console.log('节点A在节点B之后'); - * break; - * //4 - * case UE.dom.domUtils.POSITION_PRECEDING; - * console.log('节点A在节点B之前'); - * break; - * //8 - * case UE.dom.domUtils.POSITION_IS_CONTAINED: - * console.log('节点A被节点B包含'); - * break; - * case 10: - * console.log('节点A被节点B包含且节点A在节点B之后'); - * break; - * //16 - * case UE.dom.domUtils.POSITION_CONTAINS: - * console.log('节点A包含节点B'); - * break; - * case 20: - * console.log('节点A包含节点B且节点A在节点B之前'); - * break; - * - * } - * ``` - */ - 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 需要检测的节点对象 - * @return { Number } 该节点在父节点中的位置 - * @see UE.dom.domUtils.getNodeIndex(Node,Boolean) - */ - - /** - * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点 - * @method getNodeIndex - * @param { Node } node 需要检测的节点对象 - * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点 - * @return { Number } 该节点在父节点中的位置 - * @example - * ```javascript - * - * var node = document.createElement("div"); - * - * node.appendChild( document.createTextNode( "hello" ) ); - * node.appendChild( document.createTextNode( "world" ) ); - * node.appendChild( node = document.createElement( "div" ) ); - * - * //output: 2 - * console.log( UE.dom.domUtils.getNodeIndex( node ) ); - * - * //output: 1 - * console.log( UE.dom.domUtils.getNodeIndex( node, true ) ); - * - * ``` - */ - 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++; - } - return i; - }, - - /** - * 检测节点node是否在给定的document对象上 - * @method inDoc - * @param { Node } node 需要检测的节点对象 - * @param { DomDocument } doc 需要检测的document对象 - * @return { Boolean } 该节点node是否在给定的document的dom树上 - * @example - * ```javascript - * - * var node = document.createElement("div"); - * - * //output: false - * console.log( UE.do.domUtils.inDoc( node, document ) ); - * - * document.body.appendChild( node ); - * - * //output: true - * console.log( UE.do.domUtils.inDoc( node, document ) ); - * - * ``` - */ - inDoc: function(node, doc) { - return domUtils.getPosition(node, doc) == 10; - }, - /** - * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, - * 查找的起点是给定node节点的父节点。 - * @method findParent - * @param { Node } node 需要查找的节点 - * @param { Function } filterFn 自定义的过滤方法。 - * @warning 查找的终点是到body节点为止 - * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 - * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 - * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL - * @example - * ```javascript - * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) { - * - * //由于查找的终点是body节点, 所以永远也不会匹配当前过滤器的条件, 即这里永远会返回false - * return node.tagName === "HTML"; - * - * } ); - * - * //output: true - * console.log( filterNode === null ); - * ``` - */ - - /** - * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, - * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点 - * @method findParent - * @param { Node } node 需要查找的节点 - * @param { Function } filterFn 自定义的过滤方法。 - * @param { Boolean } includeSelf 查找过程是否包含自身 - * @warning 查找的终点是到body节点为止 - * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 - * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 - * @remind 如果includeSelf为true, 则过滤器第一次执行时的参数会是节点本身。 - * 反之, 过滤器第一次执行时的参数将是该节点的父节点。 - * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL - * @example - * ```html - * - * - *
    - *
    - * - * - * - * ``` - */ - 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; - } - } - return null; - }, - /** - * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 - * @method findParentByTagName - * @param { Node } node 需要查找的节点对象 - * @param { Array } tagNames 需要查找的父节点的名称数组 - * @warning 查找的终点是到body节点为止 - * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); - * //output: BODY - * console.log( node.tagName ); - * ``` - */ - - /** - * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, - * 否则, 起点是node的父节点。 - * @method findParentByTagName - * @param { Node } node 需要查找的节点对象 - * @param { Array } tagNames 需要查找的父节点的名称数组 - * @param { Boolean } includeSelf 查找过程是否包含node节点自身 - * @warning 查找的终点是到body节点为止 - * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var queryTarget = document.getElementsByTagName("div")[0]; - * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); - * //output: true - * 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 - ); - }, - /** - * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 - * @method findParents - * @param { Node } node 需要查找的节点对象 - * @return { Array } 给定节点的祖先节点数组 - * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 - * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 - * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 - * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 - */ - - /** - * 查找节点node的祖先节点集合, 如果includeSelf的值为true, - * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 - * @method findParents - * @param { Node } node 需要查找的节点对象 - * @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(); - }, - - /** - * 在节点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); - }, - - /** - * 删除节点node及其下属的所有节点 - * @method remove - * @param { Node } node 需要删除的节点对象 - * @return { Node } 返回刚删除的节点对象 - * @example - * ```html - *
    - *
    你好
    - *
    - * - * ``` - */ - - /** - * 删除节点node,并根据keepChildren的值决定是否保留子节点 - * @method remove - * @param { Node } node 需要删除的节点对象 - * @param { Boolean } keepChildren 是否需要保留子节点 - * @return { Node } 返回刚删除的节点对象 - * @example - * ```html - *
    - *
    你好
    - *
    - * - * ``` - */ - 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); - } - return node; - }, - - /** - * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, - * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 - * @method getNextDomNode - * @param { Node } node 需要获取其后的兄弟节点的节点对象 - * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```html - * - *
    - * - *
    - * xxx - * - * - * ``` - * @example - * ```html - * - *
    - * - * xxx - *
    - * xxx - * - * - * ``` - */ - - /** - * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, - * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, - * 则执行
    getNextDomNode(Node node)的查找过程。 - * @method getNextDomNode - * @param { Node } node 需要获取其后的兄弟节点的节点对象 - * @param { Boolean } startFromChild 查找过程是否从其子节点开始 - * @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 - ); - }, - /** - * 检测节点node是否属是UEditor定义的bookmark节点 - * @method isBookmarkNode - * @private - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 是否是bookmark节点 - * @example - * ```html - * - * - * ``` - */ - isBookmarkNode: function(node) { - return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); - }, - /** - * 获取节点node所属的window对象 - * @method getWindow - * @param { Node } node 节点对象 - * @return { Window } 当前节点所属的window对象 - * @example - * ```javascript - * //output: true - * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); - * ``` - */ - getWindow: function(node) { - var doc = node.ownerDocument || node; - return doc.defaultView || doc.parentWindow; - }, - /** - * 获取离nodeA与nodeB最近的公共的祖先节点 - * @method getCommonAncestor - * @param { Node } nodeA 第一个节点 - * @param { Node } nodeB 第二个节点 - * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 - * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 - * @example - * ```javascript - * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); - * //output: true - * 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]; - }, - /** - * 清除node节点左右连续为空的兄弟inline节点 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * 则这些兄弟节点将被删除 - * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 - * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 - * @example - * ```html - * - *
    - * - * - * - * xxx - * - * - * - * ``` - */ - - /** - * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, - * 则忽略对右边兄弟节点的操作。 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 - * 则这些兄弟节点将被删除 - * @see UE.dom.domUtils.clearEmptySibling(Node) - */ - - /** - * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, - * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 - * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 - * 则这些兄弟节点将被删除 - * @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"); - }, - /** - * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 - * @method split - * @param { Node } textNode 需要拆分的文本节点对象 - * @param { int } offset 需要拆分的位置, 位置计算从0开始 - * @return { Node } 拆分后形成的新节点 - * @example - * ```html - *
    abcdef
    - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Boolean } 检测的节点是否为空 - * @example - * ```html - *
    - * - *
    - * - * ``` - */ - isWhitespace: function(node) { - return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test( - node.nodeValue - ); - }, - /** - * 获取元素element相对于viewport的位置坐标 - * @method getXY - * @param { Node } element 需要计算位置的节点对象 - * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, - * y代表垂直偏移距离。 - * - * @example - * ```javascript - * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); - * //output: test的坐标为: 12, 24 - * 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 }; - }, - /** - * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 - * @method on - * @param { Node } element 需要绑定事件的节点对象 - * @param { String } type 绑定的事件类型 - * @param { Function } handler 事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.on(document.body,"click",function(e){ - * //e为事件对象,this为被点击元素对戏那个 - * }); - * ``` - */ - - /** - * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 - * @method on - * @param { Node } element 需要绑定事件的节点对象 - * @param { Array } type 绑定的事件类型数组 - * @param { Function } handler 事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - 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; - }, - /** - * 解除DOM事件绑定 - * @method un - * @param { Node } element 需要解除事件绑定的节点对象 - * @param { String } type 需要接触绑定的事件类型 - * @param { Function } handler 对应的事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.un(document.body,"click",function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - - /** - * 解除DOM事件绑定 - * @method un - * @param { Node } element 需要解除事件绑定的节点对象 - * @param { Array } type 需要接触绑定的事件类型数组 - * @param { Function } handler 对应的事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - 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]; - } - } - } - }, - - /** - * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 - * @method isSameElement - * @param { Node } nodeA 需要比较的节点 - * @param { Node } nodeB 需要比较的节点 - * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 - * @example - * ```html - * ssss - * bbbbb - * ssss - * bbbbb - * - * - * ``` - */ - 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++; - } - 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; - } - } - // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 - if (ie) { - for (i = 0; (attrB = otherAttrs[i++]); ) { - if (attrB.specified) { - bl++; - } - } - if (al != bl) { - return false; - } - } - return true; - }, - - /** - * 判断节点nodeA与节点nodeB的元素的style属性是否一致 - * @method isSameStyle - * @param { Node } nodeA 需要比较的节点 - * @param { Node } nodeB 需要比较的节点 - * @return { Boolean } 两个节点是否具有相同的style属性值 - * @example - * ```html - * ssss - * bbbbb - * ssss - * bbbbb - * - * - * ``` - */ - 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 || !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; - }, - /** - * 检查节点node是否为block元素 - * @method isBlockElm - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 是否是block元素节点 - * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; - * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 - * @example - * ```html - * - * - *
    - * - * - * ``` - */ - 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元素 - * @return { Boolean } 给定的元素是否是body元素 - * @example - * ```javascript - * //output: true - * console.log( UE.dom.domUtils.isBody( document.body ) ); - * ``` - */ - isBody: function(node) { - return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body"; - }, - /** - * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, - * 拆分形成的两个节点之间是node节点 - * @method breakParent - * @param { Node } node 作为分界的节点对象 - * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 - * @return { Node } 给定的node分界节点 - * @example - * ```javascript - * - * var node = document.createElement("span"), - * wrapNode = document.createElement( "div" ), - * parent = document.createElement("p"); - * - * parent.appendChild( node ); - * wrapNode.appendChild( parent ); - * - * //拆分前 - * //output:

    - * console.log( wrapNode.innerHTML ); - * - * - * UE.dom.domUtils.breakParent( node, parent ); - * //拆分后 - * //output:

    - * console.log( wrapNode.innerHTML ); - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 - * @example - * ```html - * => 1 - * => 1 - * => 1 - * 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; - }, - - /** - * 删除node节点下首尾两端的空白文本子节点 - * @method trimWhiteTextNode - * @param { Element } node 需要执行删除操作的元素对象 - * @example - * ```javascript - * var node = document.createElement("div"); - * - * node.appendChild( document.createTextNode( "" ) ); - * - * node.appendChild( document.createElement("div") ); - * - * node.appendChild( document.createTextNode( "" ) ); - * - * //3 - * console.log( node.childNodes.length ); - * - * UE.dom.domUtils.trimWhiteTextNode( node ); - * - * //1 - * 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"); - }, - - /** - * 合并node节点下相同的子节点 - * @name mergeChild - * @desc - * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 - * @example - *

    xxaaxx

    - * ==> 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]; - } - } - } - 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); - } - } - - return arr; - }, - /** - * 将节点node提取到父节点上 - * @method mergeToParent - * @param { Element } node 需要提取的元素对象 - * @example - * ```html - *
    - *
    - * - *
    - *
    - * - * - * ``` - */ - 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; - } - }, - /** - * 合并节点node的左右兄弟节点 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - - /** - * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @param { Boolean } ignorePre 是否忽略合并左节点 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - - /** - * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @param { Boolean } ignorePre 是否忽略合并左节点 - * @param { Boolean } ignoreNext 是否忽略合并右节点 - * @remind 如果同时忽略左右节点, 则该操作什么也不会做 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - 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); - } - } - !ignorePre && merge("previousSibling", "firstChild", node); - !ignoreNext && merge("nextSibling", "lastChild", node); - }, - - /** - * 设置节点node及其子节点不会被选中 - * @method unSelectable - * @param { Element } node 需要执行操作的dom元素 - * @remind 执行该操作后的节点, 将不能被鼠标选中 - * @example - * ```javascript - * 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"); - } - } - } - : function(node) { - node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = - "none"; - }, - /** - * 删除节点node上的指定属性名称的属性 - * @method removeAttributes - * @param { Node } node 需要删除属性的节点对象 - * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 - * @example - * ```html - *
    - * xxxxx - *
    - * - * - * ``` - */ - - /** - * 删除节点node上的指定属性名称的属性 - * @method removeAttributes - * @param { Node } node 需要删除属性的节点对象 - * @param { Array } attrNames 需要删除的属性名数组 - * @example - * ```html - *
    - * xxxxx - *
    - * - * - * ``` - */ - 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节点创建 - * @param { String } tagName 需要创建的元素的标签名 - * @param { Object } attrs 新创建的元素的属性key-value集合 - * @return { Element } 新创建的元素对象 - * @example - * ```javascript - * var ele = UE.dom.domUtils.createElement( document, 'div', { - * id: 'test' - * } ); - * - * //output: DIV - * console.log( ele.tagName ); - * - * //output: test - * console.log( ele.id ); - * - * ``` - */ - createElement: function(doc, tag, attrs) { - return domUtils.setAttributes(doc.createElement(tag), attrs); - }, - /** - * 为节点node添加属性attrs,attrs为属性键值对 - * @method setAttributes - * @param { Element } node 需要设置属性的元素对象 - * @param { Object } attrs 需要设置的属性名-值对 - * @return { Element } 设置属性的元素对象 - * @example - * ```html - * - * - * - * - */ - setAttributes: function(node, attrs) { - for (var attr in attrs) { - if (attrs.hasOwnProperty(attr)) { - var value = attrs[attr]; - switch (attr) { - case "class": - //ie下要这样赋值,setAttribute不起作用 - node.className = value; - break; - case "style": - node.style.cssText = node.style.cssText + ";" + value; - break; - case "innerHTML": - node[attr] = value; - break; - case "value": - node.value = value; - break; - default: - node.setAttribute(attrFix[attr] || attr, value); - } - } - } - return node; - }, - - /** - * 获取元素element经过计算后的样式值 - * @method getComputedStyle - * @param { Element } element 需要获取样式的元素对象 - * @param { String } styleName 需要获取的样式名 - * @return { String } 获取到的样式值 - * @example - * ```html - * - * - * - * - * - * ``` - */ - 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)); - }, - /** - * 删除元素element指定的className - * @method removeClasses - * @param { Element } ele 需要删除class的元素节点 - * @param { String } classNames 需要删除的className, 多个className之间以空格分开 - * @example - * ```html - * xxx - * - * - * ``` - */ - - /** - * 删除元素element指定的className - * @method removeClasses - * @param { Element } ele 需要删除class的元素节点 - * @param { Array } classNames 需要删除的className数组 - * @example - * ```html - * xxx - * - * - * ``` - */ - 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的元素 - * @param { String } classNames 需要添加的className, 多个className之间以空格分割 - * @remind 相同的类名不会被重复添加 - * @example - * ```html - * - * - * - * ``` - */ - - /** - * 判断元素element是否包含给定的样式类名className - * @method hasClass - * @param { Node } ele 需要检测的元素 - * @param { Array } classNames 需要检测的className数组 - * @return { Boolean } 元素是否包含所有给定的className - * @example - * ```html - * - * - * - * ``` - */ - 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 需要阻止默认行为的事件对象 - * @example - * ```javascript - * UE.dom.domUtils.preventDefault( evt ); - * ``` - */ - preventDefault: function(evt) { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - }, - /** - * 删除元素element指定的样式 - * @method removeStyle - * @param { Element } element 需要删除样式的元素 - * @param { String } styleName 需要删除的样式名 - * @example - * ```html - * - * - * - * ``` - */ - 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"]); - } - }, - /** - * 获取元素element的style属性的指定值 - * @method getStyle - * @param { Element } element 需要获取属性值的元素 - * @param { String } styleName 需要获取的style的名称 - * @warning 该方法仅获取元素style属性中所标明的值 - * @return { String } 该元素包含指定的style属性值 - * @example - * ```html - *
    - * - * - * ``` - */ - getStyle: function(element, name) { - var value = element.style[utils.cssStyleToDomStyle(name)]; - return utils.fixColor(name, value); - }, - /** - * 为元素element设置样式属性值 - * @method setStyle - * @param { Element } element 需要设置样式的元素 - * @param { String } styleName 样式名 - * @param { String } styleValue 样式值 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 需要设置样式的元素 - * @param { Object } styles 样式名值对 - * @example - * ```html - *
    - * - * - * ``` - */ - 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"); - }, - /** - * 获取子节点的数量 - * @method getChildCount - * @param { Element } node 需要检测的元素 - * @return { Number } 给定的node元素的子节点数量 - * @example - * ```html - *
    - * - *
    - * - * - * ``` - */ - - /** - * 根据给定的过滤规则, 获取符合条件的子节点的数量 - * @method getChildCount - * @param { Element } node 需要检测的元素 - * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false - * @return { Number } 符合过滤条件的node元素的子节点数量 - * @example - * ```html - *
    - * - *
    - * - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Boolean } 节点是否为空 - * @example - * ```javascript - * UE.dom.domUtils.isEmptyNode( document.body ); - * ``` - */ - isEmptyNode: function(node) { - return ( - !node.firstChild || - domUtils.getChildCount(node, function(node) { - return ( - !domUtils.isBr(node) && - !domUtils.isBookmarkNode(node) && - !domUtils.isWhitespace(node) - ); - }) == 0 - ); - }, - 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 - }; - } - }; - 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"; - }, - /** - * 判断给定的节点是否是一个“填充”节点 - * @private - * @method isFillChar - * @param { Node } node 需要判断的节点 - * @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; - } - if (tmpNode) { - tmpRange.setStartBefore(tmpNode); - } else { - tmpRange.setStartBefore(tmpRange.startContainer); - } - } - } - return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; - }, - - /** - * 判断给定的元素是否是一个空元素 - * @method isEmptyBlock - * @param { Element } node 需要判断的元素 - * @return { Boolean } 是否是空元素 - * @example - * ```html - *
    - * - * - * ``` - */ - - /** - * 根据指定的判断规则判断给定的元素是否是一个空元素 - * @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"); - - 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 需要设置偏移量的元素 - * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 - * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 - * offset.top的距离 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 - * @param { DomDocument } doc 填充的节点所在的docment对象 - * @param { Node } node 需要填充的节点对象 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 源节点, 该节点下的所有子节点将被移除 - * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 - * @example - * ```html - *
    - * - *
    - *
    - *
    - *
    - * - * - * ``` - */ - - /** - * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” - * @method moveChild - * @param { Node } src 源节点, 该节点下的所有子节点将被移除 - * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 - * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 - * @example - * ```html - *
    - * - *
    - *
    - *
    - *
    - * - * - * ``` - */ - 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 - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 节点是否不包含任何属性 - * @example - * ```html - *
    xxxx
    - * - * - * ``` - */ - hasNoAttributes: function(node) { - return browser.ie - ? /^<\w+\s*?>/.test(node.outerHTML) - : node.attributes.length == 0; - }, - - /** - * 检测节点是否是UEditor所使用的辅助节点 - * @method isCustomeNode - * @private - * @param { Node } node 需要检测的节点 - * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 - * @return { Boolean } 给定的节点是否是一个辅助节点 - */ - isCustomeNode: function(node) { - return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); - }, - - /** - * 检测节点的标签是否是给定的标签 - * @method isTagNode - * @param { Node } node 需要检测的节点对象 - * @param { String } tagName 标签 - * @return { Boolean } 节点的标签是否是给定的标签 - * @example - * ```html - *
    - * - * - * ``` - */ - isTagNode: function(node, tagNames) { - return ( - node.nodeType == 1 && - new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) - ); - }, - - /** - * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false - * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: null - * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() !== 'div'; - * } ) ); - * ``` - */ - - /** - * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 - * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: null - * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); - * ``` - */ - - /** - * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 - * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false - * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 - * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 - * 过滤条件的节点数组或第一个节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: 3(假定有3个div) - * console.log( divNodes.length ); - * - * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() === 'div'; - * }, true ); - * - * //output: 3 - * console.log( nodes.length ); - * - * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() === 'div'; - * }, false ); - * - * //output: div - * 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; - }, - - /** - * 查询给定的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; - } - 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"); - - -// core/Range.js -/** - * Range封装 - * @file - * @module UE.dom - * @class Range - * @since 1.2.6.1 - */ - -/** - * dom操作封装 - * @unfile - * @module UE.dom - */ - -/** - * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 - * @unfile - * @module UE.dom - * @class Range - */ - -;(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 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; - } - 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(""))); - } - 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)) - ); - //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; - } - 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); - } - } - } 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; - } - - /** - * 创建一个跟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; - }); - - /** - * 删除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, ""); - } - } - } 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; - } - } - - Range.prototype = { - /** - * 克隆选区的内容到一个DocumentFragment里 - * @method cloneContents - * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - * ``` - */ - cloneContents: function() { - return this.collapsed ? null : execContentsAction(this, 0); - }, - - /** - * 删除当前选区范围中的所有内容 - * @method deleteContents - * @remind 执行完该操作后, 当前Range对象变成了闭合状态 - * @return { UE.dom.Range } 当前操作的Range对象 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - * ``` - */ - 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 执行该操作后, 选区将变成闭合状态 - * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 - * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - */ - extractContents: function() { - return this.collapsed ? null : execContentsAction(this, 2); - }, - - /** - * 设置Range的开始容器节点和偏移量 - * @method setStart - * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, - * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 - * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 - * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 - * 中的索引 - * @param { Node } node 将被设为当前选区开始边界容器的节点对象 - * @param { int } offset 选区的开始位置偏移量 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxxxxxxxxxx[xxx] - * - * - * ``` - * @example - * ```html - * - * xxx[xx]x - * - * - * ``` - */ - setStart: function(node, offset) { - return setEndPoint(true, node, offset, this); - }, - - /** - * 设置Range的结束容器和偏移量 - * @method setEnd - * @param { Node } node 作为当前选区结束边界容器的节点对象 - * @param { int } offset 结束边界的偏移量 - * @see UE.dom.Range:setStart(Node,int) - * @return { UE.dom.Range } 当前range对象 - */ - setEnd: function(node, offset) { - return setEndPoint(false, node, offset, this); - }, - - /** - * 将Range开始位置设置到node节点之后 - * @method setStartAfter - * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 - * @param { Node } node 选区的开始边界将紧接着该节点之后 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxxxx[xxxx] - * - * - * ``` - */ - setStartAfter: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, - - /** - * 将Range开始位置设置到node节点之前 - * @method setStartBefore - * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 - * @param { Node } node 新的选区开始位置在该节点之前 - * @see UE.dom.Range:setStartAfter(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setStartBefore: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); - }, - - /** - * 将Range结束位置设置到node节点之后 - * @method setEndAfter - * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setStartAfter(Node) - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * [xxxxxxx]xxxx - * - * - * ``` - */ - setEndAfter: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, - - /** - * 将Range结束位置设置到node节点之前 - * @method setEndBefore - * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setEndAfter(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setEndBefore: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); - }, - - /** - * 设置Range的开始位置到node节点内的第一个子节点之前 - * @method setStartAtFirst - * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 - * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setStartBefore(Node) - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - setStartAtFirst: function(node) { - return this.setStart(node, 0); - }, - - /** - * 设置Range的开始位置到node节点内的最后一个节点之后 - * @method setStartAtLast - * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 - * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 - * @param { Node } node 目标节点 - * @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 - ); - }, - - /** - * 设置Range的结束位置到node节点内的第一个节点之前 - * @method setEndAtFirst - * @param { Node } node 目标节点 - * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 - * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 - * @see UE.dom.Range:setStartAtFirst(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setEndAtFirst: function(node) { - return this.setEnd(node, 0); - }, - - /** - * 设置Range的结束位置到node节点内的最后一个节点之后 - * @method setEndAtLast - * @param { Node } node 目标节点 - * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 - * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 - * @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 - ); - }, - - /** - * 选中给定节点 - * @method selectNode - * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, - * 而endOffset为startOffset+1 - * @param { Node } node 需要选中的节点 - * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - selectNode: function(node) { - return this.setStartBefore(node).setEndAfter(node); - }, - - /** - * 选中给定节点内部的所有节点 - * @method selectNodeContents - * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, - * 而endOffset是该节点的子节点数。 - * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 - * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - 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); - }, - - /** - * 向当前选区的结束处闭合选区 - * @method collapse - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - - /** - * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, - * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 - * @method collapse - * @param { Boolean } toStart 是否向选区开始处闭合 - * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 - * @see UE.dom.Range:collapse() - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - 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对象 - * @example - * ```html - * xxxx[xxxxx] => xxxx[xxxxx] - * ``` - * - * @example - * ```html - * - * x[xx]xxx - * - * - * ``` - * - * @example - * ```html - * [xxxxxxxxxxx] => [xxxxxxxxxxx] - * ``` - */ - - /** - * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, - * 如果ignoreEnd的值为true,则忽略对结束位置的调整 - * @method shrinkBoundary - * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 - * @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; - }, - - /** - * 获取离当前选区内包含的所有节点最近的公共祖先节点, - * @method getCommonAncestor - * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @example - * ```html - * //选区示例 - * xxxx[xxx]xxxxxx - * - * ``` - */ - - /** - * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 - * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf - * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 - * @method getCommonAncestor - * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @see UE.dom.Range:getCommonAncestor() - * @example - * ```html - * - * - * - * xxxxxxxxx[xxx]xxxxxxxx - * - * - * - * - * ``` - */ - - /** - * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 - * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf - * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 - * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 - * @method getCommonAncestor - * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 - * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @see UE.dom.Range:getCommonAncestor() - * @see UE.dom.Range:getCommonAncestor(Boolean) - * @example - * ```html - * - * - * - * xxxxxxxx[x]xxxxxxxxxxx - * - * - * - * - * ``` - */ - 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 该操作有可能会引起文本节点被切开 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * //选区示例 - * xxx[xxxxx]xxx - * - * - * ``` - */ - - /** - * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, - * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 - * @method trimBoundary - * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * //选区示例 - * xxx[xxxxx]xxx - * - * - * ``` - */ - 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); - } - } - 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 - * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 - * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 - * @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); - } - } - } - - 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); - }, - - /** - * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 - * @method setCursor - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:collapse() - */ - - /** - * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 - * @method setCursor - * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, - * 反之,则向开始容器方向闭合 - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:collapse(Boolean) - */ - setCursor: function(toEnd, noFillData) { - return this.collapse(!toEnd).select(noFillData); - }, - - /** - * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 - * @method createBookmark - * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 - * 返回标记位置的ID, 反之则返回标记位置节点的引用 - * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, - * 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++); - - 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; - }, - - /** - * 调整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; - } - 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; - }, - /** - * 调整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; - }, - - /** - * 给range选区中的内容添加给定的inline标签 - * @method applyInlineStyle - * @param { String } tagName 需要添加的标签名 - * @example - * ```html - *

    xxxx[xxxx]x

    ==> range.applyInlineStyle("strong") ==>

    xxxx[xxxx]x

    - * ``` - */ - - /** - * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 - * @method applyInlineStyle - * @param { String } tagName 需要添加的标签名 - * @param { Object } attrs 跟随新添加的标签的属性 - * @return { UE.dom.Range } 当前选区 - * @example - * ```html - *

    xxxx[xxxx]x

    - * - * ==> - * - * - * range.applyInlineStyle("strong",{"style":"font-size:12px"}) - * - * ==> - * - *

    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; - } - 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); - }, - - /** - * 移除当前选区内指定的inline标签,但保留其中的内容 - * @method removeInlineStyle - * @param { String } tagName 需要移除的标签名 - * @return { UE.dom.Range } 当前的range对象 - * @example - * ```html - * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z - * ``` - */ - - /** - * 移除当前选区内指定的一组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); - }, - - /** - * 获取当前选中的自闭合的节点 - * @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; - }, - - /** - * 在页面上高亮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); - } - } 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; - }, - - /** - * 判断当前选区内容是否占位符 - * @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; - }, - - /** - * 保存 - * @method createAddress - * @private - * @return { Boolean } 返回开始和结束的位置 - * @example - * ```html - * - *

    - * aaaa - * - * - * bbbb - * - * - *

    - * - * - * - * ``` - */ - 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; - } - firstIndex++; - if (first.nodeType == 3) { - while (first && first.nodeType == 3) { - first = first.nextSibling; - } - } else { - first = first.nextSibling; - } - } - } - } - } 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; - }, - - /** - * 保存 - * @method createAddress - * @private - * @return { Boolean } 返回开始和结束的位置 - * @example - * ```html - * - *

    - * aaaa - * - * - * bbbb - * - * - *

    - * - * - * - * ``` - */ - 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; - }, - - /** - * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 - * 作为其参数。 - * @method traversal - * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * - * - * - * - * - * - * - * - * - * ``` - */ - - /** - * 遍历range内的节点。 - * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 - * 作为其参数。 - * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 - * 发doFn函数的执行 - * @method traversal - * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 - * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 - * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 - * 会触发doFn。 - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:traversal(Function) - * @example - * ```html - * - * - * - * - * - * - * - * - * - * - * ``` - */ - 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); - } - }; -})(); - - -// core/Selection.js -/** - * 选集 - * @file - * @module UE.dom - * @class Selection - * @since 1.2.6.1 - */ - -/** - * 选区集合 - * @unfile - * @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 }; - } - - 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 ? -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); - } - } - 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() { - try { - if (!_getIERange(me) && me._bakIERange) { - me._bakIERange.select(); - } - } catch (ex) {} - me._bakIERange = null; - }); - } - iframe = doc = null; - }); - - 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对象 - * @example - * ```javascript - * 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; - } - }, - - /** - * 获得ieRange - * @method getIERange - * @return { Object } 返回ie原生的Range - * @example - * ```javascript - * editor.selection.getIERange(); - * ``` - */ - 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(); - }, - - /** - * 获取选区开始位置的父节点到body - * @method getStartElementPath - * @return { Array } 返回父节点集合 - * @example - * ```javascript - * 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 []; - }, - - /** - * 清空缓存 - * @method clear - */ - 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; - } - }, - - /** - * 获取选区对应的Range - * @method getRange - * @return { Object } 得到Range对象 - * @example - * ```javascript - * 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); - } - } - - 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 } 获得开始元素 - * @example - * ```javascript - * 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; - }, - - /** - * 得到选区中的文本 - * @method getText - * @return { String } 选区中包含的文本 - * @example - * ```javascript - * 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 ""; - }, - - /** - * 清除选区 - * @method clearRange - * @example - * ```javascript - * editor.selection.clearRange(); - * ``` - */ - clearRange: function() { - this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); - } - }; -})(); - - -// core/Editor.js -/** - * 编辑器主类,包含编辑器提供的大部分公用接口 - * @file - * @module UE - * @class Editor - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -/** - * UEditor的核心类,为用户提供与编辑器交互的接口。 - * @unfile - * @module UE - * @class Editor - */ - -;(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; - } - } - } else { - textarea = editor.textarea; - } - } - 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; - - me.fireEvent("langReady"); - } - - /** - * 编辑器准备就绪后会触发该事件 - * @module UE - * @class Editor - * @event ready - * @remind render方法执行完成之后,会触发该事件 - * @remind - * @example - * ```javascript - * editor.addListener( 'ready', function( editor ) { - * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 - * } ); - * ``` - */ - /** - * 执行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 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 - * @example - * ```javascript - * editor.addListener( 'selectionchange', function( editor ) { - * 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到一个容器,编辑器实例才能正常渲染到页面 - * @example - * ```javascript - * var editor = new UE.Editor(); - * editor.execCommand('blod'); - * ``` - * @see UE.Config - */ - - /** - * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 - * @constructor - * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 - * @param { Object } setting 创建编辑器的参数 - * @example - * ```javascript - * var editor = new UE.Editor(); - * editor.execCommand('blod'); - * ``` - * @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)); - - /* 尝试异步加载后台配置 */ - //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", - 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; - }, - /** - * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 - * @method ready - * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 - * 立即触发该回调。 - * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 - * @example - * ```javascript - * editor.ready( function( editor ) { - * editor.setContent('初始化完毕'); - * } ); - * ``` - * @see UE.Editor.event:ready - */ - ready: function(fn) { - var me = this; - if (fn) { - me.isReady ? fn.apply(me) : me.addListener("ready", fn); - } - }, - /** - * 该方法用于设置placeholder - * @method setPlaceholder - * @param { String } placeholder 编辑器的placeholder文案 - * @example - * ```javascript - * editor.setPlaceholder('请输入内容'); - * ``` - */ - setPlaceholder: function(){ - - function contentChange(){ - var localHtml = this.getPlainTxt(); - if(!localHtml.trim()){ - UE.dom.domUtils.addClass( this.body, 'empty' ); - }else{ - UE.dom.domUtils.removeClasses( this.body, 'empty' ); - } - } - - return function(placeholder){ - var _editor = this; - - _editor.ready(function () { - contentChange.call(_editor); - _editor.body.setAttribute('placeholder', placeholder); - }); - _editor.removeListener('keyup contentchange', contentChange); - _editor.addListener('keyup contentchange', contentChange); - } - }(), - - /** - * 该方法是提供给插件里面使用,设置配置项默认值 - * @method setOpt - * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 - * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 - * @param { String } key 编辑器的可接受的选项名称 - * @param { * } val 该选项可接受的值 - * @example - * ```javascript - * editor.setOpt( 'initContent', '欢迎使用编辑器' ); - * ``` - */ - - /** - * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 - * @method setOpt - * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 - * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 - * @param { Object } options 将要设置的选项的键值对对象 - * @example - * ```javascript - * editor.setOpt( { - * 'initContent': '欢迎使用编辑器' - * } ); - * ``` - */ - 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 - * ```javascript - * 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 = ""; - } - - 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 - * @remind 执行该方法,会触发ready事件 - * @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; - } - - 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 html = - (ie && browser.version < 9 ? "" : "") + - "" + - "" + - "" + - (options.iframeCssUrl - ? "" - : "") + - (options.initialStyle - ? "" - : "") + - "" + - "" + - "" + - (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"; - } - }); - } - }, - - /** - * 编辑器初始化 - * @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; - } - } 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项 - * @method sync - * @example - * ```javascript - * editor.sync(); - * form.sumbit(); //form变量已经指向了form元素 - * ``` - */ - - /** - * 根据传入的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); - }, - - /** - * 设置编辑器高度 - * @method setHeight - * @remind 当配置项autoHeightEnabled为真时,该方法无效 - * @param { Number } number 设置的高度值,纯数值,不带单位 - * @example - * ```javascript - * 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"); - }, - - /** - * 为编辑器的编辑命令提供快捷键 - * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 - * @method addshortcutkey - * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 - * @example - * ```javascript - * editor.addshortcutkey({ - * "Bold" : "ctrl+66",//^B - * "Italic" : "ctrl+73", //^I - * }); - * ``` - */ - /** - * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 - * @method addshortcutkey - * @param { String } cmd 触发快捷键时,响应的命令 - * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 - * @example - * ```javascript - * 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); - }, - - /** - * 对编辑器设置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); - } - } - } - } - }); - }, - - /** - * 获取编辑器的内容 - * @method getContent - * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 - * @example - * ```javascript - * //编辑器html内容:

    123456

    - * var content = editor.getContent(); //返回值:

    123456

    - * ``` - */ - - /** - * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 - * @method getContent - * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, - * 代表当前编辑器的内容是否空, - * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 - * 经过内置过滤规则处理后的内容。 - * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 - * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @return { String } 编辑器的内容字符串 - * @example - * ```javascript - * // editor 是一个编辑器的实例 - * var content = editor.getContent( function ( editor ) { - * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 - * } ); - * ``` - */ - 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文档字符串 - * @eaxmple - * ```javascript - * 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) + - "" - ); - }, - - /** - * 得到编辑器的纯文本内容,但会保留段落格式 - * @method getPlainTxt - * @return { String } 编辑器带段落格式的纯文本内容字符串 - * @example - * ```javascript - * //编辑器html内容:

    1

    2

    - * 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, " "); - }, - - /** - * 获取编辑器中的纯文本内容,没有段落格式 - * @method getContentTxt - * @return { String } 编辑器不带段落格式的纯文本内容字符串 - * @example - * ```javascript - * //编辑器html内容:

    1

    2

    - * 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, " "); - }, - - /** - * 设置编辑器的内容,可修改编辑器当前的html内容 - * @method setContent - * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @warning 该方法会触发selectionchange事件 - * @param { String } html 要插入的html内容 - * @example - * ```javascript - * editor.getContent('

    test

    '); - * ``` - */ - - /** - * 设置编辑器的内容,可修改编辑器当前的html内容 - * @method setContent - * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @warning 该方法会触发selectionchange事件 - * @param { String } html 要插入的html内容 - * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 - * @example - * ```javascript - * //假设设置前的编辑器内容是

    old text

    - * editor.setContent('

    new text

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

    old text

    new text

    - * ``` - */ - setContent: function(html, isAppendTo, notFireSelectionchange) { - var me = this; - - me.fireEvent("beforesetcontent", html); - var root = UE.htmlparser(html); - me.filterInputRule(root); - html = root.toHtml(); - - 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; - } - if (p.firstChild) { - if (!child) { - me.body.appendChild(p); - break; - } else { - child.parentNode.insertBefore(p, child); - p = me.document.createElement("p"); - } - } - child = child.nextSibling; - } - } - } - 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); - } - }, - - /** - * 让编辑器获得焦点,默认focus到编辑器头部 - * @method focus - * @example - * ```javascript - * editor.focus() - * ``` - */ - - /** - * 让编辑器获得焦点,toEnd确定focus位置 - * @method focus - * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 - * @example - * ```javascript - * 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); - } 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 { - sel.removeAllRanges(); - } - - //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); - }); - }, - /** - * 触发事件代理 - * @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() - ); - }, - /** - * 变化选区 - * @method _selectionChange - * @private - */ - _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); - }, - - /** - * 执行编辑命令 - * @method _callCmdFn - * @private - * @param { String } fnName 函数名称 - * @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); - } - }, - - /** - * 执行编辑命令cmdName,完成富文本编辑效果 - * @method execCommand - * @param { String } cmdName 需要执行的命令 - * @remind 具体命令的使用请参考命令列表 - * @return { * } 返回命令函数运行的返回值 - * @example - * ```javascript - * editor.execCommand(cmdName); - * ``` - */ - execCommand: function(cmdName) { - cmdName = cmdName.toLowerCase(); - var me = this; - var result; - var 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 需要查询的命令名称 - * @remind 具体命令的使用请参考命令列表 - * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) - * @example - * ```javascript - * editor.queryCommandState(cmdName) => (-1|0|1) - * ``` - * @see COMMAND.LIST - */ - queryCommandState: function(cmdName) { - return this._callCmdFn("queryCommandState", arguments); - }, - - /** - * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 - * @method queryCommandValue - * @param { String } cmdName 需要查询的命令名称 - * @remind 具体命令的使用请参考命令列表 - * @remind 只有部分插件有此方法 - * @return { * } 返回每个命令特定的当前状态值 - * @grammar editor.queryCommandValue(cmdName) => {*} - * @see COMMAND.LIST - */ - queryCommandValue: function(cmdName) { - return this._callCmdFn("queryCommandValue", arguments); - }, - - /** - * 检查编辑区域中是否有内容 - * @method hasContents - * @remind 默认有文本内容,或者有以下节点都不认为是空 - * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param - * @return { Boolean } 检查有内容返回true,否则返回false - * @example - * ```javascript - * editor.hasContents() - * ``` - */ - - /** - * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true - * @method hasContents - * @param { Array } tags 传入数组判断时用到的节点类型 - * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false - * @example - * ```javascript - * 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; - } - } - } - return false; - }, - - /** - * 重置编辑器,可用来做多个tab使用同一个编辑器实例 - * @method reset - * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 - * @example - * ```javascript - * editor.reset() - * ``` - */ - reset: function() { - this.fireEvent("reset"); - }, - - /** - * 设置当前编辑区域可以编辑 - * @method setEnabled - * @example - * ```javascript - * 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(); - }, - - /** 设置当前编辑区域不可编辑 - * @method setDisabled - */ - - /** 设置当前编辑区域不可编辑,except中的命令除外 - * @method setDisabled - * @param { String } except 例外命令的字符串 - * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 - * @example - * ```javascript - * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 - * ``` - */ - - /** 设置当前编辑区域不可编辑,except中的命令除外 - * @method setDisabled - * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 - * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 - * @example - * ```javascript - * 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); - }, - - /** - * 设置默认内容 - * @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); - } - } - - return function(cont) { - var me = this; - me.body.innerHTML = '

    ' + cont + "

    "; - - me.addListener("firstBeforeExecCommand focus", clear); - }; - })(), - - /** - * 显示编辑器 - * @method setShow - * @example - * ```javascript - * 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(); - }, - /** - * 隐藏编辑器 - * @method setHide - * @example - * ```javascript - * 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(); - }, - - /** - * 根据指定的路径,获取对应的语言资源 - * @method getLang - * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 - * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 - * @example - * ```javascript - * 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; - }, - - /** - * 计算编辑器html内容字符串的长度 - * @method getContentLength - * @return { Number } 返回计算的长度 - * @example - * ```javascript - * //编辑器html内容

    132

    - * editor.getContentLength() //返回27 - * ``` - */ - /** - * 计算编辑器当前纯文本内容的长度 - * @method getContentLength - * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 - * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 - * @example - * ```javascript - * //编辑器html内容

    132

    - * 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; - }, - - /** - * 注册输入过滤规则 - * @method addInputRule - * @param { Function } rule 要添加的过滤规则 - * @example - * ```javascript - * editor.addInputRule(function(root){ - * $.each(root.getNodesByTagName('div'),function(i,node){ - * node.tagName="p"; - * }); - * }); - * ``` - */ - addInputRule: function(rule) { - this.inputRules.push(rule); - }, - - /** - * 执行注册的过滤规则 - * @method filterInputRule - * @param { UE.uNode } root 要过滤的uNode节点 - * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 - * @example - * ```javascript - * editor.filterInputRule(editor.body); - * ``` - * @see UE.Editor:addInputRule - */ - filterInputRule: function(root) { - for (var i = 0, ci; (ci = this.inputRules[i++]); ) { - ci.call(this, root); - } - }, - - /** - * 注册输出过滤规则 - * @method addOutputRule - * @param { Function } rule 要添加的过滤规则 - * @example - * ```javascript - * editor.addOutputRule(function(root){ - * $.each(root.getNodesByTagName('p'),function(i,node){ - * node.tagName="div"; - * }); - * }); - * ``` - */ - addOutputRule: function(rule) { - this.outputRules.push(rule); - }, - - /** - * 根据输出过滤规则,过滤编辑器内容 - * @method filterOutputRule - * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 - * @param { UE.uNode } root 要过滤的uNode节点 - * @example - * ```javascript - * editor.filterOutputRule(editor.body); - * ``` - * @see UE.Editor:addOutputRule - */ - filterOutputRule: function(root) { - for (var i = 0, ci; (ci = this.outputRules[i++]); ) { - ci.call(this, root); - } - }, - - /** - * 根据action名称获取请求的路径 - * @method getActionUrl - * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 - * @param { String } action action名称 - * @example - * ```javascript - * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" - * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" - * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" - * 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"); - /* if (!serverUrl && imageUrl) { - serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); - } - - if (serverUrl) { - serverUrl = - serverUrl + - (serverUrl.indexOf("?") == -1 ? "?" : "&") + - "action=" + - (actionName || ""); - return utils.formatUrl(serverUrl); - } else { - return ""; - } */ - - if (serverUrl) { - serverUrl = serverUrl + "?"; - 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", - 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 + "i18n/", - 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" - ) - ); - - 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); - 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' - //}); - } - }; - - 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); - } - }; -})(); - - -// core/ajax.js -/** - * @file - * @module UE.ajax - * @since 1.2.6.1 - */ - -/** - * 提供对ajax请求的支持 - * @module UE.ajax - */ -UE.ajax = (function() { - //创建一个ajaxRequest对象 - var fnStr = "XMLHttpRequest()"; - try { - 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]) - ); - } - } - } - return strArr.join("&"); - } - - function doAjax(url, ajaxOptions) { - var xhr = creatAjaxRequest(), - //是否超时 - timeIsOut = false, - //默认参数 - defaultAjaxOptions = { - method: "POST", - timeout: 5000, - async: true, - 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; - - 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 (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); - - 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 - * @param { URLString } url ajax请求的url地址 - * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: - * @example - * ```javascript - * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 - * UE.ajax.requeset( 'sayhello.php', { - * - * //请求方法。可选值: 'GET', 'POST',默认值是'POST' - * method: 'GET', - * - * //超时时间。 默认为5000, 单位是ms - * timeout: 10000, - * - * //是否是异步请求。 true为异步请求, false为同步请求 - * async: true, - * - * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 - * data: { - * name: 'neditor' - * }, - * - * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 - * onsuccess: function ( xhr ) { - * console.log( xhr.responseText ); - * }, - * - * //请求失败或者超时后的回调。 - * onerror: function ( xhr ) { - * alert( 'Ajax请求失败' ); - * } - * - * } ); - * ``` - */ - - /** - * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 - * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 - * @method request - * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 - * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: - * @example - * ```javascript - * - * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 - * UE.ajax.requeset( 'sayhello.php', { - * - * //请求的地址, 该项是必须的。 - * url: 'sayhello.php' - * - * } ); - * ``` - */ - 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/filterword.js -/** - * UE过滤word的静态方法 - * @file - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @module UE - */ - -/** - * 根据传入html字符串过滤word - * @module UE - * @since 1.2.6.1 - * @method filterWord - * @param { String } html html字符串 - * @return { String } 已过滤后的结果字符串 - * @example - * ```javascript - * 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; - } - - 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); - - for (var i = 0, v; (v = s[i]); i++) { - var name, - value, - parts = v.split(":"); - - 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; - } - - 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 (!/]/.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 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] ? "/" : "") + - ">" - ); - //插入新行 - 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); - } - 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); - } - } - 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; - } - } - } - } - - 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字符串 - * @example - * ```javascript - * node.toHtml(); - * ``` - */ - - /** - * 当前节点对象,转换成html文本 - * @method toHtml - * @param { Boolean } formatter 是否格式化返回值 - * @return { String } 返回转换后的html字符串 - * @example - * ```javascript - * node.toHtml( true ); - * ``` - */ - toHtml: function(formatter) { - var arr = []; - nodeToHtml(this, arr, formatter, 0); - return arr.join(""); - }, - - /** - * 获取节点的html内容 - * @method innerHTML - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @return { String } 返回节点的html内容 - * @example - * ```javascript - * var htmlstr = node.innerHTML(); - * ``` - */ - - /** - * 设置节点的html内容 - * @method innerHTML - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @param { String } htmlstr 传入要设置的html内容 - * @return { UE.uNode } 返回节点本身 - * @example - * ```javascript - * 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(); - } - }, - - /** - * 获取节点的纯文本内容 - * @method innerText - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @return { String } 返回节点的存文本内容 - * @example - * ```javascript - * var textStr = node.innerText(); - * ``` - */ - - /** - * 设置节点的纯文本内容 - * @method innerText - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @param { String } textStr 传入要设置的文本内容 - * @return { UE.uNode } 返回节点本身 - * @example - * ```javascript - * 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, ""); - } - }, - - /** - * 获取当前对象的data属性 - * @method getData - * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 - * @example - * ```javascript - * node.getData(); - * ``` - */ - getData: function() { - if (this.type == "element") return ""; - return this.data; - }, - - /** - * 获取当前节点下的第一个子节点 - * @method firstChild - * @return { UE.uNode } 返回第一个子节点 - * @example - * ```javascript - * node.firstChild(); //返回第一个子节点 - * ``` - */ - firstChild: function() { - // if (this.type != 'element' || dtd.$empty[this.tagName]) { - // return this; - // } - return this.children ? this.children[0] : null; - }, - - /** - * 获取当前节点下的最后一个子节点 - * @method lastChild - * @return { UE.uNode } 返回最后一个子节点 - * @example - * ```javascript - * node.lastChild(); //返回最后一个子节点 - * ``` - */ - 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 } 返回前一个节点 - * @example - * ```javascript - * 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]; - } - } - }, - - /** - * 获取和当前节点有相同父亲节点的后一个节点 - * @method nextSibling - * @return { UE.uNode } 返回后一个节点,找不到返回null - * @example - * ```javascript - * 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]; - } - } - }, - - /** - * 用新的节点替换当前节点 - * @method replaceChild - * @param { UE.uNode } target 要替换成该节点参数 - * @param { UE.uNode } source 要被替换掉的节点 - * @return { UE.uNode } 返回替换之后的节点对象 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在节点的子节点列表最后位置插入一个节点 - * @method appendChild - * @param { UE.uNode } node 要插入的节点 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - }, - - /** - * 在传入节点的前面插入一个节点 - * @method insertBefore - * @param { UE.uNode } target 要插入的节点 - * @param { UE.uNode } source 在该参数节点前面插入 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在传入节点的后面插入一个节点 - * @method insertAfter - * @param { UE.uNode } target 要插入的节点 - * @param { UE.uNode } source 在该参数节点后面插入 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 从当前节点的子节点列表中,移除节点 - * @method removeChild - * @param { UE.uNode } node 要移除的节点引用 - * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 - * @return { * } 返回刚移除的子节点 - * @example - * ```javascript - * 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; - } - } - return ci; - } - } - } - }, - - /** - * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 - * @method getAttr - * @param { String } attrName 要获取的属性名称 - * @return { * } 返回attrs对象下的属性值 - * @example - * ```javascript - * node.getAttr('title'); - * ``` - */ - getAttr: function(attrName) { - return this.attrs && this.attrs[attrName.toLowerCase()]; - }, - - /** - * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 - * @method setAttr - * @param { String } attrName 要设置的属性名称 - * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 - * @return { * } 返回attrs对象下的属性值 - * @example - * ```javascript - * 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; - } - } - }, - - /** - * 获取当前节点在父节点下的位置索引 - * @method getIndex - * @return { Number } 返回索引数值,如果没有父节点,返回-1 - * @example - * ```javascript - * 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; - }, - - /** - * 在当前节点下,根据id查找节点 - * @method getNodeById - * @param { String } id 要查找的id - * @return { UE.uNode } 返回找到的节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在当前节点下,根据元素名称查找节点列表 - * @method getNodesByTagName - * @param { String } tagNames 要查找的元素名称 - * @return { Array } 返回找到的节点列表 - * @example - * ```javascript - * 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; - }, - - /** - * 根据样式名称,获取节点的样式值 - * @method getStyle - * @param { String } name 要获取的样式名称 - * @return { String } 返回样式值 - * @example - * ```javascript - * 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 ""; - }, - - /** - * 给节点设置样式 - * @method setStyle - * @param { String } name 要设置的的样式名称 - * @param { String } val 要设置的的样值 - * @example - * ```javascript - * 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; - } - } - - 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 遍历到节点的时,传入节点作为参数,运行此函数 - * @example - * ```javascript - * traversal(node, function(){ - * console.log(node.type); - * }); - * ``` - */ - traversal: function(fn) { - if (this.children && this.children.length) { - nodeTraversal(this, fn); - } - return this; - } - }; -})(); - - -// core/htmlparser.js -/** - * html字符串转换成uNode节点 - * @file - * @module UE - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -/** - * html字符串转换成uNode节点的静态方法 - * @method htmlparser - * @param { String } htmlstr 要转换的html代码 - * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 - * @return { uNode } 给定的html片段转换形成的uNode对象 - * @example - * ```javascript - * var root = UE.htmlparser('

    htmlparser

    ', true); - * ``` - */ - -var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { - //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 " - ); - } - html.push(""); - } - //禁止指定table-width - 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; - - //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" - }; - - 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)); - } - } - - 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; -}); - - -// core/filternode.js -/** - * UE过滤节点的静态方法 - * @file - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @module UE - */ - -/** - * 根据传入节点和过滤规则过滤相应节点 - * @module UE - * @since 1.2.6.1 - * @method filterNode - * @param { Object } root 指定root节点 - * @param { Object } rules 过滤规则json对象 - * @example - * ```javascript - * 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); - } - }); - 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); - } - } - 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; - }; -})()); - - -// core/plugin.js -/** - * Created with JetBrains PhpStorm. - * User: campaign - * Date: 10/8/13 - * 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); - } - }); - } - } 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); - } - } - }; -})(); - - -// core/keymap.js -var keymap = (UE.keymap = { - Backspace: 8, - Tab: 9, - Enter: 13, - - Shift: 16, - Control: 17, - Alt: 18, - CapsLock: 20, - - Esc: 27, - - Spacebar: 32, - - PageUp: 33, - PageDown: 34, - End: 35, - Home: 36, - - Left: 37, - Up: 38, - Right: 39, - Down: 40, - - Insert: 45, - - Del: 46, - - NumLock: 144, - - Cmd: 91, - - "=": 187, - "-": 189, - - b: 66, - i: 73, - //回退 - z: 90, - y: 89, - //粘贴 - v: 86, - x: 88, - - s: 83, - - n: 78 -}); - - -// core/localstorage.js -//存储媒介封装 -var LocalStorage = (UE.LocalStorage = (function() { - var storage = window.localStorage || getUserData() || null, - LOCAL_FILE = "localStorage"; - - return { - saveLocalData: function(key, data) { - if (storage && data) { - storage.setItem(key, data); - return true; - } - - return false; - }, - - getLocalData: function(key) { - if (storage) { - return storage.getItem(key); - } - - return null; - }, - - removeItem: function(key) { - storage && storage.removeItem(key); - } - }; - - function getUserData() { - var container = document.createElement("div"); - container.style.display = "none"; - - if (!container.addBehavior) { - return null; - } - - container.addBehavior("#default#userdata"); - - return { - getItem: function(key) { - var result = null; - - try { - document.body.appendChild(container); - container.load(LOCAL_FILE); - result = container.getAttribute(key); - document.body.removeChild(container); - } catch (e) {} - - return result; - }, - - setItem: function(key, value) { - document.body.appendChild(container); - container.setAttribute(key, value); - container.save(LOCAL_FILE); - document.body.removeChild(container); - }, - - //// 暂时没有用到 - //clear: function () { - // - // var expiresTime = new Date(); - // expiresTime.setFullYear(expiresTime.getFullYear() - 1); - // document.body.appendChild(container); - // container.expires = expiresTime.toUTCString(); - // container.save(LOCAL_FILE); - // document.body.removeChild(container); - // - //}, - - removeItem: function(key) { - document.body.appendChild(container); - container.removeAttribute(key); - container.save(LOCAL_FILE); - document.body.removeChild(container); - } - }; - } -})()); - -;(function() { - var ROOTKEY = "ueditor_preference"; - - UE.Editor.prototype.setPreferences = function(key, value) { - var obj = {}; - if (utils.isString(key)) { - obj[key] = value; - } else { - obj = key; - } - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - utils.extend(data, obj); - } else { - data = obj; - } - data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); - }; - - UE.Editor.prototype.getPreferences = function(key) { - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - return key ? data[key] : data; - } - return null; - }; - - UE.Editor.prototype.removePreferences = function(key) { - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - data[key] = undefined; - delete data[key]; - } - data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); - }; -})(); - - -// plugins/defaultfilter.js -///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); - // } - }); - }); - - //从编辑器出去的内容处理 - 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: "" - }); - } - } - } - }); - }); -}; - - -// plugins/inserthtml.js -/** - * 插入html字符串插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入html代码 - * @command inserthtml - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } html 插入的html字符串 - * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 - * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 - * @example - * ```javascript - * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 - * //执行命令,插入CC - * //插入后的效果 xxxCCxxx - * //

    xx|xxx

    当前选区为闭合状态 - * //插入

    CC

    - * //结果

    xx

    CC

    xxx

    - * //

    xxxx

    |

    xxx

    当前选区在两个p标签之间 - * //插入 xxxx - * //结果

    xxxx

    xxxx

    xxx

    - * ``` - */ - -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"; - - 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; - } - 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 { - 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; - } - } - - 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); - } -}; - - -// plugins/autotypeset.js -/** - * 自动排版 - * @file - * @since 1.2.6.1 - */ - -/** - * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 - * @command autotypeset - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'autotypeset' ); - * ``` - */ - -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 - } - }); - - 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) { - 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"); - - 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); - } - }); - 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); - } - }); - 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) { - me.addListener("beforepaste", autotype); - } - autotype.call(me); - } - }; -}; - - -// plugins/autosubmit.js -/** - * 快捷键提交 - * @file - * @since 1.2.6.1 - */ - -/** - * 提交表单 - * @command autosubmit - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'autosubmit' ); - * ``` - */ - -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(); - } - } - } - } - }; -}); - - -// plugins/background.js -/** - * 背景插件,为UEditor提供设置背景功能 - * @file - * @since 1.2.6.1 - */ -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); - } - } - //重写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 - } - } - }; -}); - - -// plugins/image.js -/** - * 图片插入、排版插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 图片对齐方式 - * @command imagefloat - * @method execCommand - * @remind 值center为独占一行居中 - * @param { String } cmd 命令字符串 - * @param { String } align 对齐方式,可传left、right、none、center - * @remaind center表示图片独占一行 - * @example - * ```javascript - * editor.execCommand( 'imagefloat', 'center' ); - * ``` - */ - -/** - * 如果选区所在位置是图片区域 - * @command imagefloat - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回图片对齐方式 - * @example - * ```javascript - * editor.queryCommandValue( 'imagefloat' ); - * ``` - */ - -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", ""); - } - } - - 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") { - var 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.getElementsByClassName("_img_parent_tmp")[0]; - tmpNode.removeAttribute("class"); - 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"); - - 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; - - startNode = range.getClosedNode(); - if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { - return 0; - } - return -1; - } -}; - -/** - * 插入图片 - * @command insertimage - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 - * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, - * 此时数组的每一个元素都是一个Object类型的图片属性集合。 - * @example - * ```javascript - * editor.execCommand( 'insertimage', { - * src:'a/b/c.jpg', - * width:'100', - * height:'100' - * } ); - * ``` - * @example - * ```javascript - * editor.execCommand( 'insertimage', [{ - * src:'a/b/c.jpg', - * width:'100', - * height:'100' - * },{ - * src:'a/b/d.jpg', - * width:'100', - * height:'100' - * }] ); - * ``` - */ - -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("word_img") - ) { - 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); - } -}; - - -// plugins/justify.js -/** - * 段落格式 - * @file - * @since 1.2.6.1 - */ - -/** - * 段落对齐方式 - * @command justify - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 - * @example - * ```javascript - * editor.execCommand( 'justify', 'center' ); - * ``` - */ -/** - * 如果选区所在位置是段落区域,返回当前段落对齐方式 - * @command justify - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回段落对齐方式 - * @example - * ```javascript - * editor.queryCommandValue( 'justify' ); - * ``` - */ - -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); - }; - - 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; - } - }; -}; - - -// plugins/font.js -/** - * 字体颜色,背景色,字号,字体,下划线,删除线 - * @file - * @since 1.2.6.1 - */ - -/** - * 字体颜色 - * @command forecolor - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 色值(必须十六进制) - * @example - * ```javascript - * editor.execCommand( 'forecolor', '#000' ); - * ``` - */ -/** - * 返回选区字体颜色 - * @command forecolor - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体颜色 - * @example - * ```javascript - * editor.queryCommandValue( 'forecolor' ); - * ``` - */ - -/** - * 字体背景颜色 - * @command backcolor - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 色值(必须十六进制) - * @example - * ```javascript - * editor.execCommand( 'backcolor', '#000' ); - * ``` - */ -/** - * 返回选区字体颜色 - * @command backcolor - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体背景颜色 - * @example - * ```javascript - * editor.queryCommandValue( 'backcolor' ); - * ``` - */ - -/** - * 字体大小 - * @command fontsize - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 字体大小 - * @example - * ```javascript - * editor.execCommand( 'fontsize', '14px' ); - * ``` - */ -/** - * 返回选区字体大小 - * @command fontsize - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体大小 - * @example - * ```javascript - * editor.queryCommandValue( 'fontsize' ); - * ``` - */ - -/** - * 字体样式 - * @command fontfamily - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 字体样式 - * @example - * ```javascript - * editor.execCommand( 'fontfamily', '微软雅黑' ); - * ``` - */ -/** - * 返回选区字体样式 - * @command fontfamily - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体样式 - * @example - * ```javascript - * editor.queryCommandValue( 'fontfamily' ); - * ``` - */ - -/** - * 字体下划线,与删除线互斥 - * @command underline - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'underline' ); - * ``` - */ - -/** - * 字体删除线,与下划线互斥 - * @command strikethrough - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'strikethrough' ); - * ``` - */ - -/** - * 字体边框 - * @command fontborder - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'fontborder' ); - * ``` - */ - -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] - }); - - 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) { - rng.traversal(function(node){ - var start; - if(domUtils.isTagNode(node,'span')){ - start = node; - }else{ - start = domUtils.getElementsByTagName(node,'span')[0]; - } - 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); - } - }); - } - } - } - 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); - } - 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) - ); - }); - if (parent && !/background-color/.test(span.style.cssText)) { - span.style.backgroundColor = parent.style.backgroundColor; - } - } - }); - 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"; - }); - // 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.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; - - 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); - - 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); - } - - 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; - } - 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]); - } -}; - - -// plugins/link.js -/** - * 超链接 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入超链接 - * @command link - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } options 设置自定义属性,例如:url、title、target - * @example - * ```javascript - * editor.execCommand( 'link', '{ - * url:'neditor.baidu.com', - * title:'neditor', - * target:'_blank' - * }' ); - * ``` - */ -/** - * 返回当前选中的第一个超链接节点 - * @command link - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { Element } 超链接节点 - * @example - * ```javascript - * editor.queryCommandValue( 'link' ); - * ``` - */ - -/** - * 取消超链接 - * @command unlink - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'unlink'); - * ``` - */ - -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; - } - } 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; - } - }; -}; - - -// plugins/iframe.js -///import core -///import plugins\inserthtml.js -///commands 插入框架 -///commandsName InsertFrame -///commandsTitle 插入Iframe -///commandsDialog dialogs\insertframe - -UE.plugins["insertframe"] = function() { - var me = this; - function deleteIframe() { - me._iframe && delete me._iframe; - } - - me.addListener("selectionchange", function() { - deleteIframe(); - }); -}; - - -// plugins/scrawl.js -///import core -///commands 涂鸦 -///commandsName Scrawl -///commandsTitle 涂鸦 -///commandsDialog dialogs\scrawl -UE.commands["scrawl"] = { - queryCommandState: function() { - return browser.ie && browser.version <= 8 ? -1 : 0; - } -}; - - -// plugins/removeformat.js -/** - * 清除格式 - * @file - * @since 1.2.6.1 - */ - -/** - * 清除文字样式 - * @command removeformat - * @method execCommand - * @param { String } cmd 命令字符串 - * @param {String} tags 以逗号隔开的标签。如:strong - * @param {String} style 样式如:color - * @param {String} attrs 属性如:width - * @example - * ```javascript - * editor.execCommand( 'removeformat', 'strong','color','width' ); - * ``` - */ - -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); - } - } else { - //trace:939 不能把list上的样式去掉 - if ( - !dtd.$tableContent[current.tagName] && - !dtd.$list[current.tagName] - ) { - domUtils.removeAttributes(current, removeFormatAttributes); - if (isRedundantSpan(current)) { - domUtils.remove(current, true); - } - } - } - } - 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(); - } - }; -}; - - -// plugins/blockquote.js -/** - * 添加引用 - * @file - * @since 1.2.6.1 - */ - -/** - * 添加引用 - * @command blockquote - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'blockquote' ); - * ``` - */ - -/** - * 添加引用 - * @command blockquote - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } attrs 节点属性 - * @example - * ```javascript - * editor.execCommand( 'blockquote',{ - * style: "color: red;" - * } ); - * ``` - */ - -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(); - - 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; - } - }; -}; - - -// plugins/convertcase.js -/** - * 大小写转换 - * @file - * @since 1.2.6.1 - */ - -/** - * 把选区内文本变大写,与“tolowercase”命令互斥 - * @command touppercase - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'touppercase' ); - * ``` - */ - -/** - * 把选区内文本变小写,与“touppercase”命令互斥 - * @command tolowercase - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'tolowercase' ); - * ``` - */ -UE.commands["touppercase"] = UE.commands["tolowercase"] = { - 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(); - } -}; - - -// plugins/indent.js -/** - * 首行缩进 - * @file - * @since 1.2.6.1 - */ - -/** - * 缩进 - * @command indent - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'indent' ); - * ``` - */ -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; - } -}; - - -// plugins/print.js -/** - * 打印 - * @file - * @since 1.2.6.1 - */ - -/** - * 打印 - * @command print - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'print' ); - * ``` - */ -UE.commands["print"] = { - execCommand: function() { - this.window.print(); - }, - notNeedUndo: 1 -}; - - -// plugins/preview.js -/** - * 预览 - * @file - * @since 1.2.6.1 - */ - -/** - * 预览 - * @command preview - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'preview' ); - * ``` - */ -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 -}; - - -// plugins/selectall.js -/** - * 全选 - * @file - * @since 1.2.6.1 - */ - -/** - * 选中所有内容 - * @command selectall - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * 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 - }; - - //快捷键 - me.addshortcutkey({ - selectAll: "ctrl+65" - }); -}; - - -// plugins/paragraph.js -/** - * 段落样式 - * @file - * @since 1.2.6.1 - */ - -/** - * 段落格式 - * @command paragraph - * @method execCommand - * @param { String } cmd 命令字符串 - * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' - * @param {Object} attrs 标签的属性 - * @example - * ```javascript - * editor.execCommand( 'Paragraph','h1','{ - * class:'test' - * }' ); - * ``` - */ - -/** - * 返回选区内节点标签名 - * @command paragraph - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 节点标签名 - * @example - * ```javascript - * editor.queryCommandValue( 'Paragraph' ); - * ``` - */ - -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; - }, - queryCommandValue: function() { - var node = domUtils.filterNodeList( - this.selection.getStartElementPath(), - "p h1 h2 h3 h4 h5 h6" - ); - return node ? node.tagName.toLowerCase() : ""; - } - }; -}; - - -// plugins/directionality.js -/** - * 设置文字输入的方向的插件 - * @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); - }, - 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; - } - - current = domUtils.getNextDomNode(current, false, filterFn); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); - } - } - return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); - }; - - /** - * 文字输入方向 - * @command directionality - * @method execCommand - * @param { String } cmdName 命令字符串 - * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 - * @example - * ```javascript - * editor.execCommand( 'directionality', 'ltr'); - * ``` - */ - - /** - * 查询当前选区的文字输入方向 - * @command directionality - * @method queryCommandValue - * @param { String } cmdName 命令字符串 - * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 - * @example - * ```javascript - * 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); - } - - range.select(); - return true; - }, - queryCommandValue: function() { - var node = getObj(this); - return node ? node.getAttribute("dir") : "ltr"; - } - }; -})(); - - -// plugins/horizontal.js -/** - * 插入分割线插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入分割线 - * @command horizontal - * @method execCommand - * @param { String } cmdName 命令字符串 - * @example - * ```javascript - * 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(); - } - } - } - } - 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; - } - } - }); -}; - - -// plugins/time.js -/** - * 插入时间和日期 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入时间,默认格式:12:59:59 - * @command time - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'time'); - * ``` - */ - -/** - * 插入日期,默认格式:2013-08-30 - * @command date - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'date'); - * ``` - */ -UE.commands["time"] = UE.commands["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); - } - - this.execCommand( - "insertHtml", - cmd == "time" ? formatTime(date, format) : formatDate(date, format) - ); - } -}; - - -// plugins/rowspacing.js -/** - * 段前段后间距插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 设置段间距 - * @command rowspacing - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 段间距的值,以px为单位 - * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 - * @example - * ```javascript - * editor.execCommand( 'rowspacing', '10', 'top' ); - * ``` - */ - -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; - } - }; -}; - - -// plugins/lineheight.js -/** - * 设置行内间距 - * @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"] }); - - /** - * 行距 - * @command lineheight - * @method execCommand - * @param { String } cmdName 命令字符串 - * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 - * @example - * ```javascript - * editor.execCommand( 'lineheight', 1.5); - * ``` - */ - /** - * 查询当前选区内容的行高大小 - * @command lineheight - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回当前行高大小 - * @example - * ```javascript - * editor.queryCommandValue( 'lineheight' ); - * ``` - */ - - 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, ""); - } - } - }; -}; - - -// plugins/insertcode.js -/** - * 插入代码插件 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["insertcode"] = function() { - var me = this; - me.ready(function() { - utils.cssRule( - "pre", - "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", - me.document - ); - }); - 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" - }); - - /** - * 插入代码 - * @command insertcode - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } lang 插入代码的语言 - * @example - * ```javascript - * editor.execCommand( 'insertcode', 'javascript' ); - * ``` - */ - - /** - * 如果选区所在位置是插入插入代码区域,返回代码的语言 - * @command insertcode - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回代码的语言 - * @example - * ```javascript - * editor.queryCommandValue( 'insertcode' ); - * ``` - */ - - 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"; - } - } - } 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; - } - }); -}; - - -// plugins/cleardoc.js -/** - * 清空文档插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 清空文档 - * @command cleardoc - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor 是编辑器实例 - * editor.execCommand('cleardoc'); - * ``` - */ - -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); - } - setTimeout(function() { - me.fireEvent("clearDoc"); - }, 0); - } -}; - - -// plugins/anchor.js -/** - * 锚点插件,为UEditor提供插入锚点支持 - * @file - * @since 1.2.6.1 - */ -UE.plugin.register("anchor", function () { - var me = this; - 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: 16px;}", - 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); - } - } else { - if (name) { - //只在选区的开始插入 - var anchor = utils.renderTplstr('', { - name: name - }); - me.execCommand("inserthtml", anchor, true); - } - } - } - } - } - }; -}); - - -// plugins/wordcount.js -///import core -///commands 字数统计 -///commandsName WordCount,wordCount -///commandsTitle 字数统计 -/* - * Created by JetBrains WebStorm. - * User: taoqili - * Date: 11-9-7 - * Time: 下午8:18 - * 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() { - 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); - }); - }); -}; - - -// plugins/pagebreak.js -/** - * 分页功能插件 - * @file - * @since 1.2.6.1 - */ -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; - - 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( - '
    ' - ); - 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 - * @param { String } cmd 命令字符串 - * @remind 在表格中插入分页符会把表格切分成两部分 - * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, - * 以便于提交数据到服务器端后处理分页。 - * @example - * ```javascript - * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak - * ``` - */ - - 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 { - 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); - } - } - }; -}; - - -// plugins/wordimage.js -///import core -///commands 本地图片引导上传 -///commandsName WordImage -///commandsTitle 本地图片引导上传 -///commandsDialog dialogs\wordimage - -UE.plugin.register("wordimage", function() { - var me = this, - images = []; - 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("word_img"); - 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("word_img")) { - 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/notadd/images/spacer.gif"; - if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { - img.setAttr({ - width: attrs.width, - height: attrs.height, - alt: attrs.alt, - word_img: 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" - }); - } - }); - } - }; -}); - - -// 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(); - - 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.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"); - } - } - } - }); -}; - - -// plugins/undo.js -/** - * undo redo - * @file - * @since 1.2.6.1 - */ - -/** - * 撤销上一次执行的命令 - * @command undo - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'undo' ); - * ``` - */ - -/** - * 重做上一次执行的命令 - * @command redo - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'redo' ); - * ``` - */ - -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; - } - - 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; - } - 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.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); - } - }, 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; - - function initZeroClipboard() { - ZeroClipboard.config({ - debug: false, - swfPath: - me.options.UEDITOR_HOME_URL + - "third-party/zeroclipboard/ZeroClipboard.swf" - }); - - var client = (me.zeroclipboard = new ZeroClipboard()); - - // 复制内容 - 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(); - }); - - // 触发事件 - 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")); - } - } - } - } - }; -}); - - -// plugins/paste.js -///import core -///import plugins/inserthtml.js -///import plugins/undo.js -///import plugins/serialize.js -///commands 粘贴 -///commandsName PastePlain -///commandsTitle 纯文本粘贴模式 -/** - * @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; - } - } - } - 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 - ); - } 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")); - } - } - }; -}; - - -// plugins/puretxtpaste.js -/** - * 纯文本粘贴插件 - * @file - * @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); - } - } - } - 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 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.queryCommandState( 'pasteplain' ); - * ``` - */ - - /** - * 查询当前是否处于纯文本粘贴模式 - * @command pasteplain - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果处于纯文本模式,返回1,否则,返回0 - * @example - * ```javascript - * editor.queryCommandState( 'pasteplain' ); - * ``` - */ - me.commands["pasteplain"] = { - queryCommandState: function() { - return pasteplain ? 1 : 0; - }, - execCommand: function() { - pasteplain = !pasteplain | 0; - }, - notNeedUndo: 1 - }; -}; - - -// plugins/list.js -/** - * 有序列表,无序列表插件 - * @file - * @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) { - 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 - * @param { String } command 命令字符串 - * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 - * @example - * ```javascript - * editor.execCommand( 'insertorderedlist','decimal'); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertorderedlist - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果当前选区是有序列表返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'insertorderedlist' ); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertorderedlist - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 - * @example - * ```javascript - * editor.queryCommandValue( 'insertorderedlist' ); - * ``` - */ - - /** - * 无序列表,与“insertorderedlist”命令互斥 - * @command insertunorderedlist - * @method execCommand - * @param { String } command 命令字符串 - * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot - * @example - * ```javascript - * editor.execCommand( 'insertunorderedlist','circle'); - * ``` - */ - /** - * 查询当前是否有word文档粘贴进来的图片 - * @command insertunorderedlist - * @method insertunorderedlist - * @param { String } command 命令字符串 - * @return { int } 如果当前选区是无序列表返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'insertunorderedlist' ); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertunorderedlist - * @method queryCommandValue - * @param { String } command 命令字符串 - * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot - * @example - * ```javascript - * editor.queryCommandValue( 'insertunorderedlist' ); - * ``` - */ - - 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); - } - 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; - } - } - - 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); - 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; - } - }; -}; - - -// plugins/source.js -/** - * 源码编辑插件 - * @file - * @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; - }, - 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 - }); - 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); - } - - var bakCssText; - //解决在源码模式下getContent不能得到最新的内容问题 - var oldGetContent, bakAddress; - - /** - * 切换源码模式和编辑模式 - * @command source - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'source'); - * ``` - */ - - /** - * 查询当前编辑区域的状态是源码模式还是可视化模式 - * @command source - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'source' ); - * ``` - */ - - 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()); - } - } - 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); - }; - - 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" - }); - }); - } - }; -})(); - - -// plugins/enterkey.js -///import core -///import plugins/undo.js -///commands 设置回车标签p或br -///commandsName EnterKey -///commandsTitle 设置回车标签p或br -/** - * @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; - - //修正在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(); - } - } - //没有站位符,会出现多行的问题 - 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(); - } 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(); - - //处理全选的情况 - 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 - ) { - 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(); - } - } - } - }); -}; - - -// plugins/fiximgclick.js -///import core -///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 -///commandsName FixImgClick -///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 }; - } - - (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] - ]; - - Scale.prototype = { - init: function(editor) { - var me = this; - me.editor = editor; - me.startPos = this.prePos = { x: 0, y: 0 }; - me.dragId = -1; - - var hands = [], - cover = (me.cover = document.createElement("div")), - resizer = (me.resizer = document.createElement("div")); - - 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(); - }); - - 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 + - ";"; - - 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); - - var doc = me.editor.document; - domUtils.setStyles(resizer, { - width: target.width + "px", - height: target.height + "px", - left: - iframePos.x + - imgPos.x - - (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0) - - editorPos.x - - parseInt(resizer.style.borderLeftWidth) + - "px", - top: - iframePos.y + - imgPos.y - - (doc.documentElement.scrollTop || doc.body.scrollTop || 0) - - 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") { - if ( - img.className.indexOf("edui-faked-music") != -1 || - 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); - } - }, - 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(); - } - }); - } - }; -})(); - - -// plugins/autolink.js -///import core -///commands 为非ie浏览器自动添加a标签 -///commandsName AutoLink -///commandsTitle 自动增加链接 -/** - * @description 为非ie浏览器自动添加a标签 - * @author zhanyi - */ - -UE.plugin.register( - "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; - - 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; - } - - 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); - - 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(); - } - } - } - } - } - : {}; - }, - 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; - - 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; - } - } - 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); - } - } - } - }); - } -); - - -// plugins/autoheight.js -///import core -///commands 当输入内容超过编辑器高度时,编辑器自动增高 -///commandsName AutoHeight,autoHeightEnabled -///commandsTitle 自动增高 -/** - * @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() { - 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; - } - } -}; - - -// plugins/autofloat.js -///import core -///commands 悬浮工具栏 -///commandsName AutoFloat,autoFloatEnabled -///commandsTitle 悬浮工具栏 -/** - * 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; - - //如果不固定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; - } - - 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); - //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar - var scrollBox = document.getElementById("scrollBox"); - if (scrollBox) { - domUtils.un(scrollBox, ['scroll','resize'], 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); - //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar - var scrollBox = document.getElementById("scrollBox"); - if (scrollBox) { - domUtils.on(scrollBox, ['scroll','resize'], 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); - }); - } - }); -}; - - -// plugins/video.js -/** - * video插件, 为UEditor提供视频插入支持 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["video"] = function() { - var me = this; - - /** - * 创建插入视频字符窜 - * @param url 视频地址 - * @param width 视频宽度 - * @param height 视频高度 - * @param align 视频对齐 - * @param toEmbed 是否以flash代替显示 - * @param addParagraph 是否需要添加P 标签 - */ - function creatInsertStr(url, width, height, id, align, classname, type) { - var str; - switch (type) { - case "image": - str = - "'; - break; - case "embed": - str = - ''; - break; - case "video": - var ext = url.substr(url.lastIndexOf(".") + 1); - if (ext == "ogv") ext = "ogg"; - str = - "' + - ''; - break; - } - return str; - } - - function switchImgAndVideo(root, img2video) { - utils.each( - root.getNodesByTagName(img2video ? "img" : "embed video"), - function(node) { - var className = node.getAttr("class"); - if (className && className.indexOf("edui-faked-video") != -1) { - var html = creatInsertStr( - img2video ? node.getAttr("_url") : node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - null, - node.getStyle("float") || "", - className, - img2video ? "embed" : "image" - ); - node.parentNode.replaceChild(UE.uNode.createElement(html), node); - } - if (className && className.indexOf("edui-upload-video") != -1) { - var html = creatInsertStr( - img2video ? node.getAttr("_url") : node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - null, - node.getStyle("float") || "", - className, - img2video ? "video" : "image" - ); - node.parentNode.replaceChild(UE.uNode.createElement(html), node); - } - } - ); - } - - me.addOutputRule(function(root) { - switchImgAndVideo(root, true); - }); - me.addInputRule(function(root) { - switchImgAndVideo(root); - }); - - /** - * 插入视频 - * @command insertvideo - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 - * @example - * ```javascript - * - * var videoAttr = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * }; - * - * //editor 是编辑器实例 - * //向编辑器插入单个视频 - * editor.execCommand( 'insertvideo', videoAttr ); - * ``` - */ - - /** - * 插入视频 - * @command insertvideo - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 - * @example - * ```javascript - * - * var videoAttr1 = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * }, - * videoAttr2 = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * } - * - * //editor 是编辑器实例 - * //该方法将会向编辑器内插入两个视频 - * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); - * ``` - */ - - /** - * 查询当前光标所在处是否是一个视频 - * @command insertvideo - * @method queryCommandState - * @param { String } cmd 需要查询的命令字符串 - * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 - * @example - * ```javascript - * - * //editor 是编辑器实例 - * editor.queryCommandState( 'insertvideo' ); - * ``` - */ - me.commands["insertvideo"] = { - execCommand: function(cmd, videoObjs, type) { - videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]; - - if (me.fireEvent("beforeinsertvideo", videoObjs) === true) { - return; - } - - var html = [], - id = "tmpVedio", - cl; - for (var i = 0, vi, len = videoObjs.length; i < len; i++) { - vi = videoObjs[i]; - cl = type == "upload" - ? "edui-upload-video video-js vjs-default-skin" - : "edui-faked-video"; - html.push( - creatInsertStr( - vi.url, - vi.width || 420, - vi.height || 280, - id + i, - null, - cl, - "image" - ) - ); - } - me.execCommand("inserthtml", html.join(""), true); - var rng = this.selection.getRange(); - for (var i = 0, len = videoObjs.length; i < len; i++) { - var img = this.document.getElementById("tmpVedio" + i); - domUtils.removeAttributes(img, "id"); - rng.selectNode(img).select(); - me.execCommand("imagefloat", videoObjs[i].align); - } - - me.fireEvent("afterinsertvideo", videoObjs); - }, - queryCommandState: function() { - var img = me.selection.getRange().getClosedNode(), - flag = - img && - (img.className == "edui-faked-video" || - img.className.indexOf("edui-upload-video") != -1); - return flag ? 1 : 0; - } - }; -}; - - -// plugins/table.core.js -/** - * Created with JetBrains WebStorm. - * User: taoqili - * Date: 13-1-18 - * Time: 上午11:09 - * To change this template use File | Settings | File Templates. - */ -/** - * UE表格操作类 - * @param table - * @constructor - */ -;(function() { - var UETable = (UE.UETable = function(table) { - this.table = table; - this.indexTable = []; - this.selectedTds = []; - this.cellsRange = {}; - this.update(table); - }); - - //===以下为静态工具方法=== - UETable.removeSelectedClass = function(cells) { - utils.each(cells, function(cell) { - domUtils.removeClasses(cell, "selectTdClass"); - }); - }; - UETable.addSelectedClass = function(cells) { - utils.each(cells, function(cell) { - domUtils.addClass(cell, "selectTdClass"); - }); - }; - UETable.isEmptyBlock = function(node) { - var reg = new RegExp(domUtils.fillChar, "g"); - if ( - node[browser.ie ? "innerText" : "textContent"] - .replace(/^\s*$/, "") - .replace(reg, "").length > 0 - ) { - return 0; - } - for (var i in dtd.$isNotEmpty) - if (dtd.$isNotEmpty.hasOwnProperty(i)) { - if (node.getElementsByTagName(i).length) { - return 0; - } - } - return 1; - }; - UETable.getWidth = function(cell) { - if (!cell) return 0; - return parseInt(domUtils.getComputedStyle(cell, "width"), 10); - }; - - /** - * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 - * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; - * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 - * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null - */ - UETable.getTableCellAlignState = function(cells) { - !utils.isArray(cells) && (cells = [cells]); - - var result = {}, - status = ["align", "valign"], - tempStatus = null, - isSame = true; //状态是否相同 - - utils.each(cells, function(cellNode) { - utils.each(status, function(currentState) { - tempStatus = cellNode.getAttribute(currentState); - - if (!result[currentState] && tempStatus) { - result[currentState] = tempStatus; - } else if ( - !result[currentState] || - tempStatus !== result[currentState] - ) { - isSame = false; - return false; - } - }); - - return isSame; - }); - - return isSame ? result : null; - }; - - /** - * 根据当前选区获取相关的table信息 - * @return {Object} - */ - UETable.getTableItemsByRange = function(editor) { - var start = editor.selection.getStart(); - - //ff下会选中bookmark - if ( - start && - start.id && - start.id.indexOf("_baidu_bookmark_start_") === 0 && - start.nextSibling - ) { - start = start.nextSibling; - } - - //在table或者td边缘有可能存在选中tr的情况 - var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), - tr = cell && cell.parentNode, - table = tr && domUtils.findParentByTagName(tr, ["table"]), - caption = table && table.getElementsByTagName("caption")[0]; - - return { - cell: cell, - tr: tr, - table: table, - caption: caption - }; - }; - UETable.getUETableBySelected = function(editor) { - var table = UETable.getTableItemsByRange(editor).table; - if (table && table.ueTable && table.ueTable.selectedTds.length) { - return table.ueTable; - } - return null; - }; - - UETable.getDefaultValue = function(editor, table) { - var borderMap = { - thin: "0px", - medium: "1px", - thick: "2px" - }, - tableBorder, - tdPadding, - tdBorder, - tmpValue; - if (!table) { - table = editor.document.createElement("table"); - table.insertRow(0).insertCell(0).innerHTML = "xxx"; - editor.body.appendChild(table); - var td = table.getElementsByTagName("td")[0]; - tmpValue = domUtils.getComputedStyle(table, "border-left-width"); - tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "padding-left"); - tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "border-left-width"); - tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - domUtils.remove(table); - return { - tableBorder: tableBorder, - tdPadding: tdPadding, - tdBorder: tdBorder - }; - } else { - td = table.getElementsByTagName("td")[0]; - tmpValue = domUtils.getComputedStyle(table, "border-left-width"); - tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "padding-left"); - tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "border-left-width"); - tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - return { - tableBorder: tableBorder, - tdPadding: tdPadding, - tdBorder: tdBorder - }; - } - }; - /** - * 根据当前点击的td或者table获取索引对象 - * @param tdOrTable - */ - UETable.getUETable = function(tdOrTable) { - var tag = tdOrTable.tagName.toLowerCase(); - tdOrTable = tag == "td" || tag == "th" || tag == "caption" - ? domUtils.findParentByTagName(tdOrTable, "table", true) - : tdOrTable; - if (!tdOrTable.ueTable) { - tdOrTable.ueTable = new UETable(tdOrTable); - } - return tdOrTable.ueTable; - }; - - UETable.cloneCell = function(cell, ignoreMerge, keepPro) { - if (!cell || utils.isString(cell)) { - return this.table.ownerDocument.createElement(cell || "td"); - } - var flag = domUtils.hasClass(cell, "selectTdClass"); - flag && domUtils.removeClasses(cell, "selectTdClass"); - var tmpCell = cell.cloneNode(true); - if (ignoreMerge) { - tmpCell.rowSpan = tmpCell.colSpan = 1; - } - //去掉宽高 - !keepPro && domUtils.removeAttributes(tmpCell, "width height"); - !keepPro && domUtils.removeAttributes(tmpCell, "style"); - - tmpCell.style.borderLeftStyle = ""; - tmpCell.style.borderTopStyle = ""; - tmpCell.style.borderLeftColor = cell.style.borderRightColor; - tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; - tmpCell.style.borderTopColor = cell.style.borderBottomColor; - tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; - flag && domUtils.addClass(cell, "selectTdClass"); - return tmpCell; - }; - - UETable.prototype = { - getMaxRows: function() { - var rows = this.table.rows, - maxLen = 1; - for (var i = 0, row; (row = rows[i]); i++) { - var currentMax = 1; - for (var j = 0, cj; (cj = row.cells[j++]); ) { - currentMax = Math.max(cj.rowSpan || 1, currentMax); - } - maxLen = Math.max(currentMax + i, maxLen); - } - return maxLen; - }, - /** - * 获取当前表格的最大列数 - */ - getMaxCols: function() { - var rows = this.table.rows, - maxLen = 0, - cellRows = {}; - for (var i = 0, row; (row = rows[i]); i++) { - var cellsNum = 0; - for (var j = 0, cj; (cj = row.cells[j++]); ) { - cellsNum += cj.colSpan || 1; - if (cj.rowSpan && cj.rowSpan > 1) { - for (var k = 1; k < cj.rowSpan; k++) { - if (!cellRows["row_" + (i + k)]) { - cellRows["row_" + (i + k)] = cj.colSpan || 1; - } else { - cellRows["row_" + (i + k)]++; - } - } - } - } - cellsNum += cellRows["row_" + i] || 0; - maxLen = Math.max(cellsNum, maxLen); - } - return maxLen; - }, - getCellColIndex: function(cell) {}, - /** - * 获取当前cell旁边的单元格, - * @param cell - * @param right - */ - getHSideCell: function(cell, right) { - try { - var cellInfo = this.getCellInfo(cell), - previewRowIndex, - previewColIndex; - var len = this.selectedTds.length, - range = this.cellsRange; - //首行或者首列没有前置单元格 - if ( - (!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || - (right && - (!len - ? cellInfo.colIndex == this.colsNum - 1 - : range.endColIndex == this.colsNum - 1)) - ) - return null; - - previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; - previewColIndex = !right - ? !len - ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 - : range.beginColIndex - 1 - : !len ? cellInfo.colIndex + 1 : range.endColIndex + 1; - return this.getCell( - this.indexTable[previewRowIndex][previewColIndex].rowIndex, - this.indexTable[previewRowIndex][previewColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - getTabNextCell: function(cell, preRowIndex) { - var cellInfo = this.getCellInfo(cell), - rowIndex = preRowIndex || cellInfo.rowIndex, - colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), - nextCell; - try { - nextCell = this.getCell( - this.indexTable[rowIndex][colIndex].rowIndex, - this.indexTable[rowIndex][colIndex].cellIndex - ); - } catch (e) { - try { - rowIndex = rowIndex * 1 + 1; - colIndex = 0; - nextCell = this.getCell( - this.indexTable[rowIndex][colIndex].rowIndex, - this.indexTable[rowIndex][colIndex].cellIndex - ); - } catch (e) {} - } - return nextCell; - }, - /** - * 获取视觉上的后置单元格 - * @param cell - * @param bottom - */ - getVSideCell: function(cell, bottom, ignoreRange) { - try { - var cellInfo = this.getCellInfo(cell), - nextRowIndex, - nextColIndex; - var len = this.selectedTds.length && !ignoreRange, - range = this.cellsRange; - //末行或者末列没有后置单元格 - if ( - (!bottom && cellInfo.rowIndex == 0) || - (bottom && - (!len - ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 - : range.endRowIndex == this.rowsNum - 1)) - ) - return null; - - nextRowIndex = !bottom - ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 - : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; - nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; - return this.getCell( - this.indexTable[nextRowIndex][nextColIndex].rowIndex, - this.indexTable[nextRowIndex][nextColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - /** - * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 - */ - getSameEndPosCells: function(cell, xOrY) { - try { - var flag = xOrY.toLowerCase() === "x", - end = - domUtils.getXY(cell)[flag ? "x" : "y"] + - cell["offset" + (flag ? "Width" : "Height")], - rows = this.table.rows, - cells = null, - returns = []; - for (var i = 0; i < this.rowsNum; i++) { - cells = rows[i].cells; - for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { - var tmpEnd = - domUtils.getXY(tmpCell)[flag ? "x" : "y"] + - tmpCell["offset" + (flag ? "Width" : "Height")]; - //对应行的td已经被上面行rowSpan了 - if (tmpEnd > end && flag) break; - if (cell == tmpCell || end == tmpEnd) { - //只获取单一的单元格 - //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 - if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { - returns.push(tmpCell); - } - if (flag) break; - } - } - } - return returns; - } catch (e) { - showError(e); - } - }, - setCellContent: function(cell, content) { - cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
    "); - }, - cloneCell: UETable.cloneCell, - /** - * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 - */ - getSameStartPosXCells: function(cell) { - try { - var start = domUtils.getXY(cell).x + cell.offsetWidth, - rows = this.table.rows, - cells, - returns = []; - for (var i = 0; i < this.rowsNum; i++) { - cells = rows[i].cells; - for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { - var tmpStart = domUtils.getXY(tmpCell).x; - if (tmpStart > start) break; - if (tmpStart == start && tmpCell.colSpan == 1) { - returns.push(tmpCell); - break; - } - } - } - return returns; - } catch (e) { - showError(e); - } - }, - /** - * 更新table对应的索引表 - */ - update: function(table) { - this.table = table || this.table; - this.selectedTds = []; - this.cellsRange = {}; - this.indexTable = []; - var rows = this.table.rows, - rowsNum = this.getMaxRows(), - dNum = rowsNum - rows.length, - colsNum = this.getMaxCols(); - while (dNum--) { - this.table.insertRow(rows.length); - } - this.rowsNum = rowsNum; - this.colsNum = colsNum; - for (var i = 0, len = rows.length; i < len; i++) { - this.indexTable[i] = new Array(colsNum); - } - //填充索引表 - for (var rowIndex = 0, row; (row = rows[rowIndex]); rowIndex++) { - for ( - var cellIndex = 0, cell, cells = row.cells; - (cell = cells[cellIndex]); - cellIndex++ - ) { - //修正整行被rowSpan时导致的行数计算错误 - if (cell.rowSpan > rowsNum) { - cell.rowSpan = rowsNum; - } - var colIndex = cellIndex, - rowSpan = cell.rowSpan || 1, - colSpan = cell.colSpan || 1; - //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 - while (this.indexTable[rowIndex][colIndex]) colIndex++; - for (var j = 0; j < rowSpan; j++) { - for (var k = 0; k < colSpan; k++) { - this.indexTable[rowIndex + j][colIndex + k] = { - rowIndex: rowIndex, - cellIndex: cellIndex, - colIndex: colIndex, - rowSpan: rowSpan, - colSpan: colSpan - }; - } - } - } - } - //修复残缺td - for (j = 0; j < rowsNum; j++) { - for (k = 0; k < colsNum; k++) { - if (this.indexTable[j][k] === undefined) { - row = rows[j]; - cell = row.cells[row.cells.length - 1]; - cell = cell - ? cell.cloneNode(true) - : this.table.ownerDocument.createElement("td"); - this.setCellContent(cell); - if (cell.colSpan !== 1) cell.colSpan = 1; - if (cell.rowSpan !== 1) cell.rowSpan = 1; - row.appendChild(cell); - this.indexTable[j][k] = { - rowIndex: j, - cellIndex: cell.cellIndex, - colIndex: k, - rowSpan: 1, - colSpan: 1 - }; - } - } - } - //当框选后删除行或者列后撤销,需要重建选区。 - var tds = domUtils.getElementsByTagName(this.table, "td"), - selectTds = []; - utils.each(tds, function(td) { - if (domUtils.hasClass(td, "selectTdClass")) { - selectTds.push(td); - } - }); - if (selectTds.length) { - var start = selectTds[0], - end = selectTds[selectTds.length - 1], - startInfo = this.getCellInfo(start), - endInfo = this.getCellInfo(end); - this.selectedTds = selectTds; - this.cellsRange = { - beginRowIndex: startInfo.rowIndex, - beginColIndex: startInfo.colIndex, - endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1, - endColIndex: endInfo.colIndex + endInfo.colSpan - 1 - }; - } - //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 - if (!domUtils.hasClass(this.table.rows[0], "firstRow")) { - domUtils.addClass(this.table.rows[0], "firstRow"); - for (var i = 1; i < this.table.rows.length; i++) { - domUtils.removeClasses(this.table.rows[i], "firstRow"); - } - } - }, - /** - * 获取单元格的索引信息 - */ - getCellInfo: function(cell) { - if (!cell) return; - var cellIndex = cell.cellIndex, - rowIndex = cell.parentNode.rowIndex, - rowInfo = this.indexTable[rowIndex], - numCols = this.colsNum; - for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { - var cellInfo = rowInfo[colIndex]; - if ( - cellInfo.rowIndex === rowIndex && - cellInfo.cellIndex === cellIndex - ) { - return cellInfo; - } - } - }, - /** - * 根据行列号获取单元格 - */ - getCell: function(rowIndex, cellIndex) { - return ( - (rowIndex < this.rowsNum && - this.table.rows[rowIndex].cells[cellIndex]) || - null - ); - }, - /** - * 删除单元格 - */ - deleteCell: function(cell, rowIndex) { - rowIndex = typeof rowIndex == "number" - ? rowIndex - : cell.parentNode.rowIndex; - var row = this.table.rows[rowIndex]; - row.deleteCell(cell.cellIndex); - }, - /** - * 根据始末两个单元格获取被框选的所有单元格范围 - */ - getCellsRange: function(cellA, cellB) { - function checkRange( - beginRowIndex, - beginColIndex, - endRowIndex, - endColIndex - ) { - var tmpBeginRowIndex = beginRowIndex, - tmpBeginColIndex = beginColIndex, - tmpEndRowIndex = endRowIndex, - tmpEndColIndex = endColIndex, - cellInfo, - colIndex, - rowIndex; - // 通过indexTable检查是否存在超出TableRange上边界的情况 - if (beginRowIndex > 0) { - for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { - cellInfo = me.indexTable[beginRowIndex][colIndex]; - rowIndex = cellInfo.rowIndex; - if (rowIndex < beginRowIndex) { - tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); - } - } - } - // 通过indexTable检查是否存在超出TableRange右边界的情况 - if (endColIndex < me.colsNum) { - for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { - cellInfo = me.indexTable[rowIndex][endColIndex]; - colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; - if (colIndex > endColIndex) { - tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); - } - } - } - // 检查是否有超出TableRange下边界的情况 - if (endRowIndex < me.rowsNum) { - for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { - cellInfo = me.indexTable[endRowIndex][colIndex]; - rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; - if (rowIndex > endRowIndex) { - tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); - } - } - } - // 检查是否有超出TableRange左边界的情况 - if (beginColIndex > 0) { - for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { - cellInfo = me.indexTable[rowIndex][beginColIndex]; - colIndex = cellInfo.colIndex; - if (colIndex < beginColIndex) { - tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); - } - } - } - //递归调用直至所有完成所有框选单元格的扩展 - if ( - tmpBeginRowIndex != beginRowIndex || - tmpBeginColIndex != beginColIndex || - tmpEndRowIndex != endRowIndex || - tmpEndColIndex != endColIndex - ) { - return checkRange( - tmpBeginRowIndex, - tmpBeginColIndex, - tmpEndRowIndex, - tmpEndColIndex - ); - } else { - // 不需要扩展TableRange的情况 - return { - beginRowIndex: beginRowIndex, - beginColIndex: beginColIndex, - endRowIndex: endRowIndex, - endColIndex: endColIndex - }; - } - } - - try { - var me = this, - cellAInfo = me.getCellInfo(cellA); - if (cellA === cellB) { - return { - beginRowIndex: cellAInfo.rowIndex, - beginColIndex: cellAInfo.colIndex, - endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1, - endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1 - }; - } - var cellBInfo = me.getCellInfo(cellB); - // 计算TableRange的四个边 - var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), - beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), - endRowIndex = Math.max( - cellAInfo.rowIndex + cellAInfo.rowSpan - 1, - cellBInfo.rowIndex + cellBInfo.rowSpan - 1 - ), - endColIndex = Math.max( - cellAInfo.colIndex + cellAInfo.colSpan - 1, - cellBInfo.colIndex + cellBInfo.colSpan - 1 - ); - - return checkRange( - beginRowIndex, - beginColIndex, - endRowIndex, - endColIndex - ); - } catch (e) { - //throw e; - } - }, - /** - * 依据cellsRange获取对应的单元格集合 - */ - getCells: function(range) { - //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 - this.clearSelected(); - var beginRowIndex = range.beginRowIndex, - beginColIndex = range.beginColIndex, - endRowIndex = range.endRowIndex, - endColIndex = range.endColIndex, - cellInfo, - rowIndex, - colIndex, - tdHash = {}, - returnTds = []; - for (var i = beginRowIndex; i <= endRowIndex; i++) { - for (var j = beginColIndex; j <= endColIndex; j++) { - cellInfo = this.indexTable[i][j]; - rowIndex = cellInfo.rowIndex; - colIndex = cellInfo.colIndex; - // 如果Cells里已经包含了此Cell则跳过 - var key = rowIndex + "|" + colIndex; - if (tdHash[key]) continue; - tdHash[key] = 1; - if ( - rowIndex < i || - colIndex < j || - rowIndex + cellInfo.rowSpan - 1 > endRowIndex || - colIndex + cellInfo.colSpan - 1 > endColIndex - ) { - return null; - } - returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); - } - } - return returnTds; - }, - /** - * 清理已经选中的单元格 - */ - clearSelected: function() { - UETable.removeSelectedClass(this.selectedTds); - this.selectedTds = []; - this.cellsRange = {}; - }, - /** - * 根据range设置已经选中的单元格 - */ - setSelected: function(range) { - var cells = this.getCells(range); - UETable.addSelectedClass(cells); - this.selectedTds = cells; - this.cellsRange = range; - }, - isFullRow: function() { - var range = this.cellsRange; - return range.endColIndex - range.beginColIndex + 1 == this.colsNum; - }, - isFullCol: function() { - var range = this.cellsRange, - table = this.table, - ths = table.getElementsByTagName("th"), - rows = range.endRowIndex - range.beginRowIndex + 1; - return !ths.length - ? rows == this.rowsNum - : rows == this.rowsNum || rows == this.rowsNum - 1; - }, - /** - * 获取视觉上的前置单元格,默认是左边,top传入时 - * @param cell - * @param top - */ - getNextCell: function(cell, bottom, ignoreRange) { - try { - var cellInfo = this.getCellInfo(cell), - nextRowIndex, - nextColIndex; - var len = this.selectedTds.length && !ignoreRange, - range = this.cellsRange; - //末行或者末列没有后置单元格 - if ( - (!bottom && cellInfo.rowIndex == 0) || - (bottom && - (!len - ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 - : range.endRowIndex == this.rowsNum - 1)) - ) - return null; - - nextRowIndex = !bottom - ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 - : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; - nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; - return this.getCell( - this.indexTable[nextRowIndex][nextColIndex].rowIndex, - this.indexTable[nextRowIndex][nextColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - getPreviewCell: function(cell, top) { - try { - var cellInfo = this.getCellInfo(cell), - previewRowIndex, - previewColIndex; - var len = this.selectedTds.length, - range = this.cellsRange; - //首行或者首列没有前置单元格 - if ( - (!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || - (top && - (!len - ? cellInfo.rowIndex > this.colsNum - 1 - : range.endColIndex == this.colsNum - 1)) - ) - return null; - - previewRowIndex = !top - ? !len ? cellInfo.rowIndex : range.beginRowIndex - : !len - ? cellInfo.rowIndex < 1 ? 0 : cellInfo.rowIndex - 1 - : range.beginRowIndex; - previewColIndex = !top - ? !len - ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 - : range.beginColIndex - 1 - : !len ? cellInfo.colIndex : range.endColIndex + 1; - return this.getCell( - this.indexTable[previewRowIndex][previewColIndex].rowIndex, - this.indexTable[previewRowIndex][previewColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - /** - * 移动单元格中的内容 - */ - moveContent: function(cellTo, cellFrom) { - if (UETable.isEmptyBlock(cellFrom)) return; - if (UETable.isEmptyBlock(cellTo)) { - cellTo.innerHTML = cellFrom.innerHTML; - return; - } - var child = cellTo.lastChild; - if (child.nodeType == 3 || !dtd.$block[child.tagName]) { - cellTo.appendChild(cellTo.ownerDocument.createElement("br")); - } - while ((child = cellFrom.firstChild)) { - cellTo.appendChild(child); - } - }, - /** - * 向右合并单元格 - */ - mergeRight: function(cell) { - var cellInfo = this.getCellInfo(cell), - rightColIndex = cellInfo.colIndex + cellInfo.colSpan, - rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], - rightCell = this.getCell( - rightCellInfo.rowIndex, - rightCellInfo.cellIndex - ); - //合并 - cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; - //被合并的单元格不应存在宽度属性 - cell.removeAttribute("width"); - //移动内容 - this.moveContent(cell, rightCell); - //删掉被合并的Cell - this.deleteCell(rightCell, rightCellInfo.rowIndex); - this.update(); - }, - /** - * 向下合并单元格 - */ - mergeDown: function(cell) { - var cellInfo = this.getCellInfo(cell), - downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, - downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], - downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); - cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; - cell.removeAttribute("height"); - this.moveContent(cell, downCell); - this.deleteCell(downCell, downCellInfo.rowIndex); - this.update(); - }, - /** - * 合并整个range中的内容 - */ - mergeRange: function() { - //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 - var range = this.cellsRange, - leftTopCell = this.getCell( - range.beginRowIndex, - this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex - ); - - // 这段关于行表头或者列表头的特殊处理会导致表头合并范围错误 - // 为什么有这段代码的原因未明,暂且注释掉,希望原作者看到后出面说明下 - // if ( - // leftTopCell.tagName == "TH" && - // range.endRowIndex !== range.beginRowIndex - // ) { - // var index = this.indexTable, - // info = this.getCellInfo(leftTopCell); - // leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); - // range = this.getCellsRange( - // leftTopCell, - // this.getCell( - // index[this.rowsNum - 1][info.colIndex].rowIndex, - // index[this.rowsNum - 1][info.colIndex].cellIndex - // ) - // ); - // } - - // 删除剩余的Cells - var cells = this.getCells(range); - for (var i = 0, ci; (ci = cells[i++]); ) { - if (ci !== leftTopCell) { - this.moveContent(leftTopCell, ci); - this.deleteCell(ci); - } - } - // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 - leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; - leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); - leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; - leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); - if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { - leftTopCell.colSpan = 1; - } - - if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { - var rowIndex = leftTopCell.parentNode.rowIndex; - //解决IE下的表格操作问题 - if (this.table.deleteRow) { - for ( - var i = rowIndex + 1, - curIndex = rowIndex + 1, - len = leftTopCell.rowSpan; - i < len; - i++ - ) { - this.table.deleteRow(curIndex); - } - } else { - for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) { - var row = this.table.rows[rowIndex + 1]; - row.parentNode.removeChild(row); - } - } - leftTopCell.rowSpan = 1; - } - this.update(); - }, - /** - * 插入一行单元格 - */ - insertRow: function(rowIndex, sourceCell) { - var numCols = this.colsNum, - table = this.table, - row = table.insertRow(rowIndex), - cell, - thead = null, - isInsertTitle = - typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; - - function replaceTdToTh(colIndex, cell, tableRow) { - if (colIndex == 0) { - var tr = tableRow.nextSibling || tableRow.previousSibling, - th = tr.cells[colIndex]; - if (th.tagName == "TH") { - th = cell.ownerDocument.createElement("th"); - th.appendChild(cell.firstChild); - tableRow.insertBefore(th, cell); - domUtils.remove(cell); - } - } else { - if (cell.tagName == "TH") { - var td = cell.ownerDocument.createElement("td"); - td.appendChild(cell.firstChild); - tableRow.insertBefore(td, cell); - domUtils.remove(cell); - } - } - } - - //首行直接插入,无需考虑部分单元格被rowspan的情况 - if (rowIndex == 0 || rowIndex == this.rowsNum) { - for (var colIndex = 0; colIndex < numCols; colIndex++) { - cell = this.cloneCell(sourceCell, true); - this.setCellContent(cell); - cell.getAttribute("vAlign") && - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - row.appendChild(cell); - if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); - } - - if (isInsertTitle) { - thead = table.createTHead(); - thead.insertBefore(row, thead.firstChild); - } - } else { - var infoRow = this.indexTable[rowIndex], - cellIndex = 0; - for (colIndex = 0; colIndex < numCols; colIndex++) { - var cellInfo = infoRow[colIndex]; - //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 - if (cellInfo.rowIndex < rowIndex) { - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - cell.rowSpan = cellInfo.rowSpan + 1; - } else { - cell = this.cloneCell(sourceCell, true); - this.setCellContent(cell); - row.appendChild(cell); - } - if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); - } - } - //框选时插入不触发contentchange,需要手动更新索引。 - this.update(); - return row; - }, - /** - * 删除一行单元格 - * @param rowIndex - */ - deleteRow: function(rowIndex) { - var row = this.table.rows[rowIndex], - infoRow = this.indexTable[rowIndex], - colsNum = this.colsNum, - count = 0; //处理计数 - for (var colIndex = 0; colIndex < colsNum; ) { - var cellInfo = infoRow[colIndex], - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - if (cell.rowSpan > 1) { - if (cellInfo.rowIndex == rowIndex) { - var clone = cell.cloneNode(true); - clone.rowSpan = cell.rowSpan - 1; - clone.innerHTML = ""; - cell.rowSpan = 1; - var nextRowIndex = rowIndex + 1, - nextRow = this.table.rows[nextRowIndex], - insertCellIndex, - preMerged = - this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; - if (preMerged < colIndex) { - insertCellIndex = colIndex - preMerged - 1; - //nextRow.insertCell(insertCellIndex); - domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); - } else { - if (nextRow.cells.length) - nextRow.insertBefore(clone, nextRow.cells[0]); - } - count += 1; - //cell.parentNode.removeChild(cell); - } - } - colIndex += cell.colSpan || 1; - } - var deleteTds = [], - cacheMap = {}; - for (colIndex = 0; colIndex < colsNum; colIndex++) { - var tmpRowIndex = infoRow[colIndex].rowIndex, - tmpCellIndex = infoRow[colIndex].cellIndex, - key = tmpRowIndex + "_" + tmpCellIndex; - if (cacheMap[key]) continue; - cacheMap[key] = 1; - cell = this.getCell(tmpRowIndex, tmpCellIndex); - deleteTds.push(cell); - } - var mergeTds = []; - utils.each(deleteTds, function(td) { - if (td.rowSpan == 1) { - td.parentNode.removeChild(td); - } else { - mergeTds.push(td); - } - }); - utils.each(mergeTds, function(td) { - td.rowSpan--; - }); - row.parentNode.removeChild(row); - //浏览器方法本身存在bug,采用自定义方法删除 - //this.table.deleteRow(rowIndex); - this.update(); - }, - insertCol: function(colIndex, sourceCell, defaultValue) { - var rowsNum = this.rowsNum, - rowIndex = 0, - tableRow, - cell, - backWidth = parseInt( - (this.table.offsetWidth - - (this.colsNum + 1) * 20 - - (this.colsNum + 1)) / - (this.colsNum + 1), - 10 - ), - isInsertTitleCol = - typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; - - function replaceTdToTh(rowIndex, cell, tableRow) { - if (rowIndex == 0) { - var th = cell.nextSibling || cell.previousSibling; - if (th.tagName == "TH") { - th = cell.ownerDocument.createElement("th"); - th.appendChild(cell.firstChild); - tableRow.insertBefore(th, cell); - domUtils.remove(cell); - } - } else { - if (cell.tagName == "TH") { - var td = cell.ownerDocument.createElement("td"); - td.appendChild(cell.firstChild); - tableRow.insertBefore(td, cell); - domUtils.remove(cell); - } - } - } - - var preCell; - if (colIndex == 0 || colIndex == this.colsNum) { - for (; rowIndex < rowsNum; rowIndex++) { - tableRow = this.table.rows[rowIndex]; - preCell = - tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; - cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); - this.setCellContent(cell); - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - preCell && cell.setAttribute("width", preCell.getAttribute("width")); - if (!colIndex) { - tableRow.insertBefore(cell, tableRow.cells[0]); - } else { - domUtils.insertAfter( - tableRow.cells[tableRow.cells.length - 1], - cell - ); - } - if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); - } - } else { - for (; rowIndex < rowsNum; rowIndex++) { - var cellInfo = this.indexTable[rowIndex][colIndex]; - if (cellInfo.colIndex < colIndex) { - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - cell.colSpan = cellInfo.colSpan + 1; - } else { - tableRow = this.table.rows[rowIndex]; - preCell = tableRow.cells[cellInfo.cellIndex]; - - cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(cellInfo.cellIndex); - this.setCellContent(cell); - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - preCell && - cell.setAttribute("width", preCell.getAttribute("width")); - //防止IE下报错 - preCell - ? tableRow.insertBefore(cell, preCell) - : tableRow.appendChild(cell); - } - if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); - } - } - //框选时插入不触发contentchange,需要手动更新索引 - this.update(); - this.updateWidth( - backWidth, - defaultValue || { tdPadding: 10, tdBorder: 1 } - ); - }, - updateWidth: function(width, defaultValue) { - var table = this.table, - tmpWidth = - UETable.getWidth(table) - - defaultValue.tdPadding * 2 - - defaultValue.tdBorder + - width; - if (tmpWidth < table.ownerDocument.body.offsetWidth) { - table.setAttribute("width", tmpWidth); - return; - } - var tds = domUtils.getElementsByTagName(this.table, "td th"); - utils.each(tds, function(td) { - td.setAttribute("width", width); - }); - }, - deleteCol: function(colIndex) { - var indexTable = this.indexTable, - tableRows = this.table.rows, - backTableWidth = this.table.getAttribute("width"), - backTdWidth = 0, - rowsNum = this.rowsNum, - cacheMap = {}; - for (var rowIndex = 0; rowIndex < rowsNum; ) { - var infoRow = indexTable[rowIndex], - cellInfo = infoRow[colIndex], - key = cellInfo.rowIndex + "_" + cellInfo.colIndex; - // 跳过已经处理过的Cell - if (cacheMap[key]) continue; - cacheMap[key] = 1; - var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - if (!backTdWidth) - backTdWidth = - cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); - // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell - if (cell.colSpan > 1) { - cell.colSpan--; - } else { - tableRows[rowIndex].deleteCell(cellInfo.cellIndex); - } - rowIndex += cellInfo.rowSpan || 1; - } - this.table.setAttribute("width", backTableWidth - backTdWidth); - this.update(); - }, - splitToCells: function(cell) { - var me = this, - cells = this.splitToRows(cell); - utils.each(cells, function(cell) { - me.splitToCols(cell); - }); - }, - splitToRows: function(cell) { - var cellInfo = this.getCellInfo(cell), - rowIndex = cellInfo.rowIndex, - colIndex = cellInfo.colIndex, - results = []; - // 修改Cell的rowSpan - cell.rowSpan = 1; - results.push(cell); - // 补齐单元格 - for ( - var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; - i < endRow; - i++ - ) { - if (i == rowIndex) continue; - var tableRow = this.table.rows[i], - tmpCell = tableRow.insertCell( - colIndex - this.getPreviewMergedCellsNum(i, colIndex) - ); - tmpCell.colSpan = cellInfo.colSpan; - this.setCellContent(tmpCell); - tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); - tmpCell.setAttribute("align", cell.getAttribute("align")); - if (cell.style.cssText) { - tmpCell.style.cssText = cell.style.cssText; - } - results.push(tmpCell); - } - this.update(); - return results; - }, - getPreviewMergedCellsNum: function(rowIndex, colIndex) { - var indexRow = this.indexTable[rowIndex], - num = 0; - for (var i = 0; i < colIndex; ) { - var colSpan = indexRow[i].colSpan, - tmpRowIndex = indexRow[i].rowIndex; - num += colSpan - (tmpRowIndex == rowIndex ? 1 : 0); - i += colSpan; - } - return num; - }, - splitToCols: function(cell) { - var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), - cellInfo = this.getCellInfo(cell), - rowIndex = cellInfo.rowIndex, - colIndex = cellInfo.colIndex, - results = []; - // 修改Cell的rowSpan - cell.colSpan = 1; - cell.setAttribute("width", backWidth); - results.push(cell); - // 补齐单元格 - for ( - var j = colIndex, endCol = colIndex + cellInfo.colSpan; - j < endCol; - j++ - ) { - if (j == colIndex) continue; - var tableRow = this.table.rows[rowIndex], - tmpCell = tableRow.insertCell( - this.indexTable[rowIndex][j].cellIndex + 1 - ); - tmpCell.rowSpan = cellInfo.rowSpan; - this.setCellContent(tmpCell); - tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); - tmpCell.setAttribute("align", cell.getAttribute("align")); - tmpCell.setAttribute("width", backWidth); - if (cell.style.cssText) { - tmpCell.style.cssText = cell.style.cssText; - } - //处理th的情况 - if (cell.tagName == "TH") { - var th = cell.ownerDocument.createElement("th"); - th.appendChild(tmpCell.firstChild); - th.setAttribute("vAlign", cell.getAttribute("vAlign")); - th.rowSpan = tmpCell.rowSpan; - tableRow.insertBefore(th, tmpCell); - domUtils.remove(tmpCell); - } - results.push(tmpCell); - } - this.update(); - return results; - }, - isLastCell: function(cell, rowsNum, colsNum) { - rowsNum = rowsNum || this.rowsNum; - colsNum = colsNum || this.colsNum; - var cellInfo = this.getCellInfo(cell); - return ( - cellInfo.rowIndex + cellInfo.rowSpan == rowsNum && - cellInfo.colIndex + cellInfo.colSpan == colsNum - ); - }, - getLastCell: function(cells) { - cells = cells || this.table.getElementsByTagName("td"); - var firstInfo = this.getCellInfo(cells[0]); - var me = this, - last = cells[0], - tr = last.parentNode, - cellsNum = 0, - cols = 0, - rows; - utils.each(cells, function(cell) { - if (cell.parentNode == tr) cols += cell.colSpan || 1; - cellsNum += cell.rowSpan * cell.colSpan || 1; - }); - rows = cellsNum / cols; - utils.each(cells, function(cell) { - if (me.isLastCell(cell, rows, cols)) { - last = cell; - return false; - } - }); - return last; - }, - selectRow: function(rowIndex) { - var indexRow = this.indexTable[rowIndex], - start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), - end = this.getCell( - indexRow[this.colsNum - 1].rowIndex, - indexRow[this.colsNum - 1].cellIndex - ), - range = this.getCellsRange(start, end); - this.setSelected(range); - }, - selectTable: function() { - var tds = this.table.getElementsByTagName("td"), - range = this.getCellsRange(tds[0], tds[tds.length - 1]); - this.setSelected(range); - }, - setBackground: function(cells, value) { - if (typeof value === "string") { - utils.each(cells, function(cell) { - cell.style.backgroundColor = value; - }); - } else if (typeof value === "object") { - value = utils.extend( - { - repeat: true, - colorList: ["#ddd", "#fff"] - }, - value - ); - var rowIndex = this.getCellInfo(cells[0]).rowIndex, - count = 0, - colors = value.colorList, - getColor = function(list, index, repeat) { - return list[index] - ? list[index] - : repeat ? list[index % list.length] : ""; - }; - for (var i = 0, cell; (cell = cells[i++]); ) { - var cellInfo = this.getCellInfo(cell); - cell.style.backgroundColor = getColor( - colors, - rowIndex + count == cellInfo.rowIndex ? count : ++count, - value.repeat - ); - } - } - }, - removeBackground: function(cells) { - utils.each(cells, function(cell) { - cell.style.backgroundColor = ""; - }); - } - }; - function showError(e) {} -})(); - - -// plugins/table.cmds.js -/** - * Created with JetBrains PhpStorm. - * User: taoqili - * Date: 13-2-20 - * Time: 下午6:25 - * To change this template use File | Settings | File Templates. - */ -;(function() { - var UT = UE.UETable, - getTableItemsByRange = function(editor) { - return UT.getTableItemsByRange(editor); - }, - getUETableBySelected = function(editor) { - return UT.getUETableBySelected(editor); - }, - getDefaultValue = function(editor, table) { - return UT.getDefaultValue(editor, table); - }, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }; - - UE.commands["inserttable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? -1 : 0; - }, - execCommand: function(cmd, opt) { - function createTable(opt, tdWidth) { - var html = [], - rowsNum = opt.numRows, - colsNum = opt.numCols; - for (var r = 0; r < rowsNum; r++) { - html.push(""); - for (var c = 0; c < colsNum; c++) { - html.push( - '
  • ' + - (browser.ie && browser.version < 11 - ? domUtils.fillChar - : "
    ") + - "
    " + html.join("") + "
    "; - } - - if (!opt) { - opt = utils.extend( - {}, - { - numCols: this.options.defaultCols, - numRows: this.options.defaultRows, - tdvalign: this.options.tdvalign - } - ); - } - var me = this; - var range = this.selection.getRange(), - start = range.startContainer, - firstParentBlock = - domUtils.findParent( - start, - function(node) { - return domUtils.isBlockElm(node); - }, - true - ) || me.body; - - var defaultValue = getDefaultValue(me), - tableWidth = firstParentBlock.offsetWidth, - tdWidth = Math.floor( - tableWidth / opt.numCols - - defaultValue.tdPadding * 2 - - defaultValue.tdBorder - ); - - //todo其他属性 - !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); - me.execCommand("inserthtml", createTable(opt, tdWidth)); - } - }; - - UE.commands["insertparagraphbeforetable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).cell ? 0 : -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var p = this.document.createElement("p"); - p.innerHTML = browser.ie ? " " : "
    "; - table.parentNode.insertBefore(p, table); - this.selection.getRange().setStart(p, 0).setCursor(); - } - } - }; - - UE.commands["deletetable"] = { - queryCommandState: function() { - var rng = this.selection.getRange(); - return domUtils.findParentByTagName(rng.startContainer, "table", true) - ? 0 - : -1; - }, - execCommand: function(cmd, table) { - var rng = this.selection.getRange(); - table = - table || - domUtils.findParentByTagName(rng.startContainer, "table", true); - if (table) { - var next = table.nextSibling; - if (!next) { - next = domUtils.createElement(this.document, "p", { - innerHTML: browser.ie ? domUtils.fillChar : "
    " - }); - table.parentNode.insertBefore(next, table); - } - domUtils.remove(table); - rng = this.selection.getRange(); - if (next.nodeType == 3) { - rng.setStartBefore(next); - } else { - rng.setStart(next, 0); - } - rng.setCursor(false, true); - this.fireEvent("tablehasdeleted"); - } - } - }; - UE.commands["cellalign"] = { - queryCommandState: function() { - return getSelectedArr(this).length ? 0 : -1; - }, - execCommand: function(cmd, align) { - var selectedTds = getSelectedArr(this); - if (selectedTds.length) { - for (var i = 0, ci; (ci = selectedTds[i++]); ) { - ci.setAttribute("align", align); - } - } - } - }; - UE.commands["cellvalign"] = { - queryCommandState: function() { - return getSelectedArr(this).length ? 0 : -1; - }, - execCommand: function(cmd, valign) { - var selectedTds = getSelectedArr(this); - if (selectedTds.length) { - for (var i = 0, ci; (ci = selectedTds[i++]); ) { - ci.setAttribute("vAlign", valign); - } - } - } - }; - UE.commands["insertcaption"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - return table.getElementsByTagName("caption").length == 0 ? 1 : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var caption = this.document.createElement("caption"); - caption.innerHTML = browser.ie ? domUtils.fillChar : "
    "; - table.insertBefore(caption, table.firstChild); - var range = this.selection.getRange(); - range.setStart(caption, 0).setCursor(); - } - } - }; - UE.commands["deletecaption"] = { - queryCommandState: function() { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - return table.getElementsByTagName("caption").length == 0 ? -1 : 1; - } - return -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - domUtils.remove(table.getElementsByTagName("caption")[0]); - var range = this.selection.getRange(); - range.setStart(table.rows[0].cells[0], 0).setCursor(); - } - } - }; - UE.commands["inserttitle"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var firstRow = table.rows[0]; - return firstRow.cells[ - firstRow.cells.length - 1 - ].tagName.toLowerCase() != "th" - ? 0 - : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - getUETable(table).insertRow(0, "th"); - } - var th = table.getElementsByTagName("th")[0]; - this.selection.getRange().setStart(th, 0).setCursor(false, true); - } - }; - UE.commands["deletetitle"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var firstRow = table.rows[0]; - return firstRow.cells[ - firstRow.cells.length - 1 - ].tagName.toLowerCase() == "th" - ? 0 - : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - domUtils.remove(table.rows[0]); - } - var td = table.getElementsByTagName("td")[0]; - this.selection.getRange().setStart(td, 0).setCursor(false, true); - } - }; - UE.commands["inserttitlecol"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var lastRow = table.rows[table.rows.length - 1]; - return lastRow.getElementsByTagName("th").length ? -1 : 0; - } - return -1; - }, - execCommand: function(cmd) { - var table = getTableItemsByRange(this).table; - if (table) { - getUETable(table).insertCol(0, "th"); - } - resetTdWidth(table, this); - var th = table.getElementsByTagName("th")[0]; - this.selection.getRange().setStart(th, 0).setCursor(false, true); - } - }; - UE.commands["deletetitlecol"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var lastRow = table.rows[table.rows.length - 1]; - return lastRow.getElementsByTagName("th").length ? 0 : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - for (var i = 0; i < table.rows.length; i++) { - domUtils.remove(table.rows[i].children[0]); - } - } - resetTdWidth(table, this); - var td = table.getElementsByTagName("td")[0]; - this.selection.getRange().setStart(td, 0).setCursor(false, true); - } - }; - - UE.commands["mergeright"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table, - cell = tableItems.cell; - - if (!table || !cell) return -1; - var ut = getUETable(table); - if (ut.selectedTds.length) return -1; - - var cellInfo = ut.getCellInfo(cell), - rightColIndex = cellInfo.colIndex + cellInfo.colSpan; - if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 - - var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], - rightCell = - table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; - if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 - - // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 - return rightCellInfo.rowIndex == cellInfo.rowIndex && - rightCellInfo.rowSpan == cellInfo.rowSpan - ? 0 - : -1; - }, - execCommand: function(cmd) { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.mergeRight(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["mergedown"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table, - cell = tableItems.cell; - - if (!table || !cell) return -1; - var ut = getUETable(table); - if (ut.selectedTds.length) return -1; - - var cellInfo = ut.getCellInfo(cell), - downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; - if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 - - var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], - downCell = - table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; - if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 - - // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 - return downCellInfo.colIndex == cellInfo.colIndex && - downCellInfo.colSpan == cellInfo.colSpan - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.mergeDown(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["mergecells"] = { - queryCommandState: function() { - return getUETableBySelected(this) ? 0 : -1; - }, - execCommand: function() { - var ut = getUETableBySelected(this); - if (ut && ut.selectedTds.length) { - var cell = ut.selectedTds[0]; - ut.mergeRange(); - var rng = this.selection.getRange(); - if (domUtils.isEmptyBlock(cell)) { - rng.setStart(cell, 0).collapse(true); - } else { - rng.selectNodeContents(cell); - } - rng.select(); - } - } - }; - UE.commands["insertrow"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - (cell.tagName == "TD" || - (cell.tagName == "TH" && - tableItems.tr !== tableItems.table.rows[0])) && - getUETable(tableItems.table).rowsNum < this.options.maxRowNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell, - table = tableItems.table, - ut = getUETable(table), - cellInfo = ut.getCellInfo(cell); - //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); - if (!ut.selectedTds.length) { - ut.insertRow(cellInfo.rowIndex, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; - i < len; - i++ - ) { - ut.insertRow(range.beginRowIndex, cell); - } - } - rng.moveToBookmark(bk).select(); - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - //后插入行 - UE.commands["insertrownext"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - cell.tagName == "TD" && - getUETable(tableItems.table).rowsNum < this.options.maxRowNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell, - table = tableItems.table, - ut = getUETable(table), - cellInfo = ut.getCellInfo(cell); - //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); - if (!ut.selectedTds.length) { - ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; - i < len; - i++ - ) { - ut.insertRow(range.endRowIndex + 1, cell); - } - } - rng.moveToBookmark(bk).select(); - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - UE.commands["deleterow"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this); - return tableItems.cell ? 0 : -1; - }, - execCommand: function() { - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellsRange = ut.cellsRange, - cellInfo = ut.getCellInfo(cell), - preCell = ut.getVSideCell(cell), - nextCell = ut.getVSideCell(cell, true), - rng = this.selection.getRange(); - if (utils.isEmptyObject(cellsRange)) { - ut.deleteRow(cellInfo.rowIndex); - } else { - for ( - var i = cellsRange.beginRowIndex; - i < cellsRange.endRowIndex + 1; - i++ - ) { - ut.deleteRow(cellsRange.beginRowIndex); - } - } - var table = ut.table; - if (!table.getElementsByTagName("td").length) { - var nextSibling = table.nextSibling; - domUtils.remove(table); - if (nextSibling) { - rng.setStart(nextSibling, 0).setCursor(false, true); - } - } else { - if ( - cellInfo.rowSpan == 1 || - cellInfo.rowSpan == - cellsRange.endRowIndex - cellsRange.beginRowIndex + 1 - ) { - if (nextCell || preCell) - rng.selectNodeContents(nextCell || preCell).setCursor(false, true); - } else { - var newCell = ut.getCell( - cellInfo.rowIndex, - ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex - ); - if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); - } - } - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - UE.commands["insertcol"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - (cell.tagName == "TD" || - (cell.tagName == "TH" && cell !== tableItems.tr.cells[0])) && - getUETable(tableItems.table).colsNum < this.options.maxColNum - ? 0 - : -1; - }, - execCommand: function(cmd) { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - if (this.queryCommandState(cmd) == -1) return; - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellInfo = ut.getCellInfo(cell); - - //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); - if (!ut.selectedTds.length) { - ut.insertCol(cellInfo.colIndex, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endColIndex - range.beginColIndex + 1; - i < len; - i++ - ) { - ut.insertCol(range.beginColIndex, cell); - } - } - rng.moveToBookmark(bk).select(true); - } - }; - UE.commands["insertcolnext"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - getUETable(tableItems.table).colsNum < this.options.maxColNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellInfo = ut.getCellInfo(cell); - //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); - if (!ut.selectedTds.length) { - ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endColIndex - range.beginColIndex + 1; - i < len; - i++ - ) { - ut.insertCol(range.endColIndex + 1, cell); - } - } - rng.moveToBookmark(bk).select(); - } - }; - - UE.commands["deletecol"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this); - return tableItems.cell ? 0 : -1; - }, - execCommand: function() { - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - range = ut.cellsRange, - cellInfo = ut.getCellInfo(cell), - preCell = ut.getHSideCell(cell), - nextCell = ut.getHSideCell(cell, true); - if (utils.isEmptyObject(range)) { - ut.deleteCol(cellInfo.colIndex); - } else { - for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { - ut.deleteCol(range.beginColIndex); - } - } - var table = ut.table, - rng = this.selection.getRange(); - - if (!table.getElementsByTagName("td").length) { - var nextSibling = table.nextSibling; - domUtils.remove(table); - if (nextSibling) { - rng.setStart(nextSibling, 0).setCursor(false, true); - } - } else { - if (domUtils.inDoc(cell, this.document)) { - rng.setStart(cell, 0).setCursor(false, true); - } else { - if (nextCell && domUtils.inDoc(nextCell, this.document)) { - rng.selectNodeContents(nextCell).setCursor(false, true); - } else { - if (preCell && domUtils.inDoc(preCell, this.document)) { - rng.selectNodeContents(preCell).setCursor(true, true); - } - } - } - } - } - }; - UE.commands["splittocells"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToCells(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["splittorows"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && cell.rowSpan > 1 ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToRows(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["splittocols"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && cell.colSpan > 1 ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToCols(cell); - rng.moveToBookmark(bk).select(); - } - }; - - UE.commands["adaptbytext"] = UE.commands["adaptbywindow"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table; - if (table) { - if (cmd == "adaptbywindow") { - resetTdWidth(table, this); - } else { - var cells = domUtils.getElementsByTagName(table, "td th"); - utils.each(cells, function(cell) { - cell.removeAttribute("width"); - }); - table.removeAttribute("width"); - } - } - } - }; - - //平均分配各列 - UE.commands["averagedistributecol"] = { - queryCommandState: function() { - var ut = getUETableBySelected(this); - if (!ut) return -1; - return ut.isFullRow() || ut.isFullCol() ? 0 : -1; - }, - execCommand: function(cmd) { - var me = this, - ut = getUETableBySelected(me); - - function getAverageWidth() { - var tb = ut.table, - averageWidth, - sumWidth = 0, - colsNum = 0, - tbAttr = getDefaultValue(me, tb); - - if (ut.isFullRow()) { - sumWidth = tb.offsetWidth; - colsNum = ut.colsNum; - } else { - var begin = ut.cellsRange.beginColIndex, - end = ut.cellsRange.endColIndex, - node; - for (var i = begin; i <= end; ) { - node = ut.selectedTds[i]; - sumWidth += node.offsetWidth; - i += node.colSpan; - colsNum += 1; - } - } - averageWidth = - Math.ceil(sumWidth / colsNum) - - tbAttr.tdBorder * 2 - - tbAttr.tdPadding * 2; - return averageWidth; - } - - function setAverageWidth(averageWidth) { - utils.each(domUtils.getElementsByTagName(ut.table, "th"), function( - node - ) { - node.setAttribute("width", ""); - }); - var cells = ut.isFullRow() - ? domUtils.getElementsByTagName(ut.table, "td") - : ut.selectedTds; - - utils.each(cells, function(node) { - if (node.colSpan == 1) { - node.setAttribute("width", averageWidth); - } - }); - } - - if (ut && ut.selectedTds.length) { - setAverageWidth(getAverageWidth()); - } - } - }; - //平均分配各行 - UE.commands["averagedistributerow"] = { - queryCommandState: function() { - var ut = getUETableBySelected(this); - if (!ut) return -1; - if (ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName)) return -1; - return ut.isFullRow() || ut.isFullCol() ? 0 : -1; - }, - execCommand: function(cmd) { - var me = this, - ut = getUETableBySelected(me); - - function getAverageHeight() { - var averageHeight, - rowNum, - sumHeight = 0, - tb = ut.table, - tbAttr = getDefaultValue(me, tb), - tdpadding = parseInt( - domUtils.getComputedStyle( - tb.getElementsByTagName("td")[0], - "padding-top" - ) - ); - - if (ut.isFullCol()) { - var captionArr = domUtils.getElementsByTagName(tb, "caption"), - thArr = domUtils.getElementsByTagName(tb, "th"), - captionHeight, - thHeight; - - if (captionArr.length > 0) { - captionHeight = captionArr[0].offsetHeight; - } - if (thArr.length > 0) { - thHeight = thArr[0].offsetHeight; - } - - sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); - rowNum = thArr.length == 0 ? ut.rowsNum : ut.rowsNum - 1; - } else { - var begin = ut.cellsRange.beginRowIndex, - end = ut.cellsRange.endRowIndex, - count = 0, - trs = domUtils.getElementsByTagName(tb, "tr"); - for (var i = begin; i <= end; i++) { - sumHeight += trs[i].offsetHeight; - count += 1; - } - rowNum = count; - } - //ie8下是混杂模式 - if (browser.ie && browser.version < 9) { - averageHeight = Math.ceil(sumHeight / rowNum); - } else { - averageHeight = - Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; - } - return averageHeight; - } - - function setAverageHeight(averageHeight) { - var cells = ut.isFullCol() - ? domUtils.getElementsByTagName(ut.table, "td") - : ut.selectedTds; - utils.each(cells, function(node) { - if (node.rowSpan == 1) { - node.setAttribute("height", averageHeight); - } - }); - } - - if (ut && ut.selectedTds.length) { - setAverageHeight(getAverageHeight()); - } - } - }; - - //单元格对齐方式 - UE.commands["cellalignment"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, data) { - var me = this, - ut = getUETableBySelected(me); - - if (!ut) { - var start = me.selection.getStart(), - cell = - start && - domUtils.findParentByTagName(start, ["td", "th", "caption"], true); - if (!/caption/gi.test(cell.tagName)) { - domUtils.setAttributes(cell, data); - } else { - cell.style.textAlign = data.align; - cell.style.verticalAlign = data.vAlign; - } - me.selection.getRange().setCursor(true); - } else { - utils.each(ut.selectedTds, function(cell) { - domUtils.setAttributes(cell, data); - }); - } - }, - /** - * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 - * @see UE.UETable.getTableCellAlignState - */ - queryCommandValue: function(cmd) { - var activeMenuCell = getTableItemsByRange(this).cell; - - if (!activeMenuCell) { - activeMenuCell = getSelectedArr(this)[0]; - } - - if (!activeMenuCell) { - return null; - } else { - //获取同时选中的其他单元格 - var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; - - !cells.length && (cells = activeMenuCell); - - return UE.UETable.getTableCellAlignState(cells); - } - } - }; - //表格对齐方式 - UE.commands["tablealignment"] = { - queryCommandState: function() { - if (browser.ie && browser.version < 8) { - return -1; - } - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, value) { - var me = this, - start = me.selection.getStart(), - table = start && domUtils.findParentByTagName(start, ["table"], true); - - if (table) { - table.setAttribute("align", value); - } - } - }; - - //表格属性 - UE.commands["edittable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, color) { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - var arr = domUtils - .getElementsByTagName(table, "td") - .concat( - domUtils.getElementsByTagName(table, "th"), - domUtils.getElementsByTagName(table, "caption") - ); - utils.each(arr, function(node) { - node.style.borderColor = color; - }); - } - } - }; - //单元格属性 - UE.commands["edittd"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, bkColor) { - var me = this, - ut = getUETableBySelected(me); - - if (!ut) { - var start = me.selection.getStart(), - cell = - start && - domUtils.findParentByTagName(start, ["td", "th", "caption"], true); - if (cell) { - cell.style.backgroundColor = bkColor; - } - } else { - utils.each(ut.selectedTds, function(cell) { - cell.style.backgroundColor = bkColor; - }); - } - } - }; - - UE.commands["settablebackground"] = { - queryCommandState: function() { - return getSelectedArr(this).length > 1 ? 0 : -1; - }, - execCommand: function(cmd, value) { - var cells, ut; - cells = getSelectedArr(this); - ut = getUETable(cells[0]); - ut.setBackground(cells, value); - } - }; - - UE.commands["cleartablebackground"] = { - queryCommandState: function() { - var cells = getSelectedArr(this); - if (!cells.length) return -1; - for (var i = 0, cell; (cell = cells[i++]); ) { - if (cell.style.backgroundColor !== "") return 0; - } - return -1; - }, - execCommand: function() { - var cells = getSelectedArr(this), - ut = getUETable(cells[0]); - ut.removeBackground(cells); - } - }; - - UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (!table) return -1; - var interlaced = table.getAttribute("interlaced"); - if (cmd == "interlacetable") { - //TODO 待定 - //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 - return interlaced === "enabled" ? -1 : 0; - } else { - return !interlaced || interlaced === "disabled" ? -1 : 0; - } - }, - execCommand: function(cmd, classList) { - var table = getTableItemsByRange(this).table; - if (cmd == "interlacetable") { - table.setAttribute("interlaced", "enabled"); - this.fireEvent("interlacetable", table, classList); - } else { - table.setAttribute("interlaced", "disabled"); - this.fireEvent("uninterlacetable", table); - } - } - }; - UE.commands["setbordervisible"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (!table) return -1; - return 0; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - utils.each(domUtils.getElementsByTagName(table, "td"), function(td) { - td.style.borderWidth = "1px"; - td.style.borderStyle = "solid"; - }); - } - }; - function resetTdWidth(table, editor) { - var tds = domUtils.getElementsByTagName(table, "td th"); - utils.each(tds, function(td) { - td.removeAttribute("width"); - }); - table.setAttribute( - "width", - getTableWidth(editor, true, getDefaultValue(editor, table)) - ); - var tdsWidths = []; - setTimeout(function() { - utils.each(tds, function(td) { - td.colSpan == 1 && tdsWidths.push(td.offsetWidth); - }); - utils.each(tds, function(td, i) { - td.colSpan == 1 && td.setAttribute("width", tdsWidths[i] + ""); - }); - }, 0); - } - - function getTableWidth(editor, needIEHack, defaultValue) { - var body = editor.body; - return ( - body.offsetWidth - - (needIEHack - ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (editor.options.offsetWidth || 0) - ); - } - - function getSelectedArr(editor) { - var cell = getTableItemsByRange(editor).cell; - if (cell) { - var ut = getUETable(cell); - return ut.selectedTds.length ? ut.selectedTds : [cell]; - } else { - return []; - } - } -})(); - - -// plugins/table.action.js -/** - * Created with JetBrains PhpStorm. - * User: taoqili - * Date: 12-10-12 - * Time: 上午10:05 - * To change this template use File | Settings | File Templates. - */ -UE.plugins["table"] = function() { - var me = this, - tabTimer = null, - //拖动计时器 - tableDragTimer = null, - //双击计时器 - tableResizeTimer = null, - //单元格最小宽度 - cellMinWidth = 5, - isInResizeBuffer = false, - //单元格边框大小 - cellBorderWidth = 5, - //鼠标偏移距离 - offsetOfTableCell = 10, - //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 - singleClickState = 0, - userActionStatus = null, - //双击允许的时间范围 - dblclickTime = 360, - UT = UE.UETable, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }, - getUETableBySelected = function(editor) { - return UT.getUETableBySelected(editor); - }, - getDefaultValue = function(editor, table) { - return UT.getDefaultValue(editor, table); - }, - removeSelectedClass = function(cells) { - return UT.removeSelectedClass(cells); - }; - - function showError(e) { - // throw e; - } - me.ready(function() { - var me = this; - var orgGetText = me.selection.getText; - me.selection.getText = function() { - var table = getUETableBySelected(me); - if (table) { - var str = ""; - utils.each(table.selectedTds, function(td) { - str += td[browser.ie ? "innerText" : "textContent"]; - }); - return str; - } else { - return orgGetText.call(me.selection); - } - }; - }); - - //处理拖动及框选相关方法 - var startTd = null, //鼠标按下时的锚点td - currentTd = null, //当前鼠标经过时的td - onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 - onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 - dragButton = null, - dragOver = false, - dragLine = null, //模拟的拖动线 - dragTd = null; //发生拖动的目标td - - var mousedown = false, - //todo 判断混乱模式 - needIEHack = true; - - me.setOpt({ - maxColNum: 20, - maxRowNum: 100, - defaultCols: 5, - defaultRows: 5, - tdvalign: "top", - cursorpath: me.options.UEDITOR_HOME_URL + "themes/" + me.options.theme + "/images/cursor_", - tableDragable: false, - classList: [ - "ue-table-interlace-color-single", - "ue-table-interlace-color-double" - ] - }); - me.getUETable = getUETable; - var commands = { - deletetable: 1, - inserttable: 1, - cellvalign: 1, - insertcaption: 1, - deletecaption: 1, - inserttitle: 1, - deletetitle: 1, - mergeright: 1, - mergedown: 1, - mergecells: 1, - insertrow: 1, - insertrownext: 1, - deleterow: 1, - insertcol: 1, - insertcolnext: 1, - deletecol: 1, - splittocells: 1, - splittorows: 1, - splittocols: 1, - adaptbytext: 1, - adaptbywindow: 1, - adaptbycustomer: 1, - insertparagraph: 1, - insertparagraphbeforetable: 1, - averagedistributecol: 1, - averagedistributerow: 1 - }; - me.ready(function() { - utils.cssRule( - "table", - //选中的td上的样式 - ".selectTdClass{background-color:#edf5fa !important}" + - "table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}" + - //插入的表格的默认样式 - "table{margin-bottom:10px;border-collapse:collapse;display:table;}" + - "td,th{padding: 5px 10px;border: 1px solid #DDD;}" + - "caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + - "th{border-top:1px solid #BBB;background-color:#F7F7F7;}" + - "table tr.firstRow th{border-top-width:2px;}" + - ".ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }" + - "td p{margin:0;padding:0;}", - me.document - ); - - var tableCopyList, isFullCol, isFullRow; - //注册del/backspace事件 - me.addListener("keydown", function(cmd, evt) { - var me = this; - var keyCode = evt.keyCode || evt.which; - - if (keyCode == 8) { - var ut = getUETableBySelected(me); - if (ut && ut.selectedTds.length) { - if (ut.isFullCol()) { - me.execCommand("deletecol"); - } else if (ut.isFullRow()) { - me.execCommand("deleterow"); - } else { - me.fireEvent("delcells"); - } - domUtils.preventDefault(evt); - } - - var caption = domUtils.findParentByTagName( - me.selection.getStart(), - "caption", - true - ), - range = me.selection.getRange(); - if (range.collapsed && caption && isEmptyBlock(caption)) { - me.fireEvent("saveScene"); - var table = caption.parentNode; - domUtils.remove(caption); - if (table) { - range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); - } - me.fireEvent("saveScene"); - } - } - - if (keyCode == 46) { - ut = getUETableBySelected(me); - if (ut) { - me.fireEvent("saveScene"); - for (var i = 0, ci; (ci = ut.selectedTds[i++]); ) { - domUtils.fillNode(me.document, ci); - } - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - } - } - if (keyCode == 13) { - var rng = me.selection.getRange(), - caption = domUtils.findParentByTagName( - rng.startContainer, - "caption", - true - ); - if (caption) { - var table = domUtils.findParentByTagName(caption, "table"); - if (!rng.collapsed) { - rng.deleteContents(); - me.fireEvent("saveScene"); - } else { - if (caption) { - rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); - } - } - domUtils.preventDefault(evt); - return; - } - if (rng.collapsed) { - var table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - var cell = table.rows[0].cells[0], - start = domUtils.findParentByTagName( - me.selection.getStart(), - ["td", "th"], - true - ), - preNode = table.previousSibling; - if ( - cell === start && - (!preNode || - (preNode.nodeType == 1 && preNode.tagName == "TABLE")) && - domUtils.isStartInblock(rng) - ) { - var first = domUtils.findParent( - me.selection.getStart(), - function(n) { - return domUtils.isBlockElm(n); - }, - true - ); - if ( - first && - (/t(h|d)/i.test(first.tagName) || first === start.firstChild) - ) { - me.execCommand("insertparagraphbeforetable"); - domUtils.preventDefault(evt); - } - } - } - } - } - - if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == "67") { - tableCopyList = null; - var ut = getUETableBySelected(me); - if (ut) { - var tds = ut.selectedTds; - isFullCol = ut.isFullCol(); - isFullRow = ut.isFullRow(); - tableCopyList = [[ut.cloneCell(tds[0], null, true)]]; - for (var i = 1, ci; (ci = tds[i]); i++) { - if (ci.parentNode !== tds[i - 1].parentNode) { - tableCopyList.push([ut.cloneCell(ci, null, true)]); - } else { - tableCopyList[tableCopyList.length - 1].push( - ut.cloneCell(ci, null, true) - ); - } - } - } - } - }); - me.addListener("tablehasdeleted", function() { - toggleDraggableState(this, false, "", null); - if (dragButton) domUtils.remove(dragButton); - }); - - me.addListener("beforepaste", function(cmd, html) { - var me = this; - var rng = me.selection.getRange(); - if (domUtils.findParentByTagName(rng.startContainer, "caption", true)) { - var div = me.document.createElement("div"); - div.innerHTML = html.html; - //trace:3729 - html.html = div[browser.ie9below ? "innerText" : "textContent"]; - return; - } - var table = getUETableBySelected(me); - if (tableCopyList) { - me.fireEvent("saveScene"); - var rng = me.selection.getRange(); - var td = domUtils.findParentByTagName( - rng.startContainer, - ["td", "th"], - true - ), - tmpNode, - preNode; - if (td) { - var ut = getUETable(td); - if (isFullRow) { - var rowIndex = ut.getCellInfo(td).rowIndex; - if (td.tagName == "TH") { - rowIndex++; - } - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - var tr = ut.insertRow(rowIndex++, "td"); - for (var j = 0, cj; (cj = ci[j]); j++) { - var cell = tr.cells[j]; - if (!cell) { - cell = tr.insertCell(j); - } - cell.innerHTML = cj.innerHTML; - cj.getAttribute("width") && - cell.setAttribute("width", cj.getAttribute("width")); - cj.getAttribute("vAlign") && - cell.setAttribute("vAlign", cj.getAttribute("vAlign")); - cj.getAttribute("align") && - cell.setAttribute("align", cj.getAttribute("align")); - cj.style.cssText && (cell.style.cssText = cj.style.cssText); - } - for (var j = 0, cj; (cj = tr.cells[j]); j++) { - if (!ci[j]) break; - cj.innerHTML = ci[j].innerHTML; - ci[j].getAttribute("width") && - cj.setAttribute("width", ci[j].getAttribute("width")); - ci[j].getAttribute("vAlign") && - cj.setAttribute("vAlign", ci[j].getAttribute("vAlign")); - ci[j].getAttribute("align") && - cj.setAttribute("align", ci[j].getAttribute("align")); - ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText); - } - } - } else { - if (isFullCol) { - cellInfo = ut.getCellInfo(td); - var maxColNum = 0; - for (var j = 0, ci = tableCopyList[0], cj; (cj = ci[j++]); ) { - maxColNum += cj.colSpan || 1; - } - me.__hasEnterExecCommand = true; - for (i = 0; i < maxColNum; i++) { - me.execCommand("insertcol"); - } - me.__hasEnterExecCommand = false; - td = ut.table.rows[0].cells[cellInfo.cellIndex]; - if (td.tagName == "TH") { - td = ut.table.rows[1].cells[cellInfo.cellIndex]; - } - } - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - tmpNode = td; - for (var j = 0, cj; (cj = ci[j++]); ) { - if (td) { - td.innerHTML = cj.innerHTML; - //todo 定制处理 - cj.getAttribute("width") && - td.setAttribute("width", cj.getAttribute("width")); - cj.getAttribute("vAlign") && - td.setAttribute("vAlign", cj.getAttribute("vAlign")); - cj.getAttribute("align") && - td.setAttribute("align", cj.getAttribute("align")); - cj.style.cssText && (td.style.cssText = cj.style.cssText); - preNode = td; - td = td.nextSibling; - } else { - var cloneTd = cj.cloneNode(true); - domUtils.removeAttributes(cloneTd, [ - "class", - "rowSpan", - "colSpan" - ]); - - preNode.parentNode.appendChild(cloneTd); - } - } - td = ut.getNextCell(tmpNode, true, true); - if (!tableCopyList[i]) break; - if (!td) { - var cellInfo = ut.getCellInfo(tmpNode); - ut.table.insertRow(ut.table.rows.length); - ut.update(); - td = ut.getVSideCell(tmpNode, true); - } - } - } - ut.update(); - } else { - table = me.document.createElement("table"); - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - var tr = table.insertRow(table.rows.length); - for (var j = 0, cj; (cj = ci[j++]); ) { - cloneTd = UT.cloneCell(cj, null, true); - domUtils.removeAttributes(cloneTd, ["class"]); - tr.appendChild(cloneTd); - } - if (j == 2 && cloneTd.rowSpan > 1) { - cloneTd.rowSpan = 1; - } - } - - var defaultValue = getDefaultValue(me), - width = - me.body.offsetWidth - - (needIEHack - ? parseInt( - domUtils.getComputedStyle(me.body, "margin-left"), - 10 - ) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (me.options.offsetWidth || 0); - me.execCommand( - "insertHTML", - "" + - table.innerHTML - .replace(/>\s*<") - .replace(/\bth\b/gi, "td") + - "
    " - ); - } - me.fireEvent("contentchange"); - me.fireEvent("saveScene"); - html.html = ""; - return true; - } else { - var div = me.document.createElement("div"), - tables; - div.innerHTML = html.html; - tables = div.getElementsByTagName("table"); - if (domUtils.findParentByTagName(me.selection.getStart(), "table")) { - utils.each(tables, function(t) { - domUtils.remove(t); - }); - if ( - domUtils.findParentByTagName( - me.selection.getStart(), - "caption", - true - ) - ) { - div.innerHTML = div[browser.ie ? "innerText" : "textContent"]; - } - } else { - utils.each(tables, function(table) { - removeStyleSize(table, true); - domUtils.removeAttributes(table, ["style", "border"]); - utils.each(domUtils.getElementsByTagName(table, "td"), function( - td - ) { - if (isEmptyBlock(td)) { - domUtils.fillNode(me.document, td); - } - removeStyleSize(td, true); - // domUtils.removeAttributes(td, ['style']) - }); - }); - } - html.html = div.innerHTML; - } - }); - - me.addListener("afterpaste", function() { - utils.each(domUtils.getElementsByTagName(me.body, "table"), function( - table - ) { - if (table.offsetWidth > me.body.offsetWidth) { - var defaultValue = getDefaultValue(me, table); - table.style.width = - me.body.offsetWidth - - (needIEHack - ? parseInt( - domUtils.getComputedStyle(me.body, "margin-left"), - 10 - ) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (me.options.offsetWidth || 0) + - "px"; - } - }); - }); - me.addListener("blur", function() { - tableCopyList = null; - }); - var timer; - me.addListener("keydown", function() { - clearTimeout(timer); - timer = setTimeout(function() { - var rng = me.selection.getRange(), - cell = domUtils.findParentByTagName( - rng.startContainer, - ["th", "td"], - true - ); - if (cell) { - var table = cell.parentNode.parentNode.parentNode; - if (table.offsetWidth > table.getAttribute("width")) { - cell.style.wordBreak = "break-all"; - } - } - }, 100); - }); - me.addListener("selectionchange", function() { - toggleDraggableState(me, false, "", null); - }); - - //内容变化时触发索引更新 - //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 - me.addListener("contentchange", function() { - var me = this; - //尽可能排除一些不需要更新的状况 - hideDragLine(me); - if (getUETableBySelected(me)) return; - var rng = me.selection.getRange(); - var start = rng.startContainer; - start = domUtils.findParentByTagName(start, ["td", "th"], true); - utils.each(domUtils.getElementsByTagName(me.document, "table"), function( - table - ) { - if (me.fireEvent("excludetable", table) === true) return; - table.ueTable = new UT(table); - //trace:3742 - // utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { - // - // if (domUtils.isEmptyBlock(td) && td !== start) { - // domUtils.fillNode(me.document, td); - // if (browser.ie && browser.version == 6) { - // td.innerHTML = ' ' - // } - // } - // }); - // utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { - // if (domUtils.isEmptyBlock(th) && th !== start) { - // domUtils.fillNode(me.document, th); - // if (browser.ie && browser.version == 6) { - // th.innerHTML = ' ' - // } - // } - // }); - table.onmouseover = function() { - me.fireEvent("tablemouseover", table); - }; - table.onmousemove = function() { - me.fireEvent("tablemousemove", table); - me.options.tableDragable && toggleDragButton(true, this, me); - utils.defer(function() { - me.fireEvent("contentchange", 50); - }, true); - }; - table.onmouseout = function() { - me.fireEvent("tablemouseout", table); - toggleDraggableState(me, false, "", null); - hideDragLine(me); - }; - table.onclick = function(evt) { - evt = me.window.event || evt; - var target = getParentTdOrTh(evt.target || evt.srcElement); - if (!target) return; - var ut = getUETable(target), - table = ut.table, - cellInfo = ut.getCellInfo(target), - cellsRange, - rng = me.selection.getRange(); - // if ("topLeft" == inPosition(table, mouseCoords(evt))) { - // cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); - // ut.setSelected(cellsRange); - // return; - // } - // if ("bottomRight" == inPosition(table, mouseCoords(evt))) { - // - // return; - // } - if (inTableSide(table, target, evt, true)) { - var endTdCol = ut.getCell( - ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, - ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex - ); - if (evt.shiftKey && ut.selectedTds.length) { - if (ut.selectedTds[0] !== endTdCol) { - cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdCol).select(); - } - } else { - if (target !== endTdCol) { - cellsRange = ut.getCellsRange(target, endTdCol); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdCol).select(); - } - } - return; - } - if (inTableSide(table, target, evt)) { - var endTdRow = ut.getCell( - ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, - ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex - ); - if (evt.shiftKey && ut.selectedTds.length) { - if (ut.selectedTds[0] !== endTdRow) { - cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdRow).select(); - } - } else { - if (target !== endTdRow) { - cellsRange = ut.getCellsRange(target, endTdRow); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdRow).select(); - } - } - } - }; - }); - - switchBorderColor(me, true); - }); - - domUtils.on(me.document, "mousemove", mouseMoveEvent); - - domUtils.on(me.document, "mouseout", function(evt) { - var target = evt.target || evt.srcElement; - if (target.tagName == "TABLE") { - toggleDraggableState(me, false, "", null); - } - }); - /** - * 表格隔行变色 - */ - me.addListener("interlacetable", function(type, table, classList) { - if (!table) return; - var me = this, - rows = table.rows, - len = rows.length, - getClass = function(list, index, repeat) { - return list[index] - ? list[index] - : repeat ? list[index % list.length] : ""; - }; - for (var i = 0; i < len; i++) { - rows[i].className = getClass( - classList || me.options.classList, - i, - true - ); - } - }); - me.addListener("uninterlacetable", function(type, table) { - if (!table) return; - var me = this, - rows = table.rows, - classList = me.options.classList, - len = rows.length; - for (var i = 0; i < len; i++) { - domUtils.removeClasses(rows[i], classList); - } - }); - - me.addListener("mousedown", mouseDownEvent); - me.addListener("mouseup", mouseUpEvent); - //拖动的时候触发mouseup - domUtils.on(me.body, "dragstart", function(evt) { - mouseUpEvent.call(me, "dragstart", evt); - }); - me.addOutputRule(function(root) { - utils.each(root.getNodesByTagName("div"), function(n) { - if (n.getAttr("id") == "ue_tableDragLine") { - n.parentNode.removeChild(n); - } - }); - }); - - var currentRowIndex = 0; - me.addListener("mousedown", function() { - currentRowIndex = 0; - }); - me.addListener("tabkeydown", function() { - var range = this.selection.getRange(), - common = range.getCommonAncestor(true, true), - table = domUtils.findParentByTagName(common, "table"); - if (table) { - if (domUtils.findParentByTagName(common, "caption", true)) { - var cell = domUtils.getElementsByTagName(table, "th td"); - if (cell && cell.length) { - range.setStart(cell[0], 0).setCursor(false, true); - } - } else { - var cell = domUtils.findParentByTagName(common, ["td", "th"], true), - ua = getUETable(cell); - currentRowIndex = cell.rowSpan > 1 - ? currentRowIndex - : ua.getCellInfo(cell).rowIndex; - var nextCell = ua.getTabNextCell(cell, currentRowIndex); - if (nextCell) { - if (isEmptyBlock(nextCell)) { - range.setStart(nextCell, 0).setCursor(false, true); - } else { - range.selectNodeContents(nextCell).select(); - } - } else { - me.fireEvent("saveScene"); - me.__hasEnterExecCommand = true; - this.execCommand("insertrownext"); - me.__hasEnterExecCommand = false; - range = this.selection.getRange(); - range - .setStart(table.rows[table.rows.length - 1].cells[0], 0) - .setCursor(); - me.fireEvent("saveScene"); - } - } - return true; - } - }); - browser.ie && - me.addListener("selectionchange", function() { - toggleDraggableState(this, false, "", null); - }); - me.addListener("keydown", function(type, evt) { - var me = this; - //处理在表格的最后一个输入tab产生新的表格 - var keyCode = evt.keyCode || evt.which; - if (keyCode == 8 || keyCode == 46) { - return; - } - var notCtrlKey = - !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; - notCtrlKey && - removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); - var ut = getUETableBySelected(me); - if (!ut) return; - notCtrlKey && ut.clearSelected(); - }); - - me.addListener("beforegetcontent", function() { - switchBorderColor(this, false); - browser.ie && - utils.each(this.document.getElementsByTagName("caption"), function(ci) { - if (domUtils.isEmptyNode(ci)) { - ci.innerHTML = " "; - } - }); - }); - me.addListener("aftergetcontent", function() { - switchBorderColor(this, true); - }); - me.addListener("getAllHtml", function() { - removeSelectedClass(me.document.getElementsByTagName("td")); - }); - //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 - me.addListener("fullscreenchanged", function(type, fullscreen) { - if (!fullscreen) { - var ratio = this.body.offsetWidth / document.body.offsetWidth, - tables = domUtils.getElementsByTagName(this.body, "table"); - utils.each(tables, function(table) { - if (table.offsetWidth < me.body.offsetWidth) return false; - var tds = domUtils.getElementsByTagName(table, "td"), - backWidths = []; - utils.each(tds, function(td) { - backWidths.push(td.offsetWidth); - }); - for (var i = 0, td; (td = tds[i]); i++) { - td.setAttribute("width", Math.floor(backWidths[i] * ratio)); - } - table.setAttribute( - "width", - Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))) - ); - }); - } - }); - - //重写execCommand命令,用于处理框选时的处理 - var oldExecCommand = me.execCommand; - me.execCommand = function(cmd, datatat) { - var me = this, - args = arguments; - - cmd = cmd.toLowerCase(); - var ut = getUETableBySelected(me), - tds, - range = new dom.Range(me.document), - cmdFun = me.commands[cmd] || UE.commands[cmd], - result; - if (!cmdFun) return; - if ( - ut && - !commands[cmd] && - !cmdFun.notNeedUndo && - !me.__hasEnterExecCommand - ) { - me.__hasEnterExecCommand = true; - me.fireEvent("beforeexeccommand", cmd); - tds = ut.selectedTds; - var lastState = -2, - lastValue = -2, - value, - state; - for (var i = 0, td; (td = tds[i]); i++) { - if (isEmptyBlock(td)) { - range.setStart(td, 0).setCursor(false, true); - } else { - range.selectNode(td).select(true); - } - state = me.queryCommandState(cmd); - value = me.queryCommandValue(cmd); - if (state != -1) { - if (lastState !== state || lastValue !== value) { - me._ignoreContentChange = true; - result = oldExecCommand.apply(me, arguments); - me._ignoreContentChange = false; - } - lastState = me.queryCommandState(cmd); - lastValue = me.queryCommandValue(cmd); - if (domUtils.isEmptyBlock(td)) { - domUtils.fillNode(me.document, td); - } - } - } - range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); - me.fireEvent("contentchange"); - me.fireEvent("afterexeccommand", cmd); - me.__hasEnterExecCommand = false; - me._selectionChange(); - } else { - result = oldExecCommand.apply(me, arguments); - } - return result; - }; - }); - /** - * 删除obj的宽高style,改成属性宽高 - * @param obj - * @param replaceToProperty - */ - function removeStyleSize(obj, replaceToProperty) { - removeStyle(obj, "width", true); - removeStyle(obj, "height", true); - } - - function removeStyle(obj, styleName, replaceToProperty) { - if (obj.style[styleName]) { - replaceToProperty && - obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); - obj.style[styleName] = ""; - } - } - - function getParentTdOrTh(ele) { - if (ele.tagName == "TD" || ele.tagName == "TH") return ele; - var td; - if ( - (td = - domUtils.findParentByTagName(ele, "td", true) || - domUtils.findParentByTagName(ele, "th", true)) - ) - return td; - return null; - } - - function isEmptyBlock(node) { - var reg = new RegExp(domUtils.fillChar, "g"); - if ( - node[browser.ie ? "innerText" : "textContent"] - .replace(/^\s*$/, "") - .replace(reg, "").length > 0 - ) { - return 0; - } - for (var n in dtd.$isNotEmpty) { - if (node.getElementsByTagName(n).length) { - return 0; - } - } - return 1; - } - - function mouseCoords(evt) { - if (evt.pageX || evt.pageY) { - return { x: evt.pageX, y: evt.pageY }; - } - return { - x: - evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, - y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop - }; - } - - function mouseMoveEvent(evt) { - if (isEditorDisabled()) { - return; - } - - try { - //普通状态下鼠标移动 - var target = getParentTdOrTh(evt.target || evt.srcElement), - pos; - - //区分用户的行为是拖动还是双击 - if (isInResizeBuffer) { - me.body.style.webkitUserSelect = "none"; - - if ( - Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell || - Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell - ) { - clearTableDragTimer(); - isInResizeBuffer = false; - singleClickState = 0; - //drag action - tableBorderDrag(evt); - } - } - - //修改单元格大小时的鼠标移动 - if (onDrag && dragTd) { - singleClickState = 0; - me.body.style.webkitUserSelect = "none"; - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - pos = mouseCoords(evt); - toggleDraggableState(me, true, onDrag, pos, target); - if (onDrag == "h") { - dragLine.style.left = getPermissionX(dragTd, evt) + "px"; - } else if (onDrag == "v") { - dragLine.style.top = getPermissionY(dragTd, evt) + "px"; - } - return; - } - //当鼠标处于table上时,修改移动过程中的光标状态 - if (target) { - //针对使用table作为容器的组件不触发拖拽效果 - if (me.fireEvent("excludetable", target) === true) return; - pos = mouseCoords(evt); - var state = getRelation(target, pos), - table = domUtils.findParentByTagName(target, "table", true); - - if (inTableSide(table, target, evt, true)) { - if (me.fireEvent("excludetable", table) === true) return; - me.body.style.cursor = - "url(" + me.options.cursorpath + "h.png),pointer"; - } else if (inTableSide(table, target, evt)) { - if (me.fireEvent("excludetable", table) === true) return; - me.body.style.cursor = - "url(" + me.options.cursorpath + "v.png),pointer"; - } else { - me.body.style.cursor = "text"; - var curCell = target; - if (/\d/.test(state)) { - state = state.replace(/\d/, ""); - target = getUETable(target).getPreviewCell(target, state == "v"); - } - //位于第一行的顶部或者第一列的左边时不可拖动 - toggleDraggableState( - me, - target ? !!state : false, - target ? state : "", - pos, - target - ); - } - } else { - toggleDragButton(false, table, me); - } - } catch (e) { - showError(e); - } - } - - var dragButtonTimer; - - function toggleDragButton(show, table, editor) { - if (!show) { - if (dragOver) return; - dragButtonTimer = setTimeout(function() { - !dragOver && - dragButton && - dragButton.parentNode && - dragButton.parentNode.removeChild(dragButton); - }, 2000); - } else { - createDragButton(table, editor); - } - } - - function createDragButton(table, editor) { - var pos = domUtils.getXY(table), - doc = table.ownerDocument; - if (dragButton && dragButton.parentNode) return dragButton; - dragButton = doc.createElement("div"); - dragButton.contentEditable = false; - dragButton.innerHTML = ""; - dragButton.style.cssText = - "width:15px;height:15px;background-image:url(" + - editor.options.UEDITOR_HOME_URL + - "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + - (pos.y - 15) + - "px;left:" + - pos.x + - "px;"; - domUtils.unSelectable(dragButton); - dragButton.onmouseover = function(evt) { - dragOver = true; - }; - dragButton.onmouseout = function(evt) { - dragOver = false; - }; - domUtils.on(dragButton, "click", function(type, evt) { - doClick(evt, this); - }); - domUtils.on(dragButton, "dblclick", function(type, evt) { - doDblClick(evt); - }); - domUtils.on(dragButton, "dragstart", function(type, evt) { - domUtils.preventDefault(evt); - }); - var timer; - - function doClick(evt, button) { - // 部分浏览器下需要清理 - clearTimeout(timer); - timer = setTimeout(function() { - editor.fireEvent("tableClicked", table, button); - }, 300); - } - - function doDblClick(evt) { - clearTimeout(timer); - var ut = getUETable(table), - start = table.rows[0].cells[0], - end = ut.getLastCell(), - range = ut.getCellsRange(start, end); - editor.selection.getRange().setStart(start, 0).setCursor(false, true); - ut.setSelected(range); - } - - doc.body.appendChild(dragButton); - } - - // function inPosition(table, pos) { - // var tablePos = domUtils.getXY(table), - // width = table.offsetWidth, - // height = table.offsetHeight; - // if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { - // return "topLeft"; - // } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { - // return "bottomRight"; - // } - // } - - function inTableSide(table, cell, evt, top) { - var pos = mouseCoords(evt), - state = getRelation(cell, pos); - - if (top) { - var caption = table.getElementsByTagName("caption")[0], - capHeight = caption ? caption.offsetHeight : 0; - return state == "v1" && pos.y - domUtils.getXY(table).y - capHeight < 8; - } else { - return state == "h1" && pos.x - domUtils.getXY(table).x < 8; - } - } - - /** - * 获取拖动时允许的X轴坐标 - * @param dragTd - * @param evt - */ - function getPermissionX(dragTd, evt) { - var ut = getUETable(dragTd); - if (ut) { - var preTd = ut.getSameEndPosCells(dragTd, "x")[0], - nextTd = ut.getSameStartPosXCells(dragTd)[0], - mouseX = mouseCoords(evt).x, - left = - (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20, - right = nextTd - ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 - : me.body.offsetWidth + 5 || - parseInt(domUtils.getComputedStyle(me.body, "width"), 10); - - left += cellMinWidth; - right -= cellMinWidth; - - return mouseX < left ? left : mouseX > right ? right : mouseX; - } - } - - /** - * 获取拖动时允许的Y轴坐标 - */ - function getPermissionY(dragTd, evt) { - try { - var top = domUtils.getXY(dragTd).y, - mousePosY = mouseCoords(evt).y; - return mousePosY < top ? top : mousePosY; - } catch (e) { - showError(e); - } - } - - /** - * 移动状态切换 - */ - function toggleDraggableState(editor, draggable, dir, mousePos, cell) { - try { - editor.body.style.cursor = dir == "h" - ? "col-resize" - : dir == "v" ? "row-resize" : "text"; - if (browser.ie) { - if (dir && !mousedown && !getUETableBySelected(editor)) { - getDragLine(editor, editor.document); - showDragLineAt(dir, cell); - } else { - hideDragLine(editor); - } - } - onBorder = draggable; - } catch (e) { - showError(e); - } - } - - /** - * 获取与UETable相关的resize line - * @param uetable UETable对象 - */ - function getResizeLineByUETable() { - var lineId = "_UETableResizeLine", - line = this.document.getElementById(lineId); - - if (!line) { - line = this.document.createElement("div"); - line.id = lineId; - line.contnetEditable = false; - line.setAttribute("unselectable", "on"); - - var styles = { - width: 2 * cellBorderWidth + 1 + "px", - position: "absolute", - "z-index": 100000, - cursor: "col-resize", - background: "red", - display: "none" - }; - - //切换状态 - line.onmouseout = function() { - this.style.display = "none"; - }; - - utils.extend(line.style, styles); - - this.document.body.appendChild(line); - } - - return line; - } - - /** - * 更新resize-line - */ - function updateResizeLine(cell, uetable) { - var line = getResizeLineByUETable.call(this), - table = uetable.table, - styles = { - top: domUtils.getXY(table).y + "px", - left: - domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + "px", - display: "block", - height: table.offsetHeight + "px" - }; - - utils.extend(line.style, styles); - } - - /** - * 显示resize-line - */ - function showResizeLine(cell) { - var uetable = getUETable(cell); - - updateResizeLine.call(this, cell, uetable); - } - - /** - * 获取鼠标与当前单元格的相对位置 - * @param ele - * @param mousePos - */ - function getRelation(ele, mousePos) { - var elePos = domUtils.getXY(ele); - - if (!elePos) { - return ""; - } - - if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { - return "h"; - } - if (mousePos.x - elePos.x < cellBorderWidth) { - return "h1"; - } - if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { - return "v"; - } - if (mousePos.y - elePos.y < cellBorderWidth) { - return "v1"; - } - return ""; - } - - function mouseDownEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - userActionStatus = { - x: evt.clientX, - y: evt.clientY - }; - - //右键菜单单独处理 - if (evt.button == 2) { - var ut = getUETableBySelected(me), - flag = false; - - if (ut) { - var td = getTargetTd(me, evt); - utils.each(ut.selectedTds, function(ti) { - if (ti === td) { - flag = true; - } - }); - if (!flag) { - removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); - ut.clearSelected(); - } else { - td = ut.selectedTds[0]; - setTimeout(function() { - me.selection.getRange().setStart(td, 0).setCursor(false, true); - }, 0); - } - } - } else { - tableClickHander(evt); - } - } - - //清除表格的计时器 - function clearTableTimer() { - tabTimer && clearTimeout(tabTimer); - tabTimer = null; - } - - //双击收缩 - function tableDbclickHandler(evt) { - singleClickState = 0; - evt = evt || me.window.event; - var target = getParentTdOrTh(evt.target || evt.srcElement); - if (target) { - var h; - if ((h = getRelation(target, mouseCoords(evt)))) { - hideDragLine(me); - - if (h == "h1") { - h = "h"; - if ( - inTableSide( - domUtils.findParentByTagName(target, "table"), - target, - evt - ) - ) { - me.execCommand("adaptbywindow"); - } else { - target = getUETable(target).getPreviewCell(target); - if (target) { - var rng = me.selection.getRange(); - rng.selectNodeContents(target).setCursor(true, true); - } - } - } - if (h == "h") { - var ut = getUETable(target), - table = ut.table, - cells = getCellsByMoveBorder(target, table, true); - - cells = extractArray(cells, "left"); - - ut.width = ut.offsetWidth; - - var oldWidth = [], - newWidth = []; - - utils.each(cells, function(cell) { - oldWidth.push(cell.offsetWidth); - }); - - utils.each(cells, function(cell) { - cell.removeAttribute("width"); - }); - - window.setTimeout(function() { - //是否允许改变 - var changeable = true; - - utils.each(cells, function(cell, index) { - var width = cell.offsetWidth; - - if (width > oldWidth[index]) { - changeable = false; - return false; - } - - newWidth.push(width); - }); - - var change = changeable ? newWidth : oldWidth; - - utils.each(cells, function(cell, index) { - cell.width = change[index] - getTabcellSpace(); - }); - }, 0); - - // minWidth -= cellMinWidth; - // - // table.removeAttribute("width"); - // utils.each(cells, function (cell) { - // cell.style.width = ""; - // cell.width -= minWidth; - // }); - } - } - } - } - - function tableClickHander(evt) { - removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); - //trace:3113 - //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 - utils.each(me.document.getElementsByTagName("table"), function(t) { - t.ueTable = null; - }); - startTd = getTargetTd(me, evt); - if (!startTd) return; - var table = domUtils.findParentByTagName(startTd, "table", true); - ut = getUETable(table); - ut && ut.clearSelected(); - - //判断当前鼠标状态 - if (!onBorder) { - me.document.body.style.webkitUserSelect = ""; - mousedown = true; - me.addListener("mouseover", mouseOverEvent); - } else { - //边框上的动作处理 - borderActionHandler(evt); - } - } - - //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 - function borderActionHandler(evt) { - if (browser.ie) { - evt = reconstruct(evt); - } - - clearTableDragTimer(); - - //是否正在等待resize的缓冲中 - isInResizeBuffer = true; - - tableDragTimer = setTimeout(function() { - tableBorderDrag(evt); - }, dblclickTime); - } - - function extractArray(originArr, key) { - var result = [], - tmp = null; - - for (var i = 0, len = originArr.length; i < len; i++) { - tmp = originArr[i][key]; - - if (tmp) { - result.push(tmp); - } - } - - return result; - } - - function clearTableDragTimer() { - tableDragTimer && clearTimeout(tableDragTimer); - tableDragTimer = null; - } - - function reconstruct(obj) { - var attrs = [ - "pageX", - "pageY", - "clientX", - "clientY", - "srcElement", - "target" - ], - newObj = {}; - - if (obj) { - for (var i = 0, key, val; (key = attrs[i]); i++) { - val = obj[key]; - val && (newObj[key] = val); - } - } - - return newObj; - } - - //边框拖动 - function tableBorderDrag(evt) { - isInResizeBuffer = false; - - startTd = evt.target || evt.srcElement; - if (!startTd) return; - var state = getRelation(startTd, mouseCoords(evt)); - if (/\d/.test(state)) { - state = state.replace(/\d/, ""); - startTd = getUETable(startTd).getPreviewCell(startTd, state == "v"); - } - hideDragLine(me); - getDragLine(me, me.document); - me.fireEvent("saveScene"); - showDragLineAt(state, startTd); - mousedown = true; - //拖动开始 - onDrag = state; - dragTd = startTd; - } - - function mouseUpEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - clearTableDragTimer(); - - isInResizeBuffer = false; - - if (onBorder) { - singleClickState = ++singleClickState % 3; - - userActionStatus = { - x: evt.clientX, - y: evt.clientY - }; - - tableResizeTimer = setTimeout(function() { - singleClickState > 0 && singleClickState--; - }, dblclickTime); - - if (singleClickState === 2) { - singleClickState = 0; - tableDbclickHandler(evt); - return; - } - } - - if (evt.button == 2) return; - var me = this; - //清除表格上原生跨选问题 - var range = me.selection.getRange(), - start = domUtils.findParentByTagName(range.startContainer, "table", true), - end = domUtils.findParentByTagName(range.endContainer, "table", true); - - if (start || end) { - if (start === end) { - start = domUtils.findParentByTagName( - range.startContainer, - ["td", "th", "caption"], - true - ); - end = domUtils.findParentByTagName( - range.endContainer, - ["td", "th", "caption"], - true - ); - if (start !== end) { - me.selection.clearRange(); - } - } else { - me.selection.clearRange(); - } - } - mousedown = false; - me.document.body.style.webkitUserSelect = ""; - //拖拽状态下的mouseUP - if (onDrag && dragTd) { - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - - singleClickState = 0; - dragLine = me.document.getElementById("ue_tableDragLine"); - - // trace 3973 - if (dragLine) { - var dragTdPos = domUtils.getXY(dragTd), - dragLinePos = domUtils.getXY(dragLine); - - switch (onDrag) { - case "h": - changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); - break; - case "v": - changeRowHeight( - dragTd, - dragLinePos.y - dragTdPos.y - dragTd.offsetHeight - ); - break; - default: - } - onDrag = ""; - dragTd = null; - - hideDragLine(me); - me.fireEvent("saveScene"); - return; - } - } - //正常状态下的mouseup - if (!startTd) { - var target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - "td", - true - ); - if (!target) - target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - "th", - true - ); - if (target && (target.tagName == "TD" || target.tagName == "TH")) { - if (me.fireEvent("excludetable", target) === true) return; - range = new dom.Range(me.document); - range.setStart(target, 0).setCursor(false, true); - } - } else { - var ut = getUETable(startTd), - cell = ut ? ut.selectedTds[0] : null; - if (cell) { - range = new dom.Range(me.document); - if (domUtils.isEmptyBlock(cell)) { - range.setStart(cell, 0).setCursor(false, true); - } else { - range - .selectNodeContents(cell) - .shrinkBoundary() - .setCursor(false, true); - } - } else { - range = me.selection.getRange().shrinkBoundary(); - if (!range.collapsed) { - var start = domUtils.findParentByTagName( - range.startContainer, - ["td", "th"], - true - ), - end = domUtils.findParentByTagName( - range.endContainer, - ["td", "th"], - true - ); - //在table里边的不能清除 - if ( - (start && !end) || - (!start && end) || - (start && end && start !== end) - ) { - range.setCursor(false, true); - } - } - } - startTd = null; - me.removeListener("mouseover", mouseOverEvent); - } - me._selectionChange(250, evt); - } - - function mouseOverEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - var me = this, - tar = evt.target || evt.srcElement; - currentTd = - domUtils.findParentByTagName(tar, "td", true) || - domUtils.findParentByTagName(tar, "th", true); - //需要判断两个TD是否位于同一个表格内 - if ( - startTd && - currentTd && - ((startTd.tagName == "TD" && currentTd.tagName == "TD") || - (startTd.tagName == "TH" && currentTd.tagName == "TH")) && - domUtils.findParentByTagName(startTd, "table") == - domUtils.findParentByTagName(currentTd, "table") - ) { - var ut = getUETable(currentTd); - if (startTd != currentTd) { - me.document.body.style.webkitUserSelect = "none"; - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - var range = ut.getCellsRange(startTd, currentTd); - ut.setSelected(range); - } else { - me.document.body.style.webkitUserSelect = ""; - ut.clearSelected(); - } - } - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - } - - function setCellHeight(cell, height, backHeight) { - var lineHight = parseInt( - domUtils.getComputedStyle(cell, "line-height"), - 10 - ), - tmpHeight = backHeight + height; - height = tmpHeight < lineHight ? lineHight : tmpHeight; - if (cell.style.height) cell.style.height = ""; - cell.rowSpan == 1 - ? cell.setAttribute("height", height) - : cell.removeAttribute && cell.removeAttribute("height"); - } - - function getWidth(cell) { - if (!cell) return 0; - return parseInt(domUtils.getComputedStyle(cell, "width"), 10); - } - - function changeColWidth(cell, changeValue) { - var ut = getUETable(cell); - if (ut) { - //根据当前移动的边框获取相关的单元格 - var table = ut.table, - cells = getCellsByMoveBorder(cell, table); - - table.style.width = ""; - table.removeAttribute("width"); - - //修正改变量 - changeValue = correctChangeValue(changeValue, cell, cells); - - if (cell.nextSibling) { - var i = 0; - - utils.each(cells, function(cellGroup) { - cellGroup.left.width = +cellGroup.left.width + changeValue; - cellGroup.right && - (cellGroup.right.width = +cellGroup.right.width - changeValue); - }); - } else { - utils.each(cells, function(cellGroup) { - cellGroup.left.width -= -changeValue; - }); - } - } - } - - function isEditorDisabled() { - return me.body.contentEditable === "false"; - } - - function changeRowHeight(td, changeValue) { - if (Math.abs(changeValue) < 10) return; - var ut = getUETable(td); - if (ut) { - var cells = ut.getSameEndPosCells(td, "y"), - //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 - backHeight = cells[0] ? cells[0].offsetHeight : 0; - for (var i = 0, cell; (cell = cells[i++]); ) { - setCellHeight(cell, changeValue, backHeight); - } - } - } - - /** - * 获取调整单元格大小的相关单元格 - * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 - */ - function getCellsByMoveBorder(cell, table, isContainMergeCell) { - if (!table) { - table = domUtils.findParentByTagName(cell, "table"); - } - - if (!table) { - return null; - } - - //获取到该单元格所在行的序列号 - var index = domUtils.getNodeIndex(cell), - temp = cell, - rows = table.rows, - colIndex = 0; - - while (temp) { - //获取到当前单元格在未发生单元格合并时的序列 - if (temp.nodeType === 1) { - colIndex += temp.colSpan || 1; - } - temp = temp.previousSibling; - } - - temp = null; - - //记录想关的单元格 - var borderCells = []; - - utils.each(rows, function(tabRow) { - var cells = tabRow.cells, - currIndex = 0; - - utils.each(cells, function(tabCell) { - currIndex += tabCell.colSpan || 1; - - if (currIndex === colIndex) { - borderCells.push({ - left: tabCell, - right: tabCell.nextSibling || null - }); - - return false; - } else if (currIndex > colIndex) { - if (isContainMergeCell) { - borderCells.push({ - left: tabCell - }); - } - - return false; - } - }); - }); - - return borderCells; - } - - /** - * 通过给定的单元格集合获取最小的单元格width - */ - function getMinWidthByTableCells(cells) { - var minWidth = Number.MAX_VALUE; - - for (var i = 0, curCell; (curCell = cells[i]); i++) { - minWidth = Math.min( - minWidth, - curCell.width || getTableCellWidth(curCell) - ); - } - - return minWidth; - } - - function correctChangeValue(changeValue, relatedCell, cells) { - //为单元格的paading预留空间 - changeValue -= getTabcellSpace(); - - if (changeValue < 0) { - return 0; - } - - changeValue -= getTableCellWidth(relatedCell); - - //确定方向 - var direction = changeValue < 0 ? "left" : "right"; - - changeValue = Math.abs(changeValue); - - //只关心非最后一个单元格就可以 - utils.each(cells, function(cellGroup) { - var curCell = cellGroup[direction]; - - //为单元格保留最小空间 - if (curCell) { - changeValue = Math.min( - changeValue, - getTableCellWidth(curCell) - cellMinWidth - ); - } - }); - - //修正越界 - changeValue = changeValue < 0 ? 0 : changeValue; - - return direction === "left" ? -changeValue : changeValue; - } - - function getTableCellWidth(cell) { - var width = 0, - //偏移纠正量 - offset = 0, - width = cell.offsetWidth - getTabcellSpace(); - - //最后一个节点纠正一下 - if (!cell.nextSibling) { - width -= getTableCellOffset(cell); - } - - width = width < 0 ? 0 : width; - - try { - cell.width = width; - } catch (e) {} - - return width; - } - - /** - * 获取单元格所在表格的最末单元格的偏移量 - */ - function getTableCellOffset(cell) { - tab = domUtils.findParentByTagName(cell, "table", false); - - if (tab.offsetVal === undefined) { - var prev = cell.previousSibling; - - if (prev) { - //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 - tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth - ? UT.borderWidth - : 0; - } else { - tab.offsetVal = 0; - } - } - - return tab.offsetVal; - } - - function getTabcellSpace() { - if (UT.tabcellSpace === undefined) { - var cell = null, - tab = me.document.createElement("table"), - tbody = me.document.createElement("tbody"), - trow = me.document.createElement("tr"), - tabcell = me.document.createElement("td"), - mirror = null; - - tabcell.style.cssText = "border: 0;"; - tabcell.width = 1; - - trow.appendChild(tabcell); - trow.appendChild((mirror = tabcell.cloneNode(false))); - - tbody.appendChild(trow); - - tab.appendChild(tbody); - - tab.style.cssText = "visibility: hidden;"; - - me.body.appendChild(tab); - - UT.paddingSpace = tabcell.offsetWidth - 1; - - var tmpTabWidth = tab.offsetWidth; - - tabcell.style.cssText = ""; - mirror.style.cssText = ""; - - UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3; - - UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; - - me.body.removeChild(tab); - } - - getTabcellSpace = function() { - return UT.tabcellSpace; - }; - - return UT.tabcellSpace; - } - - function getDragLine(editor, doc) { - if (mousedown) return; - dragLine = editor.document.createElement("div"); - domUtils.setAttributes(dragLine, { - id: "ue_tableDragLine", - unselectable: "on", - contenteditable: false, - onresizestart: "return false", - ondragstart: "return false", - onselectstart: "return false", - style: - "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" - }); - editor.body.appendChild(dragLine); - } - - function hideDragLine(editor) { - if (mousedown) return; - var line; - while ((line = editor.document.getElementById("ue_tableDragLine"))) { - domUtils.remove(line); - } - } - - /** - * 依据state(v|h)在cell位置显示横线 - * @param state - * @param cell - */ - function showDragLineAt(state, cell) { - if (!cell) return; - var table = domUtils.findParentByTagName(cell, "table"), - caption = table.getElementsByTagName("caption"), - width = table.offsetWidth, - height = - table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), - tablePos = domUtils.getXY(table), - cellPos = domUtils.getXY(cell), - css; - switch (state) { - case "h": - css = - "height:" + - height + - "px;top:" + - (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + - "px;left:" + - (cellPos.x + cell.offsetWidth); - dragLine.style.cssText = - css + - "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)"; - break; - case "v": - css = - "width:" + - width + - "px;left:" + - tablePos.x + - "px;top:" + - (cellPos.y + cell.offsetHeight); - //必须加上border:0和color:blue,否则低版ie不支持背景色显示 - dragLine.style.cssText = - css + - "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"; - break; - default: - } - } - - /** - * 当表格边框颜色为白色时设置为虚线,true为添加虚线 - * @param editor - * @param flag - */ - function switchBorderColor(editor, flag) { - var tableArr = domUtils.getElementsByTagName(editor.body, "table"), - color; - for (var i = 0, node; (node = tableArr[i++]); ) { - var td = domUtils.getElementsByTagName(node, "td"); - if (td[0]) { - if (flag) { - color = td[0].style.borderColor.replace(/\s/g, ""); - if (/(#ffffff)|(rgb\(255,255,255\))/gi.test(color)) - domUtils.addClass(node, "noBorderTable"); - } else { - domUtils.removeClasses(node, "noBorderTable"); - } - } - } - } - - function getTableWidth(editor, needIEHack, defaultValue) { - var body = editor.body; - return ( - body.offsetWidth - - (needIEHack - ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (editor.options.offsetWidth || 0) - ); - } - - /** - * 获取当前拖动的单元格 - */ - function getTargetTd(editor, evt) { - var target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - ["td", "th"], - true - ), - dir = null; - - if (!target) { - return null; - } - - dir = getRelation(target, mouseCoords(evt)); - - //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td - - if (!target) { - return null; - } - - if (dir === "h1" && target.previousSibling) { - var position = domUtils.getXY(target), - cellWidth = target.offsetWidth; - - if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) { - target = target.previousSibling; - } - } else if (dir === "v1" && target.parentNode.previousSibling) { - var position = domUtils.getXY(target), - cellHeight = target.offsetHeight; - - if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) { - target = target.parentNode.previousSibling.firstChild; - } - } - - //排除了非td内部以及用于代码高亮部分的td - return target && !(editor.fireEvent("excludetable", target) === true) - ? target - : null; - } -}; - - -// plugins/table.sort.js -/** - * Created with JetBrains PhpStorm. - * User: Jinqn - * Date: 13-10-12 - * Time: 上午10:20 - * To change this template use File | Settings | File Templates. - */ - -UE.UETable.prototype.sortTable = function(sortByCellIndex, compareFn) { - var table = this.table, - rows = table.rows, - trArray = [], - flag = rows[0].cells[0].tagName === "TH", - lastRowIndex = 0; - if (this.selectedTds.length) { - var range = this.cellsRange, - len = range.endRowIndex + 1; - for (var i = range.beginRowIndex; i < len; i++) { - trArray[i] = rows[i]; - } - trArray.splice(0, range.beginRowIndex); - lastRowIndex = range.endRowIndex + 1 === this.rowsNum - ? 0 - : range.endRowIndex + 1; - } else { - for (var i = 0, len = rows.length; i < len; i++) { - trArray[i] = rows[i]; - } - } - - var Fn = { - reversecurrent: function(td1, td2) { - return 1; - }, - orderbyasc: function(td1, td2) { - var value1 = td1.innerText || td1.textContent, - value2 = td2.innerText || td2.textContent; - return value1.localeCompare(value2); - }, - reversebyasc: function(td1, td2) { - var value1 = td1.innerHTML, - value2 = td2.innerHTML; - return value2.localeCompare(value1); - }, - orderbynum: function(td1, td2) { - var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), - value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value1 || 0) - (value2 || 0); - }, - reversebynum: function(td1, td2) { - var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), - value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value2 || 0) - (value1 || 0); - } - }; - - //对表格设置排序的标记data-sort-type - table.setAttribute( - "data-sort-type", - compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : "" - ); - - //th不参与排序 - flag && trArray.splice(0, 1); - trArray = utils.sort(trArray, function(tr1, tr2) { - var result; - if (compareFn && typeof compareFn === "function") { - result = compareFn.call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else if (compareFn && typeof compareFn === "number") { - result = 1; - } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { - result = Fn[compareFn].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else { - result = Fn["orderbyasc"].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } - return result; - }); - var fragment = table.ownerDocument.createDocumentFragment(); - for (var j = 0, len = trArray.length; j < len; j++) { - fragment.appendChild(trArray[j]); - } - var tbody = table.getElementsByTagName("tbody")[0]; - if (!lastRowIndex) { - tbody.appendChild(fragment); - } else { - tbody.insertBefore( - fragment, - rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] - ); - } -}; - -UE.plugins["tablesort"] = function() { - var me = this, - UT = UE.UETable, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }, - getTableItemsByRange = function(editor) { - return UT.getTableItemsByRange(editor); - }; - - me.ready(function() { - //添加表格可排序的样式 - utils.cssRule( - "tablesort", - "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;" + - " background-image:url(" + - me.options.themePath + - me.options.theme + - "/images/sortable.png);}", - me.document - ); - - //做单元格合并操作时,清除可排序标识 - me.addListener("afterexeccommand", function(type, cmd) { - if (cmd == "mergeright" || cmd == "mergedown" || cmd == "mergecells") { - this.execCommand("disablesort"); - } - }); - }); - - //表格排序 - UE.commands["sorttable"] = { - queryCommandState: function() { - var me = this, - tableItems = getTableItemsByRange(me); - if (!tableItems.cell) return -1; - var table = tableItems.table, - cells = table.getElementsByTagName("td"); - for (var i = 0, cell; (cell = cells[i++]); ) { - if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; - } - return 0; - }, - execCommand: function(cmd, fn) { - var me = this, - range = me.selection.getRange(), - bk = range.createBookmark(true), - tableItems = getTableItemsByRange(me), - cell = tableItems.cell, - ut = getUETable(tableItems.table), - cellInfo = ut.getCellInfo(cell); - ut.sortTable(cellInfo.cellIndex, fn); - range.moveToBookmark(bk); - try { - range.select(); - } catch (e) {} - } - }; - - //设置表格可排序,清除表格可排序 - UE.commands["enablesort"] = UE.commands["disablesort"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (table && cmd == "enablesort") { - var cells = domUtils.getElementsByTagName(table, "th td"); - for (var i = 0; i < cells.length; i++) { - if ( - cells[i].getAttribute("colspan") > 1 || - cells[i].getAttribute("rowspan") > 1 - ) - return -1; - } - } - - return !table - ? -1 - : (cmd == "enablesort") ^ - (table.getAttribute("data-sort") != "sortEnabled") - ? -1 - : 0; - }, - execCommand: function(cmd) { - var table = getTableItemsByRange(this).table; - table.setAttribute( - "data-sort", - cmd == "enablesort" ? "sortEnabled" : "sortDisabled" - ); - cmd == "enablesort" - ? domUtils.addClass(table, "sortEnabled") - : domUtils.removeClasses(table, "sortEnabled"); - } - }; -}; - - -// plugins/contextmenu.js -///import core -///commands 右键菜单 -///commandsName ContextMenu -///commandsTitle 右键菜单 -/** - * 右键菜单 - * @function - * @name baidu.editor.plugins.contextmenu - * @author zhanyi - */ - -UE.plugins["contextmenu"] = function() { - var me = this; - - me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true); - - if (me.getOpt("enableContextMenu") === false) { - return; - } - var lang = me.getLang("contextMenu"), - menu, - items = me.options.contextMenu || [ - { label: lang["selectall"], cmdName: "selectall" }, - { - label: lang.cleardoc, - cmdName: "cleardoc", - exec: function() { - if (confirm(lang.confirmclear)) { - this.execCommand("cleardoc"); - } - } - }, - "-", - { - label: lang.unlink, - cmdName: "unlink" - }, - "-", - { - group: lang.paragraph, - icon: "justifyjustify", - subMenu: [ - { - label: lang.justifyleft, - cmdName: "justify", - value: "left" - }, - { - label: lang.justifyright, - cmdName: "justify", - value: "right" - }, - { - label: lang.justifycenter, - cmdName: "justify", - value: "center" - }, - { - label: lang.justifyjustify, - cmdName: "justify", - value: "justify" - } - ] - }, - "-", - { - group: lang.table, - icon: "table", - subMenu: [ - { - label: lang.inserttable, - cmdName: "inserttable" - }, - { - label: lang.deletetable, - cmdName: "deletetable" - }, - "-", - { - label: lang.deleterow, - cmdName: "deleterow" - }, - { - label: lang.deletecol, - cmdName: "deletecol" - }, - { - label: lang.insertcol, - cmdName: "insertcol" - }, - { - label: lang.insertcolnext, - cmdName: "insertcolnext" - }, - { - label: lang.insertrow, - cmdName: "insertrow" - }, - { - label: lang.insertrownext, - cmdName: "insertrownext" - }, - "-", - { - label: lang.insertcaption, - cmdName: "insertcaption" - }, - { - label: lang.deletecaption, - cmdName: "deletecaption" - }, - { - label: lang.inserttitle, - cmdName: "inserttitle" - }, - { - label: lang.deletetitle, - cmdName: "deletetitle" - }, - { - label: lang.inserttitlecol, - cmdName: "inserttitlecol" - }, - { - label: lang.deletetitlecol, - cmdName: "deletetitlecol" - }, - "-", - { - label: lang.mergecells, - cmdName: "mergecells" - }, - { - label: lang.mergeright, - cmdName: "mergeright" - }, - { - label: lang.mergedown, - cmdName: "mergedown" - }, - "-", - { - label: lang.splittorows, - cmdName: "splittorows" - }, - { - label: lang.splittocols, - cmdName: "splittocols" - }, - { - label: lang.splittocells, - cmdName: "splittocells" - }, - "-", - { - label: lang.averageDiseRow, - cmdName: "averagedistributerow" - }, - { - label: lang.averageDisCol, - cmdName: "averagedistributecol" - }, - "-", - { - label: lang.edittd, - cmdName: "edittd", - exec: function() { - if (UE.ui["edittd"]) { - new UE.ui["edittd"](this); - } - this.getDialog("edittd").open(); - } - }, - { - label: lang.edittable, - cmdName: "edittable", - exec: function() { - if (UE.ui["edittable"]) { - new UE.ui["edittable"](this); - } - this.getDialog("edittable").open(); - } - }, - { - label: lang.setbordervisible, - cmdName: "setbordervisible" - } - ] - }, - { - group: lang.tablesort, - icon: "tablesort", - subMenu: [ - { - label: lang.enablesort, - cmdName: "enablesort" - }, - { - label: lang.disablesort, - cmdName: "disablesort" - }, - "-", - { - label: lang.reversecurrent, - cmdName: "sorttable", - value: "reversecurrent" - }, - { - label: lang.orderbyasc, - cmdName: "sorttable", - value: "orderbyasc" - }, - { - label: lang.reversebyasc, - cmdName: "sorttable", - value: "reversebyasc" - }, - { - label: lang.orderbynum, - cmdName: "sorttable", - value: "orderbynum" - }, - { - label: lang.reversebynum, - cmdName: "sorttable", - value: "reversebynum" - } - ] - }, - { - group: lang.borderbk, - icon: "borderBack", - subMenu: [ - { - label: lang.setcolor, - cmdName: "interlacetable", - exec: function() { - this.execCommand("interlacetable"); - } - }, - { - label: lang.unsetcolor, - cmdName: "uninterlacetable", - exec: function() { - this.execCommand("uninterlacetable"); - } - }, - { - label: lang.setbackground, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["#bbb", "#ccc"] - }); - } - }, - { - label: lang.unsetbackground, - cmdName: "cleartablebackground", - exec: function() { - this.execCommand("cleartablebackground"); - } - }, - { - label: lang.redandblue, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["red", "blue"] - }); - } - }, - { - label: lang.threecolorgradient, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["#aaa", "#bbb", "#ccc"] - }); - } - } - ] - }, - { - group: lang.aligntd, - icon: "aligntd", - subMenu: [ - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "bottom" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "bottom" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "bottom" } - } - ] - }, - { - group: lang.aligntable, - icon: "aligntable", - subMenu: [ - { - cmdName: "tablealignment", - className: "left", - label: lang.tableleft, - value: "left" - }, - { - cmdName: "tablealignment", - className: "center", - label: lang.tablecenter, - value: "center" - }, - { - cmdName: "tablealignment", - className: "right", - label: lang.tableright, - value: "right" - } - ] - }, - "-", - { - label: lang.insertparagraphbefore, - cmdName: "insertparagraph", - value: true - }, - { - label: lang.insertparagraphafter, - cmdName: "insertparagraph" - }, - { - label: lang["copy"], - cmdName: "copy" - }, - { - label: lang["paste"], - cmdName: "paste" - } - ]; - if (!items.length) { - return; - } - var uiUtils = UE.ui.uiUtils; - - me.addListener("contextmenu", function(type, evt) { - var offset = uiUtils.getViewportOffsetByEvent(evt); - me.fireEvent("beforeselectionchange"); - if (menu) { - menu.destroy(); - } - for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) { - var last; - (function(item) { - if (item == "-") { - if ((last = contextItems[contextItems.length - 1]) && last !== "-") { - contextItems.push("-"); - } - } else if (item.hasOwnProperty("group")) { - for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) { - (function(subItem) { - if (subItem == "-") { - if ((last = subMenu[subMenu.length - 1]) && last !== "-") { - subMenu.push("-"); - } else { - subMenu.splice(subMenu.length - 1); - } - } else { - if ( - (me.commands[subItem.cmdName] || - UE.commands[subItem.cmdName] || - subItem.query) && - (subItem.query - ? subItem.query() - : me.queryCommandState(subItem.cmdName)) > -1 - ) { - subMenu.push({ - label: - subItem.label || - me.getLang( - "contextMenu." + - subItem.cmdName + - (subItem.value || "") - ) || - "", - className: - "edui-for-" + - subItem.cmdName + - (subItem.className - ? " edui-for-" + - subItem.cmdName + - "-" + - subItem.className - : ""), - onclick: subItem.exec - ? function() { - subItem.exec.call(me); - } - : function() { - me.execCommand(subItem.cmdName, subItem.value); - } - }); - } - } - })(cj); - } - if (subMenu.length) { - function getLabel() { - switch (item.icon) { - case "table": - return me.getLang("contextMenu.table"); - case "justifyjustify": - return me.getLang("contextMenu.paragraph"); - case "aligntd": - return me.getLang("contextMenu.aligntd"); - case "aligntable": - return me.getLang("contextMenu.aligntable"); - case "tablesort": - return lang.tablesort; - case "borderBack": - return lang.borderbk; - default: - return ""; - } - } - contextItems.push({ - //todo 修正成自动获取方式 - label: getLabel(), - className: "edui-for-" + item.icon, - subMenu: { - items: subMenu, - editor: me - } - }); - } - } else { - //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 - if ( - (me.commands[item.cmdName] || - UE.commands[item.cmdName] || - item.query) && - (item.query - ? item.query.call(me) - : me.queryCommandState(item.cmdName)) > -1 - ) { - contextItems.push({ - label: item.label || me.getLang("contextMenu." + item.cmdName), - className: - "edui-for-" + - (item.icon ? item.icon : item.cmdName + (item.value || "")), - onclick: item.exec - ? function() { - item.exec.call(me); - } - : function() { - me.execCommand(item.cmdName, item.value); - } - }); - } - } - })(ti); - } - if (contextItems[contextItems.length - 1] == "-") { - contextItems.pop(); - } - - menu = new UE.ui.Menu({ - items: contextItems, - className: "edui-contextmenu", - editor: me - }); - menu.render(); - menu.showAt(offset); - - me.fireEvent("aftershowcontextmenu", menu); - - domUtils.preventDefault(evt); - if (browser.ie) { - var ieRange; - try { - ieRange = me.selection.getNative().createRange(); - } catch (e) { - return; - } - if (ieRange.item) { - var range = new dom.Range(me.document); - range.selectNode(ieRange.item(0)).select(true, true); - } - } - }); - - // 添加复制的flash按钮 - me.addListener("aftershowcontextmenu", function(type, menu) { - if (me.zeroclipboard) { - var items = menu.items; - for (var key in items) { - if (items[key].className == "edui-for-copy") { - me.zeroclipboard.clip(items[key].getDom()); - } - } - } - }); -}; - - -// plugins/shortcutmenu.js -///import core -///commands 弹出菜单 -// commandsName popupmenu -///commandsTitle 弹出菜单 -/** - * 弹出菜单 - * @function - * @name baidu.editor.plugins.popupmenu - * @author xuheng - */ - -UE.plugins["shortcutmenu"] = function() { - var me = this, - menu, - items = me.options.shortcutMenu || []; - - if (!items.length) { - return; - } - - me.addListener("contextmenu mouseup", function(type, e) { - var me = this, - customEvt = { - type: type, - target: e.target || e.srcElement, - screenX: e.screenX, - screenY: e.screenY, - clientX: e.clientX, - clientY: e.clientY - }; - - setTimeout(function() { - var rng = me.selection.getRange(); - if (rng.collapsed === false || type == "contextmenu") { - if (!menu) { - menu = new baidu.editor.ui.ShortCutMenu({ - editor: me, - items: items, - theme: me.options.theme, - className: "edui-shortcutmenu" - }); - - menu.render(); - me.fireEvent("afterrendershortcutmenu", menu); - } - - menu.show(customEvt, !!UE.plugins["contextmenu"]); - } - }); - - if (type == "contextmenu") { - domUtils.preventDefault(e); - if (browser.ie9below) { - var ieRange; - try { - ieRange = me.selection.getNative().createRange(); - } catch (e) { - return; - } - if (ieRange.item) { - var range = new dom.Range(me.document); - range.selectNode(ieRange.item(0)).select(true, true); - } - } - } - }); - - me.addListener("keydown", function(type) { - if (type == "keydown") { - menu && !menu.isHidden && menu.hide(); - } - }); -}; - - -// plugins/basestyle.js -/** - * B、I、sub、super命令支持 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["basestyle"] = function() { - /** - * 字体加粗 - * @command bold - * @param { String } cmd 命令字符串 - * @remind 对已加粗的文本内容执行该命令, 将取消加粗 - * @method execCommand - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行加粗操作 - * //第一次执行, 文本内容加粗 - * editor.execCommand( 'bold' ); - * - * //第二次执行, 文本内容取消加粗 - * editor.execCommand( 'bold' ); - * ``` - */ - - /** - * 字体倾斜 - * @command italic - * @method execCommand - * @param { String } cmd 命令字符串 - * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行斜体操作 - * //第一次操作, 文本内容将变成斜体 - * editor.execCommand( 'italic' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'italic' ); - * ``` - */ - - /** - * 下标文本,与“superscript”命令互斥 - * @command subscript - * @method execCommand - * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行下标操作 - * //第一次操作, 文本内容将变成下标文本 - * editor.execCommand( 'subscript' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'subscript' ); - * ``` - */ - - /** - * 上标文本,与“subscript”命令互斥 - * @command superscript - * @method execCommand - * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行上标操作 - * //第一次操作, 文本内容将变成上标文本 - * editor.execCommand( 'superscript' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'superscript' ); - * ``` - */ - var basestyles = { - bold: ["strong", "b"], - italic: ["em", "i"], - subscript: ["sub"], - superscript: ["sup"] - }, - getObj = function(editor, tagNames) { - return domUtils.filterNodeList( - editor.selection.getStartElementPath(), - tagNames - ); - }, - me = this; - //添加快捷键 - me.addshortcutkey({ - Bold: "ctrl+66", //^B - Italic: "ctrl+73", //^I - Underline: "ctrl+85" //^U - }); - me.addInputRule(function(root) { - utils.each(root.getNodesByTagName("b i"), function(node) { - switch (node.tagName) { - case "b": - node.tagName = "strong"; - break; - case "i": - node.tagName = "em"; - } - }); - }); - for (var style in basestyles) { - (function(cmd, tagNames) { - me.commands[cmd] = { - execCommand: function(cmdName) { - var range = me.selection.getRange(), - obj = getObj(this, tagNames); - if (range.collapsed) { - if (obj) { - var tmpText = me.document.createTextNode(""); - range.insertNode(tmpText).removeInlineStyle(tagNames); - range.setStartBefore(tmpText); - domUtils.remove(tmpText); - } else { - var tmpNode = range.document.createElement(tagNames[0]); - if (cmdName == "superscript" || cmdName == "subscript") { - tmpText = me.document.createTextNode(""); - range - .insertNode(tmpText) - .removeInlineStyle(["sub", "sup"]) - .setStartBefore(tmpText) - .collapse(true); - } - range.insertNode(tmpNode).setStart(tmpNode, 0); - } - range.collapse(true); - } else { - if (cmdName == "superscript" || cmdName == "subscript") { - if (!obj || obj.tagName.toLowerCase() != cmdName) { - range.removeInlineStyle(["sub", "sup"]); - } - } - obj - ? range.removeInlineStyle(tagNames) - : range.applyInlineStyle(tagNames[0]); - } - range.select(); - }, - queryCommandState: function() { - return getObj(this, tagNames) ? 1 : 0; - } - }; - })(style, basestyles[style]); - } -}; - - -// plugins/elementpath.js -/** - * 选取路径命令 - * @file - */ -UE.plugins["elementpath"] = function() { - var currentLevel, - tagNames, - me = this; - me.setOpt("elementPathEnabled", true); - if (!me.options.elementPathEnabled) { - return; - } - me.commands["elementpath"] = { - execCommand: function(cmdName, level) { - var start = tagNames[level], - range = me.selection.getRange(); - currentLevel = level * 1; - range.selectNode(start).select(); - }, - queryCommandValue: function() { - //产生一个副本,不能修改原来的startElementPath; - var parents = [].concat(this.selection.getStartElementPath()).reverse(), - names = []; - tagNames = parents; - for (var i = 0, ci; (ci = parents[i]); i++) { - if (ci.nodeType == 3) { - continue; - } - var name = ci.tagName.toLowerCase(); - if (name == "img" && ci.getAttribute("anchorname")) { - name = "anchor"; - } - names[i] = name; - if (currentLevel == i) { - currentLevel = -1; - break; - } - } - return names; - } - }; -}; - - -// plugins/formatmatch.js -/** - * 格式刷,只格式inline的 - * @file - * @since 1.2.6.1 - */ - -/** - * 格式刷 - * @command formatmatch - * @method execCommand - * @remind 该操作不能复制段落格式 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //获取格式刷 - * editor.execCommand( 'formatmatch' ); - * ``` - */ -UE.plugins["formatmatch"] = function() { - var me = this, - list = [], - img, - flag = 0; - - me.addListener("reset", function() { - list = []; - flag = 0; - }); - - function addList(type, evt) { - if (browser.webkit) { - var target = evt.target.tagName == "IMG" ? evt.target : null; - } - - function addFormat(range) { - if (text) { - range.selectNode(text); - } - return range.applyInlineStyle(list[list.length - 1].tagName, null, list); - } - - me.undoManger && me.undoManger.save(); - - var range = me.selection.getRange(), - imgT = target || range.getClosedNode(); - if (img && imgT && imgT.tagName == "IMG") { - //trace:964 - - imgT.style.cssText += - ";float:" + - (img.style.cssFloat || img.style.styleFloat || "none") + - ";display:" + - (img.style.display || "inline"); - - img = null; - } else { - if (!img) { - var collapsed = range.collapsed; - if (collapsed) { - var text = me.document.createTextNode("match"); - range.insertNode(text).select(); - } - me.__hasEnterExecCommand = true; - //不能把block上的属性干掉 - //trace:1553 - var removeFormatAttributes = me.options.removeFormatAttributes; - me.options.removeFormatAttributes = ""; - me.execCommand("removeformat"); - me.options.removeFormatAttributes = removeFormatAttributes; - me.__hasEnterExecCommand = false; - //trace:969 - range = me.selection.getRange(); - if (list.length) { - addFormat(range); - } - if (text) { - range.setStartBefore(text).collapse(true); - } - range.select(); - text && domUtils.remove(text); - } - } - - me.undoManger && me.undoManger.save(); - me.removeListener("mouseup", addList); - flag = 0; - } - - me.commands["formatmatch"] = { - execCommand: function(cmdName) { - if (flag) { - flag = 0; - list = []; - me.removeListener("mouseup", addList); - return; - } - - var range = me.selection.getRange(); - img = range.getClosedNode(); - if (!img || img.tagName != "IMG") { - range.collapse(true).shrinkBoundary(); - var start = range.startContainer; - list = domUtils.findParents(start, true, function(node) { - return !domUtils.isBlockElm(node) && node.nodeType == 1; - }); - //a不能加入格式刷, 并且克隆节点 - for (var i = 0, ci; (ci = list[i]); i++) { - if (ci.tagName == "A") { - list.splice(i, 1); - break; - } - } - } - - me.addListener("mouseup", addList); - flag = 1; - }, - queryCommandState: function() { - return flag; - }, - notNeedUndo: 1 - }; -}; - - -// plugins/searchreplace.js -///import core -///commands 查找替换 -///commandsName SearchReplace -///commandsTitle 查询替换 -///commandsDialog dialogs\searchreplace -/** - * @description 查找替换 - * @author zhanyi - */ - -UE.plugin.register("searchreplace", function() { - var me = this; - - var _blockElm = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; - - var lastRng = null; - - function getText(node) { - var text = node.nodeType == 3 - ? node.nodeValue - : node[browser.ie ? "innerText" : "textContent"]; - return text.replace(domUtils.fillChar, ""); - } - - function findTextInString(textContent, opt, currentIndex) { - var str = opt.searchStr; - - var reg = new RegExp(str, "g" + (opt.casesensitive ? "" : "i")), - match; - - if (opt.dir == -1) { - textContent = textContent.substr(0, currentIndex); - textContent = textContent.split("").reverse().join(""); - str = str.split("").reverse().join(""); - match = reg.exec(textContent); - if (match) { - return currentIndex - match.index - str.length; - } - } else { - textContent = textContent.substr(currentIndex); - match = reg.exec(textContent); - if (match) { - return match.index + currentIndex; - } - } - - return -1; - } - function findTextBlockElm(node, currentIndex, opt) { - var textContent, - index, - methodName = opt.all || opt.dir == 1 ? "getNextDomNode" : "getPreDomNode"; - if (domUtils.isBody(node)) { - node = node.firstChild; - } - var first = 1; - while (node) { - textContent = getText(node); - index = findTextInString(textContent, opt, currentIndex); - first = 0; - if (index != -1) { - return { - node: node, - index: index - }; - } - node = domUtils[methodName](node); - while (node && _blockElm[node.nodeName.toLowerCase()]) { - node = domUtils[methodName](node, true); - } - if (node) { - currentIndex = opt.dir == -1 ? getText(node).length : 0; - } - } - } - function findNTextInBlockElm(node, index, str) { - var currentIndex = 0, - currentNode = node.firstChild, - currentNodeLength = 0, - result; - while (currentNode) { - if (currentNode.nodeType == 3) { - currentNodeLength = getText(currentNode).replace( - /(^[\t\r\n]+)|([\t\r\n]+$)/, - "" - ).length; - currentIndex += currentNodeLength; - if (currentIndex >= index) { - return { - node: currentNode, - index: currentNodeLength - (currentIndex - index) - }; - } - } else if (!dtd.$empty[currentNode.tagName]) { - currentNodeLength = getText(currentNode).replace( - /(^[\t\r\n]+)|([\t\r\n]+$)/, - "" - ).length; - currentIndex += currentNodeLength; - if (currentIndex >= index) { - result = findNTextInBlockElm( - currentNode, - currentNodeLength - (currentIndex - index), - str - ); - if (result) { - return result; - } - } - } - currentNode = domUtils.getNextDomNode(currentNode); - } - } - - function searchReplace(me, opt) { - var rng = lastRng || me.selection.getRange(), - startBlockNode, - searchStr = opt.searchStr, - span = me.document.createElement("span"); - span.innerHTML = "$$ueditor_searchreplace_key$$"; - - rng.shrinkBoundary(true); - - //判断是不是第一次选中 - if (!rng.collapsed) { - rng.select(); - var rngText = me.selection.getText(); - if ( - new RegExp( - "^" + opt.searchStr + "$", - opt.casesensitive ? "" : "i" - ).test(rngText) - ) { - if (opt.replaceStr != undefined) { - replaceText(rng, opt.replaceStr); - rng.select(); - return true; - } else { - rng.collapse(opt.dir == -1); - } - } - } - - rng.insertNode(span); - rng.enlargeToBlockElm(true); - startBlockNode = rng.startContainer; - var currentIndex = getText(startBlockNode).indexOf( - "$$ueditor_searchreplace_key$$" - ); - rng.setStartBefore(span); - domUtils.remove(span); - var result = findTextBlockElm(startBlockNode, currentIndex, opt); - if (result) { - var rngStart = findNTextInBlockElm(result.node, result.index, searchStr); - var rngEnd = findNTextInBlockElm( - result.node, - result.index + searchStr.length, - searchStr - ); - rng - .setStart(rngStart.node, rngStart.index) - .setEnd(rngEnd.node, rngEnd.index); - - if (opt.replaceStr !== undefined) { - replaceText(rng, opt.replaceStr); - } - rng.select(); - return true; - } else { - rng.setCursor(); - } - } - function replaceText(rng, str) { - str = me.document.createTextNode(str); - rng.deleteContents().insertNode(str); - } - return { - commands: { - searchreplace: { - execCommand: function(cmdName, opt) { - utils.extend( - opt, - { - all: false, - casesensitive: false, - dir: 1 - }, - true - ); - var num = 0; - if (opt.all) { - lastRng = null; - var rng = me.selection.getRange(), - first = me.body.firstChild; - if (first && first.nodeType == 1) { - rng.setStart(first, 0); - rng.shrinkBoundary(true); - } else if (first.nodeType == 3) { - rng.setStartBefore(first); - } - rng.collapse(true).select(true); - if (opt.replaceStr !== undefined) { - me.fireEvent("saveScene"); - } - while (searchReplace(this, opt)) { - num++; - lastRng = me.selection.getRange(); - lastRng.collapse(opt.dir == -1); - } - if (num) { - me.fireEvent("saveScene"); - } - } else { - if (opt.replaceStr !== undefined) { - me.fireEvent("saveScene"); - } - if (searchReplace(this, opt)) { - num++; - lastRng = me.selection.getRange(); - lastRng.collapse(opt.dir == -1); - } - if (num) { - me.fireEvent("saveScene"); - } - } - - return num; - }, - notNeedUndo: 1 - } - }, - bindEvents: { - clearlastSearchResult: function() { - lastRng = null; - } - } - }; -}); - - -// plugins/customstyle.js -/** - * 自定义样式 - * @file - * @since 1.2.6.1 - */ - -/** - * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 - * @command customstyle - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'customstyle' ); - * ``` - */ -UE.plugins["customstyle"] = function() { - var me = this; - me.setOpt({ - customstyle: [ - { - tag: "h1", - name: "tc", - style: - "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;" - }, - { - tag: "h1", - name: "tl", - style: - "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;" - }, - { - tag: "span", - name: "im", - style: - "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;" - }, - { - tag: "span", - name: "hi", - style: - "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;" - } - ] - }); - me.commands["customstyle"] = { - execCommand: function(cmdName, obj) { - var me = this, - tagName = obj.tag, - node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label"); - }, - true - ), - range, - bk, - tmpObj = {}; - for (var p in obj) { - if (obj[p] !== undefined) tmpObj[p] = obj[p]; - } - delete tmpObj.tag; - if (node && node.getAttribute("label") == obj.label) { - range = this.selection.getRange(); - bk = range.createBookmark(); - if (range.collapsed) { - //trace:1732 删掉自定义标签,要有p来回填站位 - if (dtd.$block[node.tagName]) { - var fillNode = me.document.createElement("p"); - domUtils.moveChild(node, fillNode); - node.parentNode.insertBefore(fillNode, node); - domUtils.remove(node); - } else { - domUtils.remove(node, true); - } - } else { - var common = domUtils.getCommonAncestor(bk.start, bk.end), - nodes = domUtils.getElementsByTagName(common, tagName); - if (new RegExp(tagName, "i").test(common.tagName)) { - nodes.push(common); - } - for (var i = 0, ni; (ni = nodes[i++]); ) { - if (ni.getAttribute("label") == obj.label) { - var ps = domUtils.getPosition(ni, bk.start), - pe = domUtils.getPosition(ni, bk.end); - if ( - (ps & domUtils.POSITION_FOLLOWING || - ps & domUtils.POSITION_CONTAINS) && - (pe & domUtils.POSITION_PRECEDING || - pe & domUtils.POSITION_CONTAINS) - ) - if (dtd.$block[tagName]) { - var fillNode = me.document.createElement("p"); - domUtils.moveChild(ni, fillNode); - ni.parentNode.insertBefore(fillNode, ni); - } - domUtils.remove(ni, true); - } - } - node = domUtils.findParent( - common, - function(node) { - return node.getAttribute("label") == obj.label; - }, - true - ); - if (node) { - domUtils.remove(node, true); - } - } - range.moveToBookmark(bk).select(); - } else { - if (dtd.$block[tagName]) { - this.execCommand("paragraph", tagName, tmpObj, "customstyle"); - range = me.selection.getRange(); - if (!range.collapsed) { - range.collapse(); - node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label") == obj.label; - }, - true - ); - var pNode = me.document.createElement("p"); - domUtils.insertAfter(node, pNode); - domUtils.fillNode(me.document, pNode); - range.setStart(pNode, 0).setCursor(); - } - } else { - range = me.selection.getRange(); - if (range.collapsed) { - node = me.document.createElement(tagName); - domUtils.setAttributes(node, tmpObj); - range.insertNode(node).setStart(node, 0).setCursor(); - - return; - } - - bk = range.createBookmark(); - range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); - } - } - }, - queryCommandValue: function() { - var parent = domUtils.filterNodeList( - this.selection.getStartElementPath(), - function(node) { - return node.getAttribute("label"); - } - ); - return parent ? parent.getAttribute("label") : ""; - } - }; - //当去掉customstyle是,如果是块元素,用p代替 - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - - if (keyCode == 32 || keyCode == 13) { - var range = me.selection.getRange(); - if (range.collapsed) { - var node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label"); - }, - true - ); - if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { - var p = me.document.createElement("p"); - domUtils.insertAfter(node, p); - domUtils.fillNode(me.document, p); - domUtils.remove(node); - range.setStart(p, 0).setCursor(); - } - } - } - }); -}; - - -// plugins/catchremoteimage.js -///import core -///commands 远程图片抓取 -///commandsName catchRemoteImage,catchremoteimageenable -///commandsTitle 远程图片抓取 -/** - * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 - */ -UE.plugins["catchremoteimage"] = function() { - var me = this, - ajax = UE.ajax; - - /* 设置默认值 */ - if (me.options.catchRemoteImageEnable === false) return; - me.setOpt({ - catchRemoteImageEnable: false - }); - - me.addListener("afterpaste", function() { - me.fireEvent("catchRemoteImage"); - }); - - me.addListener("catchRemoteImage", function() { - var catcherLocalDomain = me.getOpt("catcherLocalDomain"), - catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), - catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), - catcherFieldName = me.getOpt("catcherFieldName"); - - var remoteImages = [], - loadingIMG = me.options.themePath + me.options.theme + '/images/spacer.gif', - imgs = me.document.querySelectorAll('[style*="url"],img'), - test = function(src, urls) { - if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { - return true; - } - if (urls) { - for (var j = 0, url; (url = urls[j++]); ) { - if (src.indexOf(url) !== -1) { - return true; - } - } - } - return false; - }; - - for (var i = 0, ci; (ci = imgs[i++]); ) { - if (ci.getAttribute("word_img")) { - continue; - } - if(ci.nodeName == "IMG"){ - var src = ci.getAttribute("_src") || ci.src || ""; - if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { - remoteImages.push(src); - // 添加上传时的uploading动画 - domUtils.setAttributes(ci, { - class: "loadingclass", - _src: src, - src: loadingIMG - }) - } - } else { - // 获取背景图片url - var backgroundImageurl = ci.style.cssText.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, ''); - if (/^(https?|ftp):/i.test(backgroundImageurl) && !test(backgroundImageurl, catcherLocalDomain)) { - remoteImages.push(backgroundImageurl); - ci.style.cssText = ci.style.cssText.replace(backgroundImageurl, loadingIMG); - domUtils.setAttributes(ci, { - "data-background": backgroundImageurl - }) - } - } - } - - if (remoteImages.length) { - catchremoteimage(remoteImages, { - //成功抓取 - success: function(r) { - try { - var info = r.state !== undefined - ? r - : eval("(" + r.responseText + ")"); - } catch (e) { - return; - } - - /* 获取源路径和新路径 */ - var i, - j, - ci, - cj, - oldSrc, - newSrc, - list = info.list; - - /* 抓取失败统计 */ - var catchFailList = []; - /* 抓取成功统计 */ - var catchSuccessList = []; - /* 抓取失败时显示的图片 */ - var failIMG = me.options.themePath + me.options.theme + '/images/img-cracked.png'; - - for (i = 0; ci = imgs[i++];) { - oldSrc = ci.getAttribute("_src") || ci.src || ""; - oldBgIMG = ci.getAttribute("data-background") || ""; - for (j = 0; cj = list[j++];) { - if (oldSrc == cj.source && cj.state == "SUCCESS") { - newSrc = catcherUrlPrefix + cj.url; - // 上传成功是删除uploading动画 - domUtils.removeClasses( ci, "loadingclass" ); - domUtils.setAttributes(ci, { - "src": newSrc, - "_src": newSrc, - "data-catchResult":"img_catchSuccess" // 添加catch成功标记 - }); - catchSuccessList.push(ci); - break; - } else if (oldSrc == cj.source && cj.state == "FAIL") { - // 替换成统一的失败图片 - domUtils.removeClasses( ci, "loadingclass" ); - domUtils.setAttributes(ci, { - "src": failIMG, - "_src": failIMG, - "data-catchResult":"img_catchFail" // 添加catch失败标记 - }); - catchFailList.push(ci); - break; - } else if (oldBgIMG == cj.source && cj.state == "SUCCESS") { - newBgIMG = catcherUrlPrefix + cj.url; - ci.style.cssText = ci.style.cssText.replace(loadingIMG, newBgIMG); - domUtils.removeAttributes(ci,"data-background"); - domUtils.setAttributes(ci, { - "data-catchResult":"img_catchSuccess" // 添加catch成功标记 - }); - catchSuccessList.push(ci); - break; - } else if (oldBgIMG == cj.source && cj.state == "FAIL"){ - ci.style.cssText = ci.style.cssText.replace(loadingIMG, failIMG); - domUtils.removeAttributes(ci,"data-background"); - domUtils.setAttributes(ci, { - "data-catchResult":"img_catchFail" // 添加catch失败标记 - }); - catchFailList.push(ci); - break; - } - } - - } - // 监听事件添加成功抓取和抓取失败的dom列表参数 - me.fireEvent('catchremotesuccess',catchSuccessList,catchFailList); - }, - //回调失败,本次请求超时 - error: function() { - me.fireEvent("catchremoteerror"); - } - }); - } - - function catchremoteimage(imgs, callbacks) { - var params = - utils.serializeParam(me.queryCommandValue("serverparam")) || "", - url = utils.formatUrl( - catcherActionUrl + - (catcherActionUrl.indexOf("?") == -1 ? "?" : "&") + - params - ), - isJsonp = utils.isCrossDomainUrl(url), - opt = { - method: "POST", - dataType: isJsonp ? "jsonp" : "", - timeout: 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 - onsuccess: callbacks["success"], - onerror: callbacks["error"] - }; - opt[catcherFieldName] = imgs; - ajax.request(url, opt); - } - }); -}; - - -// plugins/snapscreen.js -/** - * 截屏插件,为UEditor提供插入支持 - * @file - * @since 1.4.2 - */ -UE.plugin.register("snapscreen", function() { - var me = this; - var snapplugin; - - function getLocation(url) { - var search, - a = document.createElement("a"), - params = utils.serializeParam(me.queryCommandValue("serverparam")) || ""; - - a.href = url; - if (browser.ie) { - a.href = a.href; - } - - search = a.search; - if (params) { - search = search + (search.indexOf("?") == -1 ? "?" : "&") + params; - search = search.replace(/[&]+/gi, "&"); - } - return { - port: a.port, - hostname: a.hostname, - path: a.pathname + search || +a.hash - }; - } - - return { - commands: { - /** - * 字体背景颜色 - * @command snapscreen - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand('snapscreen'); - * ``` - */ - snapscreen: { - execCommand: function(cmd) { - var url, local, res; - var lang = me.getLang("snapScreen_plugin"); - - if (!snapplugin) { - var container = me.container; - var doc = me.container.ownerDocument || me.container.document; - snapplugin = doc.createElement("object"); - try { - snapplugin.type = "application/x-pluginbaidusnap"; - } catch (e) { - return; - } - snapplugin.style.cssText = - "position:absolute;left:-9999px;width:0;height:0;"; - snapplugin.setAttribute("width", "0"); - snapplugin.setAttribute("height", "0"); - container.appendChild(snapplugin); - } - - function onSuccess(rs) { - try { - rs = eval("(" + rs + ")"); - if (rs.state == "SUCCESS") { - var opt = me.options; - me.execCommand("insertimage", { - src: opt.snapscreenUrlPrefix + rs.url, - _src: opt.snapscreenUrlPrefix + rs.url, - alt: rs.title || "", - floatStyle: opt.snapscreenImgAlign - }); - } else { - alert(rs.state); - } - } catch (e) { - alert(lang.callBackErrorMsg); - } - } - url = me.getActionUrl(me.getOpt("snapscreenActionName")); - local = getLocation(url); - setTimeout(function() { - try { - res = snapplugin.saveSnapshot( - local.hostname, - local.path, - local.port - ); - } catch (e) { - me.ui._dialogs["snapscreenDialog"].open(); - return; - } - - onSuccess(res); - }, 50); - }, - queryCommandState: function() { - return navigator.userAgent.indexOf("Windows", 0) != -1 ? 0 : -1; - } - } - } - }; -}); - - -// plugins/insertparagraph.js -/** - * 插入段落 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入段落 - * @command insertparagraph - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * editor.execCommand( 'insertparagraph' ); - * ``` - */ - -UE.commands["insertparagraph"] = { - execCommand: function(cmdName, front) { - var me = this, - range = me.selection.getRange(), - start = range.startContainer, - tmpNode; - while (start) { - if (domUtils.isBody(start)) { - break; - } - tmpNode = start; - start = start.parentNode; - } - if (tmpNode) { - var p = me.document.createElement("p"); - if (front) { - tmpNode.parentNode.insertBefore(p, tmpNode); - } else { - tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling); - } - domUtils.fillNode(me.document, p); - range.setStart(p, 0).setCursor(false, true); - } - } -}; - - -// plugins/webapp.js -/** - * 百度应用 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入百度应用 - * @command webapp - * @method execCommand - * @remind 需要百度APPKey - * @remind 百度应用主页: http://app.baidu.com/ - * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, - * height=>应用容器高度,logo=>应用logo,url=>应用地址 - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'webapp' , { - * title: '植物大战僵尸', - * width: 560, - * height: 465, - * logo: '应用展示的图片', - * url: '百度应用的地址' - * } ); - * ``` - */ - -//UE.plugins['webapp'] = function () { -// var me = this; -// function createInsertStr( obj, toIframe, addParagraph ) { -// return !toIframe ? -// (addParagraph ? '

    ' : '') + '' + -// (addParagraph ? '

    ' : '') -// : -// ''; -// } -// -// function switchImgAndIframe( img2frame ) { -// var tmpdiv, -// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); -// for ( var i = 0, node; node = nodes[i++]; ) { -// if ( node.className != "edui-faked-webapp" ){ -// continue; -// } -// tmpdiv = me.document.createElement( "div" ); -// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); -// node.parentNode.replaceChild( tmpdiv.firstChild, node ); -// } -// } -// -// me.addListener( "beforegetcontent", function () { -// switchImgAndIframe( true ); -// } ); -// me.addListener( 'aftersetcontent', function () { -// switchImgAndIframe( false ); -// } ); -// me.addListener( 'aftergetcontent', function ( cmdName ) { -// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ -// return; -// } -// switchImgAndIframe( false ); -// } ); -// -// me.commands['webapp'] = { -// execCommand:function ( cmd, obj ) { -// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); -// } -// }; -//}; - -UE.plugin.register("webapp", function() { - var me = this; - function createInsertStr(obj, toEmbed) { - return !toEmbed - ? '" - : ''; - } - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(node) { - var html; - if (node.getAttr("class") == "edui-faked-webapp") { - html = createInsertStr( - { - title: node.getAttr("title"), - width: node.getAttr("width"), - height: node.getAttr("height"), - align: node.getAttr("align"), - cssfloat: node.getStyle("float"), - url: node.getAttr("_url"), - logo: node.getAttr("_logo_url") - }, - true - ); - var embed = UE.uNode.createElement(html); - node.parentNode.replaceChild(embed, node); - } - }); - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("iframe"), function(node) { - if (node.getAttr("class") == "edui-faked-webapp") { - var img = UE.uNode.createElement( - createInsertStr({ - title: node.getAttr("title"), - width: node.getAttr("width"), - height: node.getAttr("height"), - align: node.getAttr("align"), - cssfloat: node.getStyle("float"), - url: node.getAttr("src"), - logo: node.getAttr("logo_url") - }) - ); - node.parentNode.replaceChild(img, node); - } - }); - }, - commands: { - /** - * 插入百度应用 - * @command webapp - * @method execCommand - * @remind 需要百度APPKey - * @remind 百度应用主页: http://app.baidu.com/ - * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, - * height=>应用容器高度,logo=>应用logo,url=>应用地址 - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'webapp' , { - * title: '植物大战僵尸', - * width: 560, - * height: 465, - * logo: '应用展示的图片', - * url: '百度应用的地址' - * } ); - * ``` - */ - webapp: { - execCommand: function(cmd, obj) { - var me = this, - str = createInsertStr( - utils.extend(obj, { - align: "none" - }), - false - ); - me.execCommand("inserthtml", str); - }, - queryCommandState: function() { - var me = this, - img = me.selection.getRange().getClosedNode(), - flag = img && img.className == "edui-faked-webapp"; - return flag ? 1 : 0; - } - } - } - }; -}); - - -// plugins/template.js -///import core -///import plugins\inserthtml.js -///import plugins\cleardoc.js -///commands 模板 -///commandsName template -///commandsTitle 模板 -///commandsDialog dialogs\template -UE.plugins["template"] = function() { - UE.commands["template"] = { - execCommand: function(cmd, obj) { - obj.html && this.execCommand("inserthtml", obj.html); - } - }; - this.addListener("click", function(type, evt) { - var el = evt.target || evt.srcElement, - range = this.selection.getRange(); - var tnode = domUtils.findParent( - el, - function(node) { - if (node.className && domUtils.hasClass(node, "ue_t")) { - return node; - } - }, - true - ); - tnode && range.selectNode(tnode).shrinkBoundary().select(); - }); - this.addListener("keydown", function(type, evt) { - var range = this.selection.getRange(); - if (!range.collapsed) { - if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { - var tnode = domUtils.findParent( - range.startContainer, - function(node) { - if (node.className && domUtils.hasClass(node, "ue_t")) { - return node; - } - }, - true - ); - if (tnode) { - domUtils.removeClasses(tnode, ["ue_t"]); - } - } - } - }); -}; - - -// plugins/music.js -/** - * 插入音乐命令 - * @file - */ -UE.plugin.register("music", function() { - var me = this; - function creatInsertStr(url, width, height, align, cssfloat, toEmbed) { - return !toEmbed - ? "' - : ''; - } - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(node) { - var html; - if (node.getAttr("class") == "edui-faked-music") { - var cssfloat = node.getStyle("float"); - var align = node.getAttr("align"); - html = creatInsertStr( - node.getAttr("_url"), - node.getAttr("width"), - node.getAttr("height"), - align, - cssfloat, - true - ); - var embed = UE.uNode.createElement(html); - node.parentNode.replaceChild(embed, node); - } - }); - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("embed"), function(node) { - if (node.getAttr("class") == "edui-faked-music") { - var cssfloat = node.getStyle("float"); - var align = node.getAttr("align"); - html = creatInsertStr( - node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - align, - cssfloat, - false - ); - var img = UE.uNode.createElement(html); - node.parentNode.replaceChild(img, node); - } - }); - }, - commands: { - /** - * 插入音乐 - * @command music - * @method execCommand - * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; - * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'music' , { - * width: 400, - * height: 95, - * align: "center", - * url: "音乐地址" - * } ); - * ``` - */ - music: { - execCommand: function(cmd, musicObj) { - var me = this, - str = creatInsertStr( - musicObj.url, - musicObj.width || 400, - musicObj.height || 95, - "none", - false - ); - me.execCommand("inserthtml", str); - }, - queryCommandState: function() { - var me = this, - img = me.selection.getRange().getClosedNode(), - flag = img && img.className == "edui-faked-music"; - return flag ? 1 : 0; - } - } - } - }; -}); - - -// plugins/autoupload.js -/** - * @description - * 1.拖放文件到编辑区域,自动上传并插入到选区 - * 2.插入粘贴板的图片,自动上传并插入到选区 - * @author Jinqn - * @date 2013-10-14 - */ -UE.plugin.register("autoupload", function() { - function sendAndInsertFile(file, editor) { - var me = editor; - //模拟数据 - var fieldName, - urlPrefix, - maxSize, - allowFiles, - actionUrl, - loadingHtml, - errorHandler, - successHandler, - filetype = /image\/\w+/i.test(file.type) ? "image" : "file", - loadingId = "loading_" + (+new Date()).toString(36); - - fieldName = me.getOpt(filetype + "FieldName"); - urlPrefix = me.getOpt(filetype + "UrlPrefix"); - maxSize = me.getOpt(filetype + "MaxSize"); - allowFiles = me.getOpt(filetype + "AllowFiles"); - actionUrl = me.getActionUrl(me.getOpt(filetype + "ActionName")); - errorHandler = function(title) { - var loader = me.document.getElementById(loadingId); - loader && domUtils.remove(loader); - me.fireEvent("showmessage", { - id: loadingId, - content: title, - type: "error", - timeout: 4000 - }); - }; - - if (filetype == "image") { - loadingHtml = - ''; - successHandler = function(data) { - var link = urlPrefix + data.url, - loader = me.document.getElementById(loadingId); - if (loader) { - domUtils.removeClasses(loader, "loadingclass"); - loader.setAttribute("src", link); - loader.setAttribute("_src", link); - loader.setAttribute("alt", data.original || ""); - loader.removeAttribute("id"); - me.trigger("contentchange", loader); - } - }; - } else { - loadingHtml = - "

    " + - '' + - "

    "; - successHandler = function(data) { - var link = urlPrefix + data.url, - loader = me.document.getElementById(loadingId); - - var rng = me.selection.getRange(), - bk = rng.createBookmark(); - rng.selectNode(loader).select(); - me.execCommand("insertfile", { url: link }); - rng.moveToBookmark(bk).select(); - }; - } - - /* 插入loading的占位符 */ - me.execCommand("inserthtml", loadingHtml); - /* 判断后端配置是否没有加载成功 */ - if (!me.getOpt(filetype + "ActionName")) { - errorHandler(me.getLang("autoupload.errorLoadConfig")); - return; - } - /* 判断文件大小是否超出限制 */ - if (file.size > maxSize) { - errorHandler(me.getLang("autoupload.exceedSizeError")); - return; - } - /* 判断文件格式是否超出允许 */ - var fileext = file.name ? file.name.substr(file.name.lastIndexOf(".")) : ""; - if ( - (fileext && filetype != "image") || - (allowFiles && - (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") == -1) - ) { - errorHandler(me.getLang("autoupload.exceedTypeError")); - return; - } - - /* 创建Ajax并提交 */ - var xhr = new XMLHttpRequest(), - fd = new FormData(), - params = utils.serializeParam(me.queryCommandValue("serverparam")) || "", - url = utils.formatUrl( - actionUrl + (actionUrl.indexOf("?") == -1 ? "?" : "&") + params - ); - - fd.append( - fieldName, - file, - file.name || "blob." + file.type.substr("image/".length) - ); - fd.append("type", "ajax"); - xhr.open("post", url, true); - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - xhr.addEventListener("load", function(e) { - try { - var json = new Function("return " + utils.trim(e.target.response))(); - if (json.state == "SUCCESS" && json.url) { - successHandler(json); - } else { - errorHandler(json.state); - } - } catch (er) { - errorHandler(me.getLang("autoupload.loadError")); - } - }); - xhr.send(fd); - } - - function getPasteImage(e) { - return e.clipboardData && - e.clipboardData.items && - e.clipboardData.items.length == 1 && - /^image\//.test(e.clipboardData.items[0].type) - ? e.clipboardData.items - : null; - } - function getDropImage(e) { - return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; - } - - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(n) { - if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { - n.parentNode.removeChild(n); - } - }); - utils.each(root.getNodesByTagName("p"), function(n) { - if (/\bloadpara\b/.test(n.getAttr("class"))) { - n.parentNode.removeChild(n); - } - }); - }, - bindEvents: { - defaultOptions: { - //默认间隔时间 - enableDragUpload: true, - enablePasteUpload: true - }, - //插入粘贴板的图片,拖放插入图片 - ready: function(e) { - var me = this; - if (window.FormData && window.FileReader) { - var handler = function(e) { - var hasImg = false, - items; - //获取粘贴板文件列表或者拖放文件列表 - items = e.type == "paste" ? getPasteImage(e) : getDropImage(e); - if (items) { - var len = items.length, - file; - while (len--) { - file = items[len]; - if (file.getAsFile) file = file.getAsFile(); - if (file && file.size > 0) { - sendAndInsertFile(file, me); - hasImg = true; - } - } - hasImg && e.preventDefault(); - } - }; - - if (me.getOpt("enablePasteUpload") !== false) { - domUtils.on(me.body, "paste ", handler); - } - if (me.getOpt("enableDragUpload") !== false) { - domUtils.on(me.body, "drop", handler); - //取消拖放图片时出现的文字光标位置提示 - domUtils.on(me.body, "dragover", function(e) { - if (e.dataTransfer.types[0] == "Files") { - e.preventDefault(); - } - }); - } else { - if (browser.gecko) { - domUtils.on(me.body, "drop", function(e) { - if (getDropImage(e)) { - e.preventDefault(); - } - }); - } - } - - //设置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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" + - "}", - this.document - ); - } - } - } - }; -}); - - -// plugins/autosave.js -UE.plugin.register("autosave", function() { - var me = this, - //无限循环保护 - lastSaveTime = new Date(), - //最小保存间隔时间 - MIN_TIME = 20, - //auto save key - saveKey = null; - - function save(editor) { - var saveData; - - if (new Date() - lastSaveTime < MIN_TIME) { - return; - } - - if (!editor.hasContents()) { - //这里不能调用命令来删除, 会造成事件死循环 - saveKey && me.removePreferences(saveKey); - return; - } - - lastSaveTime = new Date(); - - editor._saveFlag = null; - - saveData = me.body.innerHTML; - - if ( - editor.fireEvent("beforeautosave", { - content: saveData - }) === false - ) { - return; - } - - me.setPreferences(saveKey, saveData); - - editor.fireEvent("afterautosave", { - content: saveData - }); - } - - return { - defaultOptions: { - //默认间隔时间 - saveInterval: 500, - enableAutoSave: true - }, - bindEvents: { - ready: function() { - var _suffix = "-drafts-data", - key = null; - - if (me.key) { - key = me.key + _suffix; - } else { - key = (me.container.parentNode.id || "ue-common") + _suffix; - } - - //页面地址+编辑器ID 保持唯一 - saveKey = - (location.protocol + location.host + location.pathname).replace( - /[.:\/]/g, - "_" - ) + key; - }, - - contentchange: function() { - if (!me.getOpt("enableAutoSave")) { - return; - } - - if (!saveKey) { - return; - } - - if (me._saveFlag) { - window.clearTimeout(me._saveFlag); - } - - if (me.options.saveInterval > 0) { - me._saveFlag = window.setTimeout(function() { - save(me); - }, me.options.saveInterval); - } else { - save(me); - } - } - }, - commands: { - clearlocaldata: { - execCommand: function(cmd, name) { - if (saveKey && me.getPreferences(saveKey)) { - me.removePreferences(saveKey); - } - }, - notNeedUndo: true, - ignoreContentChange: true - }, - - getlocaldata: { - execCommand: function(cmd, name) { - return saveKey ? me.getPreferences(saveKey) || "" : ""; - }, - notNeedUndo: true, - ignoreContentChange: true - }, - - drafts: { - execCommand: function(cmd, name) { - if (saveKey) { - window.setTimeout(function(){ - me.body.innerHTML = - me.getPreferences(saveKey) || "

    " + domUtils.fillHtml + "

    "; - // me.focus(true); - }, 0); - } - }, - queryCommandState: function() { - return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1; - }, - notNeedUndo: true, - ignoreContentChange: true - } - } - }; -}); - - -// plugins/charts.js -UE.plugin.register("charts", function() { - var me = this; - - return { - bindEvents: { - chartserror: function() {} - }, - commands: { - charts: { - execCommand: function(cmd, data) { - var tableNode = domUtils.findParentByTagName( - this.selection.getRange().startContainer, - "table", - true - ), - flagText = [], - config = {}; - - if (!tableNode) { - return false; - } - - if (!validData(tableNode)) { - me.fireEvent("chartserror"); - return false; - } - - config.title = data.title || ""; - config.subTitle = data.subTitle || ""; - config.xTitle = data.xTitle || ""; - config.yTitle = data.yTitle || ""; - config.suffix = data.suffix || ""; - config.tip = data.tip || ""; - //数据对齐方式 - config.dataFormat = data.tableDataFormat || ""; - //图表类型 - config.chartType = data.chartType || 0; - - for (var key in config) { - if (!config.hasOwnProperty(key)) { - continue; - } - - flagText.push(key + ":" + config[key]); - } - - tableNode.setAttribute("data-chart", flagText.join(";")); - domUtils.addClass(tableNode, "edui-charts-table"); - }, - queryCommandState: function(cmd, name) { - var tableNode = domUtils.findParentByTagName( - this.selection.getRange().startContainer, - "table", - true - ); - return tableNode && validData(tableNode) ? 0 : -1; - } - } - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("table"), function(tableNode) { - if (tableNode.getAttr("data-chart") !== undefined) { - tableNode.setAttr("style"); - } - }); - }, - outputRule: function(root) { - utils.each(root.getNodesByTagName("table"), function(tableNode) { - if (tableNode.getAttr("data-chart") !== undefined) { - tableNode.setAttr("style", "display: none;"); - } - }); - } - }; - - function validData(table) { - var firstRows = null, - cellCount = 0; - - //行数不够 - if (table.rows.length < 2) { - return false; - } - - //列数不够 - if (table.rows[0].cells.length < 2) { - return false; - } - - //第一行所有cell必须是th - firstRows = table.rows[0].cells; - cellCount = firstRows.length; - - for (var i = 0, cell; (cell = firstRows[i]); i++) { - if (cell.tagName.toLowerCase() !== "th") { - return false; - } - } - - for (var i = 1, row; (row = table.rows[i]); i++) { - //每行单元格数不匹配, 返回false - if (row.cells.length != cellCount) { - return false; - } - - //第一列不是th也返回false - if (row.cells[0].tagName.toLowerCase() !== "th") { - return false; - } - - for (var j = 1, cell; (cell = row.cells[j]); j++) { - var value = utils.trim(cell.innerText || cell.textContent || ""); - - value = value - .replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "") - .replace(/^\s+|\s+$/g, ""); - - //必须是数字 - if (!/^\d*\.?\d+$/.test(value)) { - return false; - } - } - } - - return true; - } -}); - - -// plugins/section.js -/** - * 目录大纲支持插件 - * @file - * @since 1.3.0 - */ -UE.plugin.register("section", function() { - /* 目录节点对象 */ - function Section(option) { - this.tag = ""; - (this.level = -1), (this.dom = null); - this.nextSection = null; - this.previousSection = null; - this.parentSection = null; - this.startAddress = []; - this.endAddress = []; - this.children = []; - } - function getSection(option) { - var section = new Section(); - return utils.extend(section, option); - } - function getNodeFromAddress(startAddress, root) { - var current = root; - for (var i = 0; i < startAddress.length; i++) { - if (!current.childNodes) return null; - current = current.childNodes[startAddress[i]]; - } - return current; - } - - var me = this; - - return { - bindMultiEvents: { - type: "aftersetcontent afterscencerestore", - handler: function() { - me.fireEvent("updateSections"); - } - }, - bindEvents: { - /* 初始化、拖拽、粘贴、执行setcontent之后 */ - ready: function() { - me.fireEvent("updateSections"); - domUtils.on(me.body, "drop paste", function() { - me.fireEvent("updateSections"); - }); - }, - /* 执行paragraph命令之后 */ - afterexeccommand: function(type, cmd) { - if (cmd == "paragraph") { - me.fireEvent("updateSections"); - } - }, - /* 部分键盘操作,触发updateSections事件 */ - keyup: function(type, e) { - var me = this, - range = me.selection.getRange(); - if (range.collapsed != true) { - me.fireEvent("updateSections"); - } else { - var keyCode = e.keyCode || e.which; - if (keyCode == 13 || keyCode == 8 || keyCode == 46) { - me.fireEvent("updateSections"); - } - } - } - }, - commands: { - getsections: { - execCommand: function(cmd, levels) { - var levelFn = levels || ["h1", "h2", "h3", "h4", "h5", "h6"]; - - for (var i = 0; i < levelFn.length; i++) { - if (typeof levelFn[i] == "string") { - levelFn[i] = (function(fn) { - return function(node) { - return node.tagName == fn.toUpperCase(); - }; - })(levelFn[i]); - } else if (typeof levelFn[i] != "function") { - levelFn[i] = function(node) { - return null; - }; - } - } - function getSectionLevel(node) { - for (var i = 0; i < levelFn.length; i++) { - if (levelFn[i](node)) return i; - } - return -1; - } - - var me = this, - Directory = getSection({ level: -1, title: "root" }), - previous = Directory; - - function traversal(node, Directory) { - var level, - tmpSection = null, - parent, - child, - children = node.childNodes; - for (var i = 0, len = children.length; i < len; i++) { - child = children[i]; - level = getSectionLevel(child); - if (level >= 0) { - var address = me.selection - .getRange() - .selectNode(child) - .createAddress(true).startAddress, - current = getSection({ - tag: child.tagName, - title: child.innerText || child.textContent || "", - level: level, - dom: child, - startAddress: utils.clone(address, []), - endAddress: utils.clone(address, []), - children: [] - }); - previous.nextSection = current; - current.previousSection = previous; - parent = previous; - while (level <= parent.level) { - parent = parent.parentSection; - } - current.parentSection = parent; - parent.children.push(current); - tmpSection = previous = current; - } else { - child.nodeType === 1 && traversal(child, Directory); - tmpSection && - tmpSection.endAddress[tmpSection.endAddress.length - 1]++; - } - } - } - traversal(me.body, Directory); - return Directory; - }, - notNeedUndo: true - }, - movesection: { - execCommand: function(cmd, sourceSection, targetSection, isAfter) { - var me = this, - targetAddress, - target; - - if (!sourceSection || !targetSection || targetSection.level == -1) - return; - - targetAddress = isAfter - ? targetSection.endAddress - : targetSection.startAddress; - target = getNodeFromAddress(targetAddress, me.body); - - /* 判断目标地址是否被源章节包含 */ - if ( - !targetAddress || - !target || - isContainsAddress( - sourceSection.startAddress, - sourceSection.endAddress, - targetAddress - ) - ) - return; - - var startNode = getNodeFromAddress( - sourceSection.startAddress, - me.body - ), - endNode = getNodeFromAddress(sourceSection.endAddress, me.body), - current, - nextNode; - - if (isAfter) { - current = endNode; - while ( - current && - !( - domUtils.getPosition(startNode, current) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.previousSibling; - domUtils.insertAfter(target, current); - if (current == startNode) break; - current = nextNode; - } - } else { - current = startNode; - while ( - current && - !( - domUtils.getPosition(current, endNode) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.nextSibling; - target.parentNode.insertBefore(current, target); - if (current == endNode) break; - current = nextNode; - } - } - - me.fireEvent("updateSections"); - - /* 获取地址的包含关系 */ - function isContainsAddress(startAddress, endAddress, addressTarget) { - var isAfterStartAddress = false, - isBeforeEndAddress = false; - for (var i = 0; i < startAddress.length; i++) { - if (i >= addressTarget.length) break; - if (addressTarget[i] > startAddress[i]) { - isAfterStartAddress = true; - break; - } else if (addressTarget[i] < startAddress[i]) { - break; - } - } - for (var i = 0; i < endAddress.length; i++) { - if (i >= addressTarget.length) break; - if (addressTarget[i] < startAddress[i]) { - isBeforeEndAddress = true; - break; - } else if (addressTarget[i] > startAddress[i]) { - break; - } - } - return isAfterStartAddress && isBeforeEndAddress; - } - } - }, - deletesection: { - execCommand: function(cmd, section, keepChildren) { - var me = this; - - if (!section) return; - - function getNodeFromAddress(startAddress) { - var current = me.body; - for (var i = 0; i < startAddress.length; i++) { - if (!current.childNodes) return null; - current = current.childNodes[startAddress[i]]; - } - return current; - } - - var startNode = getNodeFromAddress(section.startAddress), - endNode = getNodeFromAddress(section.endAddress), - current = startNode, - nextNode; - - if (!keepChildren) { - while ( - current && - domUtils.inDoc(endNode, me.document) && - !( - domUtils.getPosition(current, endNode) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.nextSibling; - domUtils.remove(current); - current = nextNode; - } - } else { - domUtils.remove(current); - } - - me.fireEvent("updateSections"); - } - }, - selectsection: { - execCommand: function(cmd, section) { - if (!section && !section.dom) return false; - var me = this, - range = me.selection.getRange(), - address = { - startAddress: utils.clone(section.startAddress, []), - endAddress: utils.clone(section.endAddress, []) - }; - address.endAddress[address.endAddress.length - 1]++; - range.moveToAddress(address).select().scrollToView(); - return true; - }, - notNeedUndo: true - }, - scrolltosection: { - execCommand: function(cmd, section) { - if (!section && !section.dom) return false; - var me = this, - range = me.selection.getRange(), - address = { - startAddress: section.startAddress, - endAddress: section.endAddress - }; - address.endAddress[address.endAddress.length - 1]++; - range.moveToAddress(address).scrollToView(); - return true; - }, - notNeedUndo: true - } - } - }; -}); - - -// plugins/simpleupload.js -/** - * @description - * 简单上传:点击按钮,直接选择文件上传 - * @author Jinqn - * @date 2014-03-31 - */ -UE.plugin.register("simpleupload", function() { - var me = this, - isLoaded = false, - containerBtn; - - function initUploadBtn() { - var w = containerBtn.offsetWidth || 20, - h = containerBtn.offsetHeight || 20, - btnIframe = document.createElement("iframe"), - btnStyle = - "display:block;width:" + - w + - "px;height:" + - h + - "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;"; - - domUtils.on(btnIframe, "load", function() { - var timestrap = (+new Date()).toString(36), - wrapper, - btnIframeDoc, - btnIframeBody; - - btnIframeDoc = - btnIframe.contentDocument || btnIframe.contentWindow.document; - btnIframeBody = btnIframeDoc.body; - wrapper = btnIframeDoc.createElement("div"); - - wrapper.innerHTML = - '
    ' + - '' + - "
    " + - ''; - - 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, - json, - loader, - body = (iframe.contentDocument || iframe.contentWindow.document) - .body, - result = body.innerText || body.textContent || ""; - json = new Function("return " + result)(); - link = me.options.imageUrlPrefix + json.url; - if (json.state == "SUCCESS" && json.url) { - loader = me.document.getElementById(loadingId); - domUtils.removeClasses(loader, "loadingclass"); - domUtils.on(loader,'load',function(){ - me.fireEvent('contentchange'); - }); - loader.setAttribute("src", link); - loader.setAttribute("_src", link); - loader.setAttribute("alt", json.original || ""); - loader.removeAttribute("id"); - } else { - showErrorLoader && showErrorLoader(json.state); - } - } 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 - }); - } - } - - /* 判断后端配置是否没有加载成功 */ - 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; - } - - domUtils.on(iframe, "load", callback); - form.action = utils.formatUrl( - imageActionUrl + - (imageActionUrl.indexOf("?") == -1 ? "?" : "&") + - params - ); - form.submit(); - }); - - 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; - }); - - 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:1px solid #cccccc;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:1px solid #cccccc;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; - } - } - } - }; -}); - - -// plugins/serverparam.js -/** - * 服务器提交的额外参数列表设置插件 - * @file - * @since 1.2.6.1 - */ -UE.plugin.register("serverparam", function() { - var me = this, - serverParam = {}; - - return { - commands: { - /** - * 修改服务器提交的额外参数列表,清除所有项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand('serverparam'); - * editor.queryCommandValue('serverparam'); //返回空 - * ``` - */ - /** - * 修改服务器提交的额外参数列表,删除指定项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } key 要清除的属性 - * @example - * ```javascript - * editor.execCommand('serverparam', 'name'); //删除属性name - * ``` - */ - /** - * 修改服务器提交的额外参数列表,使用键值添加项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } key 要添加的属性 - * @param { String } value 要添加属性的值 - * @example - * ```javascript - * editor.execCommand('serverparam', 'name', 'hello'); - * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} - * ``` - */ - /** - * 修改服务器提交的额外参数列表,传入键值对对象添加多项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } key 传入的键值对对象 - * @example - * ```javascript - * editor.execCommand('serverparam', {'name': 'hello'}); - * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} - * ``` - */ - /** - * 修改服务器提交的额外参数列表,使用自定义函数添加多项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Function } key 自定义获取参数的函数 - * @example - * ```javascript - * editor.execCommand('serverparam', function(editor){ - * return {'key': 'value'}; - * }); - * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} - * ``` - */ - - /** - * 获取服务器提交的额外参数列表 - * @command serverparam - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * 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; - } - } else if (utils.isObject(key)) { - //传入对象,覆盖列表项 - utils.extend(serverParam, key, false); - } else if (utils.isFunction(key)) { - //传入函数,添加列表项 - utils.extend(serverParam, key(), false); - } - }, - queryCommandValue: function() { - return serverParam || {}; - } - } - } - }; -}); - - -// plugins/insertfile.js -/** - * 插入附件 - */ -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); - } - } - } - }; -}); - - -// plugins/xssFilter.js -/** - * @file xssFilter.js - * @desc xss过滤器 - * @author robbenmu - */ - -UE.plugins.xssFilter = function() { - - var config = UEDITOR_CONFIG; - var whitList = config.whitList; - - function filter(node) { - - var tagName = node.tagName; - var attrs = node.attrs; - - if (!whitList.hasOwnProperty(tagName)) { - node.parentNode.removeChild(node); - return false; - } - - UE.utils.each(attrs, function (val, key) { - - if (whitList[tagName].indexOf(key) === -1) { - node.setAttr(key); - } - }); - } - - // 添加inserthtml\paste等操作用的过滤规则 - if (whitList && config.xssFilterRules) { - this.options.filterRules = function () { - - var result = {}; - - UE.utils.each(whitList, function(val, key) { - result[key] = function (node) { - return filter(node); - }; - }); - - return result; - }(); - } - - var tagList = []; - - UE.utils.each(whitList, function (val, key) { - tagList.push(key); - }); - - // 添加input过滤规则 - // - if (whitList && config.inputXssFilter) { - this.addInputRule(function (root) { - - root.traversal(function(node) { - if (node.type !== 'element') { - return false; - } - filter(node); - }); - }); - } - // 添加output过滤规则 - // - if (whitList && config.outputXssFilter) { - this.addOutputRule(function (root) { - - root.traversal(function(node) { - if (node.type !== 'element') { - return false; - } - filter(node); - }); - }); - } - -}; - - -// ui/ui.js -var baidu = baidu || {}; -baidu.editor = baidu.editor || {}; -UE.ui = baidu.editor.ui = {}; - - -// ui/uiutils.js -;(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 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 = []; - } - 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"; - } - 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"; - } - } - } - }); - 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() {}); - - 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); - - //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); - } - holder = holder || uiUtils.getFixedLayer(); - 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); -})(); - - -// 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); -})(); - - -// 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; - - 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(); - }); - - 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(); - } - } - } - - 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上的鼠标滚轮事件, 防止用户的正常操作被误解 - if (window.XMLHttpRequest) { - 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; - } - } - ); - } else { - //ie6 - domUtils.on(this.getDom(), "mousewheel", function(e) { - e.returnValue = false; - - me.getDom("content").scrollTop -= e.wheelDelta / 120 * 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() { - 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; - } - - 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(); - }); - - 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"); - } - }; - 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; - - 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; - - 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"); - } - } - }; -})(); - - -// ui/button.js -///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; - } - 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); -})(); - - -// ui/splitbutton.js -///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( - '
    ' - ) - ); - 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); -})(); - - -// ui/colorbutton.js -///import core -///import uicore -///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); -})(); - - -// ui/tablebutton.js -///import core -///import uicore -///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); -})(); - - -// ui/autotypesetpicker.js -///import core -///import uicore -;(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 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); -})(); - - -// ui/autotypesetbutton.js -///import core -///import uicore -///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); - } - }); - - 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; - - /** - * 该参数将新增一个参数: 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 - }, - 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]; - } - }, - 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; - - tempIndex === 0 && tmpl.push(""); - - tmpl.push( - '
    ' - ); - - tempIndex === 2 && tmpl.push(""); - } - - 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; - - 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 (/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); -})(); - - -// ui/menu.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, - 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: "index.html", - 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(); - } - }; - 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; - - //获取单元格对齐初始状态 - 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 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(); - } - 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); -})(); - - -// ui/combox.js -///import core -///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 - }); - - 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); - } - } - }; - utils.inherits(Combox, SplitButton); -})(); - - -// ui/dialog.js -///import core -///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 - ) - ); - } - } - } - }, - 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() { - var popBodyEl = this.getDom("body"); - // if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) { - // uiUtils.removeStyle(popBodyEl, 'width'); - // uiUtils.removeStyle(popBodyEl, 'height'); - // } - var size = this.mesureSize(); - 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; - 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); -})(); - - -// ui/menubutton.js -///import core -///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; - } - } - }); - this.initSplitButton(); - }, - setValue: function(value) { - this._value = value; - } - }; - utils.inherits(MenuButton, SplitButton); -})(); - - -// ui/multiMenu.js -///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(); - }); - - 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(); - } - }; - - 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; - - var allMenus = [], //存储所有快捷菜单 - timeID, - isSubMenuShow = false; //是否有子pop显示 - - var ShortCutMenu = (UI.ShortCutMenu = function(options) { - this.initOptions(options); - this.initShortCutMenu(); - }); - - 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) { - 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, 0.2); - } - - 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(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); -})(); - - -// 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(); - }); - }, - 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); -})(); - - -// ui/iconfont.js -;(function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) - -// adapter/editorui.js -//ui跟编辑器的适配層 -//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 -//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据neditor.config中的toolbars找到相应的进行实例化 -;(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", - insertimage: "~/dialogs/image/image.html", - link: "~/dialogs/link/link.html", - spechars: "~/dialogs/spechars/spechars.html", - searchreplace: "~/dialogs/searchreplace/searchreplace.html", - map: "~/dialogs/map/map.html", - gmap: "~/dialogs/gmap/gmap.html", - insertvideo: "~/dialogs/video/video.html", - help: "~/dialogs/help/help.html", - preview: "~/dialogs/preview/preview.html", - emotion: "~/dialogs/emotion/emotion.html", - wordimage: "~/dialogs/wordimage/wordimage.html", - attachment: "~/dialogs/attachment/attachment.html", - insertframe: "~/dialogs/insertframe/insertframe.html", - edittip: "~/dialogs/table/edittip.html", - edittable: "~/dialogs/table/edittable.html", - edittd: "~/dialogs/table/edittd.html", - webapp: "~/dialogs/webapp/webapp.html", - snapscreen: "~/dialogs/snapscreen/snapscreen.html", - scrawl: "~/dialogs/scrawl/scrawl.html", - music: "~/dialogs/music/music.html", - template: "~/dialogs/template/template.html", - background: "~/dialogs/background/background.html", - charts: "~/dialogs/charts/charts.html" - }; - //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 - 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", - "drafts" - ]; - - 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); - if (state == -1) { - ui.setDisabled(true); - ui.setChecked(false); - } else { - if (!uiReady) { - ui.setDisabled(false); - ui.setChecked(state); - } - } - }); - return ui; - }; - })(ci); - } - - //清除文档 - 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 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", "webapp", "preview"], - ok: [ - "attachment", - "anchor", - "link", - "insertimage", - "map", - "gmap", - "insertframe", - "wordimage", - "insertvideo", - "insertframe", - "edittip", - "edittable", - "edittd", - "scrawl", - "template", - "music", - "background", - "charts" - ] - }; - - 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, - className: "edui-for-" + cmd, - title: title, - holdScroll: cmd === "insertimage", - fullscreen: /charts|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 (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) || - cmd == "charts" - }); - 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.snapscreen = function(editor, iframeUrl, title) { - title = - editor.options.labelMap["snapscreen"] || - editor.getLang("labelMap.snapscreen") || - ""; - var ui = new editorui.Button({ - className: "edui-for-snapscreen", - title: title, - onclick: function() { - editor.execCommand("snapscreen"); - }, - theme: editor.options.theme - }); - editorui.buttons["snapscreen"] = ui; - iframeUrl = - iframeUrl || - (editor.options.iframeUrlMap || {})["snapscreen"] || - iframeUrlMap["snapscreen"]; - if (iframeUrl) { - var dialog = new editorui.Dialog({ - iframeUrl: editor.ui.mapUrl(iframeUrl), - editor: editor, - className: "edui-for-snapscreen", - title: title, - 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); - } - } - ] - }); - dialog.render(); - editor.ui._dialogs["snapscreenDialog"] = dialog; - } - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState("snapscreen") == -1); - }); - return ui; - }; - - 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); - } - }); - } - 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: 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.iframeUrlMap || {})[cmd] || - iframeUrlMap[cmd] - ) - }); - editorui.buttons[cmd] = 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["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; - }; -})(); - - -// adapter/editor.js -///import core -///commands 全屏 -///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 = []; - - 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; - - 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 - ); - - //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("property") + - ': ' + - 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.className.indexOf("edui-faked-webapp") != -1) { - dialogName = "webappDialog"; - } - if (img.src.indexOf("https://api.map.baidu.com") != -1) { - dialogName = "mapDialog"; - } - if (img.className.indexOf("edui-faked-music") != -1) { - dialogName = "musicDialog"; - } - if ( - img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1 - ) { - dialogName = "gmapDialog"; - } - if (img.getAttribute("anchorname")) { - dialogName = "anchorDialog"; - html = popup.formatHtml( - "" + - editor.getLang("property") + - ': ' + - editor.getLang("modify") + - "  " + - "" + - editor.getLang("delete") + - "" - ); - } - if (img.getAttribute("word_img")) { - //todo 放到dialog去做查询 - editor.word_img = [img.getAttribute("word_img")]; - dialogName = "wordimageDialog"; - } - if ( - domUtils.hasClass(img, "loadingclass") || - domUtils.hasClass(img, "loaderrorclass") - ) { - dialogName = ""; - } - if (!dialogs[dialogName]) { - return; - } - str = - "" + - editor.getLang("property") + - ": " + - '' + - editor.getLang("default") + - "  " + - '' + - editor.getLang("justifyleft") + - "  " + - '' + - editor.getLang("justifyright") + - "  " + - '' + - editor.getLang("justifycenter") + - "  " + - "' + - editor.getLang("modify") + - ""; - - !html && (html = popup.formatHtml(str)); - } - 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("anthorMsg") + - ': ' + - 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; - } - 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 - '
    ' + - '' + - '' + - '' + - "
    " + - '
    ' + - "
    " - ); - }, - 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" - ); - 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/neditor.css", - 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); - } - 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; - - 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; - } -}); - - -// adapter/autosave.js -UE.registerUI("autosave", function(editor) { - var timer = null, - uid = null; - editor.on("afterautosave", function() { - clearTimeout(timer); - - timer = setTimeout(function() { - if (uid) { - editor.trigger("hidemessage", uid); - } - uid = editor.trigger("showmessage", { - content: editor.getLang("autosave.success"), - timeout: 2000 - }); - }, 2000); - }); -}); - - - -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.min.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.min.js deleted file mode 100644 index 9104bbc..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.all.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * neditor - * version: 2.1.6 - * build: Thu Nov 29 2018 09:38:10 GMT+0000 (UTC) - */!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor={plugins:{},commands:{},instants:{},I18N:{},_customizeUI:{},version:"1.5.0"};var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/i.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""","“":"“","”":"”",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',"“":"“","”":"”",">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file neditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.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+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
    "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode, -domUtils.remove(c),c=g}}catch(d){}}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),"SPAN"==k.tagName&&b&&b.style&&utils.each(k.getElementsByTagName("span"),function(a){a.style.cssText=a.style.cssText+";"+b.style}),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.options.textarea)if(utils.isString(b.options.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setPlaceholder:function(){function a(){var a=this.getPlainTxt();a.trim()?UE.dom.domUtils.removeClasses(this.body,"empty"):UE.dom.domUtils.addClass(this.body,"empty")}return function(b){var c=this;c.ready(function(){a.call(c),c.body.setAttribute("placeholder",b)}),c.removeListener("keyup contentchange",a),c.addListener("keyup contentchange",a)}}(),setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+""+(c.iframeJsUrl?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

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

    "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.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:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

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

    "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){ -function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

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

    ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

    '+b+"

    ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=(this.getOpt(a)||a,this.getOpt("imageUrl"),this.getOpt("serverUrl"));return b?(b+="?",utils.formatUrl(b)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"i18n/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,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),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).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(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){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":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={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};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={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"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":if(c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b),a.getOpt("rgb2Hex")){var d=b.getAttr("style");d&&b.setAttr("style",d.replace(/rgba?\(([\d,\s]+)\)/g,function(a,b){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;return b.toUpperCase()}))}break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

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

    ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
    "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


    '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){var i=e.parentNode;for(domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

    '+i.innerHTML+"

    "),f=c.document.getElementsByClassName("_img_parent_tmp")[0],f.removeAttribute("class"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){if(b=utils.isArray(b)?b:[b],b.length){var c=this,d=c.selection.getRange(),e=d.getClosedNode();if(c.fireEvent("beforeinsertimage",b)!==!0){if(!e||!/img/i.test(e.tagName)||"edui-faked-video"==e.className&&e.className.indexOf("edui-upload-video")==-1||e.getAttribute("word_img")){var f,g=[],h="";if(f=b[0],1==b.length)h=''+f.alt+'","center"==f.floatStyle&&(h='

    '+h+"

    "),g.push(h);else for(var i=0;f=b[i++];)h="

    ",g.push(h);c.execCommand("insertHtml",g.join(""))}else{var j=b.shift(),k=j.floatStyle;delete j.floatStyle,domUtils.setAttributes(e,j),c.execCommand("imagefloat",k),b.length>0&&(d.setStartAfter(e).setCursor(!1,!0),c.execCommand("insertimage",b))}c.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){g[b]&&(a.adjustmentBoundary(),a.collapsed||1!=a.startContainer.nodeType||a.traversal(function(d){var e;if(e=domUtils.isTagNode(d,"span")?d:domUtils.getElementsByTagName(d,"span")[0],e&&domUtils.isTagNode(e,"span")){var f=a.createBookmark();utils.each(domUtils.getElementsByTagName(e,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(f)}}))}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.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]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.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"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
    "+this.getContent(null,null,!0)+"
    "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g.parentNode,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
    ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.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"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
    ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
    ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
    ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
    ")):f+=a.data+"
    ",!a.nextSibling()&&/
    $/.test(f)&&(f=f.replace(/
    $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
    "}})}c.execCommand("inserthtml",'
    '+f+"
    ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.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};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
    ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

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

    ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){var a=this;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: 16px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;if((b=a.getAttr("name"))&&!a.getAttr("href")){if(/^\_Toc\d+$/.test(b))return void a.parentNode.removeChild(a);a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name")}})},commands:{anchor:{execCommand:function(b,c){var d=this.selection.getRange(),e=d.getClosedNode();if(e&&e.getAttribute("anchorname"))c?e.setAttribute("anchorname",c):(d.setStartBefore(e).setCursor(),domUtils.remove(e));else if(c){var f=utils.renderTplstr('',{name:c});a.execCommand("inserthtml",f,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
    ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/notadd/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),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=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;b&&("mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover"))}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()}),b.fireEvent("zeroclipboardready",a)}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


    ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,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,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
    ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={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]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0), -n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

    ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null},focus:function(){c.focus()},blur:function(){c.blur()}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null},focus:function(){c.focus()},blur:function(){c.setOption("readOnly",!0),c.setOption("readOnly",!1)}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==h.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](g,b)}var c,d,e,f,g=this,h=this.options,i=!1;h.sourceEditor=browser.ie?"textarea":h.sourceEditor||"codemirror",g.setOpt({sourceEditorFirst:!1});var j,k,l;g.commands.source={execCommand:function(){if(i=!i){l=g.selection.getRange().createAddress(!1,!0),g.undoManger&&g.undoManger.save(!0),browser.gecko&&(g.body.contentEditable=!1),j=g.iframe.style.cssText,g.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",g.fireEvent("beforegetcontent");var a=UE.htmlparser(g.body.innerHTML);g.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),g.fireEvent("aftergetcontent");var h=a.toHtml(!0);c=b(g.iframe.parentNode),c.setContent(h),d=g.setContent,g.setContent=function(a){var b=UE.htmlparser(a);g.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),g.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),k=g.getContent,g.getContent=function(){return c.getContent()||"

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

    "},e=g.focus,f=g.blur,g.focus=function(){c.focus()},g.blur=function(){f.call(g),c.blur()}}else{g.iframe.style.cssText=j;var m=c.getContent()||"

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

    ";m=m.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),g.setContent=d,g.setContent(m),c.dispose(),c=null,g.getContent=k,g.focus=e,g.blur=f;var n=g.body.firstChild;if(n||(g.body.innerHTML="

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

    ",n=g.body.firstChild),g.undoManger&&g.undoManger.save(!0),browser.gecko){var o=document.createElement("input");o.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(o),g.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(o,{left:-32768,top:0}),o.focus(),setTimeout(function(){g.body.contentEditable=!0,g.selection.getRange().moveToAddress(l).select(!0),domUtils.remove(o)})})}else try{g.selection.getRange().moveToAddress(l).select(!0)}catch(p){}}this.fireEvent("sourcemodechanged",i)},queryCommandState:function(){return 0|i},notNeedUndo:1};var m=g.queryCommandState;g.queryCommandState=function(a){return a=a.toLowerCase(),i?a in{source:1,fullscreen:1}?1:-1:m.apply(this,arguments)},"codemirror"==h.sourceEditor&&g.addListener("ready",function(){utils.loadFile(document,{src:h.codeMirrorJsUrl||h.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){h.sourceEditorFirst&&setTimeout(function(){g.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:h.codeMirrorCssUrl||h.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

    "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

    "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

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

    ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[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]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.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 a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode),h=b.editor.document;domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-(h.documentElement.scrollLeft||h.body.scrollLeft||0)-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-(h.documentElement.scrollTop||h.body.scrollTop||0)-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(f),g||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(f=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",e=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(i.minFrameHeight,i.initialFrameHeight)),e!=h&&(e!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=e+"px"), -a.body.style.height=e+"px",h=e),domUtils.removeStyle(b,"clear"))},50))}function b(){c.window&&(null===j?j=c.window.scrollY:0==c.window.scrollY&&0!=j&&(c.window.scrollTo(0,0),j=null))}var c=this;if(c.autoHeightEnabled=c.options.autoHeightEnabled!==!1,c.autoHeightEnabled){var d,e,f,g,h=0,i=c.options;c.addListener("fullscreenchanged",function(a,b){g=b}),c.addListener("destroy",function(){domUtils.un(c.window,"scroll",b),c.removeListener("contentchange afterinserthtml keyup mouseup",a)}),c.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var c=b.document;b.autoHeightEnabled=!0,d=c.body.style.overflowY,c.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},c.disableAutoHeight=function(){c.body.style.overflowY=d||"",c.removeListener("contentchange",a),c.removeListener("keyup",a),c.removeListener("mouseup",a),c.autoHeightEnabled=!1,c.fireEvent("autoheightchanged",c.autoHeightEnabled)},c.on("setHeight",function(){c.disableAutoHeight()}),c.addListener("ready",function(){c.enableAutoHeight();var d;domUtils.on(browser.ie?c.body:c.document,browser.webkit?"dragover":"drop",function(){clearTimeout(d),d=setTimeout(function(){a.call(c)},100)}),domUtils.on(c.window,"scroll",b)});var j}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s);var a=document.getElementById("scrollBox");a&&domUtils.un(a,["scroll","resize"],e)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s);var c=document.getElementById("scrollBox");c&&domUtils.on(c,["scroll","resize"],e),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){if(d=utils.isArray(d)?d:[d],c.fireEvent("beforeinsertvideo",d)!==!0){for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=d&&domUtils.findParentByTagName(d,["table"]),f=e&&e.getElementsByTagName("caption")[0];return{cell:c,tr:d,table:e,caption:f}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
    ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){for(var a,b=this.cellsRange,c=this.getCell(b.beginRowIndex,this.indexTable[b.beginRowIndex][b.beginColIndex].cellIndex),d=this.getCells(b),e=0;a=d[e++];)a!==c&&(this.moveContent(c,a),this.deleteCell(a));if(c.rowSpan=b.endRowIndex-b.beginRowIndex+1,c.rowSpan>1&&c.removeAttribute("height"),c.colSpan=b.endColIndex-b.beginColIndex+1,c.colSpan>1&&c.removeAttribute("width"),c.rowSpan==this.rowsNum&&1!=c.colSpan&&(c.colSpan=1),c.colSpan==this.colsNum&&1!=c.rowSpan){var f=c.parentNode.rowIndex;if(this.table.deleteRow)for(var e=f+1,g=f+1,h=c.rowSpan;e1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
    ")+"");c.push("")}return"
    "+c.join("")+"
    "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
    ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
    "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
    ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/"+N.options.theme+"/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
    ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",a.getOpt("enableContextMenu")||!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a){var b=3==a.nodeType?a.nodeValue:a[browser.ie?"innerText":"textContent"];return b.replace(domUtils.fillChar,"")}function b(a,b,c){var d,e=b.searchStr,f=new RegExp(e,"g"+(b.casesensitive?"":"i"));if(b.dir==-1){if(a=a.substr(0,c),a=a.split("").reverse().join(""),e=e.split("").reverse().join(""),d=f.exec(a))return c-d.index-e.length}else if(a=a.substr(c),d=f.exec(a))return d.index+c;return-1}function c(c,d,e){var f,g,i=e.all||1==e.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(c)&&(c=c.firstChild);for(var j=1;c;){if(f=a(c),g=b(f,e,d),j=0,g!=-1)return{node:c,index:g};for(c=domUtils[i](c);c&&h[c.nodeName.toLowerCase()];)c=domUtils[i](c,!0);c&&(d=e.dir==-1?a(c).length:0)}}function d(b,c,e){for(var f,g=0,h=b.firstChild,i=0;h;){if(3==h.nodeType){if(i=a(h).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,g+=i,g>=c)return{node:h,index:i-(g-c)}}else if(!dtd.$empty[h.tagName]&&(i=a(h).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,g+=i,g>=c&&(f=d(h,i-(g-c),e))))return f;h=domUtils.getNextDomNode(h)}}function e(b,e){var g,h=i||b.selection.getRange(),j=e.searchStr,k=b.document.createElement("span");if(k.innerHTML="$$ueditor_searchreplace_key$$",h.shrinkBoundary(!0),!h.collapsed){h.select();var l=b.selection.getText();if(new RegExp("^"+e.searchStr+"$",e.casesensitive?"":"i").test(l)){if(void 0!=e.replaceStr)return f(h,e.replaceStr),h.select(),!0;h.collapse(e.dir==-1)}}h.insertNode(k),h.enlargeToBlockElm(!0),g=h.startContainer;var m=a(g).indexOf("$$ueditor_searchreplace_key$$");h.setStartBefore(k),domUtils.remove(k);var n=c(g,m,e);if(n){var o=d(n.node,n.index,j),p=d(n.node,n.index+j.length,j);return h.setStart(o.node,o.index).setEnd(p.node,p.index),void 0!==e.replaceStr&&f(h,e.replaceStr),h.select(),!0}h.setCursor()}function f(a,b){b=g.document.createTextNode(b),a.deleteContents().insertNode(b)}var g=this,h={table:1,tbody:1,tr:1,ol:1,ul:1},i=null;return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){i=null;var d=g.selection.getRange(),f=g.body.firstChild;for(f&&1==f.nodeType?(d.setStart(f,0),d.shrinkBoundary(!0)):3==f.nodeType&&d.setStartBefore(f),d.collapse(!0).select(!0),void 0!==b.replaceStr&&g.fireEvent("saveScene");e(this,b);)c++,i=g.selection.getRange(),i.collapse(b.dir==-1);c&&g.fireEvent("saveScene")}else void 0!==b.replaceStr&&g.fireEvent("saveScene"),e(this,b)&&(c++,i=g.selection.getRange(),i.collapse(b.dir==-1)),c&&g.fireEvent("saveScene");return c},notNeedUndo:1}},bindEvents:{clearlastSearchResult:function(){i=null}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],loadingIMG=me.options.themePath+me.options.theme+"/images/spacer.gif",imgs=me.document.querySelectorAll('[style*="url"],img'),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img"))if("IMG"==ci.nodeName){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&(remoteImages.push(src),domUtils.setAttributes(ci,{"class":"loadingclass",_src:src,src:loadingIMG}))}else{var backgroundImageurl=ci.style.cssText.replace(/.*\s?url\([\'\"]?/,"").replace(/[\'\"]?\).*/,"");/^(https?|ftp):/i.test(backgroundImageurl)&&!test(backgroundImageurl,catcherLocalDomain)&&(remoteImages.push(backgroundImageurl),ci.style.cssText=ci.style.cssText.replace(backgroundImageurl,loadingIMG),domUtils.setAttributes(ci,{"data-background":backgroundImageurl}))}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list,catchFailList=[],catchSuccessList=[],failIMG=me.options.themePath+me.options.theme+"/images/img-cracked.png";for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",oldBgIMG=ci.getAttribute("data-background")||"",j=0;cj=list[j++];){if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.removeClasses(ci,"loadingclass"),domUtils.setAttributes(ci,{src:newSrc,_src:newSrc,"data-catchResult":"img_catchSuccess"}),catchSuccessList.push(ci);break}if(oldSrc==cj.source&&"FAIL"==cj.state){domUtils.removeClasses(ci,"loadingclass"),domUtils.setAttributes(ci,{src:failIMG,_src:failIMG,"data-catchResult":"img_catchFail"}),catchFailList.push(ci);break}if(oldBgIMG==cj.source&&"SUCCESS"==cj.state){newBgIMG=catcherUrlPrefix+cj.url,ci.style.cssText=ci.style.cssText.replace(loadingIMG,newBgIMG),domUtils.removeAttributes(ci,"data-background"),domUtils.setAttributes(ci,{"data-catchResult":"img_catchSuccess"}),catchSuccessList.push(ci);break}if(oldBgIMG==cj.source&&"FAIL"==cj.state){ci.style.cssText=ci.style.cssText.replace(loadingIMG,failIMG),domUtils.removeAttributes(ci,"data-background"),domUtils.setAttributes(ci,{"data-catchResult":"img_catchFail"}),catchFailList.push(ci);break}}me.fireEvent("catchremotesuccess",catchSuccessList,catchFailList)},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(domUtils.removeClasses(c,"loadingclass"),c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),k.trigger("contentchange",c))}):(h='

    ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{defaultOptions:{enableDragUpload:!0,enablePasteUpload:!0},ready:function(d){var e=this;if(window.FormData&&window.FileReader){var f=function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}};e.getOpt("enablePasteUpload")!==!1&&domUtils.on(e.body,"paste ",f),e.getOpt("enableDragUpload")!==!1?(domUtils.on(e.body,"drop",f),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault(); -})):browser.gecko&&domUtils.on(e.body,"drop",function(a){c(a)&&a.preventDefault()}),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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)}}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&window.setTimeout(function(){b.body.innerHTML=b.getPreferences(e)||"

    "+domUtils.fillHtml+"

    "},0)},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),domUtils.removeClasses(g,"loadingclass"),domUtils.on(g,"load",function(){c.fireEvent("contentchange")}),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("alt",f.original||""),g.removeAttribute("id")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){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:1px solid #cccccc;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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!1):utils.isFunction(c)&&utils.extend(a,c(),!1)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={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 c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){if(d=utils.isArray(d)?d:[d],b.fireEvent("beforeinsertfile",d)!==!0){var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

    ";b.execCommand("insertHtml",i),b.fireEvent("afterinsertfile",d)}}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b
    '}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
    '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
    '+this.getContentHtmlTpl()+"
    "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
    '+a+'
    ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
    '+b.getLang("themeColor")+'
    '+b.getLang("standardColor")+"
    =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
    "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="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(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
    '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(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(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.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:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-"+(a.theme||"default")+" .edui-toolbar .edui-button.edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.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(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
    ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
    '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
    ')),this.getDom().className+=" edui-colorbutton"},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
    "+c.mergeLine+'"+c.delLine+'
    "+c.removeFormat+'"+c.indent+'
    "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.removeFontsize+'"+c.removeFontFamily+'
    "+c.removeHtml+'
    "+c.pasteFilter+'
    "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
    "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
    '),2===d&&e.push("");return'
    '+e.join("")+"
    "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
    '+this.editor.getLang("pasteOpt")+'
    '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+"
    '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"index.html",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0; a'+a.join("")+"
    "},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
    '+this.renderLabelHtml()+"
    "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,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"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
    '+b.join("")+"
    "}return'
    '+(this.title||"")+"
    "+this.closeButton.renderHtml()+'
    '+(this.autoReset?"":this.getContentHtml())+"
    "+a+"
    "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+"
    "}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
    "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
    ×
    '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a); -},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),function(a){function b(){var a,b;a=document.createElement("div"),a.innerHTML=c,c=null,b=a.getElementsByTagName("svg")[0],b&&(b.setAttribute("aria-hidden","true"),b.style.position="absolute",b.style.width=0,b.style.height=0,b.style.overflow="hidden",h(b,document.body))}var c='',d=function(){ -var a=document.getElementsByTagName("script");return a[a.length-1]}(),e=d.getAttribute("data-injectcss"),f=function(b){function c(a,b){var c=a.document,d=!1,e=function(){d||(d=!0,b())},f=function(){try{c.documentElement.doScroll("left")}catch(a){return void setTimeout(f,50)}e()};f(),c.onreadystatechange=function(){"complete"==c.readyState&&(c.onreadystatechange=null,e())}}if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(b,0);else{var d=function(){document.removeEventListener("DOMContentLoaded",d,!1),b()};document.addEventListener("DOMContentLoaded",d,!1)}else document.attachEvent&&c(a,b)},g=function(a,b){b.parentNode.insertBefore(a,b)},h=function(a,b){b.firstChild?g(a,b.firstChild):b.appendChild(a)};if(e&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(i){console&&console.log(i)}}f(b)}(window),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["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","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+"
    '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"
    ");b.innerHTML='
    '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
    "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){baidu.editor.ui[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){if(c&&g.ui){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.setOpt("enableMessageShow",!0),g.getOpt("enableMessageShow")!==!1&&(g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()}))}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.config.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.config.js deleted file mode 100644 index 3643feb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.config.js +++ /dev/null @@ -1,604 +0,0 @@ -/** - * neditor完整配置项 - * 可以在这里配置整个编辑器的特性 - */ -/**************************提示******************************** - * 所有被注释的配置项均为UEditor默认值。 - * 修改默认配置请首先确保已经完全明确该参数的真实用途。 - * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 - * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 - **************************提示********************************/ - -(function () { - /** - * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 - * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 - * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/neditor/"这样的路径。 - * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 - * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 - * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; - */ - var URL = window.UEDITOR_HOME_URL || getUEBasePath(); - - /** - * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 - */ - window.UEDITOR_CONFIG = { - videoAllowFiles: [ - ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", - ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], - //为编辑器实例添加一个路径,这个不能被注释 - UEDITOR_HOME_URL: URL, - - // 服务器统一请求接口路径 - //serverUrl: window.NEDITOR_UPLOAD || URL + "php/controller.php", - serverUrl: "/fileUploads/ueditor/upload/file", - imageActionName: "uploadimage", - scrawlActionName: "uploadscrawl", - videoActionName: "uploadvideo", - fileActionName: "uploadfile", - imageFieldName: "file", // 提交的图片表单名称 - imageMaxSize: 2048000, // 上传大小限制,单位B - imageUrlPrefix: "", - scrawlUrlPrefix: "", - videoUrlPrefix: "", - fileUrlPrefix: "", - catcherLocalDomain: "", - //工具栏上的所有的功能按钮和下拉框,可以在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", - "music", - "attachment", - "map", - "gmap", - "insertframe", - // "webapp", - "pagebreak", - "template", - "background", - "|", - "insertcode", - "horizontal", - "date", - "time", - "spechars", - "snapscreen", - "wordimage", - "|", - "inserttable", - "deletetable", - "insertparagraphbeforetable", - "insertrow", - "deleterow", - "insertcol", - "deletecol", - "mergecells", - "mergeright", - "mergedown", - "splittocells", - "splittorows", - "splittocols", - "charts", - "|", - "print", - "preview", - "searchreplace", - "drafts", - "help" - ] - ] - //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 - //,labelMap:{ - // 'anchor':'', 'undo':'' - //} - - //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: - //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() - //,lang:"zh-cn" - //,langPath:URL +"i18n/" - - //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: - //现有如下皮肤:default - , - theme: 'notadd' - //,themePath:URL +"themes/" - - , - zIndex: 1100 //编辑器层级的基数,默认是900 - - //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 - //,charset:"utf-8" - - //若实例化编辑器的页面手动修改的domain,此处需要设置为true - //,customDomain:false - - //常用配置项目 - //,isShow : true //默认显示编辑器 - - //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 - - //,initialContent:'欢迎使用neditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 - - //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 - - //,focus:false //初始化时,是否让编辑器获得焦点true或false - - //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 - //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 - - //,iframeJsUrl: '' //给编辑区域的iframe引入一个js文件 - //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 - - //indentValue - //首行缩进距离,默认是2em - //,indentValue:'2em' - - //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 - //,initialFrameHeight:320 //初始化编辑器高度,默认320 - - //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false - - //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) - - //启用自动保存 - //,enableAutoSave: true - //自动保存间隔时间, 单位ms - //,saveInterval: 500 - - //启用拖放上传 - //,enableDragUpload: true - //启用粘贴上传 - //,enablePasteUpload: true - - //启用图片拉伸缩放 - //,imageScaleEnabled: true - - //,fullscreen : false //是否开启初始化时即全屏,默认关闭 - - //,imagePopup:true //图片操作的浮层开关,默认打开 - - //,autoSyncData:true //自动同步编辑器要提交的数据 - //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 - - //粘贴只保留标签,去除标签所有属性 - //,retainOnlyLabelPasted: false - - //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 - //纯文本粘贴模式下的过滤规则 - //'filterTxtRules' : function(){ - // function transP(node){ - // node.tagName = 'p'; - // node.setStyle(); - // } - // return { - // //直接删除及其字节点内容 - // '-' : 'script style object iframe embed input select', - // 'p': {$:{}}, - // 'br':{$:{}}, - // 'div':{'$':{}}, - // 'li':{'$':{}}, - // '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()) - // } - // } - //}() - - //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 - - //insertorderedlist - //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 - //,'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' : '' , lang //'A,B,C' - // 'upper-roman' : '' //'I,II,III...' - //} - - //insertunorderedlist - //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 - //,insertunorderedlist : { //自定的样式 - // 'dash' :'— 破折号', //-破折号 - // 'dot':' 。 小圆圈', //系统自带 - // 'circle' : '', // '○ 小圆圈' - // 'disc' : '', // '● 小圆点' - // 'square' : '' //'■ 小方块' - //} - //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 - //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 - //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 - - //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 - - //fontfamily - //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 - //,'fontfamily':[ - // { label:'',name:'songti',val:'宋体,SimSun'}, - // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, - // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, - // { label:'',name:'heiti',val:'黑体, SimHei'}, - // { label:'',name:'lishu',val:'隶书, SimLi'}, - // { label:'',name:'andaleMono',val:'andale mono'}, - // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, - // { label:'',name:'arialBlack',val:'arial black,avant garde'}, - // { label:'',name:'comicSansMs',val:'comic sans ms'}, - // { label:'',name:'impact',val:'impact,chicago'}, - // { label:'',name:'timesNewRoman',val:'times new roman'} - //] - - //fontsize - //字号 - //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] - - //paragraph - //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 - //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} - - //rowspacingtop - //段间距 值和显示的名字相同 - //,'rowspacingtop':['5', '10', '15', '20', '25'] - - //rowspacingBottom - //段间距 值和显示的名字相同 - //,'rowspacingbottom':['5', '10', '15', '20', '25'] - - //lineheight - //行内间距 值和显示的名字相同 - //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] - - //customstyle - //自定义样式,不支持国际化,此处配置值即可最后显示值 - //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 - //尽量使用一些常用的标签 - //参数说明 - //tag 使用的标签名字 - //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, - //style 添加的样式 - //每一个对象就是一个自定义的样式 - //,'customstyle':[ - // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, - // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, - // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, - // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} - //] - - //打开右键菜单功能 - //,enableContextMenu: true - //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 - //,contextMenu:[ - // { - // label:'', //显示的名称 - // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 - // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName - // exec:function () { - // //this是当前编辑器的实例 - // //this.ui._dialogs['inserttableDialog'].open(); - // } - // } - //] - - //快捷菜单 - //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] - - //elementPathEnabled - //是否启用元素路径,默认是显示 - //,elementPathEnabled : true - - //wordCount - //,wordCount:true //是否开启字数统计 - //,maximumWords:10000 //允许的最大字符数 - //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 - //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 - //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 - //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! - - //tab - //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 - //,tabSize:4 - //,tabNode:' ' - - //removeFormat - //清除格式时可以删除的标签和属性 - //removeForamtTags标签 - //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' - //removeFormatAttributes属性 - //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' - - //undo - //可以最多回退的次数,默认20 - //,maxUndoCount:20 - //当输入的字符数超过该值时,保存一次现场 - //,maxInputCount:1 - - //autoHeightEnabled - // 是否自动长高,默认true - , - autoHeightEnabled: false - - //scaleEnabled - //是否可以拉伸长高,默认true(当开启时,自动长高失效) - //,scaleEnabled:false - //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 - //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 - - //autoFloatEnabled - //是否保持toolbar的位置不动,默认true - //,autoFloatEnabled:true - //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 - //,topOffset:30 - //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) - //,toolbarTopOffset:400 - - //设置远程图片是否抓取到本地保存 - //,catchRemoteImageEnable: true //设置是否抓取远程图片 - - //pageBreakTag - //分页标识符,默认是_neditor_page_break_tag_ - //,pageBreakTag:'_neditor_page_break_tag_' - - //autotypeset - //自动排版参数 - //,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: {标签名字:1}, - // indent: false, // 行首缩进 - // indentValue : '2em', //行首缩进的大小 - // bdc2sb: false, - // tobdc: false - //} - - //tableDragable - //表格是否可以拖拽 - //,tableDragable: true - - //sourceEditor - //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror - //注意默认codemirror只能在ie8+和非ie中使用 - //,sourceEditor:"codemirror" - //如果sourceEditor是codemirror,还用配置一下两个参数 - //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" - //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" - //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" - //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" - //编辑器初始化完成后是否进入源码模式,默认为否。 - //,sourceEditorFirst:false - - //iframeUrlMap - //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 - //,iframeUrlMap:{ - // 'anchor':'~/dialogs/anchor/anchor.html', - //} - - //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http - //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] - - //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html - //, webAppKey: "" - - //默认过滤规则相关配置项目 - //,disabledTableInTable:true //禁止表格嵌套 - //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 - //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 - - // xss 过滤是否开启,inserthtml等操作 - , - xssFilterRules: true - //input xss过滤 - , - inputXssFilter: true - //output xss过滤 - , - outputXssFilter: true - // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js - , - whitList: { - a: ['target', 'href', 'title', 'class', 'style'], - abbr: ['title', 'class', 'style'], - address: ['class', 'style'], - area: ['shape', 'coords', 'href', 'alt'], - article: [], - aside: [], - audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], - b: ['class', 'style'], - bdi: ['dir'], - bdo: ['dir'], - big: [], - blockquote: ['cite', 'class', 'style'], - br: [], - caption: ['class', 'style'], - center: [], - cite: [], - code: ['class', 'style'], - col: ['align', 'valign', 'span', 'width', 'class', 'style'], - colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], - dd: ['class', 'style'], - del: ['datetime'], - details: ['open'], - div: ['class', 'style'], - dl: ['class', 'style'], - dt: ['class', 'style'], - em: ['class', 'style'], - font: ['color', 'size', 'face'], - footer: [], - h1: ['class', 'style'], - h2: ['class', 'style'], - h3: ['class', 'style'], - h4: ['class', 'style'], - h5: ['class', 'style'], - h6: ['class', 'style'], - header: [], - hr: [], - i: ['class', 'style'], - img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', '_url', 'loadingclass', 'class', 'data-latex'], - ins: ['datetime'], - li: ['class', 'style'], - mark: [], - nav: [], - ol: ['class', 'style'], - p: ['class', 'style'], - pre: ['class', 'style'], - s: [], - section: [], - small: [], - span: ['class', 'style'], - sub: ['class', 'style'], - sup: ['class', 'style'], - strong: ['class', 'style'], - table: ['width', 'border', 'align', 'valign', 'class', 'style'], - tbody: ['align', 'valign', 'class', 'style'], - td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], - tfoot: ['align', 'valign', 'class', 'style'], - th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], - thead: ['align', 'valign', 'class', 'style'], - tr: ['rowspan', 'align', 'valign', 'class', 'style'], - tt: [], - u: [], - ul: ['class', 'style'], - video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'], - source: ['src', 'type'], - embed: ['type', 'class', 'pluginspage', 'src', 'width', 'height', 'align', 'style', 'wmode', 'play', 'autoplay', 'loop', 'index.html', 'allowscriptaccess', 'allowfullscreen', 'controls', 'preload'], - iframe: ['src', 'class', 'height', 'width', 'max-width', 'max-height', 'align', 'frameborder', 'allowfullscreen'] - } - }; - - function getUEBasePath(docUrl, confUrl) { - return getBasePath( - docUrl || self.document.URL || self.location.href, - confUrl || getConfigFilePath() - ); - } - - function getConfigFilePath() { - var configPath = document.getElementsByTagName("script"); - - return configPath[configPath.length - 1].src; - } - - function getBasePath(docUrl, confUrl) { - var basePath = confUrl; - - if (/^(\/|\\\\)/.test(confUrl)) { - basePath = - /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ""); - } else if (!/^[a-z]+:/i.test(confUrl)) { - docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ""); - - basePath = docUrl + "" + confUrl; - } - - return optimizationPath(basePath); - } - - function optimizationPath(path) { - var protocol = /^[a-z]+:\/\//.exec(path)[0], - tmp = null, - res = []; - - path = path.replace(protocol, "").split("?")[0].split("#")[0]; - - path = path.replace(/\\/g, "/").split(/\//); - - path[path.length - 1] = ""; - - while (path.length) { - if ((tmp = path.shift()) === "..") { - res.pop(); - } else if (tmp !== ".") { - res.push(tmp); - } - } - - return protocol + res.join("/"); - } - - window.UE = { - getUEBasePath: getUEBasePath - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.js deleted file mode 100644 index 028d72e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.js +++ /dev/null @@ -1,1230 +0,0 @@ -/*! - * neditor parse - * version: 2.1.6 - * build: Thu Nov 29 2018 09:38:10 GMT+0000 (UTC) - */ - -(function(){ - -(function() { - UE = window.UE || {}; - var isIE = !!window.ActiveXObject; - //定义utils工具 - var utils = { - removeLastbs: function(url) { - return url.replace(/\/$/, ""); - }, - extend: function(t, s) { - var a = arguments, - notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, - len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; - for (var i = 1; i < len; i++) { - var x = a[i]; - for (var k in x) { - if (!notCover || !t.hasOwnProperty(k)) { - t[k] = x[k]; - } - } - } - return t; - }, - isIE: isIE, - cssRule: isIE - ? function(key, style, doc) { - var indexList, index; - doc = doc || document; - if (doc.indexList) { - indexList = doc.indexList; - } else { - indexList = doc.indexList = {}; - } - var sheetStyle; - if (!indexList[key]) { - if (style === undefined) { - return ""; - } - sheetStyle = doc.createStyleSheet( - "", - (index = doc.styleSheets.length) - ); - indexList[key] = index; - } else { - sheetStyle = doc.styleSheets[indexList[key]]; - } - if (style === undefined) { - return sheetStyle.cssText; - } - sheetStyle.cssText = sheetStyle.cssText + "\n" + (style || ""); - } - : function(key, style, doc) { - doc = doc || document; - var head = doc.getElementsByTagName("head")[0], - node; - if (!(node = doc.getElementById(key))) { - if (style === undefined) { - return ""; - } - node = doc.createElement("style"); - node.id = key; - head.appendChild(node); - } - if (style === undefined) { - return node.innerHTML; - } - if (style !== "") { - node.innerHTML = node.innerHTML + "\n" + style; - } else { - head.removeChild(node); - } - }, - domReady: function(onready) { - var doc = window.document; - if (doc.readyState === "complete") { - onready(); - } else { - if (isIE) { - (function() { - if (doc.isReady) return; - try { - doc.documentElement.doScroll("left"); - } catch (error) { - setTimeout(arguments.callee, 0); - return; - } - onready(); - })(); - window.attachEvent("onload", function() { - onready(); - }); - } else { - doc.addEventListener( - "DOMContentLoaded", - function() { - doc.removeEventListener( - "DOMContentLoaded", - arguments.callee, - false - ); - onready(); - }, - false - ); - window.addEventListener( - "load", - function() { - onready(); - }, - 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; - } - } - } - }, - inArray: function(arr, item) { - var index = -1; - this.each(arr, function(v, i) { - if (v === item) { - index = i; - return false; - } - }); - return index; - }, - pushItem: function(arr, item) { - if (this.inArray(arr, item) == -1) { - arr.push(item); - } - }, - trim: function(str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); - }, - 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; - }, - hasClass: function(element, className) { - className = className - .replace(/(^[ ]+)|([ ]+$)/g, "") - .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; - }, - addClass: function(elm, classNames) { - if (!elm) return; - classNames = this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); - for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) { - if (!new RegExp("\\b" + ci + "\\b").test(cls)) { - cls += " " + ci; - } - } - elm.className = utils.trim(cls); - }, - removeClass: function(elm, classNames) { - classNames = this.isArray(classNames) - ? classNames - : this.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 = this.trim(cls).replace(/[ ]{2,}/g, " "); - elm.className = cls; - !cls && elm.removeAttribute("className"); - }, - on: function(element, type, handler) { - var types = this.isArray(type) ? type : 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; - }, - off: function(element, type, handler) { - var types = this.isArray(type) ? type : 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]; - } - } - } - }, - 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(); - } - } - element.onload = element.onreadystatechange = null; - } - }; - element.onerror = function() { - throw Error( - "The load " + (obj.href || obj.src) + " fails,check the url" - ); - }; - doc.getElementsByTagName("head")[0].appendChild(element); - }; - })() - }; - utils.each( - ["String", "Function", "Array", "Number", "RegExp", "Object", "Boolean"], - function(v) { - utils["is" + v] = function(obj) { - return Object.prototype.toString.apply(obj) == "[object " + v + "]"; - }; - } - ); - var parselist = {}; - UE.parse = { - register: function(parseName, fn) { - parselist[parseName] = fn; - }, - load: function(opt) { - utils.each(parselist, function(v) { - v.call(opt, utils); - }); - } - }; - uParse = function(selector, opt) { - utils.domReady(function() { - var contents; - if (document.querySelectorAll) { - contents = document.querySelectorAll(selector); - } else { - if (/^#/.test(selector)) { - contents = [document.getElementById(selector.replace(/^#/, ""))]; - } else if (/^\./.test(selector)) { - var contents = []; - utils.each(document.getElementsByTagName("*"), function(node) { - if ( - node.className && - new RegExp("\\b" + selector.replace(/^\./, "") + "\\b", "i").test( - node.className - ) - ) { - contents.push(node); - } - }); - } else { - contents = document.getElementsByTagName(selector); - } - } - utils.each(contents, function(v) { - UE.parse.load(utils.extend({ root: v, selector: selector }, opt)); - }); - }); - }; -})(); - -UE.parse.register("insertcode", function(utils) { - var pres = this.root.getElementsByTagName("pre"); - if (pres.length) { - if (typeof XRegExp == "undefined") { - var jsurl, cssurl; - if (this.rootPath !== undefined) { - jsurl = - utils.removeLastbs(this.rootPath) + - "/third-party/SyntaxHighlighter/shCore.js"; - cssurl = - utils.removeLastbs(this.rootPath) + - "/third-party/SyntaxHighlighter/shCoreDefault.css"; - } else { - jsurl = this.highlightJsUrl; - cssurl = this.highlightCssUrl; - } - utils.loadFile(document, { - id: "syntaxhighlighter_css", - tag: "link", - rel: "stylesheet", - type: "text/css", - href: cssurl - }); - utils.loadFile( - document, - { - id: "syntaxhighlighter_js", - src: jsurl, - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - utils.each(pres, function(pi) { - if (pi && /brush/i.test(pi.className)) { - SyntaxHighlighter.highlight(pi); - } - }); - } - ); - } else { - utils.each(pres, function(pi) { - if (pi && /brush/i.test(pi.className)) { - SyntaxHighlighter.highlight(pi); - } - }); - } - } -}); - -UE.parse.register("table", function(utils) { - var me = this, - root = this.root, - tables = root.getElementsByTagName("table"); - if (tables.length) { - var selector = this.selector; - //追加默认的表格样式 - utils.cssRule( - "table", - selector + - " table.noBorderTable td," + - selector + - " table.noBorderTable th," + - selector + - " table.noBorderTable caption{border:1px dashed #ddd !important}" + - selector + - " table.sortEnabled tr.firstRow th," + - selector + - " table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;" + - "background-position: center right; background-image:url(" + - this.rootPath + - "themes/default/images/sortable.png);}" + - selector + - " table.sortEnabled tr.firstRow th:hover," + - selector + - " table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}" + - selector + - " table{margin-bottom:10px;border-collapse:collapse;display:table;}" + - selector + - " td," + - selector + - " th{padding: 5px 10px;border: 1px solid #DDD;}" + - selector + - " caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + - selector + - " th{border-top:1px solid #BBB;background:#F7F7F7;}" + - selector + - " table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}" + - selector + - " tr.ue-table-interlace-color-single td{ background: #fcfcfc; }" + - selector + - " tr.ue-table-interlace-color-double td{ background: #f7faff; }" + - selector + - " td p{margin:0;padding:0;width:auto;height:auto;}", - document - ); - //填充空的单元格 - - utils.each("td th caption".split(" "), function(tag) { - var cells = root.getElementsByTagName(tag); - cells.length && - utils.each(cells, function(node) { - if (!node.firstChild) { - node.innerHTML = " "; - } - }); - }); - - //表格可排序 - var tables = root.getElementsByTagName("table"); - utils.each(tables, function(table) { - if (/\bsortEnabled\b/.test(table.className)) { - utils.on(table, "click", function(e) { - var target = e.target || e.srcElement, - cell = findParentByTagName(target, ["td", "th"]); - var table = findParentByTagName(target, "table"), - colIndex = utils.indexOf(table.rows[0].cells, cell), - sortType = table.getAttribute("data-sort-type"); - if (colIndex != -1) { - sortTable(table, colIndex, me.tableSortCompareFn || sortType); - updateTable(table); - } - }); - } - }); - - //按照标签名查找父节点 - function findParentByTagName(target, tagNames) { - var i, - current = target; - tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; - while (current) { - for (i = 0; i < tagNames.length; i++) { - if (current.tagName == tagNames[i].toUpperCase()) return current; - } - current = current.parentNode; - } - return null; - } - //表格排序 - function sortTable(table, sortByCellIndex, compareFn) { - var rows = table.rows, - trArray = [], - flag = rows[0].cells[0].tagName === "TH", - lastRowIndex = 0; - - for (var i = 0, len = rows.length; i < len; i++) { - trArray[i] = rows[i]; - } - - var Fn = { - reversecurrent: function(td1, td2) { - return 1; - }, - orderbyasc: function(td1, td2) { - var value1 = td1.innerText || td1.textContent, - value2 = td2.innerText || td2.textContent; - return value1.localeCompare(value2); - }, - reversebyasc: function(td1, td2) { - var value1 = td1.innerHTML, - value2 = td2.innerHTML; - return value2.localeCompare(value1); - }, - orderbynum: function(td1, td2) { - var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( - /\d+/ - ), - value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value1 || 0) - (value2 || 0); - }, - reversebynum: function(td1, td2) { - var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( - /\d+/ - ), - value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value2 || 0) - (value1 || 0); - } - }; - - //对表格设置排序的标记data-sort-type - table.setAttribute( - "data-sort-type", - compareFn && typeof compareFn === "string" && Fn[compareFn] - ? compareFn - : "" - ); - - //th不参与排序 - flag && trArray.splice(0, 1); - trArray = sort(trArray, function(tr1, tr2) { - var result; - if (compareFn && typeof compareFn === "function") { - result = compareFn.call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else if (compareFn && typeof compareFn === "number") { - result = 1; - } else if ( - compareFn && - typeof compareFn === "string" && - Fn[compareFn] - ) { - result = Fn[compareFn].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else { - result = Fn["orderbyasc"].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } - return result; - }); - var fragment = table.ownerDocument.createDocumentFragment(); - for (var j = 0, len = trArray.length; j < len; j++) { - fragment.appendChild(trArray[j]); - } - var tbody = table.getElementsByTagName("tbody")[0]; - if (!lastRowIndex) { - tbody.appendChild(fragment); - } else { - tbody.insertBefore( - fragment, - rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] - ); - } - } - //冒泡排序 - function sort(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; - } - //更新表格 - function updateTable(table) { - //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 - if (!utils.hasClass(table.rows[0], "firstRow")) { - for (var i = 1; i < table.rows.length; i++) { - utils.removeClass(table.rows[i], "firstRow"); - } - utils.addClass(table.rows[0], "firstRow"); - } - } - } -}); - -UE.parse.register("charts", function(utils) { - utils.cssRule( - "chartsContainerHeight", - ".edui-chart-container { height:" + - (this.chartContainerHeight || 300) + - "px}" - ); - var resourceRoot = this.rootPath, - containers = this.root, - sources = null; - - //不存在指定的根路径, 则直接退出 - if (!resourceRoot) { - return; - } - - if ((sources = parseSources())) { - loadResources(); - } - - function parseSources() { - if (!containers) { - return null; - } - - return extractChartData(containers); - } - - /** - * 提取数据 - */ - function extractChartData(rootNode) { - var data = [], - tables = rootNode.getElementsByTagName("table"); - - for (var i = 0, tableNode; (tableNode = tables[i]); i++) { - if (tableNode.getAttribute("data-chart") !== null) { - data.push(formatData(tableNode)); - } - } - - return data.length ? data : null; - } - - function formatData(tableNode) { - var meta = tableNode.getAttribute("data-chart"), - metaConfig = {}, - data = []; - - //提取table数据 - for (var i = 0, row; (row = tableNode.rows[i]); i++) { - var rowData = []; - - for (var j = 0, cell; (cell = row.cells[j]); j++) { - var value = cell.innerText || cell.textContent || ""; - rowData.push(cell.tagName == "TH" ? value : value | 0); - } - - data.push(rowData); - } - - //解析元信息 - meta = meta.split(";"); - for (var i = 0, metaData; (metaData = meta[i]); i++) { - metaData = metaData.split(":"); - metaConfig[metaData[0]] = metaData[1]; - } - - return { - table: tableNode, - meta: metaConfig, - data: data - }; - } - - //加载资源 - function loadResources() { - loadJQuery(); - } - - function loadJQuery() { - //不存在jquery, 则加载jquery - if (!window.jQuery) { - utils.loadFile( - document, - { - src: resourceRoot + "/third-party/jquery-1.10.2.min.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - loadHighcharts(); - } - ); - } else { - loadHighcharts(); - } - } - - function loadHighcharts() { - //不存在Highcharts, 则加载Highcharts - if (!window.Highcharts) { - utils.loadFile( - document, - { - src: resourceRoot + "/third-party/highcharts/highcharts.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - loadTypeConfig(); - } - ); - } else { - loadTypeConfig(); - } - } - - //加载图表差异化配置文件 - function loadTypeConfig() { - utils.loadFile( - document, - { - src: resourceRoot + "/dialogs/charts/chart.config.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - render(); - } - ); - } - - //渲染图表 - function render() { - var config = null, - chartConfig = null, - container = null; - - for (var i = 0, len = sources.length; i < len; i++) { - config = sources[i]; - - chartConfig = analysisConfig(config); - - container = createContainer(config.table); - - renderChart(container, typeConfig[config.meta.chartType], chartConfig); - } - } - - /** - * 渲染图表 - * @param container 图表容器节点对象 - * @param typeConfig 图表类型配置 - * @param config 图表通用配置 - * */ - function renderChart(container, typeConfig, config) { - $(container).highcharts( - $.extend({}, typeConfig, { - credits: { - enabled: false - }, - exporting: { - enabled: false - }, - title: { - text: config.title, - x: -20 //center - }, - subtitle: { - text: config.subTitle, - x: -20 - }, - xAxis: { - title: { - text: config.xTitle - }, - categories: config.categories - }, - yAxis: { - title: { - text: config.yTitle - }, - plotLines: [ - { - value: 0, - width: 1, - color: "#808080" - } - ] - }, - tooltip: { - enabled: true, - valueSuffix: config.suffix - }, - legend: { - layout: "vertical", - align: "right", - verticalAlign: "middle", - borderWidth: 1 - }, - series: config.series - }) - ); - } - - /** - * 创建图表的容器 - * 新创建的容器会替换掉对应的table对象 - * */ - function createContainer(tableNode) { - var container = document.createElement("div"); - container.className = "edui-chart-container"; - - tableNode.parentNode.replaceChild(container, tableNode); - - return container; - } - - //根据config解析出正确的类别和图表数据信息 - function analysisConfig(config) { - var series = [], - //数据类别 - categories = [], - result = [], - data = config.data, - meta = config.meta; - - //数据对齐方式为相反的方式, 需要反转数据 - if (meta.dataFormat != "1") { - for (var i = 0, len = data.length; i < len; i++) { - for (var j = 0, jlen = data[i].length; j < jlen; j++) { - if (!result[j]) { - result[j] = []; - } - - result[j][i] = data[i][j]; - } - } - - data = result; - } - - result = {}; - - //普通图表 - if (meta.chartType != typeConfig.length - 1) { - categories = data[0].slice(1); - - for (var i = 1, curData; (curData = data[i]); i++) { - series.push({ - name: curData[0], - data: curData.slice(1) - }); - } - - result.series = series; - result.categories = categories; - result.title = meta.title; - result.subTitle = meta.subTitle; - result.xTitle = meta.xTitle; - result.yTitle = meta.yTitle; - result.suffix = meta.suffix; - } else { - var curData = []; - - for (var i = 1, len = data[0].length; i < len; i++) { - curData.push([data[0][i], data[1][i] | 0]); - } - - //饼图 - series[0] = { - type: "pie", - name: meta.tip, - data: curData - }; - - result.series = series; - result.title = meta.title; - result.suffix = meta.suffix; - } - - return result; - } -}); - -UE.parse.register("background", function(utils) { - var me = this, - root = me.root, - p = root.getElementsByTagName("p"), - styles; - - for (var i = 0, ci; (ci = p[i++]); ) { - styles = ci.getAttribute("data-background"); - if (styles) { - ci.parentNode.removeChild(ci); - } - } - - //追加默认的表格样式 - styles && - utils.cssRule( - "ueditor_background", - me.selector + "{" + styles + "}", - document - ); -}); - -UE.parse.register("list", function(utils) { - var customCss = [], - customStyle = { - cn: "cn-1-", - cn1: "cn-2-", - cn2: "cn-3-", - num: "num-1-", - num1: "num-2-", - num2: "num-3-", - dash: "dash", - dot: "dot" - }; - - utils.extend(this, { - liiconpath : utils.removeLastbs(this.rootPath) + '/themes/ueditor-list/', - listDefaultPaddingLeft: "20" - }); - - var root = this.root, - ols = root.getElementsByTagName("ol"), - uls = root.getElementsByTagName("ul"), - selector = this.selector; - - if (ols.length) { - applyStyle.call(this, ols); - } - - if (uls.length) { - applyStyle.call(this, uls); - } - - if (ols.length || uls.length) { - customCss.push(selector + " .list-paddingleft-1{padding-left:0}"); - customCss.push( - selector + - " .list-paddingleft-2{padding-left:" + - this.listDefaultPaddingLeft + - "px}" - ); - customCss.push( - selector + - " .list-paddingleft-3{padding-left:" + - this.listDefaultPaddingLeft * 2 + - "px}" - ); - - utils.cssRule( - "list", - selector + - " ol," + - selector + - " ul{margin:0;padding:0;}\n" + - selector + - " li{clear:both;}\n" + - customCss.join("\n"), - document - ); - } - function applyStyle(nodes) { - var T = this; - utils.each(nodes, function(list) { - if (list.className && /custom_/i.test(list.className)) { - var listStyle = list.className.match(/custom_(\w+)/)[1]; - if (listStyle == "dash" || listStyle == "dot") { - utils.pushItem( - customCss, - selector + - " li.list-" + - customStyle[listStyle] + - "{background-image:url(" + - T.liiconpath + - customStyle[listStyle] + - ".gif)}" - ); - utils.pushItem( - customCss, - selector + - " ul.custom_" + - listStyle + - "{list-style:none;} " + - selector + - " ul.custom_" + - listStyle + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } else { - var index = 1; - utils.each(list.childNodes, function(li) { - if (li.tagName == "LI") { - utils.pushItem( - customCss, - selector + - " li.list-" + - customStyle[listStyle] + - index + - "{background-image:url(" + - T.liiconpath + - "list-" + - customStyle[listStyle] + - index + - ".gif)}" - ); - index++; - } - }); - utils.pushItem( - customCss, - selector + - " ol.custom_" + - listStyle + - "{list-style:none;}" + - selector + - " ol.custom_" + - listStyle + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } - switch (listStyle) { - case "cn": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:25px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:55px}" - ); - break; - case "cn1": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:30px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:55px}" - ); - break; - case "cn2": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:55px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:68px}" - ); - break; - case "num": - case "num1": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:25px}" - ); - break; - case "num2": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:35px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - break; - case "dash": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft{padding-left:35px}" - ); - break; - case "dot": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft{padding-left:20px}" - ); - } - } - }); - } -}); - -UE.parse.register("vedio", function(utils) { - var video = this.root.getElementsByTagName("video"), - audio = this.root.getElementsByTagName("audio"); - - document.createElement("video"); - document.createElement("audio"); - if (video.length || audio.length) { - var sourcePath = utils.removeLastbs(this.rootPath), - jsurl = sourcePath + "/third-party/video-js/video.js", - cssurl = sourcePath + "/third-party/video-js/video-js.min.css", - swfUrl = sourcePath + "/third-party/video-js/video-js.swf"; - - if (window.videojs) { - videojs.autoSetup(); - } else { - utils.loadFile(document, { - id: "video_css", - tag: "link", - rel: "stylesheet", - type: "text/css", - href: cssurl - }); - utils.loadFile( - document, - { - id: "video_js", - src: jsurl, - tag: "script", - type: "text/javascript" - }, - function() { - videojs.options.flash.swf = swfUrl; - videojs.autoSetup(); - } - ); - } - } -}); - - -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.min.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.min.js deleted file mode 100644 index 6edefd4..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/neditor.parse.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * neditor parse - * version: 2.1.6 - * build: Thu Nov 29 2018 09:38:15 GMT+0000 (UTC) - */!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;ca+;LT89wv= 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 F`M=t5Rl)!O diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.js deleted file mode 100644 index 7728224..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.js +++ /dev/null @@ -1 +0,0 @@ -(function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.svg b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.svg deleted file mode 100644 index 7bbbafe..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.svg +++ /dev/null @@ -1,410 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.ttf b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/fonts/iconfont.ttf deleted file mode 100644 index f8a15465d6cd67623be8186f5bdb96988308ac0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25608 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/anchor.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/anchor.gif deleted file mode 100644 index fa4d420ada43da7064ebca58f79c80ba46488b64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1O92q*K6{f7;QzKn8n>r>`sfJyu2$Ju`2;6`vUx7@0j?978nDmtHulb%ar(_2Yem zV}~XwaRuv4R8e%jS-?LnDDMDk#BQe4cC{(C6SuAn3U;}qAsKc?;&Z)j+NY}()81Qt z{U)<-X5pG8Z?3Fi>p9Ks>VIhJ$^C`5`U(=xteCSw{qyb%s_&0VNPK$|<*%EuN<4^z zlOu5dp9M$PO)yS6v2DZu@2tY>THN~&^}ckI6Xpx4u`qcmzv-O_&%bN0UA>MryM!tQ zx=!|!bi6flO1ZSz{+uke?rSM7QTB17ue$bevEIG4;7Q~TlYY7F@4hCUYyI$OZRE{q zp3GvU*;^HK^H1(tW4-!ZcC?@6C%q}5p;KGCgpKXL=WKry5vUYclH}^H`-3IqTXfrt zD;58MA*5R38c~vxSdwa$T$Bo=7>o=IEp!dcbd4-Rj0~+z&8!SewGAw+3=H(X>^4Nv zkei>9nN|tXV4`bas%u~vVq{=tVrFG(0@3j3>e>}R4bC7Niu2P-$`gxH8T3nwi}Z8y zlM{3FGjkKuQ-L@$Ia|Lt11PDVlAo;a2@>@Mi|U%|>u2Vrq*mxU zm!(@J=jZ08=9MrgxTof&76F}}qL5Un;F+B7o1dSjmzl3%aQd_dP=f@>{*a8)+$1Y2 zm;B^XkR~gu0H7_!42H}9@770C19pIwl}Bo3dPWI@xuKyb!?jSL8gV3ZplZT1Q%W*G zO4>fQaR8M_A}R6B%uOw+EJ$SldsDw4FWr7qm>-%sz9B$W42H&*7M3O!CWau2QWrs|iMmlx&dm+0rEmKSH1 zfcbigTe~DWM4fmaJ0N diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow.png deleted file mode 100644 index d9008866ba56c4a4715a3f883ccb3be941031206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmd^<>ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_down.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_down.png deleted file mode 100644 index e9257e83b00375259f2f724c7cbac03d0df5ceb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_up.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/arrow_up.png deleted file mode 100644 index 74277af1e6a8ef91f8fe664efde11377a5292dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/button-bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/button-bg.gif deleted file mode 100644 index ec7fa2eabf0705226fe0c488d65198508bf547e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cancelbutton.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cancelbutton.gif deleted file mode 100644 index df4bc2c06d485df4403d689c98ee745a4cde8e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_h.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_h.gif deleted file mode 100644 index d7c3e7e9eb5755d57ec03c34097c258244abe61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_v.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/cursor_v.gif deleted file mode 100644 index bb508db552b6ac3f670f9ce1fcb1e55669db0dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/filescan.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/filescan.png deleted file mode 100644 index 1d271588692c1726e3521032f71d8354b66fab0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4282 zcmV;r5Jm5aP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1?NdbK~#9!?3_!lWmOT!t7_HW`<(lvZ{H>$5@Q?MbURQ7v;-We31bE(&WQtc=8P#* zJ^>RAGY2LPoG<`iA;Azj5j8?%(@{|Rrqg}SeH_nzt+lGk!3`$J>9zR)_4^3F{8#PT zwH|0@w>~=R#xaCo;QT)bAR=2$bLC54z`uWZXJ>os!rqRXD)>5Ct=DbG|LMoaAAPtV zqsuDDy0Eu%cX7;h6_SXkyDE`Hs)|_+RL#s~l~6S^U{h07RdpjpS*mJmV5%lAYcg42 zYzC^PUb8;eGBi_DHBVMimZ_OBn2DN*C#!@612YBy00VGYWefng9mabnt1%|`QJ|@- zb{M%IV-y|6=tc_6np$#ZL?jAC!HpCk3W~x&NP#f8tfH(yAjpIiCy*XdM^2q-7i~-=?qyF|ON2^@cMp^Y}+eiJ= zPt5SQf4hHopf5kRuZCXbH*{D4g!a!nXOGO4|Mc*1Kq4exhGkg<0BnF_DCXma5@Kk8eAef@ z?2cRSvq~InbK7S&!|chLA{&|^6Cnro&7Cs*$qXKunc0ODW$`B)7FFQNWfiFc6A=?p zU2$EzkP>ypM8qLbRfozyhUH|{Aq3(;P}kIC@8FBcswogKGtOr)dh1YRJ_BatS%te> zko-_-;a>+}cMF;d*wS#g4;mo*DclFBVuZsTxSb-t^})%_wO+e&fCPSX;Ij~dDZF>< z`06g9nccjzdi~vdt5M9OwINuz*Mw)k_VCrm_80*AVLVwb*L`wT8w-}qtA5xA0DkSA zfBp5t<#XS<+_0a~+AM3#@|(YWyj=D8)1STZ{P(V{x~RT)|G=_^dt3D@zq`p>b+zha z8@+{}2-v(1JZ5d9bkUD?mt|qh#!+-V4zox~%DBDJRix%rU#Ha~$0O@8F4T;LT`2ENxy zTx1bXR*4Yov=z?8W7UY?H=K|aGBNYKsrPmzd+Sh?#mw!B!>p+v+Lh$D?~AgkDx5SN z>blz5LVv2D2-j7pYsP?7Gx>a`2-S=M8O$t;sTcSXmI=&QQp#PMy=IlEDoKf@>&DX) z@!y?tQ(A@GbsW2OTrRSB2VX4kfpXXK1(JTT$i8J*P8Q)oK>WoUw_kYW&F#vClxP#Y z^!zhuX1{;ugI~S=$K~;vOWDZ9gZ=M6`}B9e`2+*Nw=d7GJ#{Db3-HJ6J_}McKRmcR z0|0D4db9nW?p8e@@1=$Epyn(CjR4{F=jz zK-Z|fJ9%*b4xkVkWP}9TgSo6C3J96OB3KJHxR7GF6f81WLhVpT7gDNPs$hx1M$it- zWtEqqfQ<~6KwI!+O~}gU$%>#IsJ~M>nXGs&s|EFWR#{d$mz6Re`^&{9so@8s|^FfM#}lHq)$07*qoM6N<$f|`Fa&Hw-a diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/highlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/highlighted.gif deleted file mode 100644 index 9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons-all.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons-all.gif deleted file mode 100644 index 21915e59dede0aa22cda8c7097a14f0f1f68906c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 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 b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/icons.png deleted file mode 100644 index c015e3aac9a84ebad11b932e84722124772d9641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19694 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ÏmvOE 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 b`u_(2Nr-(&rSM diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loaderror.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loaderror.png deleted file mode 100644 index 35ff3336457d48dbecbc11698ef8245441a94f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3209 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loading.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/loading.gif deleted file mode 100644 index b713e27dfba708a01c380e7c731a13b52a34edfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/pagebreak.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/pagebreak.gif deleted file mode 100644 index 8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sortable.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sortable.png deleted file mode 100644 index 1bca649698e187a80e1b1951fde99ddea3d7b038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 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 BXOsW{ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/spacer.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/spacer.gif deleted file mode 100644 index 5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sparator_v.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/sparator_v.png deleted file mode 100644 index 8cf5662da8c36a446e1e08eb71b992c730ab8d15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/table-cell-align.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/table-cell-align.png deleted file mode 100644 index ddf42853ea5c00663e74d9195d1f1264ab684252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1847 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/toolbar_bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/toolbar_bg.png deleted file mode 100644 index 7ab685f4236ad543601b0d7dc43e429e041bee98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/unhighlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/unhighlighted.gif deleted file mode 100644 index 7ad0b67ae634d41e76848ec0b6696e8ac7e06983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.10/themes/notadd/images/upload.png deleted file mode 100644 index 08d4d9268204a20ca343bf75784302cc706d2417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6608 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 O0000R>^78WY^MyiTK|w)L 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/SyntaxHighlighter/shCore.js b/web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/SyntaxHighlighter/shCore.js deleted file mode 100644 index 3249184..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.10/third-party/SyntaxHighlighter/shCore.js +++ /dev/null @@ -1,3655 +0,0 @@ -// XRegExp 1.5.1 -// (c) 2007-2012 Steven Levithan -// MIT License -// -// Provides an augmented, extensible, cross-browser implementation of regular expressions, -// including support for additional syntax, flags, and methods - -var XRegExp; - -if (XRegExp) { - // Avoid running twice, since that would break references to native globals - throw Error("can't load XRegExp twice in the same frame"); -} - -// Run within an anonymous function to protect variables and avoid new globals -(function (undefined) { - - //--------------------------------- - // Constructor - //--------------------------------- - - // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native - // regular expression in that additional syntax and flags are supported and cross-browser - // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and - // converts to type XRegExp - XRegExp = function (pattern, flags) { - var output = [], - currScope = XRegExp.OUTSIDE_CLASS, - pos = 0, - context, tokenResult, match, chr, regex; - - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) - throw TypeError("can't supply flags when constructing one RegExp from another"); - return clone(pattern); - } - // Tokens become part of the regex construction process, so protect against infinite - // recursion when an XRegExp is constructed within a token handler or trigger - if (isInsideConstructor) - throw Error("can't call the XRegExp constructor within token definition functions"); - - flags = flags || ""; - context = { // `this` object for custom tokens - hasNamedCapture: false, - captureNames: [], - hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, - setFlag: function (flag) {flags += flag;} - }; - - while (pos < pattern.length) { - // Check for custom tokens at the current position - tokenResult = runTokens(pattern, pos, currScope, context); - - if (tokenResult) { - output.push(tokenResult.output); - pos += (tokenResult.match[0].length || 1); - } else { - // Check for native multicharacter metasequences (excluding character classes) at - // the current position - if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { - output.push(match[0]); - pos += match[0].length; - } else { - chr = pattern.charAt(pos); - if (chr === "[") - currScope = XRegExp.INSIDE_CLASS; - else if (chr === "]") - currScope = XRegExp.OUTSIDE_CLASS; - // Advance position one character - output.push(chr); - pos++; - } - } - } - - regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); - regex._xregexp = { - source: pattern, - captureNames: context.hasNamedCapture ? context.captureNames : null - }; - return regex; - }; - - - //--------------------------------- - // Public properties - //--------------------------------- - - XRegExp.version = "1.5.1"; - - // Token scope bitflags - XRegExp.INSIDE_CLASS = 1; - XRegExp.OUTSIDE_CLASS = 2; - - - //--------------------------------- - // Private variables - //--------------------------------- - - var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, - flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags - quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, - isInsideConstructor = false, - tokens = [], - // Copy native globals for reference ("native" is an ES3 reserved keyword) - nativ = { - exec: RegExp.prototype.exec, - test: RegExp.prototype.test, - match: String.prototype.match, - replace: String.prototype.replace, - split: String.prototype.split - }, - compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups - compliantLastIndexIncrement = function () { - var x = /^/g; - nativ.test.call(x, ""); - return !x.lastIndex; - }(), - hasNativeY = RegExp.prototype.sticky !== undefined, - nativeTokens = {}; - - // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, - // excluding character classes) - nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; - nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; - - - //--------------------------------- - // Public methods - //--------------------------------- - - // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by - // the XRegExp library and can be used to create XRegExp plugins. This function is intended for - // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can - // be disabled by `XRegExp.freezeTokens` - XRegExp.addToken = function (regex, handler, scope, trigger) { - tokens.push({ - pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), - handler: handler, - scope: scope || XRegExp.OUTSIDE_CLASS, - trigger: trigger || null - }); - }; - - // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag - // combination has previously been cached, the cached copy is returned; otherwise the newly - // created regex is cached - XRegExp.cache = function (pattern, flags) { - var key = pattern + "/" + (flags || ""); - return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); - }; - - // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh - // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` - // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve - // special properties required for named capture - XRegExp.copyAsGlobal = function (regex) { - return clone(regex, "g"); - }; - - // Accepts a string; returns the string with regex metacharacters escaped. The returned string - // can safely be used at any point within a regex to match the provided literal string. Escaped - // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace - XRegExp.escape = function (str) { - return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - }; - - // Accepts a string to search, regex to search with, position to start the search within the - // string (default: 0), and an optional Boolean indicating whether matches must start at-or- - // after the position or at the specified position only. This function ignores the `lastIndex` - // of the provided regex in its own handling, but updates the property for compatibility - XRegExp.execAt = function (str, regex, pos, anchored) { - var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), - match; - r2.lastIndex = pos = pos || 0; - match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (anchored && match && match.index !== pos) - match = null; - if (regex.global) - regex.lastIndex = match ? r2.lastIndex : 0; - return match; - }; - - // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing - // syntax and flag changes. Should be run after XRegExp and any plugins are loaded - XRegExp.freezeTokens = function () { - XRegExp.addToken = function () { - throw Error("can't run addToken after freezeTokens"); - }; - }; - - // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. - // Note that this is also `true` for regex literals and regexes created by the `XRegExp` - // constructor. This works correctly for variables created in another frame, when `instanceof` - // and `constructor` checks would fail to work as intended - XRegExp.isRegExp = function (o) { - return Object.prototype.toString.call(o) === "[object RegExp]"; - }; - - // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to - // iterate over regex matches compared to the traditional approaches of subverting - // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop - XRegExp.iterate = function (str, regex, callback, context) { - var r2 = clone(regex, "g"), - i = -1, match; - while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (regex.global) - regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` - callback.call(context, match, ++i, str, regex); - if (r2.lastIndex === match.index) - r2.lastIndex++; - } - if (regex.global) - regex.lastIndex = 0; - }; - - // Accepts a string and an array of regexes; returns the result of using each successive regex - // to search within the matches of the previous regex. The array of regexes can also contain - // objects with `regex` and `backref` properties, in which case the named or numbered back- - // references specified are passed forward to the next regex or returned. E.g.: - // var xregexpImgFileNames = XRegExp.matchChain(html, [ - // {regex: /]+)>/i, backref: 1}, // tag attributes - // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values - // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths - // /[^\/]+$/ // filenames (strip directory paths) - // ]); - XRegExp.matchChain = function (str, chain) { - return function recurseChain (values, level) { - var item = chain[level].regex ? chain[level] : {regex: chain[level]}, - regex = clone(item.regex, "g"), - matches = [], i; - for (i = 0; i < values.length; i++) { - XRegExp.iterate(values[i], regex, function (match) { - matches.push(item.backref ? (match[item.backref] || "") : match[0]); - }); - } - return ((level === chain.length - 1) || !matches.length) ? - matches : recurseChain(matches, level + 1); - }([str], 0); - }; - - - //--------------------------------- - // New RegExp prototype methods - //--------------------------------- - - // Accepts a context object and arguments array; returns the result of calling `exec` with the - // first value in the arguments array. the context is ignored but is accepted for congruity - // with `Function.prototype.apply` - RegExp.prototype.apply = function (context, args) { - return this.exec(args[0]); - }; - - // Accepts a context object and string; returns the result of calling `exec` with the provided - // string. the context is ignored but is accepted for congruity with `Function.prototype.call` - RegExp.prototype.call = function (context, str) { - return this.exec(str); - }; - - - //--------------------------------- - // Overriden native methods - //--------------------------------- - - // Adds named capture support (with backreferences returned as `result.name`), and fixes two - // cross-browser issues per ES3: - // - Captured values for nonparticipating capturing groups should be returned as `undefined`, - // rather than the empty string. - // - `lastIndex` should not be incremented after zero-length matches. - RegExp.prototype.exec = function (str) { - var match, name, r2, origLastIndex; - if (!this.global) - origLastIndex = this.lastIndex; - match = nativ.exec.apply(this, arguments); - if (match) { - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { - r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); - // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - nativ.replace.call((str + "").slice(match.index), r2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) - match[i] = undefined; - } - }); - } - // Attach named capture properties - if (this._xregexp && this._xregexp.captureNames) { - for (var i = 1; i < match.length; i++) { - name = this._xregexp.captureNames[i - 1]; - if (name) - match[name] = match[i]; - } - } - // Fix browsers that increment `lastIndex` after zero-length matches - if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - } - if (!this.global) - this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - return match; - }; - - // Fix browser bugs in native method - RegExp.prototype.test = function (str) { - // Use the native `exec` to skip some processing overhead, even though the altered - // `exec` would take care of the `lastIndex` fixes - var match, origLastIndex; - if (!this.global) - origLastIndex = this.lastIndex; - match = nativ.exec.call(this, str); - // Fix browsers that increment `lastIndex` after zero-length matches - if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - if (!this.global) - this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - return !!match; - }; - - // Adds named capture support and fixes browser bugs in native method - String.prototype.match = function (regex) { - if (!XRegExp.isRegExp(regex)) - regex = RegExp(regex); // Native `RegExp` - if (regex.global) { - var result = nativ.match.apply(this, arguments); - regex.lastIndex = 0; // Fix IE bug - return result; - } - return regex.exec(this); // Run the altered `exec` - }; - - // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, - // and provides named backreferences to replacement functions as `arguments[0].name`. Also - // fixes cross-browser differences in replacement text syntax when performing a replacement - // using a nonregex search value, and the value of replacement regexes' `lastIndex` property - // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary - // third (`flags`) parameter - String.prototype.replace = function (search, replacement) { - var isRegex = XRegExp.isRegExp(search), - captureNames, result, str, origLastIndex; - - // There are too many combinations of search/replacement types/values and browser bugs that - // preclude passing to native `replace`, so don't try - //if (...) - // return nativ.replace.apply(this, arguments); - - if (isRegex) { - if (search._xregexp) - captureNames = search._xregexp.captureNames; // Array or `null` - if (!search.global) - origLastIndex = search.lastIndex; - } else { - search = search + ""; // Type conversion - } - - if (Object.prototype.toString.call(replacement) === "[object Function]") { - result = nativ.replace.call(this + "", search, function () { - if (captureNames) { - // Change the `arguments[0]` string primitive to a String object which can store properties - arguments[0] = new String(arguments[0]); - // Store named backreferences on `arguments[0]` - for (var i = 0; i < captureNames.length; i++) { - if (captureNames[i]) - arguments[0][captureNames[i]] = arguments[i + 1]; - } - } - // Update `lastIndex` before calling `replacement` (fix browsers) - if (isRegex && search.global) - search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; - return replacement.apply(null, arguments); - }); - } else { - str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) - result = nativ.replace.call(str, search, function () { - var args = arguments; // Keep this function's `arguments` available through closure - return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { - // Numbered backreference (without delimiters) or special variable - if ($1) { - switch ($1) { - case "$": return "$"; - case "&": return args[0]; - case "`": return args[args.length - 1].slice(0, args[args.length - 2]); - case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); - // Numbered backreference - default: - // What does "$10" mean? - // - Backreference 10, if 10 or more capturing groups exist - // - Backreference 1 followed by "0", if 1-9 capturing groups exist - // - Otherwise, it's the string "$10" - // Also note: - // - Backreferences cannot be more than two digits (enforced by `replacementToken`) - // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" - // - There is no "$0" token ("$&" is the entire match) - var literalNumbers = ""; - $1 = +$1; // Type conversion; drop leading zero - if (!$1) // `$1` was "0" or "00" - return $0; - while ($1 > args.length - 3) { - literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; - $1 = Math.floor($1 / 10); // Drop the last digit - } - return ($1 ? args[$1] || "" : "$") + literalNumbers; - } - // Named backreference or delimited numbered backreference - } else { - // What does "${n}" mean? - // - Backreference to numbered capture n. Two differences from "$n": - // - n can be more than two digits - // - Backreference 0 is allowed, and is the entire match - // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture - // - Otherwise, it's the string "${n}" - var n = +$2; // Type conversion; drop leading zeros - if (n <= args.length - 3) - return args[n]; - n = captureNames ? indexOf(captureNames, $2) : -1; - return n > -1 ? args[n + 1] : $0; - } - }); - }); - } - - if (isRegex) { - if (search.global) - search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) - else - search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - } - - return result; - }; - - // A consistent cross-browser, ES3 compliant `split` - String.prototype.split = function (s /* separator */, limit) { - // If separator `s` is not a regex, use the native `split` - if (!XRegExp.isRegExp(s)) - return nativ.split.apply(this, arguments); - - var str = this + "", // Type conversion - output = [], - lastLastIndex = 0, - match, lastLength; - - // Behavior for `limit`: if it's... - // - `undefined`: No limit - // - `NaN` or zero: Return an empty array - // - A positive number: Use `Math.floor(limit)` - // - A negative number: No limit - // - Other: Type-convert, then use the above rules - if (limit === undefined || +limit < 0) { - limit = Infinity; - } else { - limit = Math.floor(+limit); - if (!limit) - return []; - } - - // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero - // and restore it to its original value when we're done using the regex - s = XRegExp.copyAsGlobal(s); - - while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (s.lastIndex > lastLastIndex) { - output.push(str.slice(lastLastIndex, match.index)); - - if (match.length > 1 && match.index < str.length) - Array.prototype.push.apply(output, match.slice(1)); - - lastLength = match[0].length; - lastLastIndex = s.lastIndex; - - if (output.length >= limit) - break; - } - - if (s.lastIndex === match.index) - s.lastIndex++; - } - - if (lastLastIndex === str.length) { - if (!nativ.test.call(s, "") || lastLength) - output.push(""); - } else { - output.push(str.slice(lastLastIndex)); - } - - return output.length > limit ? output.slice(0, limit) : output; - }; - - - //--------------------------------- - // Private helper functions - //--------------------------------- - - // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` - // instance with a fresh `lastIndex` (set to zero), preserving properties required for named - // capture. Also allows adding new flags in the process of copying the regex - function clone (regex, additionalFlags) { - if (!XRegExp.isRegExp(regex)) - throw TypeError("type RegExp expected"); - var x = regex._xregexp; - regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); - if (x) { - regex._xregexp = { - source: x.source, - captureNames: x.captureNames ? x.captureNames.slice(0) : null - }; - } - return regex; - } - - function getNativeFlags (regex) { - return (regex.global ? "g" : "") + - (regex.ignoreCase ? "i" : "") + - (regex.multiline ? "m" : "") + - (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 - (regex.sticky ? "y" : ""); - } - - function runTokens (pattern, index, scope, context) { - var i = tokens.length, - result, match, t; - // Protect against constructing XRegExps within token handler and trigger functions - isInsideConstructor = true; - // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws - try { - while (i--) { // Run in reverse order - t = tokens[i]; - if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { - t.pattern.lastIndex = index; - match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. - if (match && match.index === index) { - result = { - output: t.handler.call(context, match, scope), - match: match - }; - break; - } - } - } - } catch (err) { - throw err; - } finally { - isInsideConstructor = false; - } - return result; - } - - function indexOf (array, item, from) { - if (Array.prototype.indexOf) // Use the native array method if available - return array.indexOf(item, from); - for (var i = from || 0; i < array.length; i++) { - if (array[i] === item) - return i; - } - return -1; - } - - - //--------------------------------- - // Built-in tokens - //--------------------------------- - - // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the - // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` - - // Comment pattern: (?# ) - XRegExp.addToken( - /\(\?#[^)]*\)/, - function (match) { - // Keep tokens separated unless the following token is a quantifier - return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; - } - ); - - // Capturing group (match the opening parenthesis only). - // Required for support of named capturing groups - XRegExp.addToken( - /\((?!\?)/, - function () { - this.captureNames.push(null); - return "("; - } - ); - - // Named capturing group (match the opening delimiter only): (? - XRegExp.addToken( - /\(\?<([$\w]+)>/, - function (match) { - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return "("; - } - ); - - // Named backreference: \k - XRegExp.addToken( - /\\k<([\w$]+)>/, - function (match) { - var index = indexOf(this.captureNames, match[1]); - // Keep backreferences separate from subsequent literal numbers. Preserve back- - // references to named groups that are undefined at this point as literal strings - return index > -1 ? - "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : - match[0]; - } - ); - - // Empty character class: [] or [^] - XRegExp.addToken( - /\[\^?]/, - function (match) { - // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. - // (?!) should work like \b\B, but is unreliable in Firefox - return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; - } - ); - - // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) - // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. - XRegExp.addToken( - /^\(\?([imsx]+)\)/, - function (match) { - this.setFlag(match[1]); - return ""; - } - ); - - // Whitespace and comments, in free-spacing (aka extended) mode only - XRegExp.addToken( - /(?:\s+|#.*)+/, - function (match) { - // Keep tokens separated unless the following token is a quantifier - return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; - }, - XRegExp.OUTSIDE_CLASS, - function () {return this.hasFlag("x");} - ); - - // Dot, in dotall (aka singleline) mode only - XRegExp.addToken( - /\./, - function () {return "[\\s\\S]";}, - XRegExp.OUTSIDE_CLASS, - function () {return this.hasFlag("s");} - ); - - - //--------------------------------- - // Backward compatibility - //--------------------------------- - - // Uncomment the following block for compatibility with XRegExp 1.0-1.2: - /* - XRegExp.matchWithinChain = XRegExp.matchChain; - RegExp.prototype.addFlags = function (s) {return clone(this, s);}; - RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; - RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; - RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; - */ - -})(); - -// -// Begin anonymous function. This is used to contain local scope variables without polutting global scope. -// -if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { - -// CommonJS - if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') - { - XRegExp = require('XRegExp').XRegExp; - } - -// Shortcut object which will be assigned to the SyntaxHighlighter variable. -// This is a shorthand for local reference in order to avoid long namespace -// references to SyntaxHighlighter.whatever... - var sh = { - defaults : { - /** Additional CSS class names to be added to highlighter elements. */ - 'class-name' : '', - - /** First line number. */ - 'first-line' : 1, - - /** - * Pads line numbers. Possible values are: - * - * false - don't pad line numbers. - * true - automaticaly pad numbers with minimum required number of leading zeroes. - * [int] - length up to which pad line numbers. - */ - 'pad-line-numbers' : false, - - /** Lines to highlight. */ - 'highlight' : false, - - /** Title to be displayed above the code block. */ - 'title' : null, - - /** Enables or disables smart tabs. */ - 'smart-tabs' : true, - - /** Gets or sets tab size. */ - 'tab-size' : 4, - - /** Enables or disables gutter. */ - 'gutter' : true, - - /** Enables or disables toolbar. */ - 'toolbar' : true, - - /** Enables quick code copy and paste from double click. */ - 'quick-code' : true, - - /** Forces code view to be collapsed. */ - 'collapse' : false, - - /** Enables or disables automatic links. */ - 'auto-links' : false, - - /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ - 'light' : false, - - 'unindent' : true, - - 'html-script' : false - }, - - config : { - space : ' ', - - /** Enables use of - - - - - - - - -

    - -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html deleted file mode 100644 index 09ea336..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customPluginDemo.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - -

    UEditor自定义插件

    - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html deleted file mode 100644 index bcaab8f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customToolbarDemo.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - -

    UEditor自定义toolbar

    -
    -
    -
    - - - - - - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html deleted file mode 100644 index 84c1cc2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeDialogPage.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - -
    -

    测试页面

    -
    - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html deleted file mode 100644 index 5c67c19..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/customizeToolbarUIDemo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - 完整demo - - - - - - - - - - - - - - - - -
    -

    二次开发demo

    - -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js deleted file mode 100644 index fa951a0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/editor_api.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * 开发版本的文件导入 - */ -(function (){ - var paths = [ - 'editor.js', - 'core/browser.js', - 'core/utils.js', - 'core/EventBase.js', - 'core/dtd.js', - 'core/domUtils.js', - 'core/Range.js', - 'core/Selection.js', - 'core/Editor.js', - 'core/Editor.defaultoptions.js', - 'core/loadconfig.js', - 'core/ajax.js', - 'core/filterword.js', - 'core/node.js', - 'core/htmlparser.js', - 'core/filternode.js', - 'core/plugin.js', - 'core/keymap.js', - 'core/localstorage.js', - 'plugins/defaultfilter.js', - 'plugins/inserthtml.js', - 'plugins/autotypeset.js', - 'plugins/autosubmit.js', - 'plugins/background.js', - 'plugins/image.js', - 'plugins/justify.js', - 'plugins/font.js', - 'plugins/link.js', - 'plugins/iframe.js', - 'plugins/scrawl.js', - 'plugins/removeformat.js', - 'plugins/blockquote.js', - 'plugins/convertcase.js', - 'plugins/indent.js', - 'plugins/print.js', - 'plugins/preview.js', - 'plugins/selectall.js', - 'plugins/paragraph.js', - 'plugins/directionality.js', - 'plugins/horizontal.js', - 'plugins/time.js', - 'plugins/rowspacing.js', - 'plugins/lineheight.js', - 'plugins/insertcode.js', - 'plugins/cleardoc.js', - 'plugins/anchor.js', - 'plugins/wordcount.js', - 'plugins/pagebreak.js', - 'plugins/wordimage.js', - 'plugins/dragdrop.js', - 'plugins/undo.js', - 'plugins/copy.js', - 'plugins/paste.js', - 'plugins/puretxtpaste.js', - 'plugins/list.js', - 'plugins/source.js', - 'plugins/enterkey.js', - 'plugins/keystrokes.js', - 'plugins/fiximgclick.js', - 'plugins/autolink.js', - 'plugins/autoheight.js', - 'plugins/autofloat.js', - 'plugins/video.js', - 'plugins/table.core.js', - 'plugins/table.cmds.js', - 'plugins/table.action.js', - 'plugins/table.sort.js', - 'plugins/contextmenu.js', - 'plugins/shortcutmenu.js', - 'plugins/basestyle.js', - 'plugins/elementpath.js', - 'plugins/formatmatch.js', - 'plugins/searchreplace.js', - 'plugins/customstyle.js', - 'plugins/catchremoteimage.js', - 'plugins/snapscreen.js', - 'plugins/insertparagraph.js', - 'plugins/webapp.js', - 'plugins/template.js', - 'plugins/music.js', - 'plugins/autoupload.js', - 'plugins/autosave.js', - 'plugins/charts.js', - 'plugins/section.js', - 'plugins/simpleupload.js', - 'plugins/serverparam.js', - 'plugins/insertfile.js', - 'plugins/xssFilter.js', - 'ui/ui.js', - 'ui/uiutils.js', - 'ui/uibase.js', - 'ui/separator.js', - 'ui/mask.js', - 'ui/popup.js', - 'ui/colorpicker.js', - 'ui/tablepicker.js', - 'ui/stateful.js', - 'ui/button.js', - 'ui/splitbutton.js', - 'ui/colorbutton.js', - 'ui/tablebutton.js', - 'ui/autotypesetpicker.js', - 'ui/autotypesetbutton.js', - 'ui/cellalignpicker.js', - 'ui/pastepicker.js', - 'ui/toolbar.js', - 'ui/menu.js', - 'ui/combox.js', - 'ui/dialog.js', - 'ui/menubutton.js', - 'ui/multiMenu.js', - 'ui/shortcutmenu.js', - 'ui/breakline.js', - 'ui/message.js', - 'ui/iconfont.js', - 'adapter/editorui.js', - 'adapter/editor.js', - 'adapter/message.js', - 'adapter/autosave.js' - - ], - baseURL = '../_src/'; - for (var i=0,pi;pi = paths[i++];) { - document.write(''); - } -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html deleted file mode 100644 index e0ce5d4..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/filterRuleDemo.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - 过滤规则定制化 - - - - - - -

    尝试粘贴内容近来,这里边不能粘贴任何inline的样式,不能有iframe,style,script,embed等标签,表格不能嵌套

    -
    - -
    - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html deleted file mode 100644 index 91391f3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/highlightDemo.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - -

    代码高亮演示

    -

    获得编辑器实例

    -
    -
    -        UE.getEditor('myEditor');
    -    
    -
    - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html deleted file mode 100644 index a5a4347..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - -

    UEditor各种实例演示

    -

    基础示例

    -
      -
    • - 简单示例
      - 使用基础的按钮实现简单的功能 -
    • -
    -

    应用展示

    -
      -
    • - 表单应用
      - 编辑器的内容通过表单提交到后台 -
    • -
    • - 重置编辑器
      - 将编辑器的内部变量清空,重置。 -
    • -
    • - 文本域渲染编辑器
      - 将编辑器渲染到文本域,并且将文本域的内容放到编辑器的初始化内容里 -
    • -
    -

    二次开发

    - -

    高级案例

    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html deleted file mode 100644 index 3997ff5..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryCompleteDemo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - 使用jquery的完整demo - - - - - - - -
    - - -
    - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html deleted file mode 100644 index b944a69..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/jqueryValidation.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - Ueditor在jquery validation下的验证 - - - - - - - - - - - -
    -

    Ueditor在jquery validation下的验证

    - - - - -
    - - - - -
    - -
    - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html deleted file mode 100644 index 2702881..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiDemo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - -

    UEditor多实例

    - - - - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html deleted file mode 100644 index ba612cc..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/multiEditorWithOneInstance.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - -

    UEditor多编辑区域一个编辑器实例

    - - - - - - - - - - - - - -
    - 编辑区域一 -
    - 编辑区域二 - 内容2
    - 编辑区域三 - 内容3
    - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html deleted file mode 100644 index 628656a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/renderInTable.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - 表格内实例化编辑器实例 - - - -
    -
    - - - - - - - -
    表格标题
    标题内容
    中国
    -
    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html deleted file mode 100644 index 9b63d2a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/resetDemo.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 重置编辑器 - - - - - -

    重置编辑器和销毁编辑器示例

    -
    -

    -

    - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html deleted file mode 100644 index 2b0143b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sectiondemo.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - 目录大纲demo - - - - - - - - -
    -

    目录大纲demo

    -
    -
    -
    目录:
    -
    -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx deleted file mode 100644 index 877cf8e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.ashx +++ /dev/null @@ -1,44 +0,0 @@ -<%@ WebHandler Language="C#" Class="getContent" %> -/** - * Created by visual studio 2010 - * User: xuheng - * Date: 12-3-6 - * Time: 下午21:23 - * To get the value of editor and output the value . - */ -using System; -using System.Web; - -public class getContent : IHttpHandler { - - public void ProcessRequest (HttpContext context) { - context.Response.ContentType = "text/html"; - - //获取数据 - string content = context.Server.HtmlEncode(context.Request.Form["myEditor"]); - - - //存入数据库或者其他操作 - //------------- - - //显示 - context.Response.Write(""); - context.Response.Write( - - ""); - - context.Response.Write("Content of First Editor: "); - context.Response.Write("
    " + context.Server.HtmlDecode(content) + "
    "); - - } - - public bool IsReusable { - get { - return false; - } - } - -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp deleted file mode 100644 index 416455f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.asp +++ /dev/null @@ -1,15 +0,0 @@ -<% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %> - - - -<% - Dim content - content = Request.Form("myEditor") - Response.Write("第1个编辑器的值") - Response.Write("
    " + content + "
    ") -%> \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp deleted file mode 100644 index 1ea4508..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/server/getContent.jsp +++ /dev/null @@ -1,19 +0,0 @@ - <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> - - - -<% -request.setCharacterEncoding("utf-8"); -response.setCharacterEncoding("utf-8"); -String content = request.getParameter("myEditor"); - - - -response.getWriter().print("第1个编辑器的值"); -response.getWriter().print("
    "+content+"
    "); - -%> \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html deleted file mode 100644 index 3ccac79..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/setWidthHeightDemo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - -

    UEditor设置宽高demo

    -

    这里的宽高都只是编辑区域的宽高,不包括工具栏的高度和状态栏的高度

    -

    容器给定编辑器的宽高

    - - - -
    -

    初始化时给定编辑器的宽高

    - - -

    没有工具栏的编辑器

    -
    - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html deleted file mode 100644 index 42ed0f9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/simpleDemo.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - -

    UEditor简单功能

    - - - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html deleted file mode 100644 index 8c22396..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/sortableDemo.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - -

    表格排序演示

    -

    -

    - 默认排序方法有五种:
    - reversecurrent : 逆序当前
    - orderbyasc : 按ASCII字符升序
    - reversebyasc : 按ASCII字符降序
    - orderbynum : 按数值大小升序
    - reversebynum : 按数值大小降序 -

    -

    - 表格data-sort-type属性值为reversebynum,按照数值大小降序排序,点击第一行的单元格进行排序。 -

    -
    - - - - - - - - -
    343 352 323 234 379 782
    341 163 422 234 725 833
    221 456 335 423 445 793
    112 277 563 423 932 425
    587 175 159 734 582 458
    -
    - -

    -
    -

    -

    - 自定义排序,按照个位数排序,点击第一行的单元格进行排序。 -

    -
    - - - - - - - - -
    343 352 323 234 379 782
    341 163 422 234 725 833
    221 456 335 423 445 793
    112 277 563 423 932 425
    587 175 159 734 582 458
    -
    - - - - - - \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html deleted file mode 100644 index d1006f7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/submitFormDemo.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - -

    UEditor提交示例

    -
    - - -
    -

    - 从1.2.6开始,会自动同步数据无需再手动调用sync方法 - - -

    - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html deleted file mode 100644 index 04b7073..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/textareaDemo.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - -

    文本域渲染编辑器

    - - - -
    - - - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html deleted file mode 100644 index dc5987f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/uparsedemo.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - -

    解析编辑的内容

    -
    -
    1. 这里可以书写,编辑器的初始内容

    • sdfas

      1. dfas

    1. dfa

      1. sdfadf

    -

    - 这里可以书写,编辑器的初始内容 -

    -

    - -

    -
    -               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;
    -        },
    -        
    -
      -
    1. -

      - dfasdf -

      -
    2. -
    3. -

      - asd -

      -
    4. -
    5. -

      - fa -

      -
    6. -
    7. -

      - sdfa -

      -
    8. -
    9. -

      - sdfa -

      -
    10. -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - sdf
    -
    - sdf
    -
    - sdf
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - UEditor -

    -

    - 简介 -

    -

    - UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议,所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出,可以帮助不少网站开者在开发富文本编辑器所遇到的难题,节约开发者因开发富文本编辑器所需要的大量时间,有效降低了企业的开发成本。 -

    -

    - 特点
    -

    -

    - 1、核心层提供了编辑器底层的一些方法和概念,如DOM树操作、Selection、Range等。 -

    -

    - 2、在核心层之上覆盖的是命令插件层。之所以叫命令插件层,是因为UEditor中所有的功能型实现都是通过这一层中的命令和插件来完成的,并且各个命令和插件之间基本互不耦合——使用者需要使用哪个功能就导入哪个功能对应的命令或者插件文件,完全不用考虑另外那些杂七杂八的JS文件(极少数插件除外,关于这些插件下文会整理出一个依赖列表来供同学们参考)。 -

    -

    - 理论上来讲,所有的命令都是可以用插件来代替的,但是依然将两者分开的主要原因是命令都是一些静态的方法,无需随editor实例初始化,从而优化了编辑器的性能。而插件随编辑器的初始化而初始化,性能上会有少许的影响,但相比命令而言,插件能够完成更加复杂的功能。其中最主要的一个特点是在插件内部既可以为编辑器注册命令,也可以为编辑器绑定监听事件。这个特点使得为编辑器添加任何功能都可以在插件中独立完成。 -

    -

    - 3、在命令插件层之上则是UI层。UEditor的UI设计与核心层和命令插件层几乎完全解耦,简单的几个配置就可以为编辑器在界面上添加额外的UI元素和功能,具体的配置下面将会深入阐述。 -

    -

    -
    -

    -

    -
    -

    -
    - - - - - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js deleted file mode 100644 index 246bb0e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/background.js +++ /dev/null @@ -1,21 +0,0 @@ -UE.parse.register("background", function(utils) { - var me = this, - root = me.root, - p = root.getElementsByTagName("p"), - styles; - - for (var i = 0, ci; (ci = p[i++]); ) { - styles = ci.getAttribute("data-background"); - if (styles) { - ci.parentNode.removeChild(ci); - } - } - - //追加默认的表格样式 - styles && - utils.cssRule( - "ueditor_background", - me.selector + "{" + styles + "}", - document - ); -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js deleted file mode 100644 index 5dbf41a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/charts.js +++ /dev/null @@ -1,288 +0,0 @@ -UE.parse.register("charts", function(utils) { - utils.cssRule( - "chartsContainerHeight", - ".edui-chart-container { height:" + - (this.chartContainerHeight || 300) + - "px}" - ); - var resourceRoot = this.rootPath, - containers = this.root, - sources = null; - - //不存在指定的根路径, 则直接退出 - if (!resourceRoot) { - return; - } - - if ((sources = parseSources())) { - loadResources(); - } - - function parseSources() { - if (!containers) { - return null; - } - - return extractChartData(containers); - } - - /** - * 提取数据 - */ - function extractChartData(rootNode) { - var data = [], - tables = rootNode.getElementsByTagName("table"); - - for (var i = 0, tableNode; (tableNode = tables[i]); i++) { - if (tableNode.getAttribute("data-chart") !== null) { - data.push(formatData(tableNode)); - } - } - - return data.length ? data : null; - } - - function formatData(tableNode) { - var meta = tableNode.getAttribute("data-chart"), - metaConfig = {}, - data = []; - - //提取table数据 - for (var i = 0, row; (row = tableNode.rows[i]); i++) { - var rowData = []; - - for (var j = 0, cell; (cell = row.cells[j]); j++) { - var value = cell.innerText || cell.textContent || ""; - rowData.push(cell.tagName == "TH" ? value : value | 0); - } - - data.push(rowData); - } - - //解析元信息 - meta = meta.split(";"); - for (var i = 0, metaData; (metaData = meta[i]); i++) { - metaData = metaData.split(":"); - metaConfig[metaData[0]] = metaData[1]; - } - - return { - table: tableNode, - meta: metaConfig, - data: data - }; - } - - //加载资源 - function loadResources() { - loadJQuery(); - } - - function loadJQuery() { - //不存在jquery, 则加载jquery - if (!window.jQuery) { - utils.loadFile( - document, - { - src: resourceRoot + "/third-party/jquery-1.10.2.min.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - loadHighcharts(); - } - ); - } else { - loadHighcharts(); - } - } - - function loadHighcharts() { - //不存在Highcharts, 则加载Highcharts - if (!window.Highcharts) { - utils.loadFile( - document, - { - src: resourceRoot + "/third-party/highcharts/highcharts.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - loadTypeConfig(); - } - ); - } else { - loadTypeConfig(); - } - } - - //加载图表差异化配置文件 - function loadTypeConfig() { - utils.loadFile( - document, - { - src: resourceRoot + "/dialogs/charts/chart.config.js", - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - render(); - } - ); - } - - //渲染图表 - function render() { - var config = null, - chartConfig = null, - container = null; - - for (var i = 0, len = sources.length; i < len; i++) { - config = sources[i]; - - chartConfig = analysisConfig(config); - - container = createContainer(config.table); - - renderChart(container, typeConfig[config.meta.chartType], chartConfig); - } - } - - /** - * 渲染图表 - * @param container 图表容器节点对象 - * @param typeConfig 图表类型配置 - * @param config 图表通用配置 - * */ - function renderChart(container, typeConfig, config) { - $(container).highcharts( - $.extend({}, typeConfig, { - credits: { - enabled: false - }, - exporting: { - enabled: false - }, - title: { - text: config.title, - x: -20 //center - }, - subtitle: { - text: config.subTitle, - x: -20 - }, - xAxis: { - title: { - text: config.xTitle - }, - categories: config.categories - }, - yAxis: { - title: { - text: config.yTitle - }, - plotLines: [ - { - value: 0, - width: 1, - color: "#808080" - } - ] - }, - tooltip: { - enabled: true, - valueSuffix: config.suffix - }, - legend: { - layout: "vertical", - align: "right", - verticalAlign: "middle", - borderWidth: 1 - }, - series: config.series - }) - ); - } - - /** - * 创建图表的容器 - * 新创建的容器会替换掉对应的table对象 - * */ - function createContainer(tableNode) { - var container = document.createElement("div"); - container.className = "edui-chart-container"; - - tableNode.parentNode.replaceChild(container, tableNode); - - return container; - } - - //根据config解析出正确的类别和图表数据信息 - function analysisConfig(config) { - var series = [], - //数据类别 - categories = [], - result = [], - data = config.data, - meta = config.meta; - - //数据对齐方式为相反的方式, 需要反转数据 - if (meta.dataFormat != "1") { - for (var i = 0, len = data.length; i < len; i++) { - for (var j = 0, jlen = data[i].length; j < jlen; j++) { - if (!result[j]) { - result[j] = []; - } - - result[j][i] = data[i][j]; - } - } - - data = result; - } - - result = {}; - - //普通图表 - if (meta.chartType != typeConfig.length - 1) { - categories = data[0].slice(1); - - for (var i = 1, curData; (curData = data[i]); i++) { - series.push({ - name: curData[0], - data: curData.slice(1) - }); - } - - result.series = series; - result.categories = categories; - result.title = meta.title; - result.subTitle = meta.subTitle; - result.xTitle = meta.xTitle; - result.yTitle = meta.yTitle; - result.suffix = meta.suffix; - } else { - var curData = []; - - for (var i = 1, len = data[0].length; i < len; i++) { - curData.push([data[0][i], data[1][i] | 0]); - } - - //饼图 - series[0] = { - type: "pie", - name: meta.tip, - data: curData - }; - - result.series = series; - result.title = meta.title; - result.suffix = meta.suffix; - } - - return result; - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js deleted file mode 100644 index cda95a3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/insertcode.js +++ /dev/null @@ -1,49 +0,0 @@ -UE.parse.register("insertcode", function(utils) { - var pres = this.root.getElementsByTagName("pre"); - if (pres.length) { - if (typeof XRegExp == "undefined") { - var jsurl, cssurl; - if (this.rootPath !== undefined) { - jsurl = - utils.removeLastbs(this.rootPath) + - "/third-party/SyntaxHighlighter/shCore.js"; - cssurl = - utils.removeLastbs(this.rootPath) + - "/third-party/SyntaxHighlighter/shCoreDefault.css"; - } else { - jsurl = this.highlightJsUrl; - cssurl = this.highlightCssUrl; - } - utils.loadFile(document, { - id: "syntaxhighlighter_css", - tag: "link", - rel: "stylesheet", - type: "text/css", - href: cssurl - }); - utils.loadFile( - document, - { - id: "syntaxhighlighter_js", - src: jsurl, - tag: "script", - type: "text/javascript", - defer: "defer" - }, - function() { - utils.each(pres, function(pi) { - if (pi && /brush/i.test(pi.className)) { - SyntaxHighlighter.highlight(pi); - } - }); - } - ); - } else { - utils.each(pres, function(pi) { - if (pi && /brush/i.test(pi.className)) { - SyntaxHighlighter.highlight(pi); - } - }); - } - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js deleted file mode 100644 index 2bab684..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/list.js +++ /dev/null @@ -1,235 +0,0 @@ -UE.parse.register("list", function(utils) { - var customCss = [], - customStyle = { - cn: "cn-1-", - cn1: "cn-2-", - cn2: "cn-3-", - num: "num-1-", - num1: "num-2-", - num2: "num-3-", - dash: "dash", - dot: "dot" - }; - - utils.extend(this, { - liiconpath : utils.removeLastbs(this.rootPath) + '/themes/ueditor-list/', - listDefaultPaddingLeft: "20" - },true); - - var root = this.root, - ols = root.getElementsByTagName("ol"), - uls = root.getElementsByTagName("ul"), - selector = this.selector; - - if (ols.length) { - applyStyle.call(this, ols); - } - - if (uls.length) { - applyStyle.call(this, uls); - } - - if (ols.length || uls.length) { - customCss.push(selector + " .list-paddingleft-1{padding-left:0}"); - customCss.push( - selector + - " .list-paddingleft-2{padding-left:" + - this.listDefaultPaddingLeft + - "px}" - ); - customCss.push( - selector + - " .list-paddingleft-3{padding-left:" + - this.listDefaultPaddingLeft * 2 + - "px}" - ); - - utils.cssRule( - "list", - selector + - " ol," + - selector + - " ul{margin:0;padding:0;}\n" + - selector + - " li{clear:both;}\n" + - customCss.join("\n"), - document - ); - } - function applyStyle(nodes) { - var T = this; - utils.each(nodes, function(list) { - if (list.className && /custom_/i.test(list.className)) { - var listStyle = list.className.match(/custom_(\w+)/)[1]; - if (listStyle == "dash" || listStyle == "dot") { - utils.pushItem( - customCss, - selector + - " li.list-" + - customStyle[listStyle] + - "{background-image:url(" + - T.liiconpath + - customStyle[listStyle] + - ".gif)}" - ); - utils.pushItem( - customCss, - selector + - " ul.custom_" + - listStyle + - "{list-style:none;} " + - selector + - " ul.custom_" + - listStyle + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } else { - var index = 1; - utils.each(list.childNodes, function(li) { - if (li.tagName == "LI") { - utils.pushItem( - customCss, - selector + - " li.list-" + - customStyle[listStyle] + - index + - "{background-image:url(" + - T.liiconpath + - "list-" + - customStyle[listStyle] + - index + - ".gif)}" - ); - index++; - } - }); - utils.pushItem( - customCss, - selector + - " ol.custom_" + - listStyle + - "{list-style:none;}" + - selector + - " ol.custom_" + - listStyle + - " li{background-position:0 3px;background-repeat:no-repeat}" - ); - } - switch (listStyle) { - case "cn": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:25px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:55px}" - ); - break; - case "cn1": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:30px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:55px}" - ); - break; - case "cn2": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:40px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:55px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-3{padding-left:68px}" - ); - break; - case "num": - case "num1": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:25px}" - ); - break; - case "num2": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-1{padding-left:35px}" - ); - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft-2{padding-left:40px}" - ); - break; - case "dash": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft{padding-left:35px}" - ); - break; - case "dot": - utils.pushItem( - customCss, - selector + - " li.list-" + - listStyle + - "-paddingleft{padding-left:20px}" - ); - } - } - }); - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js deleted file mode 100644 index 4c377e6..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/parse.js +++ /dev/null @@ -1,365 +0,0 @@ -(function() { - UE = window.UE || {}; - var isIE = !!window.ActiveXObject; - //定义utils工具 - var utils = { - removeLastbs: function(url) { - return url.replace(/\/$/, ""); - }, - extend: function(t, s) { - var a = arguments, - notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, - len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; - for (var i = 1; i < len; i++) { - var x = a[i]; - for (var k in x) { - if (!notCover || !t.hasOwnProperty(k)) { - t[k] = x[k]; - } - } - } - return t; - }, - isIE: isIE, - cssRule: isIE - ? function(key, style, doc) { - var indexList, index; - doc = doc || document; - if (doc.indexList) { - indexList = doc.indexList; - } else { - indexList = doc.indexList = {}; - } - var sheetStyle; - if (!indexList[key]) { - if (style === undefined) { - return ""; - } - sheetStyle = doc.createStyleSheet( - "", - (index = doc.styleSheets.length) - ); - indexList[key] = index; - } else { - sheetStyle = doc.styleSheets[indexList[key]]; - } - if (style === undefined) { - return sheetStyle.cssText; - } - sheetStyle.cssText = sheetStyle.cssText + "\n" + (style || ""); - } - : function(key, style, doc) { - doc = doc || document; - var head = doc.getElementsByTagName("head")[0], - node; - if (!(node = doc.getElementById(key))) { - if (style === undefined) { - return ""; - } - node = doc.createElement("style"); - node.id = key; - head.appendChild(node); - } - if (style === undefined) { - return node.innerHTML; - } - if (style !== "") { - node.innerHTML = node.innerHTML + "\n" + style; - } else { - head.removeChild(node); - } - }, - domReady: function(onready) { - var doc = window.document; - if (doc.readyState === "complete") { - onready(); - } else { - if (isIE) { - (function() { - if (doc.isReady) return; - try { - doc.documentElement.doScroll("left"); - } catch (error) { - setTimeout(arguments.callee, 0); - return; - } - onready(); - })(); - window.attachEvent("onload", function() { - onready(); - }); - } else { - doc.addEventListener( - "DOMContentLoaded", - function() { - doc.removeEventListener( - "DOMContentLoaded", - arguments.callee, - false - ); - onready(); - }, - false - ); - window.addEventListener( - "load", - function() { - onready(); - }, - 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; - } - } - } - }, - inArray: function(arr, item) { - var index = -1; - this.each(arr, function(v, i) { - if (v === item) { - index = i; - return false; - } - }); - return index; - }, - pushItem: function(arr, item) { - if (this.inArray(arr, item) == -1) { - arr.push(item); - } - }, - trim: function(str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); - }, - 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; - }, - hasClass: function(element, className) { - className = className - .replace(/(^[ ]+)|([ ]+$)/g, "") - .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; - }, - addClass: function(elm, classNames) { - if (!elm) return; - classNames = this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); - for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) { - if (!new RegExp("\\b" + ci + "\\b").test(cls)) { - cls += " " + ci; - } - } - elm.className = utils.trim(cls); - }, - removeClass: function(elm, classNames) { - classNames = this.isArray(classNames) - ? classNames - : this.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 = this.trim(cls).replace(/[ ]{2,}/g, " "); - elm.className = cls; - !cls && elm.removeAttribute("className"); - }, - on: function(element, type, handler) { - var types = this.isArray(type) ? type : 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; - }, - off: function(element, type, handler) { - var types = this.isArray(type) ? type : 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]; - } - } - } - }, - 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(); - } - } - element.onload = element.onreadystatechange = null; - } - }; - element.onerror = function() { - throw Error( - "The load " + (obj.href || obj.src) + " fails,check the url" - ); - }; - doc.getElementsByTagName("head")[0].appendChild(element); - }; - })() - }; - utils.each( - ["String", "Function", "Array", "Number", "RegExp", "Object", "Boolean"], - function(v) { - utils["is" + v] = function(obj) { - return Object.prototype.toString.apply(obj) == "[object " + v + "]"; - }; - } - ); - var parselist = {}; - UE.parse = { - register: function(parseName, fn) { - parselist[parseName] = fn; - }, - load: function(opt) { - utils.each(parselist, function(v) { - v.call(opt, utils); - }); - } - }; - uParse = function(selector, opt) { - utils.domReady(function() { - var contents; - if (document.querySelectorAll) { - contents = document.querySelectorAll(selector); - } else { - if (/^#/.test(selector)) { - contents = [document.getElementById(selector.replace(/^#/, ""))]; - } else if (/^\./.test(selector)) { - var contents = []; - utils.each(document.getElementsByTagName("*"), function(node) { - if ( - node.className && - new RegExp("\\b" + selector.replace(/^\./, "") + "\\b", "i").test( - node.className - ) - ) { - contents.push(node); - } - }); - } else { - contents = document.getElementsByTagName(selector); - } - } - utils.each(contents, function(v) { - UE.parse.load(utils.extend({ root: v, selector: selector }, opt)); - }); - }); - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js deleted file mode 100644 index fc3333c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/table.js +++ /dev/null @@ -1,217 +0,0 @@ -UE.parse.register("table", function(utils) { - var me = this, - root = this.root, - tables = root.getElementsByTagName("table"); - if (tables.length) { - var selector = this.selector; - //追加默认的表格样式 - utils.cssRule( - "table", - selector + - " table.noBorderTable td," + - selector + - " table.noBorderTable th," + - selector + - " table.noBorderTable caption{border:1px dashed #ddd !important}" + - selector + - " table.sortEnabled tr.firstRow th," + - selector + - " table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;" + - "background-position: center right; background-image:url(" + - this.rootPath + - "themes/default/images/sortable.png);}" + - selector + - " table.sortEnabled tr.firstRow th:hover," + - selector + - " table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}" + - selector + - " table{margin-bottom:10px;border-collapse:collapse;display:table;}" + - selector + - " td," + - selector + - " th{padding: 5px 10px;border: 1px solid #DDD;}" + - selector + - " caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + - selector + - " th{border-top:1px solid #BBB;background:#F7F7F7;}" + - selector + - " table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}" + - selector + - " tr.ue-table-interlace-color-single td{ background: #fcfcfc; }" + - selector + - " tr.ue-table-interlace-color-double td{ background: #f7faff; }" + - selector + - " td p{margin:0;padding:0;width:auto;height:auto;}", - document - ); - //填充空的单元格 - - utils.each("td th caption".split(" "), function(tag) { - var cells = root.getElementsByTagName(tag); - cells.length && - utils.each(cells, function(node) { - if (!node.firstChild) { - node.innerHTML = " "; - } - }); - }); - - //表格可排序 - var tables = root.getElementsByTagName("table"); - utils.each(tables, function(table) { - if (/\bsortEnabled\b/.test(table.className)) { - utils.on(table, "click", function(e) { - var target = e.target || e.srcElement, - cell = findParentByTagName(target, ["td", "th"]); - var table = findParentByTagName(target, "table"), - colIndex = utils.indexOf(table.rows[0].cells, cell), - sortType = table.getAttribute("data-sort-type"); - if (colIndex != -1) { - sortTable(table, colIndex, me.tableSortCompareFn || sortType); - updateTable(table); - } - }); - } - }); - - //按照标签名查找父节点 - function findParentByTagName(target, tagNames) { - var i, - current = target; - tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; - while (current) { - for (i = 0; i < tagNames.length; i++) { - if (current.tagName == tagNames[i].toUpperCase()) return current; - } - current = current.parentNode; - } - return null; - } - //表格排序 - function sortTable(table, sortByCellIndex, compareFn) { - var rows = table.rows, - trArray = [], - flag = rows[0].cells[0].tagName === "TH", - lastRowIndex = 0; - - for (var i = 0, len = rows.length; i < len; i++) { - trArray[i] = rows[i]; - } - - var Fn = { - reversecurrent: function(td1, td2) { - return 1; - }, - orderbyasc: function(td1, td2) { - var value1 = td1.innerText || td1.textContent, - value2 = td2.innerText || td2.textContent; - return value1.localeCompare(value2); - }, - reversebyasc: function(td1, td2) { - var value1 = td1.innerHTML, - value2 = td2.innerHTML; - return value2.localeCompare(value1); - }, - orderbynum: function(td1, td2) { - var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( - /\d+/ - ), - value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value1 || 0) - (value2 || 0); - }, - reversebynum: function(td1, td2) { - var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( - /\d+/ - ), - value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value2 || 0) - (value1 || 0); - } - }; - - //对表格设置排序的标记data-sort-type - table.setAttribute( - "data-sort-type", - compareFn && typeof compareFn === "string" && Fn[compareFn] - ? compareFn - : "" - ); - - //th不参与排序 - flag && trArray.splice(0, 1); - trArray = sort(trArray, function(tr1, tr2) { - var result; - if (compareFn && typeof compareFn === "function") { - result = compareFn.call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else if (compareFn && typeof compareFn === "number") { - result = 1; - } else if ( - compareFn && - typeof compareFn === "string" && - Fn[compareFn] - ) { - result = Fn[compareFn].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else { - result = Fn["orderbyasc"].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } - return result; - }); - var fragment = table.ownerDocument.createDocumentFragment(); - for (var j = 0, len = trArray.length; j < len; j++) { - fragment.appendChild(trArray[j]); - } - var tbody = table.getElementsByTagName("tbody")[0]; - if (!lastRowIndex) { - tbody.appendChild(fragment); - } else { - tbody.insertBefore( - fragment, - rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] - ); - } - } - //冒泡排序 - function sort(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; - } - //更新表格 - function updateTable(table) { - //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 - if (!utils.hasClass(table.rows[0], "firstRow")) { - for (var i = 1; i < table.rows.length; i++) { - utils.removeClass(table.rows[i], "firstRow"); - } - utils.addClass(table.rows[0], "firstRow"); - } - } - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js deleted file mode 100644 index b494253..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_parse/video.js +++ /dev/null @@ -1,38 +0,0 @@ -UE.parse.register("vedio", function(utils) { - var video = this.root.getElementsByTagName("video"), - audio = this.root.getElementsByTagName("audio"); - - document.createElement("video"); - document.createElement("audio"); - if (video.length || audio.length) { - var sourcePath = utils.removeLastbs(this.rootPath), - jsurl = sourcePath + "/third-party/video-js/video.js", - cssurl = sourcePath + "/third-party/video-js/video-js.min.css", - swfUrl = sourcePath + "/third-party/video-js/video-js.swf"; - - if (window.videojs) { - videojs.autoSetup(); - } else { - utils.loadFile(document, { - id: "video_css", - tag: "link", - rel: "stylesheet", - type: "text/css", - href: cssurl - }); - utils.loadFile( - document, - { - id: "video_js", - src: jsurl, - tag: "script", - type: "text/javascript" - }, - function() { - videojs.options.flash.swf = swfUrl; - videojs.autoSetup(); - } - ); - } - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js deleted file mode 100644 index 722feb8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/autosave.js +++ /dev/null @@ -1,17 +0,0 @@ -UE.registerUI("autosave", function(editor) { - var timer = null, - uid = null; - editor.on("afterautosave", function() { - clearTimeout(timer); - - timer = setTimeout(function() { - if (uid) { - editor.trigger("hidemessage", uid); - } - uid = editor.trigger("showmessage", { - content: editor.getLang("autosave.success"), - timeout: 2000 - }); - }, 2000); - }); -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js deleted file mode 100644 index 870f653..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editor.js +++ /dev/null @@ -1,998 +0,0 @@ -///import core -///commands 全屏 -///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 = []; - - 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; - - 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 - ); - - //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("property") + - ': ' + - 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.className.indexOf("edui-faked-webapp") != -1) { - dialogName = "webappDialog"; - } - if (img.src.indexOf("https://api.map.baidu.com") != -1) { - dialogName = "mapDialog"; - } - if (img.className.indexOf("edui-faked-music") != -1) { - dialogName = "musicDialog"; - } - if ( - img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1 - ) { - dialogName = "gmapDialog"; - } - if (img.getAttribute("anchorname")) { - dialogName = "anchorDialog"; - html = popup.formatHtml( - "" + - editor.getLang("property") + - ': ' + - editor.getLang("modify") + - "  " + - "" + - editor.getLang("delete") + - "" - ); - } - if (img.getAttribute("word_img")) { - //todo 放到dialog去做查询 - editor.word_img = [img.getAttribute("word_img")]; - dialogName = "wordimageDialog"; - } - if ( - domUtils.hasClass(img, "loadingclass") || - domUtils.hasClass(img, "loaderrorclass") - ) { - dialogName = ""; - } - if (!dialogs[dialogName]) { - return; - } - str = - "" + - editor.getLang("property") + - ": " + - '' + - editor.getLang("default") + - "  " + - '' + - editor.getLang("justifyleft") + - "  " + - '' + - editor.getLang("justifyright") + - "  " + - '' + - editor.getLang("justifycenter") + - "  " + - "' + - editor.getLang("modify") + - ""; - - !html && (html = popup.formatHtml(str)); - } - 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("anthorMsg") + - ': ' + - 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; - } - 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 - '
    ' + - '' + - '' + - '' + - "
    " + - '
    ' + - "
    " - ); - }, - 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" - ); - 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/neditor.css", - 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); - } - 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 - }; - }); - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js deleted file mode 100644 index 7aa892c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/editorui.js +++ /dev/null @@ -1,1002 +0,0 @@ -//ui跟编辑器的适配層 -//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 -//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据neditor.config中的toolbars找到相应的进行实例化 -;(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", - insertimage: "~/dialogs/image/image.html", - link: "~/dialogs/link/link.html", - spechars: "~/dialogs/spechars/spechars.html", - searchreplace: "~/dialogs/searchreplace/searchreplace.html", - map: "~/dialogs/map/map.html", - gmap: "~/dialogs/gmap/gmap.html", - insertvideo: "~/dialogs/video/video.html", - help: "~/dialogs/help/help.html", - preview: "~/dialogs/preview/preview.html", - emotion: "~/dialogs/emotion/emotion.html", - wordimage: "~/dialogs/wordimage/wordimage.html", - attachment: "~/dialogs/attachment/attachment.html", - insertframe: "~/dialogs/insertframe/insertframe.html", - edittip: "~/dialogs/table/edittip.html", - edittable: "~/dialogs/table/edittable.html", - edittd: "~/dialogs/table/edittd.html", - webapp: "~/dialogs/webapp/webapp.html", - snapscreen: "~/dialogs/snapscreen/snapscreen.html", - scrawl: "~/dialogs/scrawl/scrawl.html", - music: "~/dialogs/music/music.html", - template: "~/dialogs/template/template.html", - background: "~/dialogs/background/background.html", - charts: "~/dialogs/charts/charts.html" - }; - //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 - 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", - "drafts" - ]; - - 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); - if (state == -1) { - ui.setDisabled(true); - ui.setChecked(false); - } else { - if (!uiReady) { - ui.setDisabled(false); - ui.setChecked(state); - } - } - }); - return ui; - }; - })(ci); - } - - //清除文档 - 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 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", "webapp", "preview"], - ok: [ - "attachment", - "anchor", - "link", - "insertimage", - "map", - "gmap", - "insertframe", - "wordimage", - "insertvideo", - "insertframe", - "edittip", - "edittable", - "edittd", - "scrawl", - "template", - "music", - "background", - "charts" - ] - }; - - 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, - className: "edui-for-" + cmd, - title: title, - holdScroll: cmd === "insertimage", - fullscreen: /charts|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 (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) || - cmd == "charts" - }); - 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.snapscreen = function(editor, iframeUrl, title) { - title = - editor.options.labelMap["snapscreen"] || - editor.getLang("labelMap.snapscreen") || - ""; - var ui = new editorui.Button({ - className: "edui-for-snapscreen", - title: title, - onclick: function() { - editor.execCommand("snapscreen"); - }, - theme: editor.options.theme - }); - editorui.buttons["snapscreen"] = ui; - iframeUrl = - iframeUrl || - (editor.options.iframeUrlMap || {})["snapscreen"] || - iframeUrlMap["snapscreen"]; - if (iframeUrl) { - var dialog = new editorui.Dialog({ - iframeUrl: editor.ui.mapUrl(iframeUrl), - editor: editor, - className: "edui-for-snapscreen", - title: title, - 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); - } - } - ] - }); - dialog.render(); - editor.ui._dialogs["snapscreenDialog"] = dialog; - } - editor.addListener("selectionchange", function() { - ui.setDisabled(editor.queryCommandState("snapscreen") == -1); - }); - return ui; - }; - - 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); - } - }); - } - 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: 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.iframeUrlMap || {})[cmd] || - iframeUrlMap[cmd] - ) - }); - editorui.buttons[cmd] = 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["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; - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js deleted file mode 100644 index d9b14b0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/adapter/message.js +++ /dev/null @@ -1,67 +0,0 @@ -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"; - } - holder.style.zIndex = - Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js deleted file mode 100644 index 0c78d47..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/api.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * 该文件定义了API文档所使用到的本地函数的说明 - * @file - * @module Native - */ - -/** - * 辅助接口说明 - * @module Native - * @unfile - */ - -/** - * 原生String对象, 字符串 - * @class String - */ - -/** - * 原生Function对象, 函数 - * @class Function - */ - -/** - * 原生Object对象, 普通对象 - * @remind 如果某一方法的参数类型为Object时, 表示该参数应该接受一个key-value集合 - * @class Object - */ - -/** - * 原生Boolean对象, 布尔值 - * @class Boolean - */ - -/** - * 原生Number对象, 数值 - * @class Number - */ - -/** - * 原生NULL对象, 空 - * @class NULL - */ - -/** - * 原生Array对象, 数组 - * @class Array - */ - -/** - * 浏览器Node, dom节点 - * @class Node - */ - -/** - * 浏览器Element, dom元素 - * @class Element - */ - -/** - * UEditor模拟dom节点对象 - * @class uNode - */ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js deleted file mode 100644 index de209de..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.defaultoptions.js +++ /dev/null @@ -1,30 +0,0 @@ -//维护编辑器一下默认的不在插件中的配置项 -UE.Editor.defaultOptions = function(editor) { - var _url = editor.options.UEDITOR_HOME_URL; - return { - isShow: true, - initialContent: "", - initialStyle: "", - autoClearinitialContent: false, - iframeCssUrl: _url + "themes/iframe.css", - 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 + "i18n/", - theme: "default", - themePath: _url + "themes/", - allHtmlEnabled: false, - scaleEnabled: false, - tableNativeEditInFF: false, - autoSyncData: true, - fileNameFormat: "{time}{rand:6}" - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js deleted file mode 100644 index 9a62823..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Editor.js +++ /dev/null @@ -1,1703 +0,0 @@ -/** - * 编辑器主类,包含编辑器提供的大部分公用接口 - * @file - * @module UE - * @class Editor - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -/** - * UEditor的核心类,为用户提供与编辑器交互的接口。 - * @unfile - * @module UE - * @class Editor - */ - -;(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; - } - } - } else { - textarea = editor.textarea; - } - } - 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; - - me.fireEvent("langReady"); - } - - /** - * 编辑器准备就绪后会触发该事件 - * @module UE - * @class Editor - * @event ready - * @remind render方法执行完成之后,会触发该事件 - * @remind - * @example - * ```javascript - * editor.addListener( 'ready', function( editor ) { - * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 - * } ); - * ``` - */ - /** - * 执行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 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 - * @example - * ```javascript - * editor.addListener( 'selectionchange', function( editor ) { - * 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到一个容器,编辑器实例才能正常渲染到页面 - * @example - * ```javascript - * var editor = new UE.Editor(); - * editor.execCommand('blod'); - * ``` - * @see UE.Config - */ - - /** - * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 - * @constructor - * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 - * @param { Object } setting 创建编辑器的参数 - * @example - * ```javascript - * var editor = new UE.Editor(); - * editor.execCommand('blod'); - * ``` - * @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)); - - /* 尝试异步加载后台配置 */ - //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", - 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; - }, - /** - * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 - * @method ready - * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 - * 立即触发该回调。 - * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 - * @example - * ```javascript - * editor.ready( function( editor ) { - * editor.setContent('初始化完毕'); - * } ); - * ``` - * @see UE.Editor.event:ready - */ - ready: function(fn) { - var me = this; - if (fn) { - me.isReady ? fn.apply(me) : me.addListener("ready", fn); - } - }, - /** - * 该方法用于设置placeholder - * @method setPlaceholder - * @param { String } placeholder 编辑器的placeholder文案 - * @example - * ```javascript - * editor.setPlaceholder('请输入内容'); - * ``` - */ - setPlaceholder: function(){ - - function contentChange(){ - var localHtml = this.getPlainTxt(); - if(!localHtml.trim()){ - UE.dom.domUtils.addClass( this.body, 'empty' ); - }else{ - UE.dom.domUtils.removeClasses( this.body, 'empty' ); - } - } - - return function(placeholder){ - var _editor = this; - - _editor.ready(function () { - contentChange.call(_editor); - _editor.body.setAttribute('placeholder', placeholder); - }); - _editor.removeListener('keyup contentchange', contentChange); - _editor.addListener('keyup contentchange', contentChange); - } - }(), - - /** - * 该方法是提供给插件里面使用,设置配置项默认值 - * @method setOpt - * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 - * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 - * @param { String } key 编辑器的可接受的选项名称 - * @param { * } val 该选项可接受的值 - * @example - * ```javascript - * editor.setOpt( 'initContent', '欢迎使用编辑器' ); - * ``` - */ - - /** - * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 - * @method setOpt - * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 - * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 - * @param { Object } options 将要设置的选项的键值对对象 - * @example - * ```javascript - * editor.setOpt( { - * 'initContent': '欢迎使用编辑器' - * } ); - * ``` - */ - 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 - * ```javascript - * 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 = ""; - } - - 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 - * @remind 执行该方法,会触发ready事件 - * @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; - } - - 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 html = - (ie && browser.version < 9 ? "" : "") + - "" + - "" + - "" + - (options.iframeCssUrl - ? "" - : "") + - (options.initialStyle - ? "" - : "") + - "" + - "" + - "" + - (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"; - } - }); - } - }, - - /** - * 编辑器初始化 - * @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; - } - } 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项 - * @method sync - * @example - * ```javascript - * editor.sync(); - * form.sumbit(); //form变量已经指向了form元素 - * ``` - */ - - /** - * 根据传入的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); - }, - - /** - * 设置编辑器高度 - * @method setHeight - * @remind 当配置项autoHeightEnabled为真时,该方法无效 - * @param { Number } number 设置的高度值,纯数值,不带单位 - * @example - * ```javascript - * 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"); - }, - - /** - * 为编辑器的编辑命令提供快捷键 - * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 - * @method addshortcutkey - * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 - * @example - * ```javascript - * editor.addshortcutkey({ - * "Bold" : "ctrl+66",//^B - * "Italic" : "ctrl+73", //^I - * }); - * ``` - */ - /** - * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 - * @method addshortcutkey - * @param { String } cmd 触发快捷键时,响应的命令 - * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 - * @example - * ```javascript - * 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); - }, - - /** - * 对编辑器设置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); - } - } - } - } - }); - }, - - /** - * 获取编辑器的内容 - * @method getContent - * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 - * @example - * ```javascript - * //编辑器html内容:

    123456

    - * var content = editor.getContent(); //返回值:

    123456

    - * ``` - */ - - /** - * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 - * @method getContent - * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, - * 代表当前编辑器的内容是否空, - * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 - * 经过内置过滤规则处理后的内容。 - * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 - * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @return { String } 编辑器的内容字符串 - * @example - * ```javascript - * // editor 是一个编辑器的实例 - * var content = editor.getContent( function ( editor ) { - * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 - * } ); - * ``` - */ - 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文档字符串 - * @eaxmple - * ```javascript - * 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) + - "" - ); - }, - - /** - * 得到编辑器的纯文本内容,但会保留段落格式 - * @method getPlainTxt - * @return { String } 编辑器带段落格式的纯文本内容字符串 - * @example - * ```javascript - * //编辑器html内容:

    1

    2

    - * 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, " "); - }, - - /** - * 获取编辑器中的纯文本内容,没有段落格式 - * @method getContentTxt - * @return { String } 编辑器不带段落格式的纯文本内容字符串 - * @example - * ```javascript - * //编辑器html内容:

    1

    2

    - * 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, " "); - }, - - /** - * 设置编辑器的内容,可修改编辑器当前的html内容 - * @method setContent - * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @warning 该方法会触发selectionchange事件 - * @param { String } html 要插入的html内容 - * @example - * ```javascript - * editor.getContent('

    test

    '); - * ``` - */ - - /** - * 设置编辑器的内容,可修改编辑器当前的html内容 - * @method setContent - * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 - * @warning 该方法会触发selectionchange事件 - * @param { String } html 要插入的html内容 - * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 - * @example - * ```javascript - * //假设设置前的编辑器内容是

    old text

    - * editor.setContent('

    new text

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

    old text

    new text

    - * ``` - */ - setContent: function(html, isAppendTo, notFireSelectionchange) { - var me = this; - - me.fireEvent("beforesetcontent", html); - var root = UE.htmlparser(html); - me.filterInputRule(root); - html = root.toHtml(); - - 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; - } - if (p.firstChild) { - if (!child) { - me.body.appendChild(p); - break; - } else { - child.parentNode.insertBefore(p, child); - p = me.document.createElement("p"); - } - } - child = child.nextSibling; - } - } - } - 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); - } - }, - - /** - * 让编辑器获得焦点,默认focus到编辑器头部 - * @method focus - * @example - * ```javascript - * editor.focus() - * ``` - */ - - /** - * 让编辑器获得焦点,toEnd确定focus位置 - * @method focus - * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 - * @example - * ```javascript - * 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); - } 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 { - sel.removeAllRanges(); - } - - //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); - }); - }, - /** - * 触发事件代理 - * @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() - ); - }, - /** - * 变化选区 - * @method _selectionChange - * @private - */ - _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); - }, - - /** - * 执行编辑命令 - * @method _callCmdFn - * @private - * @param { String } fnName 函数名称 - * @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); - } - }, - - /** - * 执行编辑命令cmdName,完成富文本编辑效果 - * @method execCommand - * @param { String } cmdName 需要执行的命令 - * @remind 具体命令的使用请参考命令列表 - * @return { * } 返回命令函数运行的返回值 - * @example - * ```javascript - * editor.execCommand(cmdName); - * ``` - */ - execCommand: function(cmdName) { - cmdName = cmdName.toLowerCase(); - var me = this; - var result; - var 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 需要查询的命令名称 - * @remind 具体命令的使用请参考命令列表 - * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) - * @example - * ```javascript - * editor.queryCommandState(cmdName) => (-1|0|1) - * ``` - * @see COMMAND.LIST - */ - queryCommandState: function(cmdName) { - return this._callCmdFn("queryCommandState", arguments); - }, - - /** - * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 - * @method queryCommandValue - * @param { String } cmdName 需要查询的命令名称 - * @remind 具体命令的使用请参考命令列表 - * @remind 只有部分插件有此方法 - * @return { * } 返回每个命令特定的当前状态值 - * @grammar editor.queryCommandValue(cmdName) => {*} - * @see COMMAND.LIST - */ - queryCommandValue: function(cmdName) { - return this._callCmdFn("queryCommandValue", arguments); - }, - - /** - * 检查编辑区域中是否有内容 - * @method hasContents - * @remind 默认有文本内容,或者有以下节点都不认为是空 - * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param - * @return { Boolean } 检查有内容返回true,否则返回false - * @example - * ```javascript - * editor.hasContents() - * ``` - */ - - /** - * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true - * @method hasContents - * @param { Array } tags 传入数组判断时用到的节点类型 - * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false - * @example - * ```javascript - * 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; - } - } - } - return false; - }, - - /** - * 重置编辑器,可用来做多个tab使用同一个编辑器实例 - * @method reset - * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 - * @example - * ```javascript - * editor.reset() - * ``` - */ - reset: function() { - this.fireEvent("reset"); - }, - - /** - * 设置当前编辑区域可以编辑 - * @method setEnabled - * @example - * ```javascript - * 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(); - }, - - /** 设置当前编辑区域不可编辑 - * @method setDisabled - */ - - /** 设置当前编辑区域不可编辑,except中的命令除外 - * @method setDisabled - * @param { String } except 例外命令的字符串 - * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 - * @example - * ```javascript - * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 - * ``` - */ - - /** 设置当前编辑区域不可编辑,except中的命令除外 - * @method setDisabled - * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 - * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 - * @example - * ```javascript - * 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); - }, - - /** - * 设置默认内容 - * @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); - } - } - - return function(cont) { - var me = this; - me.body.innerHTML = '

    ' + cont + "

    "; - - me.addListener("firstBeforeExecCommand focus", clear); - }; - })(), - - /** - * 显示编辑器 - * @method setShow - * @example - * ```javascript - * 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(); - }, - /** - * 隐藏编辑器 - * @method setHide - * @example - * ```javascript - * 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(); - }, - - /** - * 根据指定的路径,获取对应的语言资源 - * @method getLang - * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 - * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 - * @example - * ```javascript - * 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; - }, - - /** - * 计算编辑器html内容字符串的长度 - * @method getContentLength - * @return { Number } 返回计算的长度 - * @example - * ```javascript - * //编辑器html内容

    132

    - * editor.getContentLength() //返回27 - * ``` - */ - /** - * 计算编辑器当前纯文本内容的长度 - * @method getContentLength - * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 - * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 - * @example - * ```javascript - * //编辑器html内容

    132

    - * 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; - }, - - /** - * 注册输入过滤规则 - * @method addInputRule - * @param { Function } rule 要添加的过滤规则 - * @example - * ```javascript - * editor.addInputRule(function(root){ - * $.each(root.getNodesByTagName('div'),function(i,node){ - * node.tagName="p"; - * }); - * }); - * ``` - */ - addInputRule: function(rule) { - this.inputRules.push(rule); - }, - - /** - * 执行注册的过滤规则 - * @method filterInputRule - * @param { UE.uNode } root 要过滤的uNode节点 - * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 - * @example - * ```javascript - * editor.filterInputRule(editor.body); - * ``` - * @see UE.Editor:addInputRule - */ - filterInputRule: function(root) { - for (var i = 0, ci; (ci = this.inputRules[i++]); ) { - ci.call(this, root); - } - }, - - /** - * 注册输出过滤规则 - * @method addOutputRule - * @param { Function } rule 要添加的过滤规则 - * @example - * ```javascript - * editor.addOutputRule(function(root){ - * $.each(root.getNodesByTagName('p'),function(i,node){ - * node.tagName="div"; - * }); - * }); - * ``` - */ - addOutputRule: function(rule) { - this.outputRules.push(rule); - }, - - /** - * 根据输出过滤规则,过滤编辑器内容 - * @method filterOutputRule - * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 - * @param { UE.uNode } root 要过滤的uNode节点 - * @example - * ```javascript - * editor.filterOutputRule(editor.body); - * ``` - * @see UE.Editor:addOutputRule - */ - filterOutputRule: function(root) { - for (var i = 0, ci; (ci = this.outputRules[i++]); ) { - ci.call(this, root); - } - }, - - /** - * 根据action名称获取请求的路径 - * @method getActionUrl - * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 - * @param { String } action action名称 - * @example - * ```javascript - * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" - * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" - * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" - * 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"); - /* if (!serverUrl && imageUrl) { - serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); - } - - if (serverUrl) { - serverUrl = - serverUrl + - (serverUrl.indexOf("?") == -1 ? "?" : "&") + - "action=" + - (actionName || ""); - return utils.formatUrl(serverUrl); - } else { - return ""; - } */ - - if (serverUrl) { - serverUrl = serverUrl + "?"; - return utils.formatUrl(serverUrl); - } else { - return ""; - } - } - }; - utils.inherits(Editor, EventBase); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js deleted file mode 100644 index f65ddf8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/EventBase.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * UE采用的事件基类 - * @file - * @module UE - * @class EventBase - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -/** - * UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。 - * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。 - * @unfile - * @module UE - * @class EventBase - */ - -/** - * 通过此构造器,子类可以继承EventBase获取事件监听的方法 - * @constructor - * @example - * ```javascript - * UE.EventBase.call(editor); - * ``` - */ -var EventBase = (UE.EventBase = function() {}); - -EventBase.prototype = { - /** - * 注册事件监听器 - * @method addListener - * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔 - * @param { Function } fn 监听的事件被触发时,会执行该回调函数 - * @waining 事件被触发时,监听的函数假如返回的值恒等于true,回调函数的队列中后面的函数将不执行 - * @example - * ```javascript - * editor.addListener('selectionchange',function(){ - * console.log("选区已经变化!"); - * }) - * editor.addListener('beforegetcontent aftergetcontent',function(type){ - * if(type == 'beforegetcontent'){ - * //do something - * }else{ - * //do something - * } - * console.log(this.getContent) // this是注册的事件的编辑器实例 - * }) - * ``` - * @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); - } - }, - - 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 移除的事件名称,同时移除多个事件使用空格分隔 - * @param { Function } fn 移除监听事件的函数引用 - * @example - * ```javascript - * //changeCallback为方法体 - * 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); - } - }, - - /** - * 触发事件 - * @method fireEvent - * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 - * @remind 该方法会触发addListener - * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 - * @example - * ```javascript - * editor.fireEvent("selectionchange"); - * ``` - */ - - /** - * 触发事件 - * @method fireEvent - * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔 - * @param { *... } options 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数 - * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值 - * @example - * ```javascript - * - * editor.addListener( "selectionchange", function ( type, arg1, arg2 ) { - * - * console.log( arg1 + " " + arg2 ); - * - * } ); - * - * //触发selectionchange事件, 会执行上面的事件监听器 - * //output: Hello World - * 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; - } - } - } - if ((t = this["on" + ti.toLowerCase()])) { - r = t.apply(this, arguments); - } - } - return r; - } -}; -/** - * 获得对象所拥有监听类型的所有监听器 - * @unfile - * @module UE - * @since 1.2.6.1 - * @method getListener - * @public - * @param { Object } obj 查询监听器的对象 - * @param { String } type 事件类型 - * @param { Boolean } force 为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组 - * @return { Array } 监听器数组 - */ -function getListener(obj, type, force) { - var allListeners; - type = type.toLowerCase(); - return ( - (allListeners = - obj.__allListeners || (force && (obj.__allListeners = {}))) && - (allListeners[type] || (force && (allListeners[type] = []))) - ); -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js deleted file mode 100644 index 3a42c41..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Range.js +++ /dev/null @@ -1,1982 +0,0 @@ -/** - * Range封装 - * @file - * @module UE.dom - * @class Range - * @since 1.2.6.1 - */ - -/** - * dom操作封装 - * @unfile - * @module UE.dom - */ - -/** - * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 - * @unfile - * @module UE.dom - * @class Range - */ - -;(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 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; - } - 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(""))); - } - 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)) - ); - //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; - } - 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); - } - } - } 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; - } - - /** - * 创建一个跟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; - }); - - /** - * 删除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, ""); - } - } - } 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; - } - } - - Range.prototype = { - /** - * 克隆选区的内容到一个DocumentFragment里 - * @method cloneContents - * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - * ``` - */ - cloneContents: function() { - return this.collapsed ? null : execContentsAction(this, 0); - }, - - /** - * 删除当前选区范围中的所有内容 - * @method deleteContents - * @remind 执行完该操作后, 当前Range对象变成了闭合状态 - * @return { UE.dom.Range } 当前操作的Range对象 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - * ``` - */ - 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 执行该操作后, 选区将变成闭合状态 - * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 - * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 - * @example - * ```html - * - * - * xx[xxx]x - * - * - * - */ - extractContents: function() { - return this.collapsed ? null : execContentsAction(this, 2); - }, - - /** - * 设置Range的开始容器节点和偏移量 - * @method setStart - * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, - * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 - * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 - * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 - * 中的索引 - * @param { Node } node 将被设为当前选区开始边界容器的节点对象 - * @param { int } offset 选区的开始位置偏移量 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxxxxxxxxxx[xxx] - * - * - * ``` - * @example - * ```html - * - * xxx[xx]x - * - * - * ``` - */ - setStart: function(node, offset) { - return setEndPoint(true, node, offset, this); - }, - - /** - * 设置Range的结束容器和偏移量 - * @method setEnd - * @param { Node } node 作为当前选区结束边界容器的节点对象 - * @param { int } offset 结束边界的偏移量 - * @see UE.dom.Range:setStart(Node,int) - * @return { UE.dom.Range } 当前range对象 - */ - setEnd: function(node, offset) { - return setEndPoint(false, node, offset, this); - }, - - /** - * 将Range开始位置设置到node节点之后 - * @method setStartAfter - * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 - * @param { Node } node 选区的开始边界将紧接着该节点之后 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxxxx[xxxx] - * - * - * ``` - */ - setStartAfter: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, - - /** - * 将Range开始位置设置到node节点之前 - * @method setStartBefore - * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 - * @param { Node } node 新的选区开始位置在该节点之前 - * @see UE.dom.Range:setStartAfter(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setStartBefore: function(node) { - return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); - }, - - /** - * 将Range结束位置设置到node节点之后 - * @method setEndAfter - * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setStartAfter(Node) - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * [xxxxxxx]xxxx - * - * - * ``` - */ - setEndAfter: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); - }, - - /** - * 将Range结束位置设置到node节点之前 - * @method setEndBefore - * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setEndAfter(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setEndBefore: function(node) { - return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); - }, - - /** - * 设置Range的开始位置到node节点内的第一个子节点之前 - * @method setStartAtFirst - * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 - * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 - * @param { Node } node 目标节点 - * @see UE.dom.Range:setStartBefore(Node) - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - setStartAtFirst: function(node) { - return this.setStart(node, 0); - }, - - /** - * 设置Range的开始位置到node节点内的最后一个节点之后 - * @method setStartAtLast - * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 - * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 - * @param { Node } node 目标节点 - * @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 - ); - }, - - /** - * 设置Range的结束位置到node节点内的第一个节点之前 - * @method setEndAtFirst - * @param { Node } node 目标节点 - * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 - * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 - * @see UE.dom.Range:setStartAtFirst(Node) - * @return { UE.dom.Range } 当前range对象 - */ - setEndAtFirst: function(node) { - return this.setEnd(node, 0); - }, - - /** - * 设置Range的结束位置到node节点内的最后一个节点之后 - * @method setEndAtLast - * @param { Node } node 目标节点 - * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 - * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 - * @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 - ); - }, - - /** - * 选中给定节点 - * @method selectNode - * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, - * 而endOffset为startOffset+1 - * @param { Node } node 需要选中的节点 - * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - selectNode: function(node) { - return this.setStartBefore(node).setEndAfter(node); - }, - - /** - * 选中给定节点内部的所有节点 - * @method selectNodeContents - * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, - * 而endOffset是该节点的子节点数。 - * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 - * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - 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); - }, - - /** - * 向当前选区的结束处闭合选区 - * @method collapse - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - - /** - * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, - * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 - * @method collapse - * @param { Boolean } toStart 是否向选区开始处闭合 - * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 - * @see UE.dom.Range:collapse() - * @example - * ```html - * - * xxxxx[xx]xxxx - * - * - * ``` - */ - 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对象 - * @example - * ```html - * xxxx[xxxxx] => xxxx[xxxxx] - * ``` - * - * @example - * ```html - * - * x[xx]xxx - * - * - * ``` - * - * @example - * ```html - * [xxxxxxxxxxx] => [xxxxxxxxxxx] - * ``` - */ - - /** - * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, - * 如果ignoreEnd的值为true,则忽略对结束位置的调整 - * @method shrinkBoundary - * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 - * @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; - }, - - /** - * 获取离当前选区内包含的所有节点最近的公共祖先节点, - * @method getCommonAncestor - * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @example - * ```html - * //选区示例 - * xxxx[xxx]xxxxxx - * - * ``` - */ - - /** - * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 - * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf - * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 - * @method getCommonAncestor - * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @see UE.dom.Range:getCommonAncestor() - * @example - * ```html - * - * - * - * xxxxxxxxx[xxx]xxxxxxxx - * - * - * - * - * ``` - */ - - /** - * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 - * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf - * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 - * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 - * @method getCommonAncestor - * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 - * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 - * @return { Node } 当前range对象内所有节点的公共祖先节点 - * @see UE.dom.Range:getCommonAncestor() - * @see UE.dom.Range:getCommonAncestor(Boolean) - * @example - * ```html - * - * - * - * xxxxxxxx[x]xxxxxxxxxxx - * - * - * - * - * ``` - */ - 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 该操作有可能会引起文本节点被切开 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * //选区示例 - * xxx[xxxxx]xxx - * - * - * ``` - */ - - /** - * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, - * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 - * @method trimBoundary - * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * //选区示例 - * xxx[xxxxx]xxx - * - * - * ``` - */ - 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); - } - } - 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 - * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 - * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 - * @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); - } - } - } - - 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); - }, - - /** - * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 - * @method setCursor - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:collapse() - */ - - /** - * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 - * @method setCursor - * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, - * 反之,则向开始容器方向闭合 - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:collapse(Boolean) - */ - setCursor: function(toEnd, noFillData) { - return this.collapse(!toEnd).select(noFillData); - }, - - /** - * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 - * @method createBookmark - * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 - * 返回标记位置的ID, 反之则返回标记位置节点的引用 - * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, - * 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++); - - 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; - }, - - /** - * 调整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; - } - 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; - }, - /** - * 调整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; - }, - - /** - * 给range选区中的内容添加给定的inline标签 - * @method applyInlineStyle - * @param { String } tagName 需要添加的标签名 - * @example - * ```html - *

    xxxx[xxxx]x

    ==> range.applyInlineStyle("strong") ==>

    xxxx[xxxx]x

    - * ``` - */ - - /** - * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 - * @method applyInlineStyle - * @param { String } tagName 需要添加的标签名 - * @param { Object } attrs 跟随新添加的标签的属性 - * @return { UE.dom.Range } 当前选区 - * @example - * ```html - *

    xxxx[xxxx]x

    - * - * ==> - * - * - * range.applyInlineStyle("strong",{"style":"font-size:12px"}) - * - * ==> - * - *

    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; - } - 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); - }, - - /** - * 移除当前选区内指定的inline标签,但保留其中的内容 - * @method removeInlineStyle - * @param { String } tagName 需要移除的标签名 - * @return { UE.dom.Range } 当前的range对象 - * @example - * ```html - * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z - * ``` - */ - - /** - * 移除当前选区内指定的一组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); - }, - - /** - * 获取当前选中的自闭合的节点 - * @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; - }, - - /** - * 在页面上高亮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); - } - } 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; - }, - - /** - * 判断当前选区内容是否占位符 - * @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; - }, - - /** - * 保存 - * @method createAddress - * @private - * @return { Boolean } 返回开始和结束的位置 - * @example - * ```html - * - *

    - * aaaa - * - * - * bbbb - * - * - *

    - * - * - * - * ``` - */ - 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; - } - firstIndex++; - if (first.nodeType == 3) { - while (first && first.nodeType == 3) { - first = first.nextSibling; - } - } else { - first = first.nextSibling; - } - } - } - } - } 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; - }, - - /** - * 保存 - * @method createAddress - * @private - * @return { Boolean } 返回开始和结束的位置 - * @example - * ```html - * - *

    - * aaaa - * - * - * bbbb - * - * - *

    - * - * - * - * ``` - */ - 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; - }, - - /** - * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 - * 作为其参数。 - * @method traversal - * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 - * @return { UE.dom.Range } 当前range对象 - * @example - * ```html - * - * - * - * - * - * - * - * - * - * - * ``` - */ - - /** - * 遍历range内的节点。 - * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 - * 作为其参数。 - * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 - * 发doFn函数的执行 - * @method traversal - * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 - * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 - * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 - * 会触发doFn。 - * @return { UE.dom.Range } 当前range对象 - * @see UE.dom.Range:traversal(Function) - * @example - * ```html - * - * - * - * - * - * - * - * - * - * - * ``` - */ - 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); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js deleted file mode 100644 index 2d4e00c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/Selection.js +++ /dev/null @@ -1,417 +0,0 @@ -/** - * 选集 - * @file - * @module UE.dom - * @class Selection - * @since 1.2.6.1 - */ - -/** - * 选区集合 - * @unfile - * @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 }; - } - - 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 ? -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); - } - } - 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() { - try { - if (!_getIERange(me) && me._bakIERange) { - me._bakIERange.select(); - } - } catch (ex) {} - me._bakIERange = null; - }); - } - iframe = doc = null; - }); - - 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对象 - * @example - * ```javascript - * 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; - } - }, - - /** - * 获得ieRange - * @method getIERange - * @return { Object } 返回ie原生的Range - * @example - * ```javascript - * editor.selection.getIERange(); - * ``` - */ - 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(); - }, - - /** - * 获取选区开始位置的父节点到body - * @method getStartElementPath - * @return { Array } 返回父节点集合 - * @example - * ```javascript - * 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 []; - }, - - /** - * 清空缓存 - * @method clear - */ - 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; - } - }, - - /** - * 获取选区对应的Range - * @method getRange - * @return { Object } 得到Range对象 - * @example - * ```javascript - * 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); - } - } - - 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 } 获得开始元素 - * @example - * ```javascript - * 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; - }, - - /** - * 得到选区中的文本 - * @method getText - * @return { String } 选区中包含的文本 - * @example - * ```javascript - * 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 ""; - }, - - /** - * 清除选区 - * @method clearRange - * @example - * ```javascript - * editor.selection.clearRange(); - * ``` - */ - clearRange: function() { - this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js deleted file mode 100644 index ac8b916..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/ajax.js +++ /dev/null @@ -1,278 +0,0 @@ -/** - * @file - * @module UE.ajax - * @since 1.2.6.1 - */ - -/** - * 提供对ajax请求的支持 - * @module UE.ajax - */ -UE.ajax = (function() { - //创建一个ajaxRequest对象 - var fnStr = "XMLHttpRequest()"; - try { - 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]) - ); - } - } - } - return strArr.join("&"); - } - - function doAjax(url, ajaxOptions) { - var xhr = creatAjaxRequest(), - //是否超时 - timeIsOut = false, - //默认参数 - defaultAjaxOptions = { - method: "POST", - timeout: 5000, - async: true, - 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; - - 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 (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); - - 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 - * @param { URLString } url ajax请求的url地址 - * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: - * @example - * ```javascript - * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 - * UE.ajax.requeset( 'sayhello.php', { - * - * //请求方法。可选值: 'GET', 'POST',默认值是'POST' - * method: 'GET', - * - * //超时时间。 默认为5000, 单位是ms - * timeout: 10000, - * - * //是否是异步请求。 true为异步请求, false为同步请求 - * async: true, - * - * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 - * data: { - * name: 'neditor' - * }, - * - * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 - * onsuccess: function ( xhr ) { - * console.log( xhr.responseText ); - * }, - * - * //请求失败或者超时后的回调。 - * onerror: function ( xhr ) { - * alert( 'Ajax请求失败' ); - * } - * - * } ); - * ``` - */ - - /** - * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 - * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 - * @method request - * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 - * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: - * @example - * ```javascript - * - * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 - * UE.ajax.requeset( 'sayhello.php', { - * - * //请求的地址, 该项是必须的。 - * url: 'sayhello.php' - * - * } ); - * ``` - */ - 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); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js deleted file mode 100644 index b4e1aca..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/browser.js +++ /dev/null @@ -1,263 +0,0 @@ -/** - * 浏览器判断模块 - * @file - * @module UE.browser - * @since 1.2.6.1 - */ - -/** - * 提供浏览器检测的模块 - * @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), - - /** - * @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} 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} 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 - * ```javascript - * if ( UE.browser.ie9Compat ) { - * console.log( '当前浏览器运行在IE9兼容模式下' ); - * } - * ``` - */ - browser.ie9Compat = document.documentMode == 9; - - /** - * @property { boolean } ie8 检测浏览器是否是IE8浏览器 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie8 ) { - * console.log( '当前浏览器是IE8浏览器' ); - * } - * ``` - */ - browser.ie8 = !!document.documentMode; - - /** - * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie8Compat ) { - * console.log( '当前浏览器运行在IE8兼容模式下' ); - * } - * ``` - */ - browser.ie8Compat = document.documentMode == 8; - - /** - * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie7Compat ) { - * console.log( '当前浏览器运行在IE7兼容模式下' ); - * } - * ``` - */ - browser.ie7Compat = - (version == 7 && !document.documentMode) || document.documentMode == 7; - - /** - * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式 - * @warning 如果浏览器不是IE, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.ie6Compat ) { - * console.log( '当前浏览器运行在IE6模式或者怪异模式下' ); - * } - * ``` - */ - browser.ie6Compat = version < 7 || browser.quirks; - - browser.ie9above = version > 8; - - browser.ie9below = version < 9; - - 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; - } - } - - /** - * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号 - * @warning 如果浏览器不是chrome, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.chrome ) { - * console.log( '当前浏览器是Chrome' ); - * } - * ``` - */ - if (/chrome\/(\d+\.\d)/i.test(agent)) { - browser.chrome = +RegExp["\x241"]; - } - - /** - * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号 - * @warning 如果浏览器不是safari, 则该值为undefined - * @example - * ```javascript - * if ( UE.browser.safari ) { - * console.log( '当前浏览器是Safari' ); - * } - * ``` - */ - 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()); - - // WebKit 522+ (Safari 3+) - if (browser.webkit) - version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); - - /** - * @property { Number } version 检测当前浏览器版本号 - * @remind - *
      - *
    • IE系列返回值为5,6,7,8,9,10等
    • - *
    • gecko系列会返回10900,158900等
    • - *
    • webkit系列会返回其build号 (如 522等)
    • - *
    - * @example - * ```javascript - * console.log( '当前浏览器版本号是: ' + UE.browser.version ); - * ``` - */ - browser.version = version; - - /** - * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容 - * @example - * ```javascript - * if ( UE.browser.isCompatible ) { - * console.log( '浏览器与UEditor能够良好兼容' ); - * } - * ``` - */ - 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; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js deleted file mode 100644 index e04ee15..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/domUtils.js +++ /dev/null @@ -1,2542 +0,0 @@ -/** - * Dom操作工具包 - * @file - * @module UE.dom.domUtils - * @since 1.2.6.1 - */ - -/** - * Dom操作工具包 - * @unfile - * @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; - } - tmpNode = parent[ltr]; - } - 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*/ - }, - /** - * 获取节点A相对于节点B的位置关系 - * @method getPosition - * @param { Node } nodeA 需要查询位置关系的节点A - * @param { Node } nodeB 需要查询位置关系的节点B - * @return { Number } 节点A与节点B的关系 - * @example - * ```javascript - * //output: 20 - * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body ); - * - * switch ( position ) { - * - * //0 - * case UE.dom.domUtils.POSITION_IDENTICAL: - * console.log('元素相同'); - * break; - * //1 - * case UE.dom.domUtils.POSITION_DISCONNECTED: - * console.log('两个节点在不同的文档中'); - * break; - * //2 - * case UE.dom.domUtils.POSITION_FOLLOWING: - * console.log('节点A在节点B之后'); - * break; - * //4 - * case UE.dom.domUtils.POSITION_PRECEDING; - * console.log('节点A在节点B之前'); - * break; - * //8 - * case UE.dom.domUtils.POSITION_IS_CONTAINED: - * console.log('节点A被节点B包含'); - * break; - * case 10: - * console.log('节点A被节点B包含且节点A在节点B之后'); - * break; - * //16 - * case UE.dom.domUtils.POSITION_CONTAINS: - * console.log('节点A包含节点B'); - * break; - * case 20: - * console.log('节点A包含节点B且节点A在节点B之前'); - * break; - * - * } - * ``` - */ - 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 需要检测的节点对象 - * @return { Number } 该节点在父节点中的位置 - * @see UE.dom.domUtils.getNodeIndex(Node,Boolean) - */ - - /** - * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点 - * @method getNodeIndex - * @param { Node } node 需要检测的节点对象 - * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点 - * @return { Number } 该节点在父节点中的位置 - * @example - * ```javascript - * - * var node = document.createElement("div"); - * - * node.appendChild( document.createTextNode( "hello" ) ); - * node.appendChild( document.createTextNode( "world" ) ); - * node.appendChild( node = document.createElement( "div" ) ); - * - * //output: 2 - * console.log( UE.dom.domUtils.getNodeIndex( node ) ); - * - * //output: 1 - * console.log( UE.dom.domUtils.getNodeIndex( node, true ) ); - * - * ``` - */ - 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++; - } - return i; - }, - - /** - * 检测节点node是否在给定的document对象上 - * @method inDoc - * @param { Node } node 需要检测的节点对象 - * @param { DomDocument } doc 需要检测的document对象 - * @return { Boolean } 该节点node是否在给定的document的dom树上 - * @example - * ```javascript - * - * var node = document.createElement("div"); - * - * //output: false - * console.log( UE.do.domUtils.inDoc( node, document ) ); - * - * document.body.appendChild( node ); - * - * //output: true - * console.log( UE.do.domUtils.inDoc( node, document ) ); - * - * ``` - */ - inDoc: function(node, doc) { - return domUtils.getPosition(node, doc) == 10; - }, - /** - * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, - * 查找的起点是给定node节点的父节点。 - * @method findParent - * @param { Node } node 需要查找的节点 - * @param { Function } filterFn 自定义的过滤方法。 - * @warning 查找的终点是到body节点为止 - * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 - * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 - * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL - * @example - * ```javascript - * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) { - * - * //由于查找的终点是body节点, 所以永远也不会匹配当前过滤器的条件, 即这里永远会返回false - * return node.tagName === "HTML"; - * - * } ); - * - * //output: true - * console.log( filterNode === null ); - * ``` - */ - - /** - * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点, - * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点 - * @method findParent - * @param { Node } node 需要查找的节点 - * @param { Function } filterFn 自定义的过滤方法。 - * @param { Boolean } includeSelf 查找过程是否包含自身 - * @warning 查找的终点是到body节点为止 - * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该 - * 节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。 - * @remind 如果includeSelf为true, 则过滤器第一次执行时的参数会是节点本身。 - * 反之, 过滤器第一次执行时的参数将是该节点的父节点。 - * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL - * @example - * ```html - * - * - *
    - *
    - * - * - * - * ``` - */ - 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; - } - } - return null; - }, - /** - * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 - * @method findParentByTagName - * @param { Node } node 需要查找的节点对象 - * @param { Array } tagNames 需要查找的父节点的名称数组 - * @warning 查找的终点是到body节点为止 - * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); - * //output: BODY - * console.log( node.tagName ); - * ``` - */ - - /** - * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, - * 否则, 起点是node的父节点。 - * @method findParentByTagName - * @param { Node } node 需要查找的节点对象 - * @param { Array } tagNames 需要查找的父节点的名称数组 - * @param { Boolean } includeSelf 查找过程是否包含node节点自身 - * @warning 查找的终点是到body节点为止 - * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var queryTarget = document.getElementsByTagName("div")[0]; - * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); - * //output: true - * 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 - ); - }, - /** - * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 - * @method findParents - * @param { Node } node 需要查找的节点对象 - * @return { Array } 给定节点的祖先节点数组 - * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 - * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 - * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 - * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 - */ - - /** - * 查找节点node的祖先节点集合, 如果includeSelf的值为true, - * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 - * @method findParents - * @param { Node } node 需要查找的节点对象 - * @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(); - }, - - /** - * 在节点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); - }, - - /** - * 删除节点node及其下属的所有节点 - * @method remove - * @param { Node } node 需要删除的节点对象 - * @return { Node } 返回刚删除的节点对象 - * @example - * ```html - *
    - *
    你好
    - *
    - * - * ``` - */ - - /** - * 删除节点node,并根据keepChildren的值决定是否保留子节点 - * @method remove - * @param { Node } node 需要删除的节点对象 - * @param { Boolean } keepChildren 是否需要保留子节点 - * @return { Node } 返回刚删除的节点对象 - * @example - * ```html - *
    - *
    你好
    - *
    - * - * ``` - */ - 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); - } - return node; - }, - - /** - * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, - * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 - * @method getNextDomNode - * @param { Node } node 需要获取其后的兄弟节点的节点对象 - * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```html - * - *
    - * - *
    - * xxx - * - * - * ``` - * @example - * ```html - * - *
    - * - * xxx - *
    - * xxx - * - * - * ``` - */ - - /** - * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, - * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, - * 则执行getNextDomNode(Node node)的查找过程。 - * @method getNextDomNode - * @param { Node } node 需要获取其后的兄弟节点的节点对象 - * @param { Boolean } startFromChild 查找过程是否从其子节点开始 - * @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 - ); - }, - /** - * 检测节点node是否属是UEditor定义的bookmark节点 - * @method isBookmarkNode - * @private - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 是否是bookmark节点 - * @example - * ```html - * - * - * ``` - */ - isBookmarkNode: function(node) { - return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); - }, - /** - * 获取节点node所属的window对象 - * @method getWindow - * @param { Node } node 节点对象 - * @return { Window } 当前节点所属的window对象 - * @example - * ```javascript - * //output: true - * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); - * ``` - */ - getWindow: function(node) { - var doc = node.ownerDocument || node; - return doc.defaultView || doc.parentWindow; - }, - /** - * 获取离nodeA与nodeB最近的公共的祖先节点 - * @method getCommonAncestor - * @param { Node } nodeA 第一个节点 - * @param { Node } nodeB 第二个节点 - * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 - * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 - * @example - * ```javascript - * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); - * //output: true - * 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]; - }, - /** - * 清除node节点左右连续为空的兄弟inline节点 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * 则这些兄弟节点将被删除 - * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 - * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 - * @example - * ```html - * - *
    - * - * - * - * xxx - * - * - * - * ``` - */ - - /** - * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, - * 则忽略对右边兄弟节点的操作。 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 - * 则这些兄弟节点将被删除 - * @see UE.dom.domUtils.clearEmptySibling(Node) - */ - - /** - * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, - * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 - * @method clearEmptySibling - * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, - * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 - * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 - * 则这些兄弟节点将被删除 - * @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"); - }, - /** - * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 - * @method split - * @param { Node } textNode 需要拆分的文本节点对象 - * @param { int } offset 需要拆分的位置, 位置计算从0开始 - * @return { Node } 拆分后形成的新节点 - * @example - * ```html - *
    abcdef
    - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Boolean } 检测的节点是否为空 - * @example - * ```html - *
    - * - *
    - * - * ``` - */ - isWhitespace: function(node) { - return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test( - node.nodeValue - ); - }, - /** - * 获取元素element相对于viewport的位置坐标 - * @method getXY - * @param { Node } element 需要计算位置的节点对象 - * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, - * y代表垂直偏移距离。 - * - * @example - * ```javascript - * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); - * //output: test的坐标为: 12, 24 - * 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 }; - }, - /** - * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 - * @method on - * @param { Node } element 需要绑定事件的节点对象 - * @param { String } type 绑定的事件类型 - * @param { Function } handler 事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.on(document.body,"click",function(e){ - * //e为事件对象,this为被点击元素对戏那个 - * }); - * ``` - */ - - /** - * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 - * @method on - * @param { Node } element 需要绑定事件的节点对象 - * @param { Array } type 绑定的事件类型数组 - * @param { Function } handler 事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - 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; - }, - /** - * 解除DOM事件绑定 - * @method un - * @param { Node } element 需要解除事件绑定的节点对象 - * @param { String } type 需要接触绑定的事件类型 - * @param { Function } handler 对应的事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.un(document.body,"click",function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - - /** - * 解除DOM事件绑定 - * @method un - * @param { Node } element 需要解除事件绑定的节点对象 - * @param { Array } type 需要接触绑定的事件类型数组 - * @param { Function } handler 对应的事件处理器 - * @example - * ```javascript - * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ - * //evt为事件对象,this为被点击元素对象 - * }); - * ``` - */ - 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]; - } - } - } - }, - - /** - * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 - * @method isSameElement - * @param { Node } nodeA 需要比较的节点 - * @param { Node } nodeB 需要比较的节点 - * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 - * @example - * ```html - * ssss - * bbbbb - * ssss - * bbbbb - * - * - * ``` - */ - 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++; - } - 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; - } - } - // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 - if (ie) { - for (i = 0; (attrB = otherAttrs[i++]); ) { - if (attrB.specified) { - bl++; - } - } - if (al != bl) { - return false; - } - } - return true; - }, - - /** - * 判断节点nodeA与节点nodeB的元素的style属性是否一致 - * @method isSameStyle - * @param { Node } nodeA 需要比较的节点 - * @param { Node } nodeB 需要比较的节点 - * @return { Boolean } 两个节点是否具有相同的style属性值 - * @example - * ```html - * ssss - * bbbbb - * ssss - * bbbbb - * - * - * ``` - */ - 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 || !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; - }, - /** - * 检查节点node是否为block元素 - * @method isBlockElm - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 是否是block元素节点 - * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; - * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 - * @example - * ```html - * - * - *
    - * - * - * ``` - */ - 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元素 - * @return { Boolean } 给定的元素是否是body元素 - * @example - * ```javascript - * //output: true - * console.log( UE.dom.domUtils.isBody( document.body ) ); - * ``` - */ - isBody: function(node) { - return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body"; - }, - /** - * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, - * 拆分形成的两个节点之间是node节点 - * @method breakParent - * @param { Node } node 作为分界的节点对象 - * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 - * @return { Node } 给定的node分界节点 - * @example - * ```javascript - * - * var node = document.createElement("span"), - * wrapNode = document.createElement( "div" ), - * parent = document.createElement("p"); - * - * parent.appendChild( node ); - * wrapNode.appendChild( parent ); - * - * //拆分前 - * //output:

    - * console.log( wrapNode.innerHTML ); - * - * - * UE.dom.domUtils.breakParent( node, parent ); - * //拆分后 - * //output:

    - * console.log( wrapNode.innerHTML ); - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 - * @example - * ```html - * => 1 - * => 1 - * => 1 - * 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; - }, - - /** - * 删除node节点下首尾两端的空白文本子节点 - * @method trimWhiteTextNode - * @param { Element } node 需要执行删除操作的元素对象 - * @example - * ```javascript - * var node = document.createElement("div"); - * - * node.appendChild( document.createTextNode( "" ) ); - * - * node.appendChild( document.createElement("div") ); - * - * node.appendChild( document.createTextNode( "" ) ); - * - * //3 - * console.log( node.childNodes.length ); - * - * UE.dom.domUtils.trimWhiteTextNode( node ); - * - * //1 - * 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"); - }, - - /** - * 合并node节点下相同的子节点 - * @name mergeChild - * @desc - * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 - * @example - *

    xxaaxx

    - * ==> 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]; - } - } - } - 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); - } - } - - return arr; - }, - /** - * 将节点node提取到父节点上 - * @method mergeToParent - * @param { Element } node 需要提取的元素对象 - * @example - * ```html - *
    - *
    - * - *
    - *
    - * - * - * ``` - */ - 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; - } - }, - /** - * 合并节点node的左右兄弟节点 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - - /** - * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @param { Boolean } ignorePre 是否忽略合并左节点 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - - /** - * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 - * @method mergeSibling - * @param { Element } node 需要合并的目标节点 - * @param { Boolean } ignorePre 是否忽略合并左节点 - * @param { Boolean } ignoreNext 是否忽略合并右节点 - * @remind 如果同时忽略左右节点, 则该操作什么也不会做 - * @example - * ```html - * xxxxoooxxxx - * - * - * ``` - */ - 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); - } - } - !ignorePre && merge("previousSibling", "firstChild", node); - !ignoreNext && merge("nextSibling", "lastChild", node); - }, - - /** - * 设置节点node及其子节点不会被选中 - * @method unSelectable - * @param { Element } node 需要执行操作的dom元素 - * @remind 执行该操作后的节点, 将不能被鼠标选中 - * @example - * ```javascript - * 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"); - } - } - } - : function(node) { - node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = - "none"; - }, - /** - * 删除节点node上的指定属性名称的属性 - * @method removeAttributes - * @param { Node } node 需要删除属性的节点对象 - * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 - * @example - * ```html - *
    - * xxxxx - *
    - * - * - * ``` - */ - - /** - * 删除节点node上的指定属性名称的属性 - * @method removeAttributes - * @param { Node } node 需要删除属性的节点对象 - * @param { Array } attrNames 需要删除的属性名数组 - * @example - * ```html - *
    - * xxxxx - *
    - * - * - * ``` - */ - 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节点创建 - * @param { String } tagName 需要创建的元素的标签名 - * @param { Object } attrs 新创建的元素的属性key-value集合 - * @return { Element } 新创建的元素对象 - * @example - * ```javascript - * var ele = UE.dom.domUtils.createElement( document, 'div', { - * id: 'test' - * } ); - * - * //output: DIV - * console.log( ele.tagName ); - * - * //output: test - * console.log( ele.id ); - * - * ``` - */ - createElement: function(doc, tag, attrs) { - return domUtils.setAttributes(doc.createElement(tag), attrs); - }, - /** - * 为节点node添加属性attrs,attrs为属性键值对 - * @method setAttributes - * @param { Element } node 需要设置属性的元素对象 - * @param { Object } attrs 需要设置的属性名-值对 - * @return { Element } 设置属性的元素对象 - * @example - * ```html - * - * - * - * - */ - setAttributes: function(node, attrs) { - for (var attr in attrs) { - if (attrs.hasOwnProperty(attr)) { - var value = attrs[attr]; - switch (attr) { - case "class": - //ie下要这样赋值,setAttribute不起作用 - node.className = value; - break; - case "style": - node.style.cssText = node.style.cssText + ";" + value; - break; - case "innerHTML": - node[attr] = value; - break; - case "value": - node.value = value; - break; - default: - node.setAttribute(attrFix[attr] || attr, value); - } - } - } - return node; - }, - - /** - * 获取元素element经过计算后的样式值 - * @method getComputedStyle - * @param { Element } element 需要获取样式的元素对象 - * @param { String } styleName 需要获取的样式名 - * @return { String } 获取到的样式值 - * @example - * ```html - * - * - * - * - * - * ``` - */ - 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)); - }, - /** - * 删除元素element指定的className - * @method removeClasses - * @param { Element } ele 需要删除class的元素节点 - * @param { String } classNames 需要删除的className, 多个className之间以空格分开 - * @example - * ```html - * xxx - * - * - * ``` - */ - - /** - * 删除元素element指定的className - * @method removeClasses - * @param { Element } ele 需要删除class的元素节点 - * @param { Array } classNames 需要删除的className数组 - * @example - * ```html - * xxx - * - * - * ``` - */ - 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的元素 - * @param { String } classNames 需要添加的className, 多个className之间以空格分割 - * @remind 相同的类名不会被重复添加 - * @example - * ```html - * - * - * - * ``` - */ - - /** - * 判断元素element是否包含给定的样式类名className - * @method hasClass - * @param { Node } ele 需要检测的元素 - * @param { Array } classNames 需要检测的className数组 - * @return { Boolean } 元素是否包含所有给定的className - * @example - * ```html - * - * - * - * ``` - */ - 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 需要阻止默认行为的事件对象 - * @example - * ```javascript - * UE.dom.domUtils.preventDefault( evt ); - * ``` - */ - preventDefault: function(evt) { - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - }, - /** - * 删除元素element指定的样式 - * @method removeStyle - * @param { Element } element 需要删除样式的元素 - * @param { String } styleName 需要删除的样式名 - * @example - * ```html - * - * - * - * ``` - */ - 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"]); - } - }, - /** - * 获取元素element的style属性的指定值 - * @method getStyle - * @param { Element } element 需要获取属性值的元素 - * @param { String } styleName 需要获取的style的名称 - * @warning 该方法仅获取元素style属性中所标明的值 - * @return { String } 该元素包含指定的style属性值 - * @example - * ```html - *
    - * - * - * ``` - */ - getStyle: function(element, name) { - var value = element.style[utils.cssStyleToDomStyle(name)]; - return utils.fixColor(name, value); - }, - /** - * 为元素element设置样式属性值 - * @method setStyle - * @param { Element } element 需要设置样式的元素 - * @param { String } styleName 样式名 - * @param { String } styleValue 样式值 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 需要设置样式的元素 - * @param { Object } styles 样式名值对 - * @example - * ```html - *
    - * - * - * ``` - */ - 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"); - }, - /** - * 获取子节点的数量 - * @method getChildCount - * @param { Element } node 需要检测的元素 - * @return { Number } 给定的node元素的子节点数量 - * @example - * ```html - *
    - * - *
    - * - * - * ``` - */ - - /** - * 根据给定的过滤规则, 获取符合条件的子节点的数量 - * @method getChildCount - * @param { Element } node 需要检测的元素 - * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false - * @return { Number } 符合过滤条件的node元素的子节点数量 - * @example - * ```html - *
    - * - *
    - * - * - * ``` - */ - 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 需要检测的节点对象 - * @return { Boolean } 节点是否为空 - * @example - * ```javascript - * UE.dom.domUtils.isEmptyNode( document.body ); - * ``` - */ - isEmptyNode: function(node) { - return ( - !node.firstChild || - domUtils.getChildCount(node, function(node) { - return ( - !domUtils.isBr(node) && - !domUtils.isBookmarkNode(node) && - !domUtils.isWhitespace(node) - ); - }) == 0 - ); - }, - 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 - }; - } - }; - 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"; - }, - /** - * 判断给定的节点是否是一个“填充”节点 - * @private - * @method isFillChar - * @param { Node } node 需要判断的节点 - * @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; - } - if (tmpNode) { - tmpRange.setStartBefore(tmpNode); - } else { - tmpRange.setStartBefore(tmpRange.startContainer); - } - } - } - return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; - }, - - /** - * 判断给定的元素是否是一个空元素 - * @method isEmptyBlock - * @param { Element } node 需要判断的元素 - * @return { Boolean } 是否是空元素 - * @example - * ```html - *
    - * - * - * ``` - */ - - /** - * 根据指定的判断规则判断给定的元素是否是一个空元素 - * @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"); - - 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 需要设置偏移量的元素 - * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 - * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 - * offset.top的距离 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 - * @param { DomDocument } doc 填充的节点所在的docment对象 - * @param { Node } node 需要填充的节点对象 - * @example - * ```html - *
    - * - * - * ``` - */ - 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 源节点, 该节点下的所有子节点将被移除 - * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 - * @example - * ```html - *
    - * - *
    - *
    - *
    - *
    - * - * - * ``` - */ - - /** - * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” - * @method moveChild - * @param { Node } src 源节点, 该节点下的所有子节点将被移除 - * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 - * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 - * @example - * ```html - *
    - * - *
    - *
    - *
    - *
    - * - * - * ``` - */ - 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 - * @param { Node } node 需要检测的节点对象 - * @return { Boolean } 节点是否不包含任何属性 - * @example - * ```html - *
    xxxx
    - * - * - * ``` - */ - hasNoAttributes: function(node) { - return browser.ie - ? /^<\w+\s*?>/.test(node.outerHTML) - : node.attributes.length == 0; - }, - - /** - * 检测节点是否是UEditor所使用的辅助节点 - * @method isCustomeNode - * @private - * @param { Node } node 需要检测的节点 - * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 - * @return { Boolean } 给定的节点是否是一个辅助节点 - */ - isCustomeNode: function(node) { - return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); - }, - - /** - * 检测节点的标签是否是给定的标签 - * @method isTagNode - * @param { Node } node 需要检测的节点对象 - * @param { String } tagName 标签 - * @return { Boolean } 节点的标签是否是给定的标签 - * @example - * ```html - *
    - * - * - * ``` - */ - isTagNode: function(node, tagNames) { - return ( - node.nodeType == 1 && - new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) - ); - }, - - /** - * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false - * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: null - * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() !== 'div'; - * } ) ); - * ``` - */ - - /** - * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 - * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: null - * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); - * ``` - */ - - /** - * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 - * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 - * @method filterNodeList - * @param { Array } nodeList 需要过滤的节点数组 - * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false - * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 - * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 - * 过滤条件的节点数组或第一个节点, 否则返回NULL - * @example - * ```javascript - * var divNodes = document.getElementsByTagName("div"); - * divNodes = [].slice.call( divNodes, 0 ); - * - * //output: 3(假定有3个div) - * console.log( divNodes.length ); - * - * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() === 'div'; - * }, true ); - * - * //output: 3 - * console.log( nodes.length ); - * - * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { - * return node.tagName.toLowerCase() === 'div'; - * }, false ); - * - * //output: div - * 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; - }, - - /** - * 查询给定的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; - } - 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"); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js deleted file mode 100644 index db4f986..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/dtd.js +++ /dev/null @@ -1,434 +0,0 @@ -///import editor.js -///import core/dom/dom.js -///import core/utils.js -/** - * dtd html语义化的体现类 - * @constructor - * @namespace dtd - */ -var dtd = (dom.dtd = (function() { - function _(s) { - for (var k in s) { - s[k.toUpperCase()] = s[k]; - } - 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 - }); - - 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 - }); -})()); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js deleted file mode 100644 index 49b0113..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filternode.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * UE过滤节点的静态方法 - * @file - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @module UE - */ - -/** - * 根据传入节点和过滤规则过滤相应节点 - * @module UE - * @since 1.2.6.1 - * @method filterNode - * @param { Object } root 指定root节点 - * @param { Object } rules 过滤规则json对象 - * @example - * ```javascript - * 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); - } - }); - 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); - } - } - 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; - }; -})()); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js deleted file mode 100644 index 8c0872e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/filterword.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * UE过滤word的静态方法 - * @file - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @module UE - */ - -/** - * 根据传入html字符串过滤word - * @module UE - * @since 1.2.6.1 - * @method filterWord - * @param { String } html html字符串 - * @return { String } 已过滤后的结果字符串 - * @example - * ```javascript - * 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; - } - - 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); - - for (var i = 0, v; (v = s[i]); i++) { - var name, - value, - parts = v.split(":"); - - 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; - } - - 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 (!/htmlparser

    ', true); - * ``` - */ - -var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { - //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 " - ); - } - html.push(""); - } - //禁止指定table-width - 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; - - //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" - }; - - 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)); - } - } - - 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; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js deleted file mode 100644 index e6d8f9f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/keymap.js +++ /dev/null @@ -1,48 +0,0 @@ -var keymap = (UE.keymap = { - Backspace: 8, - Tab: 9, - Enter: 13, - - Shift: 16, - Control: 17, - Alt: 18, - CapsLock: 20, - - Esc: 27, - - Spacebar: 32, - - PageUp: 33, - PageDown: 34, - End: 35, - Home: 36, - - Left: 37, - Up: 38, - Right: 39, - Down: 40, - - Insert: 45, - - Del: 46, - - NumLock: 144, - - Cmd: 91, - - "=": 187, - "-": 189, - - b: 66, - i: 73, - //回退 - z: 90, - y: 89, - //粘贴 - v: 86, - x: 88, - - s: 83, - - n: 78 -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js deleted file mode 100644 index c6b7949..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/loadconfig.js +++ /dev/null @@ -1,72 +0,0 @@ -;(function() { - UE.Editor.prototype.loadServerConfig = function() { - var me = this; - setTimeout(function() { - try { - me.options.imageUrl && - me.setOpt( - "serverUrl", - me.options.imageUrl.replace( - /^(.*[\/]).+([\.].+)$/, - "$1controller$2" - ) - ); - - 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); - 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' - //}); - } - }; - - 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); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js deleted file mode 100644 index 3945ccf..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/localstorage.js +++ /dev/null @@ -1,117 +0,0 @@ -//存储媒介封装 -var LocalStorage = (UE.LocalStorage = (function() { - var storage = window.localStorage || getUserData() || null, - LOCAL_FILE = "localStorage"; - - return { - saveLocalData: function(key, data) { - if (storage && data) { - storage.setItem(key, data); - return true; - } - - return false; - }, - - getLocalData: function(key) { - if (storage) { - return storage.getItem(key); - } - - return null; - }, - - removeItem: function(key) { - storage && storage.removeItem(key); - } - }; - - function getUserData() { - var container = document.createElement("div"); - container.style.display = "none"; - - if (!container.addBehavior) { - return null; - } - - container.addBehavior("#default#userdata"); - - return { - getItem: function(key) { - var result = null; - - try { - document.body.appendChild(container); - container.load(LOCAL_FILE); - result = container.getAttribute(key); - document.body.removeChild(container); - } catch (e) {} - - return result; - }, - - setItem: function(key, value) { - document.body.appendChild(container); - container.setAttribute(key, value); - container.save(LOCAL_FILE); - document.body.removeChild(container); - }, - - //// 暂时没有用到 - //clear: function () { - // - // var expiresTime = new Date(); - // expiresTime.setFullYear(expiresTime.getFullYear() - 1); - // document.body.appendChild(container); - // container.expires = expiresTime.toUTCString(); - // container.save(LOCAL_FILE); - // document.body.removeChild(container); - // - //}, - - removeItem: function(key) { - document.body.appendChild(container); - container.removeAttribute(key); - container.save(LOCAL_FILE); - document.body.removeChild(container); - } - }; - } -})()); - -;(function() { - var ROOTKEY = "ueditor_preference"; - - UE.Editor.prototype.setPreferences = function(key, value) { - var obj = {}; - if (utils.isString(key)) { - obj[key] = value; - } else { - obj = key; - } - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - utils.extend(data, obj); - } else { - data = obj; - } - data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); - }; - - UE.Editor.prototype.getPreferences = function(key) { - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - return key ? data[key] : data; - } - return null; - }; - - UE.Editor.prototype.removePreferences = function(key) { - var data = LocalStorage.getLocalData(ROOTKEY); - if (data && (data = utils.str2json(data))) { - data[key] = undefined; - delete data[key]; - } - data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js deleted file mode 100644 index 35a95b8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/node.js +++ /dev/null @@ -1,772 +0,0 @@ -/** - * 编辑器模拟的节点类 - * @file - * @module UE - * @class uNode - * @since 1.2.6.1 - */ - -/** - * UEditor公用空间,UEditor所有的功能都挂载在该空间下 - * @unfile - * @module UE - */ - -;(function() { - /** - * 编辑器模拟的节点类 - * @unfile - * @module UE - * @class uNode - */ - - /** - * 通过一个键值对,创建一个uNode对象 - * @constructor - * @param { Object } attr 传入要创建的uNode的初始属性 - * @example - * ```javascript - * var node = new uNode({ - * type:'element', - * tagName:'span', - * attrs:{style:'font-size:14px;'} - * }) - * ``` - */ - 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; - }); - - 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); - } - } - - //创建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 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] ? "/" : "") + - ">" - ); - //插入新行 - 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); - } - 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); - } - } - 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; - } - } - } - } - - 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字符串 - * @example - * ```javascript - * node.toHtml(); - * ``` - */ - - /** - * 当前节点对象,转换成html文本 - * @method toHtml - * @param { Boolean } formatter 是否格式化返回值 - * @return { String } 返回转换后的html字符串 - * @example - * ```javascript - * node.toHtml( true ); - * ``` - */ - toHtml: function(formatter) { - var arr = []; - nodeToHtml(this, arr, formatter, 0); - return arr.join(""); - }, - - /** - * 获取节点的html内容 - * @method innerHTML - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @return { String } 返回节点的html内容 - * @example - * ```javascript - * var htmlstr = node.innerHTML(); - * ``` - */ - - /** - * 设置节点的html内容 - * @method innerHTML - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @param { String } htmlstr 传入要设置的html内容 - * @return { UE.uNode } 返回节点本身 - * @example - * ```javascript - * 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(); - } - }, - - /** - * 获取节点的纯文本内容 - * @method innerText - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @return { String } 返回节点的存文本内容 - * @example - * ```javascript - * var textStr = node.innerText(); - * ``` - */ - - /** - * 设置节点的纯文本内容 - * @method innerText - * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 - * @param { String } textStr 传入要设置的文本内容 - * @return { UE.uNode } 返回节点本身 - * @example - * ```javascript - * 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, ""); - } - }, - - /** - * 获取当前对象的data属性 - * @method getData - * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 - * @example - * ```javascript - * node.getData(); - * ``` - */ - getData: function() { - if (this.type == "element") return ""; - return this.data; - }, - - /** - * 获取当前节点下的第一个子节点 - * @method firstChild - * @return { UE.uNode } 返回第一个子节点 - * @example - * ```javascript - * node.firstChild(); //返回第一个子节点 - * ``` - */ - firstChild: function() { - // if (this.type != 'element' || dtd.$empty[this.tagName]) { - // return this; - // } - return this.children ? this.children[0] : null; - }, - - /** - * 获取当前节点下的最后一个子节点 - * @method lastChild - * @return { UE.uNode } 返回最后一个子节点 - * @example - * ```javascript - * node.lastChild(); //返回最后一个子节点 - * ``` - */ - 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 } 返回前一个节点 - * @example - * ```javascript - * 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]; - } - } - }, - - /** - * 获取和当前节点有相同父亲节点的后一个节点 - * @method nextSibling - * @return { UE.uNode } 返回后一个节点,找不到返回null - * @example - * ```javascript - * 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]; - } - } - }, - - /** - * 用新的节点替换当前节点 - * @method replaceChild - * @param { UE.uNode } target 要替换成该节点参数 - * @param { UE.uNode } source 要被替换掉的节点 - * @return { UE.uNode } 返回替换之后的节点对象 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在节点的子节点列表最后位置插入一个节点 - * @method appendChild - * @param { UE.uNode } node 要插入的节点 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - }, - - /** - * 在传入节点的前面插入一个节点 - * @method insertBefore - * @param { UE.uNode } target 要插入的节点 - * @param { UE.uNode } source 在该参数节点前面插入 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在传入节点的后面插入一个节点 - * @method insertAfter - * @param { UE.uNode } target 要插入的节点 - * @param { UE.uNode } source 在该参数节点后面插入 - * @return { UE.uNode } 返回刚插入的子节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 从当前节点的子节点列表中,移除节点 - * @method removeChild - * @param { UE.uNode } node 要移除的节点引用 - * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 - * @return { * } 返回刚移除的子节点 - * @example - * ```javascript - * 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; - } - } - return ci; - } - } - } - }, - - /** - * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 - * @method getAttr - * @param { String } attrName 要获取的属性名称 - * @return { * } 返回attrs对象下的属性值 - * @example - * ```javascript - * node.getAttr('title'); - * ``` - */ - getAttr: function(attrName) { - return this.attrs && this.attrs[attrName.toLowerCase()]; - }, - - /** - * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 - * @method setAttr - * @param { String } attrName 要设置的属性名称 - * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 - * @return { * } 返回attrs对象下的属性值 - * @example - * ```javascript - * 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; - } - } - }, - - /** - * 获取当前节点在父节点下的位置索引 - * @method getIndex - * @return { Number } 返回索引数值,如果没有父节点,返回-1 - * @example - * ```javascript - * 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; - }, - - /** - * 在当前节点下,根据id查找节点 - * @method getNodeById - * @param { String } id 要查找的id - * @return { UE.uNode } 返回找到的节点 - * @example - * ```javascript - * 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; - } - } - } - }, - - /** - * 在当前节点下,根据元素名称查找节点列表 - * @method getNodesByTagName - * @param { String } tagNames 要查找的元素名称 - * @return { Array } 返回找到的节点列表 - * @example - * ```javascript - * 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; - }, - - /** - * 根据样式名称,获取节点的样式值 - * @method getStyle - * @param { String } name 要获取的样式名称 - * @return { String } 返回样式值 - * @example - * ```javascript - * 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 ""; - }, - - /** - * 给节点设置样式 - * @method setStyle - * @param { String } name 要设置的的样式名称 - * @param { String } val 要设置的的样值 - * @example - * ```javascript - * 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; - } - } - - 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 遍历到节点的时,传入节点作为参数,运行此函数 - * @example - * ```javascript - * traversal(node, function(){ - * console.log(node.type); - * }); - * ``` - */ - traversal: function(fn) { - if (this.children && this.children.length) { - nodeTraversal(this, fn); - } - return this; - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js deleted file mode 100644 index 7b57fe8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/plugin.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: campaign - * Date: 10/8/13 - * 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); - } - }); - } - } 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); - } - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js deleted file mode 100644 index 022c3d2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/core/utils.js +++ /dev/null @@ -1,1279 +0,0 @@ -/** - * 工具函数包 - * @file - * @module UE.utils - * @since 1.2.6.1 - */ - -/** - * UEditor封装使用的静态工具函数 - * @module UE.utils - * @unfile - */ - -var utils = (UE.utils = { - /** - * 用给定的迭代器遍历对象 - * @method each - * @param { Object } obj 需要遍历的对象 - * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key - * @example - * ```javascript - * var demoObj = { - * key1: 1, - * key2: 2 - * }; - * - * //output: key1: 1, key2: 2 - * UE.utils.each( demoObj, funciton ( value, key ) { - * - * console.log( key + ":" + value ); - * - * } ); - * ``` - */ - - /** - * 用给定的迭代器遍历数组或类数组对象 - * @method each - * @param { Array } array 需要遍历的数组或者类数组 - * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key - * @example - * ```javascript - * var divs = document.getElmentByTagNames( "div" ); - * - * //output: 0: DIV, 1: DIV ... - * UE.utils.each( divs, funciton ( value, key ) { - * - * console.log( key + ":" + value.tagName ); - * - * } ); - * ``` - */ - 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 该对象将作为新创建对象的原型 - * @return { Object } 新的对象, 该对象的原型是给定的protoObject对象 - * @example - * ```javascript - * - * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } }; - * - * var newObject = UE.utils.makeInstance( protoObject ); - * //output: Hello UEditor! - * newObject.sayHello(); - * ``` - */ - 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 ); - * - * ``` - */ - - /** - * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与 - * 源对象属性名相同的属性值。 - * @method extend - * @param { Object } target 目标对象, 新的属性将附加到该对象上 - * @param { Object } source 源对象, 该对象的属性会被附加到target对象上 - * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性 - * @return { Object } 返回target对象 - * @example - * ```javascript - * - * var target = { name: 'target', sex: 1 }, - * source = { name: 'source', age: 17 }; - * - * UE.utils.extend( target, source, true ); - * - * //output: { name: 'target', sex: 1, age: 17 } - * console.log( target ); - * - * ``` - */ - extend: function(t, s, b) { - if (s) { - for (var k in s) { - if (!b || !t.hasOwnProperty(k)) { - t[k] = s[k]; - } - } - } - return t; - }, - - /** - * 将给定的多个对象的属性复制到目标对象target上 - * @method extend2 - * @remind 该方法将强制把源对象上的属性复制到target对象上 - * @remind 该方法支持两个及以上的参数, 从第二个参数开始, 其属性都会被复制到第一个参数上。 如果遇到同名的属性, - * 将会覆盖掉之前的值。 - * @param { Object } target 目标对象, 新的属性将附加到该对象上 - * @param { Object... } source 源对象, 支持多个对象, 该对象的属性会被附加到target对象上 - * @return { Object } 返回target对象 - * @example - * ```javascript - * - * var target = {}, - * source1 = { name: 'source', age: 17 }, - * source2 = { title: 'dev' }; - * - * UE.utils.extend2( target, source1, source2 ); - * - * //output: { name: 'source', age: 17, title: 'dev' } - * console.log( target ); - * - * ``` - */ - 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; - }, - - /** - * 模拟继承机制, 使得subClass继承自superClass - * @method inherits - * @param { Object } subClass 子类对象 - * @param { Object } superClass 超类对象 - * @warning 该方法只能让subClass继承超类的原型, subClass对象自身的属性和方法不会被继承 - * @return { Object } 继承superClass后的子类对象 - * @example - * ```javascript - * function SuperClass(){ - * this.name = "小李"; - * } - * - * SuperClass.prototype = { - * hello:function(str){ - * console.log(this.name + str); - * } - * } - * - * function SubClass(){ - * this.name = "小张"; - * } - * - * UE.utils.inherits(SubClass,SuperClass); - * - * var sub = new SubClass(); - * //output: '小张早上好! - * 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); - }, - - /** - * 用指定的context对象作为函数fn的上下文 - * @method bind - * @param { Function } fn 需要绑定上下文的函数对象 - * @param { Object } content 函数fn新的上下文对象 - * @return { Function } 一个新的函数, 该函数作为原始函数fn的代理, 将完成fn的上下文调换工作。 - * @example - * ```javascript - * - * var name = 'window', - * newTest = null; - * - * function test () { - * console.log( this.name ); - * } - * - * newTest = UE.utils.bind( test, { name: 'object' } ); - * - * //output: object - * newTest(); - * - * //output: window - * test(); - * - * ``` - */ - bind: function(fn, context) { - return function() { - return fn.apply(context, arguments); - }; - }, - - /** - * 创建延迟指定时间后执行的函数fn - * @method defer - * @param { Function } fn 需要延迟执行的函数对象 - * @param { int } delay 延迟的时间, 单位是毫秒 - * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, - * 而不能保证刚好到达延迟时间时执行。 - * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 - * @example - * ```javascript - * var start = 0; - * - * function test(){ - * console.log( new Date() - start ); - * } - * - * var testDefer = UE.utils.defer( test, 1000 ); - * // - * start = new Date(); - * //output: (大约在1000毫秒之后输出) 1000 - * testDefer(); - * ``` - */ - - /** - * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值, - * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。 - * @method defer - * @param { Function } fn 需要延迟执行的函数对象 - * @param { int } delay 延迟的时间, 单位是毫秒 - * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数,该值将决定是否取消执行前一次函数的执行, - * 值为true表示取消执行, 反之则将在执行前一次函数之后才执行本次函数调用。 - * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后, - * 而不能保证刚好到达延迟时间时执行。 - * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果 - * @example - * ```javascript - * - * function test(){ - * console.log(1); - * } - * - * var testDefer = UE.utils.defer( test, 1000, true ); - * - * //output: (两次调用仅有一次输出) 1 - * testDefer(); - * testDefer(); - * ``` - */ - defer: function(fn, delay, exclusion) { - var timerID; - return function() { - if (exclusion) { - clearTimeout(timerID); - } - timerID = setTimeout(fn, delay); - }; - }, - - /** - * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1 - * @method indexOf - * @remind 该方法的匹配过程使用的是恒等“===” - * @param { Array } array 需要查找的数组对象 - * @param { * } item 需要在目标数组中查找的值 - * @return { int } 返回item在目标数组array中首次出现的位置, 如果在数组中未找到item, 则返回-1 - * @example - * ```javascript - * var item = 1, - * arr = [ 3, 4, 6, 8, 1, 1, 2 ]; - * - * //output: 4 - * console.log( UE.utils.indexOf( arr, item ) ); - * ``` - */ - - /** - * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。 - * @method indexOf - * @remind 该方法的匹配过程使用的是恒等“===” - * @param { Array } array 需要查找的数组对象 - * @param { * } item 需要在目标数组中查找的值 - * @param { int } start 搜索的起始位置 - * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置, 如果在数组中未找到item, 则返回-1 - * @example - * ```javascript - * var item = 1, - * arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ]; - * - * //output: 9 - * 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; - }, - - /** - * 移除数组array中所有的元素item - * @method removeItem - * @param { Array } array 要移除元素的目标数组 - * @param { * } item 将要被移除的元素 - * @remind 该方法的匹配过程使用的是恒等“===” - * @example - * ```javascript - * var arr = [ 4, 5, 7, 1, 3, 4, 6 ]; - * - * UE.utils.removeItem( arr, 4 ); - * //output: [ 5, 7, 1, 3, 6 ] - * console.log( arr ); - * - * ``` - */ - 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 需要删除首尾空格的字符串 - * @return { String } 删除了首尾的空格后的字符串 - * @example - * ```javascript - * - * var str = " UEdtior "; - * - * //output: 9 - * console.log( str.length ); - * - * //output: 7 - * console.log( UE.utils.trim( " UEdtior " ).length ); - * - * //output: 9 - * console.log( str.length ); - * - * ``` - */ - trim: function(str) { - return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); - }, - - /** - * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 - * @method listToMap - * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 - * @param { String } str 该字符串将被以','分割为数组, 然后进行转化 - * @return { Object } 转化之后的hash对象 - * @example - * ```javascript - * - * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} - * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) ); - * - * ``` - */ - - /** - * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1 - * @method listToMap - * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。 - * @param { Array } arr 字符串数组 - * @return { Object } 转化之后的hash对象 - * @example - * ```javascript - * - * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1} - * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) ); - * - * ``` - */ - 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 需要转义的字符串 - * @return { String } 转义后的字符串 - * @example - * ```javascript - * var html = '&'; - * - * //output: <body>&</body> - * console.log( UE.utils.unhtml( html ) ); - * - * ``` - */ - 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 - * @param { String } str 需要逆转义的字符串 - * @return { String } 逆转义后的字符串 - * @example - * ```javascript - * - * var str = '<body>&</body>'; - * - * //output: & - * console.log( UE.utils.html( str ) ); - * - * ``` - */ - 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样式名 - * @return { String } 转换成驼峰形式后的css样式名 - * @example - * ```javascript - * - * var str = 'border-top'; - * - * //output: borderTop - * console.log( UE.utils.cssStyleToDomStyle( str ) ); - * - * ``` - */ - 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(); - })) - ); - }; - })(), - - /** - * 动态加载文件到doc中 - * @method loadFile - * @param { DomDocument } document 需要加载资源文件的文档对象 - * @param { Object } options 加载资源文件的属性集合, 取值请参考代码示例 - * @example - * ```javascript - * - * UE.utils.loadFile( document, { - * src:"test.js", - * tag:"script", - * type:"text/javascript", - * defer:"defer" - * } ); - * - * ``` - */ - - /** - * 动态加载文件到doc中,加载成功后执行的回调函数fn - * @method loadFile - * @param { DomDocument } document 需要加载资源文件的文档对象 - * @param { Object } options 加载资源文件的属性集合, 该集合支持的值是script标签和style标签支持的所有属性。 - * @param { Function } fn 资源文件加载成功之后执行的回调 - * @warning 对于在同一个文档中多次加载同一URL的文件, 该方法会在第一次加载之后缓存该请求, - * 在此之后的所有同一URL的请求, 将会直接触发回调。 - * @example - * ```javascript - * - * UE.utils.loadFile( document, { - * src:"test.js", - * tag:"script", - * type:"text/javascript", - * defer:"defer" - * }, function () { - * console.log('加载成功'); - * } ); - * - * ``` - */ - 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(); - } - } - element.onload = element.onreadystatechange = null; - } - }; - element.onerror = function() { - throw Error( - "The load " + - (obj.href || obj.src) + - " fails,check the url settings of file neditor.config.js " - ); - }; - doc.getElementsByTagName("head")[0].appendChild(element); - }; - })(), - - /** - * 判断obj对象是否为空 - * @method isEmptyObject - * @param { * } obj 需要判断的对象 - * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空, - * 返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true - * @return { Boolean } 对象是否为空 - * @example - * ```javascript - * - * //output: true - * console.log( UE.utils.isEmptyObject( {} ) ); - * - * //output: true - * console.log( UE.utils.isEmptyObject( [] ) ); - * - * //output: true - * console.log( UE.utils.isEmptyObject( "" ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( { key: 1 } ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( [1] ) ); - * - * //output: false - * console.log( UE.utils.isEmptyObject( "1" ) ); - * - * ``` - */ - 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格式的颜色值 - * @param { String } - * @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; - }, - /** - * 只针对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; - } - } - 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 + ";;" : ";"; - }); - }, - - /** - * 克隆对象 - * @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; - } - } - } - return target; - }, - - /** - * 把cm/pt为单位的值转换为px为单位的值 - * @method transUnitToPx - * @param { String } 待转换的带单位的字符串 - * @return { String } 转换为px为计量单位的值的字符串 - * @example - * ```javascript - * - * //output: 500px - * console.log( UE.utils.transUnitToPx( '20cm' ) ); - * - * //output: 27px - * console.log( UE.utils.transUnitToPx( '20pt' ) ); - * - * ``` - */ - 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, 那么回调函数将立刻执行 - * @param { Function } fn dom树ready之后的回调函数 - * @example - * ```javascript - * - * UE.utils.domReady( function () { - * - * console.log('123'); - * - * } ); - * - * ``` - */ - 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; - } - 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 } 节点名称 - * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上']) - * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null //给body添加背景颜色 - * @grammar UE.utils.cssRule('body') =>样式的字符串 //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc} - * @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; - }, - 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)); - } - } - } - result.push("}"); - return result.join(""); - } - } - }; - } - })(), - renderTplstr: function(tpl, data) { - return tpl.replace(/\$\{\s*(\w*?)\s*\}/g, function (match, variable) { - if (data.hasOwnProperty(variable)) { - return data[variable]; - } - }); - } -}); -/** - * 判断给定的对象是否是字符串 - * @method isString - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是字符串 - */ - -/** - * 判断给定的对象是否是数组 - * @method isArray - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是数组 - */ - -/** - * 判断给定的对象是否是一个Function - * @method isFunction - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Function - */ - -/** - * 判断给定的对象是否是Number - * @method isNumber - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Number - */ - -/** - * 判断给定的对象是否是一个正则表达式 - * @method isRegExp - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是正则表达式 - */ - -/** - * 判断给定的对象是否是一个普通对象 - * @method isObject - * @param { * } object 需要判断的对象 - * @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 + "]"; - }; - } -); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js deleted file mode 100644 index eea033e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/editor.js +++ /dev/null @@ -1,15 +0,0 @@ -UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}; - -var baidu = window.baidu || {}; - -window.baidu = baidu; - -window.UE = baidu.editor = { - plugins: {}, - commands: {}, - instants: {}, - I18N: {}, - _customizeUI: {}, - version: "1.5.0" -}; -var dom = (UE.dom = {}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js deleted file mode 100644 index 329a378..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/anchor.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * 锚点插件,为UEditor提供插入锚点支持 - * @file - * @since 1.2.6.1 - */ -UE.plugin.register("anchor", function () { - var me = this; - 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: 16px;}", - 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); - } - } else { - if (name) { - //只在选区的开始插入 - var anchor = utils.renderTplstr('', { - name: name - }); - me.execCommand("inserthtml", anchor, true); - } - } - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js deleted file mode 100644 index 92716a4..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autofloat.js +++ /dev/null @@ -1,157 +0,0 @@ -///import core -///commands 悬浮工具栏 -///commandsName AutoFloat,autoFloatEnabled -///commandsTitle 悬浮工具栏 -/** - * 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; - - //如果不固定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; - } - - 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); - //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar - var scrollBox = document.getElementById("scrollBox"); - if (scrollBox) { - domUtils.un(scrollBox, ['scroll','resize'], 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 = me.ui.getDom("iframeholder").offsetHeight + "px"; - if (LteIE6) { - fixIE6FixedPos(); - } - domUtils.on(window, ["scroll", "resize"], updateFloating); - me.addListener("keydown", defer_updateFloating); - //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar - var scrollBox = document.getElementById("scrollBox"); - if (scrollBox) { - domUtils.on(scrollBox, ['scroll','resize'], 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); - }); - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js deleted file mode 100644 index 193c71e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoheight.js +++ /dev/null @@ -1,125 +0,0 @@ -///import core -///commands 当输入内容超过编辑器高度时,编辑器自动增高 -///commandsName AutoHeight,autoHeightEnabled -///commandsTitle 自动增高 -/** - * @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() { - 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; - } - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js deleted file mode 100644 index bb8c29a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autolink.js +++ /dev/null @@ -1,218 +0,0 @@ -///import core -///commands 为非ie浏览器自动添加a标签 -///commandsName AutoLink -///commandsTitle 自动增加链接 -/** - * @description 为非ie浏览器自动添加a标签 - * @author zhanyi - */ - -UE.plugin.register( - "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; - - 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; - } - - 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); - - 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(); - } - } - } - } - } - : {}; - }, - 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; - - 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; - } - } - 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); - } - } - } - }); - } -); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js deleted file mode 100644 index 7bf11ae..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosave.js +++ /dev/null @@ -1,128 +0,0 @@ -UE.plugin.register("autosave", function() { - var me = this, - //无限循环保护 - lastSaveTime = new Date(), - //最小保存间隔时间 - MIN_TIME = 20, - //auto save key - saveKey = null; - - function save(editor) { - var saveData; - - if (new Date() - lastSaveTime < MIN_TIME) { - return; - } - - if (!editor.hasContents()) { - //这里不能调用命令来删除, 会造成事件死循环 - saveKey && me.removePreferences(saveKey); - return; - } - - lastSaveTime = new Date(); - - editor._saveFlag = null; - - saveData = me.body.innerHTML; - - if ( - editor.fireEvent("beforeautosave", { - content: saveData - }) === false - ) { - return; - } - - me.setPreferences(saveKey, saveData); - - editor.fireEvent("afterautosave", { - content: saveData - }); - } - - return { - defaultOptions: { - //默认间隔时间 - saveInterval: 500, - enableAutoSave: true - }, - bindEvents: { - ready: function() { - var _suffix = "-drafts-data", - key = null; - - if (me.key) { - key = me.key + _suffix; - } else { - key = (me.container.parentNode.id || "ue-common") + _suffix; - } - - //页面地址+编辑器ID 保持唯一 - saveKey = - (location.protocol + location.host + location.pathname).replace( - /[.:\/]/g, - "_" - ) + key; - }, - - contentchange: function() { - if (!me.getOpt("enableAutoSave")) { - return; - } - - if (!saveKey) { - return; - } - - if (me._saveFlag) { - window.clearTimeout(me._saveFlag); - } - - if (me.options.saveInterval > 0) { - me._saveFlag = window.setTimeout(function() { - save(me); - }, me.options.saveInterval); - } else { - save(me); - } - } - }, - commands: { - clearlocaldata: { - execCommand: function(cmd, name) { - if (saveKey && me.getPreferences(saveKey)) { - me.removePreferences(saveKey); - } - }, - notNeedUndo: true, - ignoreContentChange: true - }, - - getlocaldata: { - execCommand: function(cmd, name) { - return saveKey ? me.getPreferences(saveKey) || "" : ""; - }, - notNeedUndo: true, - ignoreContentChange: true - }, - - drafts: { - execCommand: function(cmd, name) { - if (saveKey) { - window.setTimeout(function(){ - me.body.innerHTML = - me.getPreferences(saveKey) || "

    " + domUtils.fillHtml + "

    "; - // me.focus(true); - }, 0); - } - }, - queryCommandState: function() { - return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1; - }, - notNeedUndo: true, - ignoreContentChange: true - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js deleted file mode 100644 index 5165efe..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autosubmit.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 快捷键提交 - * @file - * @since 1.2.6.1 - */ - -/** - * 提交表单 - * @command autosubmit - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'autosubmit' ); - * ``` - */ - -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(); - } - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js deleted file mode 100644 index 680db58..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autotypeset.js +++ /dev/null @@ -1,354 +0,0 @@ -/** - * 自动排版 - * @file - * @since 1.2.6.1 - */ - -/** - * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 - * @command autotypeset - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'autotypeset' ); - * ``` - */ - -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 - } - }); - - 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) { - 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"); - - 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); - } - }); - 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); - } - }); - 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) { - me.addListener("beforepaste", autotype); - } - autotype.call(me); - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js deleted file mode 100644 index 7579d31..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/autoupload.js +++ /dev/null @@ -1,229 +0,0 @@ -/** - * @description - * 1.拖放文件到编辑区域,自动上传并插入到选区 - * 2.插入粘贴板的图片,自动上传并插入到选区 - * @author Jinqn - * @date 2013-10-14 - */ -UE.plugin.register("autoupload", function() { - function sendAndInsertFile(file, editor) { - var me = editor; - //模拟数据 - var fieldName, - urlPrefix, - maxSize, - allowFiles, - actionUrl, - loadingHtml, - errorHandler, - successHandler, - filetype = /image\/\w+/i.test(file.type) ? "image" : "file", - loadingId = "loading_" + (+new Date()).toString(36); - - fieldName = me.getOpt(filetype + "FieldName"); - urlPrefix = me.getOpt(filetype + "UrlPrefix"); - maxSize = me.getOpt(filetype + "MaxSize"); - allowFiles = me.getOpt(filetype + "AllowFiles"); - actionUrl = me.getActionUrl(me.getOpt(filetype + "ActionName")); - errorHandler = function(title) { - var loader = me.document.getElementById(loadingId); - loader && domUtils.remove(loader); - me.fireEvent("showmessage", { - id: loadingId, - content: title, - type: "error", - timeout: 4000 - }); - }; - - if (filetype == "image") { - loadingHtml = - ''; - successHandler = function(data) { - var link = urlPrefix + data.url, - loader = me.document.getElementById(loadingId); - if (loader) { - domUtils.removeClasses(loader, "loadingclass"); - loader.setAttribute("src", link); - loader.setAttribute("_src", link); - loader.setAttribute("alt", data.original || ""); - loader.removeAttribute("id"); - me.trigger("contentchange", loader); - } - }; - } else { - loadingHtml = - "

    " + - '' + - "

    "; - successHandler = function(data) { - var link = urlPrefix + data.url, - loader = me.document.getElementById(loadingId); - - var rng = me.selection.getRange(), - bk = rng.createBookmark(); - rng.selectNode(loader).select(); - me.execCommand("insertfile", { url: link }); - rng.moveToBookmark(bk).select(); - }; - } - - /* 插入loading的占位符 */ - me.execCommand("inserthtml", loadingHtml); - /* 判断后端配置是否没有加载成功 */ - if (!me.getOpt(filetype + "ActionName")) { - errorHandler(me.getLang("autoupload.errorLoadConfig")); - return; - } - /* 判断文件大小是否超出限制 */ - if (file.size > maxSize) { - errorHandler(me.getLang("autoupload.exceedSizeError")); - return; - } - /* 判断文件格式是否超出允许 */ - var fileext = file.name ? file.name.substr(file.name.lastIndexOf(".")) : ""; - if ( - (fileext && filetype != "image") || - (allowFiles && - (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") == -1) - ) { - errorHandler(me.getLang("autoupload.exceedTypeError")); - return; - } - - /* 创建Ajax并提交 */ - var xhr = new XMLHttpRequest(), - fd = new FormData(), - params = utils.serializeParam(me.queryCommandValue("serverparam")) || "", - url = utils.formatUrl( - actionUrl + (actionUrl.indexOf("?") == -1 ? "?" : "&") + params - ); - - fd.append( - fieldName, - file, - file.name || "blob." + file.type.substr("image/".length) - ); - fd.append("type", "ajax"); - xhr.open("post", url, true); - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - xhr.addEventListener("load", function(e) { - try { - var json = new Function("return " + utils.trim(e.target.response))(); - if (json.state == "SUCCESS" && json.url) { - successHandler(json); - } else { - errorHandler(json.state); - } - } catch (er) { - errorHandler(me.getLang("autoupload.loadError")); - } - }); - xhr.send(fd); - } - - function getPasteImage(e) { - return e.clipboardData && - e.clipboardData.items && - e.clipboardData.items.length == 1 && - /^image\//.test(e.clipboardData.items[0].type) - ? e.clipboardData.items - : null; - } - function getDropImage(e) { - return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; - } - - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(n) { - if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { - n.parentNode.removeChild(n); - } - }); - utils.each(root.getNodesByTagName("p"), function(n) { - if (/\bloadpara\b/.test(n.getAttr("class"))) { - n.parentNode.removeChild(n); - } - }); - }, - bindEvents: { - defaultOptions: { - //默认间隔时间 - enableDragUpload: true, - enablePasteUpload: true - }, - //插入粘贴板的图片,拖放插入图片 - ready: function(e) { - var me = this; - if (window.FormData && window.FileReader) { - var handler = function(e) { - var hasImg = false, - items; - //获取粘贴板文件列表或者拖放文件列表 - items = e.type == "paste" ? getPasteImage(e) : getDropImage(e); - if (items) { - var len = items.length, - file; - while (len--) { - file = items[len]; - if (file.getAsFile) file = file.getAsFile(); - if (file && file.size > 0) { - sendAndInsertFile(file, me); - hasImg = true; - } - } - hasImg && e.preventDefault(); - } - }; - - if (me.getOpt("enablePasteUpload") !== false) { - domUtils.on(me.body, "paste ", handler); - } - if (me.getOpt("enableDragUpload") !== false) { - domUtils.on(me.body, "drop", handler); - //取消拖放图片时出现的文字光标位置提示 - domUtils.on(me.body, "dragover", function(e) { - if (e.dataTransfer.types[0] == "Files") { - e.preventDefault(); - } - }); - } else { - if (browser.gecko) { - domUtils.on(me.body, "drop", function(e) { - if (getDropImage(e)) { - e.preventDefault(); - } - }); - } - } - - //设置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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" + - "}", - this.document - ); - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js deleted file mode 100644 index bccaf2a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/background.js +++ /dev/null @@ -1,130 +0,0 @@ -/** - * 背景插件,为UEditor提供设置背景功能 - * @file - * @since 1.2.6.1 - */ -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); - } - } - //重写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 - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js deleted file mode 100644 index 70ebae1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/basestyle.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * B、I、sub、super命令支持 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["basestyle"] = function() { - /** - * 字体加粗 - * @command bold - * @param { String } cmd 命令字符串 - * @remind 对已加粗的文本内容执行该命令, 将取消加粗 - * @method execCommand - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行加粗操作 - * //第一次执行, 文本内容加粗 - * editor.execCommand( 'bold' ); - * - * //第二次执行, 文本内容取消加粗 - * editor.execCommand( 'bold' ); - * ``` - */ - - /** - * 字体倾斜 - * @command italic - * @method execCommand - * @param { String } cmd 命令字符串 - * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行斜体操作 - * //第一次操作, 文本内容将变成斜体 - * editor.execCommand( 'italic' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'italic' ); - * ``` - */ - - /** - * 下标文本,与“superscript”命令互斥 - * @command subscript - * @method execCommand - * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行下标操作 - * //第一次操作, 文本内容将变成下标文本 - * editor.execCommand( 'subscript' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'subscript' ); - * ``` - */ - - /** - * 上标文本,与“subscript”命令互斥 - * @command superscript - * @method execCommand - * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //对当前选中的文本内容执行上标操作 - * //第一次操作, 文本内容将变成上标文本 - * editor.execCommand( 'superscript' ); - * - * //再次对同一文本内容执行, 则文本内容将恢复正常 - * editor.execCommand( 'superscript' ); - * ``` - */ - var basestyles = { - bold: ["strong", "b"], - italic: ["em", "i"], - subscript: ["sub"], - superscript: ["sup"] - }, - getObj = function(editor, tagNames) { - return domUtils.filterNodeList( - editor.selection.getStartElementPath(), - tagNames - ); - }, - me = this; - //添加快捷键 - me.addshortcutkey({ - Bold: "ctrl+66", //^B - Italic: "ctrl+73", //^I - Underline: "ctrl+85" //^U - }); - me.addInputRule(function(root) { - utils.each(root.getNodesByTagName("b i"), function(node) { - switch (node.tagName) { - case "b": - node.tagName = "strong"; - break; - case "i": - node.tagName = "em"; - } - }); - }); - for (var style in basestyles) { - (function(cmd, tagNames) { - me.commands[cmd] = { - execCommand: function(cmdName) { - var range = me.selection.getRange(), - obj = getObj(this, tagNames); - if (range.collapsed) { - if (obj) { - var tmpText = me.document.createTextNode(""); - range.insertNode(tmpText).removeInlineStyle(tagNames); - range.setStartBefore(tmpText); - domUtils.remove(tmpText); - } else { - var tmpNode = range.document.createElement(tagNames[0]); - if (cmdName == "superscript" || cmdName == "subscript") { - tmpText = me.document.createTextNode(""); - range - .insertNode(tmpText) - .removeInlineStyle(["sub", "sup"]) - .setStartBefore(tmpText) - .collapse(true); - } - range.insertNode(tmpNode).setStart(tmpNode, 0); - } - range.collapse(true); - } else { - if (cmdName == "superscript" || cmdName == "subscript") { - if (!obj || obj.tagName.toLowerCase() != cmdName) { - range.removeInlineStyle(["sub", "sup"]); - } - } - obj - ? range.removeInlineStyle(tagNames) - : range.applyInlineStyle(tagNames[0]); - } - range.select(); - }, - queryCommandState: function() { - return getObj(this, tagNames) ? 1 : 0; - } - }; - })(style, basestyles[style]); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js deleted file mode 100644 index 32bf13c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/blockquote.js +++ /dev/null @@ -1,188 +0,0 @@ -/** - * 添加引用 - * @file - * @since 1.2.6.1 - */ - -/** - * 添加引用 - * @command blockquote - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'blockquote' ); - * ``` - */ - -/** - * 添加引用 - * @command blockquote - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } attrs 节点属性 - * @example - * ```javascript - * editor.execCommand( 'blockquote',{ - * style: "color: red;" - * } ); - * ``` - */ - -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(); - - 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; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js deleted file mode 100644 index b0ca131..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/catchremoteimage.js +++ /dev/null @@ -1,177 +0,0 @@ -///import core -///commands 远程图片抓取 -///commandsName catchRemoteImage,catchremoteimageenable -///commandsTitle 远程图片抓取 -/** - * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 - */ -UE.plugins["catchremoteimage"] = function() { - var me = this, - ajax = UE.ajax; - - /* 设置默认值 */ - if (me.options.catchRemoteImageEnable === false) return; - me.setOpt({ - catchRemoteImageEnable: false - }); - - me.addListener("afterpaste", function() { - me.fireEvent("catchRemoteImage"); - }); - - me.addListener("catchRemoteImage", function() { - var catcherLocalDomain = me.getOpt("catcherLocalDomain"), - catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), - catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), - catcherFieldName = me.getOpt("catcherFieldName"); - - var remoteImages = [], - loadingIMG = me.options.themePath + me.options.theme + '/images/spacer.gif', - imgs = me.document.querySelectorAll('[style*="url"],img'), - test = function(src, urls) { - if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { - return true; - } - if (urls) { - for (var j = 0, url; (url = urls[j++]); ) { - if (src.indexOf(url) !== -1) { - return true; - } - } - } - return false; - }; - - for (var i = 0, ci; (ci = imgs[i++]); ) { - if (ci.getAttribute("word_img")) { - continue; - } - if(ci.nodeName == "IMG"){ - var src = ci.getAttribute("_src") || ci.src || ""; - if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { - remoteImages.push(src); - // 添加上传时的uploading动画 - domUtils.setAttributes(ci, { - class: "loadingclass", - _src: src, - src: loadingIMG - }) - } - } else { - // 获取背景图片url - var backgroundImageurl = ci.style.cssText.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, ''); - if (/^(https?|ftp):/i.test(backgroundImageurl) && !test(backgroundImageurl, catcherLocalDomain)) { - remoteImages.push(backgroundImageurl); - ci.style.cssText = ci.style.cssText.replace(backgroundImageurl, loadingIMG); - domUtils.setAttributes(ci, { - "data-background": backgroundImageurl - }) - } - } - } - - if (remoteImages.length) { - catchremoteimage(remoteImages, { - //成功抓取 - success: function(r) { - try { - var info = r.state !== undefined - ? r - : eval("(" + r.responseText + ")"); - } catch (e) { - return; - } - - /* 获取源路径和新路径 */ - var i, - j, - ci, - cj, - oldSrc, - newSrc, - list = info.list; - - /* 抓取失败统计 */ - var catchFailList = []; - /* 抓取成功统计 */ - var catchSuccessList = []; - /* 抓取失败时显示的图片 */ - var failIMG = me.options.themePath + me.options.theme + '/images/img-cracked.png'; - - for (i = 0; ci = imgs[i++];) { - oldSrc = ci.getAttribute("_src") || ci.src || ""; - oldBgIMG = ci.getAttribute("data-background") || ""; - for (j = 0; cj = list[j++];) { - if (oldSrc == cj.source && cj.state == "SUCCESS") { - newSrc = catcherUrlPrefix + cj.url; - // 上传成功是删除uploading动画 - domUtils.removeClasses( ci, "loadingclass" ); - domUtils.setAttributes(ci, { - "src": newSrc, - "_src": newSrc, - "data-catchResult":"img_catchSuccess" // 添加catch成功标记 - }); - catchSuccessList.push(ci); - break; - } else if (oldSrc == cj.source && cj.state == "FAIL") { - // 替换成统一的失败图片 - domUtils.removeClasses( ci, "loadingclass" ); - domUtils.setAttributes(ci, { - "src": failIMG, - "_src": failIMG, - "data-catchResult":"img_catchFail" // 添加catch失败标记 - }); - catchFailList.push(ci); - break; - } else if (oldBgIMG == cj.source && cj.state == "SUCCESS") { - newBgIMG = catcherUrlPrefix + cj.url; - ci.style.cssText = ci.style.cssText.replace(loadingIMG, newBgIMG); - domUtils.removeAttributes(ci,"data-background"); - domUtils.setAttributes(ci, { - "data-catchResult":"img_catchSuccess" // 添加catch成功标记 - }); - catchSuccessList.push(ci); - break; - } else if (oldBgIMG == cj.source && cj.state == "FAIL"){ - ci.style.cssText = ci.style.cssText.replace(loadingIMG, failIMG); - domUtils.removeAttributes(ci,"data-background"); - domUtils.setAttributes(ci, { - "data-catchResult":"img_catchFail" // 添加catch失败标记 - }); - catchFailList.push(ci); - break; - } - } - - } - // 监听事件添加成功抓取和抓取失败的dom列表参数 - me.fireEvent('catchremotesuccess',catchSuccessList,catchFailList); - }, - //回调失败,本次请求超时 - error: function() { - me.fireEvent("catchremoteerror"); - } - }); - } - - function catchremoteimage(imgs, callbacks) { - var params = - utils.serializeParam(me.queryCommandValue("serverparam")) || "", - url = utils.formatUrl( - catcherActionUrl + - (catcherActionUrl.indexOf("?") == -1 ? "?" : "&") + - params - ), - isJsonp = utils.isCrossDomainUrl(url), - opt = { - method: "POST", - dataType: isJsonp ? "jsonp" : "", - timeout: 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 - onsuccess: callbacks["success"], - onerror: callbacks["error"] - }; - opt[catcherFieldName] = imgs; - ajax.request(url, opt); - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js deleted file mode 100644 index 82ed1cf..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/charts.js +++ /dev/null @@ -1,127 +0,0 @@ -UE.plugin.register("charts", function() { - var me = this; - - return { - bindEvents: { - chartserror: function() {} - }, - commands: { - charts: { - execCommand: function(cmd, data) { - var tableNode = domUtils.findParentByTagName( - this.selection.getRange().startContainer, - "table", - true - ), - flagText = [], - config = {}; - - if (!tableNode) { - return false; - } - - if (!validData(tableNode)) { - me.fireEvent("chartserror"); - return false; - } - - config.title = data.title || ""; - config.subTitle = data.subTitle || ""; - config.xTitle = data.xTitle || ""; - config.yTitle = data.yTitle || ""; - config.suffix = data.suffix || ""; - config.tip = data.tip || ""; - //数据对齐方式 - config.dataFormat = data.tableDataFormat || ""; - //图表类型 - config.chartType = data.chartType || 0; - - for (var key in config) { - if (!config.hasOwnProperty(key)) { - continue; - } - - flagText.push(key + ":" + config[key]); - } - - tableNode.setAttribute("data-chart", flagText.join(";")); - domUtils.addClass(tableNode, "edui-charts-table"); - }, - queryCommandState: function(cmd, name) { - var tableNode = domUtils.findParentByTagName( - this.selection.getRange().startContainer, - "table", - true - ); - return tableNode && validData(tableNode) ? 0 : -1; - } - } - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("table"), function(tableNode) { - if (tableNode.getAttr("data-chart") !== undefined) { - tableNode.setAttr("style"); - } - }); - }, - outputRule: function(root) { - utils.each(root.getNodesByTagName("table"), function(tableNode) { - if (tableNode.getAttr("data-chart") !== undefined) { - tableNode.setAttr("style", "display: none;"); - } - }); - } - }; - - function validData(table) { - var firstRows = null, - cellCount = 0; - - //行数不够 - if (table.rows.length < 2) { - return false; - } - - //列数不够 - if (table.rows[0].cells.length < 2) { - return false; - } - - //第一行所有cell必须是th - firstRows = table.rows[0].cells; - cellCount = firstRows.length; - - for (var i = 0, cell; (cell = firstRows[i]); i++) { - if (cell.tagName.toLowerCase() !== "th") { - return false; - } - } - - for (var i = 1, row; (row = table.rows[i]); i++) { - //每行单元格数不匹配, 返回false - if (row.cells.length != cellCount) { - return false; - } - - //第一列不是th也返回false - if (row.cells[0].tagName.toLowerCase() !== "th") { - return false; - } - - for (var j = 1, cell; (cell = row.cells[j]); j++) { - var value = utils.trim(cell.innerText || cell.textContent || ""); - - value = value - .replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "") - .replace(/^\s+|\s+$/g, ""); - - //必须是数字 - if (!/^\d*\.?\d+$/.test(value)) { - return false; - } - } - } - - return true; - } -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js deleted file mode 100644 index 63bee09..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/cleardoc.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * 清空文档插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 清空文档 - * @command cleardoc - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor 是编辑器实例 - * editor.execCommand('cleardoc'); - * ``` - */ - -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); - } - setTimeout(function() { - me.fireEvent("clearDoc"); - }, 0); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js deleted file mode 100644 index 9c50532..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/contextmenu.js +++ /dev/null @@ -1,534 +0,0 @@ -///import core -///commands 右键菜单 -///commandsName ContextMenu -///commandsTitle 右键菜单 -/** - * 右键菜单 - * @function - * @name baidu.editor.plugins.contextmenu - * @author zhanyi - */ - -UE.plugins["contextmenu"] = function() { - var me = this; - - me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true); - - if (me.getOpt("enableContextMenu") === false) { - return; - } - var lang = me.getLang("contextMenu"), - menu, - items = me.options.contextMenu || [ - { label: lang["selectall"], cmdName: "selectall" }, - { - label: lang.cleardoc, - cmdName: "cleardoc", - exec: function() { - if (confirm(lang.confirmclear)) { - this.execCommand("cleardoc"); - } - } - }, - "-", - { - label: lang.unlink, - cmdName: "unlink" - }, - "-", - { - group: lang.paragraph, - icon: "justifyjustify", - subMenu: [ - { - label: lang.justifyleft, - cmdName: "justify", - value: "left" - }, - { - label: lang.justifyright, - cmdName: "justify", - value: "right" - }, - { - label: lang.justifycenter, - cmdName: "justify", - value: "center" - }, - { - label: lang.justifyjustify, - cmdName: "justify", - value: "justify" - } - ] - }, - "-", - { - group: lang.table, - icon: "table", - subMenu: [ - { - label: lang.inserttable, - cmdName: "inserttable" - }, - { - label: lang.deletetable, - cmdName: "deletetable" - }, - "-", - { - label: lang.deleterow, - cmdName: "deleterow" - }, - { - label: lang.deletecol, - cmdName: "deletecol" - }, - { - label: lang.insertcol, - cmdName: "insertcol" - }, - { - label: lang.insertcolnext, - cmdName: "insertcolnext" - }, - { - label: lang.insertrow, - cmdName: "insertrow" - }, - { - label: lang.insertrownext, - cmdName: "insertrownext" - }, - "-", - { - label: lang.insertcaption, - cmdName: "insertcaption" - }, - { - label: lang.deletecaption, - cmdName: "deletecaption" - }, - { - label: lang.inserttitle, - cmdName: "inserttitle" - }, - { - label: lang.deletetitle, - cmdName: "deletetitle" - }, - { - label: lang.inserttitlecol, - cmdName: "inserttitlecol" - }, - { - label: lang.deletetitlecol, - cmdName: "deletetitlecol" - }, - "-", - { - label: lang.mergecells, - cmdName: "mergecells" - }, - { - label: lang.mergeright, - cmdName: "mergeright" - }, - { - label: lang.mergedown, - cmdName: "mergedown" - }, - "-", - { - label: lang.splittorows, - cmdName: "splittorows" - }, - { - label: lang.splittocols, - cmdName: "splittocols" - }, - { - label: lang.splittocells, - cmdName: "splittocells" - }, - "-", - { - label: lang.averageDiseRow, - cmdName: "averagedistributerow" - }, - { - label: lang.averageDisCol, - cmdName: "averagedistributecol" - }, - "-", - { - label: lang.edittd, - cmdName: "edittd", - exec: function() { - if (UE.ui["edittd"]) { - new UE.ui["edittd"](this); - } - this.getDialog("edittd").open(); - } - }, - { - label: lang.edittable, - cmdName: "edittable", - exec: function() { - if (UE.ui["edittable"]) { - new UE.ui["edittable"](this); - } - this.getDialog("edittable").open(); - } - }, - { - label: lang.setbordervisible, - cmdName: "setbordervisible" - } - ] - }, - { - group: lang.tablesort, - icon: "tablesort", - subMenu: [ - { - label: lang.enablesort, - cmdName: "enablesort" - }, - { - label: lang.disablesort, - cmdName: "disablesort" - }, - "-", - { - label: lang.reversecurrent, - cmdName: "sorttable", - value: "reversecurrent" - }, - { - label: lang.orderbyasc, - cmdName: "sorttable", - value: "orderbyasc" - }, - { - label: lang.reversebyasc, - cmdName: "sorttable", - value: "reversebyasc" - }, - { - label: lang.orderbynum, - cmdName: "sorttable", - value: "orderbynum" - }, - { - label: lang.reversebynum, - cmdName: "sorttable", - value: "reversebynum" - } - ] - }, - { - group: lang.borderbk, - icon: "borderBack", - subMenu: [ - { - label: lang.setcolor, - cmdName: "interlacetable", - exec: function() { - this.execCommand("interlacetable"); - } - }, - { - label: lang.unsetcolor, - cmdName: "uninterlacetable", - exec: function() { - this.execCommand("uninterlacetable"); - } - }, - { - label: lang.setbackground, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["#bbb", "#ccc"] - }); - } - }, - { - label: lang.unsetbackground, - cmdName: "cleartablebackground", - exec: function() { - this.execCommand("cleartablebackground"); - } - }, - { - label: lang.redandblue, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["red", "blue"] - }); - } - }, - { - label: lang.threecolorgradient, - cmdName: "settablebackground", - exec: function() { - this.execCommand("settablebackground", { - repeat: true, - colorList: ["#aaa", "#bbb", "#ccc"] - }); - } - } - ] - }, - { - group: lang.aligntd, - icon: "aligntd", - subMenu: [ - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "top" } - }, - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "middle" } - }, - { - cmdName: "cellalignment", - value: { align: "left", vAlign: "bottom" } - }, - { - cmdName: "cellalignment", - value: { align: "center", vAlign: "bottom" } - }, - { - cmdName: "cellalignment", - value: { align: "right", vAlign: "bottom" } - } - ] - }, - { - group: lang.aligntable, - icon: "aligntable", - subMenu: [ - { - cmdName: "tablealignment", - className: "left", - label: lang.tableleft, - value: "left" - }, - { - cmdName: "tablealignment", - className: "center", - label: lang.tablecenter, - value: "center" - }, - { - cmdName: "tablealignment", - className: "right", - label: lang.tableright, - value: "right" - } - ] - }, - "-", - { - label: lang.insertparagraphbefore, - cmdName: "insertparagraph", - value: true - }, - { - label: lang.insertparagraphafter, - cmdName: "insertparagraph" - }, - { - label: lang["copy"], - cmdName: "copy" - }, - { - label: lang["paste"], - cmdName: "paste" - } - ]; - if (!items.length) { - return; - } - var uiUtils = UE.ui.uiUtils; - - me.addListener("contextmenu", function(type, evt) { - var offset = uiUtils.getViewportOffsetByEvent(evt); - me.fireEvent("beforeselectionchange"); - if (menu) { - menu.destroy(); - } - for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) { - var last; - (function(item) { - if (item == "-") { - if ((last = contextItems[contextItems.length - 1]) && last !== "-") { - contextItems.push("-"); - } - } else if (item.hasOwnProperty("group")) { - for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) { - (function(subItem) { - if (subItem == "-") { - if ((last = subMenu[subMenu.length - 1]) && last !== "-") { - subMenu.push("-"); - } else { - subMenu.splice(subMenu.length - 1); - } - } else { - if ( - (me.commands[subItem.cmdName] || - UE.commands[subItem.cmdName] || - subItem.query) && - (subItem.query - ? subItem.query() - : me.queryCommandState(subItem.cmdName)) > -1 - ) { - subMenu.push({ - label: - subItem.label || - me.getLang( - "contextMenu." + - subItem.cmdName + - (subItem.value || "") - ) || - "", - className: - "edui-for-" + - subItem.cmdName + - (subItem.className - ? " edui-for-" + - subItem.cmdName + - "-" + - subItem.className - : ""), - onclick: subItem.exec - ? function() { - subItem.exec.call(me); - } - : function() { - me.execCommand(subItem.cmdName, subItem.value); - } - }); - } - } - })(cj); - } - if (subMenu.length) { - function getLabel() { - switch (item.icon) { - case "table": - return me.getLang("contextMenu.table"); - case "justifyjustify": - return me.getLang("contextMenu.paragraph"); - case "aligntd": - return me.getLang("contextMenu.aligntd"); - case "aligntable": - return me.getLang("contextMenu.aligntable"); - case "tablesort": - return lang.tablesort; - case "borderBack": - return lang.borderbk; - default: - return ""; - } - } - contextItems.push({ - //todo 修正成自动获取方式 - label: getLabel(), - className: "edui-for-" + item.icon, - subMenu: { - items: subMenu, - editor: me - } - }); - } - } else { - //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 - if ( - (me.commands[item.cmdName] || - UE.commands[item.cmdName] || - item.query) && - (item.query - ? item.query.call(me) - : me.queryCommandState(item.cmdName)) > -1 - ) { - contextItems.push({ - label: item.label || me.getLang("contextMenu." + item.cmdName), - className: - "edui-for-" + - (item.icon ? item.icon : item.cmdName + (item.value || "")), - onclick: item.exec - ? function() { - item.exec.call(me); - } - : function() { - me.execCommand(item.cmdName, item.value); - } - }); - } - } - })(ti); - } - if (contextItems[contextItems.length - 1] == "-") { - contextItems.pop(); - } - - menu = new UE.ui.Menu({ - items: contextItems, - className: "edui-contextmenu", - editor: me - }); - menu.render(); - menu.showAt(offset); - - me.fireEvent("aftershowcontextmenu", menu); - - domUtils.preventDefault(evt); - if (browser.ie) { - var ieRange; - try { - ieRange = me.selection.getNative().createRange(); - } catch (e) { - return; - } - if (ieRange.item) { - var range = new dom.Range(me.document); - range.selectNode(ieRange.item(0)).select(true, true); - } - } - }); - - // 添加复制的flash按钮 - me.addListener("aftershowcontextmenu", function(type, menu) { - if (me.zeroclipboard) { - var items = menu.items; - for (var key in items) { - if (items[key].className == "edui-for-copy") { - me.zeroclipboard.clip(items[key].getDom()); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js deleted file mode 100644 index be0b025..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/convertcase.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 大小写转换 - * @file - * @since 1.2.6.1 - */ - -/** - * 把选区内文本变大写,与“tolowercase”命令互斥 - * @command touppercase - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'touppercase' ); - * ``` - */ - -/** - * 把选区内文本变小写,与“touppercase”命令互斥 - * @command tolowercase - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'tolowercase' ); - * ``` - */ -UE.commands["touppercase"] = UE.commands["tolowercase"] = { - 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(); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js deleted file mode 100644 index cd4cadc..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/copy.js +++ /dev/null @@ -1,80 +0,0 @@ -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" - }); - - var client = (me.zeroclipboard = new ZeroClipboard()); - - // 复制内容 - 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(); - }); - - // 触发事件 - 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")); - } - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js deleted file mode 100644 index da3e76d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/customstyle.js +++ /dev/null @@ -1,181 +0,0 @@ -/** - * 自定义样式 - * @file - * @since 1.2.6.1 - */ - -/** - * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 - * @command customstyle - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'customstyle' ); - * ``` - */ -UE.plugins["customstyle"] = function() { - var me = this; - me.setOpt({ - customstyle: [ - { - tag: "h1", - name: "tc", - style: - "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;" - }, - { - tag: "h1", - name: "tl", - style: - "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;" - }, - { - tag: "span", - name: "im", - style: - "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;" - }, - { - tag: "span", - name: "hi", - style: - "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;" - } - ] - }); - me.commands["customstyle"] = { - execCommand: function(cmdName, obj) { - var me = this, - tagName = obj.tag, - node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label"); - }, - true - ), - range, - bk, - tmpObj = {}; - for (var p in obj) { - if (obj[p] !== undefined) tmpObj[p] = obj[p]; - } - delete tmpObj.tag; - if (node && node.getAttribute("label") == obj.label) { - range = this.selection.getRange(); - bk = range.createBookmark(); - if (range.collapsed) { - //trace:1732 删掉自定义标签,要有p来回填站位 - if (dtd.$block[node.tagName]) { - var fillNode = me.document.createElement("p"); - domUtils.moveChild(node, fillNode); - node.parentNode.insertBefore(fillNode, node); - domUtils.remove(node); - } else { - domUtils.remove(node, true); - } - } else { - var common = domUtils.getCommonAncestor(bk.start, bk.end), - nodes = domUtils.getElementsByTagName(common, tagName); - if (new RegExp(tagName, "i").test(common.tagName)) { - nodes.push(common); - } - for (var i = 0, ni; (ni = nodes[i++]); ) { - if (ni.getAttribute("label") == obj.label) { - var ps = domUtils.getPosition(ni, bk.start), - pe = domUtils.getPosition(ni, bk.end); - if ( - (ps & domUtils.POSITION_FOLLOWING || - ps & domUtils.POSITION_CONTAINS) && - (pe & domUtils.POSITION_PRECEDING || - pe & domUtils.POSITION_CONTAINS) - ) - if (dtd.$block[tagName]) { - var fillNode = me.document.createElement("p"); - domUtils.moveChild(ni, fillNode); - ni.parentNode.insertBefore(fillNode, ni); - } - domUtils.remove(ni, true); - } - } - node = domUtils.findParent( - common, - function(node) { - return node.getAttribute("label") == obj.label; - }, - true - ); - if (node) { - domUtils.remove(node, true); - } - } - range.moveToBookmark(bk).select(); - } else { - if (dtd.$block[tagName]) { - this.execCommand("paragraph", tagName, tmpObj, "customstyle"); - range = me.selection.getRange(); - if (!range.collapsed) { - range.collapse(); - node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label") == obj.label; - }, - true - ); - var pNode = me.document.createElement("p"); - domUtils.insertAfter(node, pNode); - domUtils.fillNode(me.document, pNode); - range.setStart(pNode, 0).setCursor(); - } - } else { - range = me.selection.getRange(); - if (range.collapsed) { - node = me.document.createElement(tagName); - domUtils.setAttributes(node, tmpObj); - range.insertNode(node).setStart(node, 0).setCursor(); - - return; - } - - bk = range.createBookmark(); - range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); - } - } - }, - queryCommandValue: function() { - var parent = domUtils.filterNodeList( - this.selection.getStartElementPath(), - function(node) { - return node.getAttribute("label"); - } - ); - return parent ? parent.getAttribute("label") : ""; - } - }; - //当去掉customstyle是,如果是块元素,用p代替 - me.addListener("keyup", function(type, evt) { - var keyCode = evt.keyCode || evt.which; - - if (keyCode == 32 || keyCode == 13) { - var range = me.selection.getRange(); - if (range.collapsed) { - var node = domUtils.findParent( - me.selection.getStart(), - function(node) { - return node.getAttribute("label"); - }, - true - ); - if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { - var p = me.document.createElement("p"); - domUtils.insertAfter(node, p); - domUtils.fillNode(me.document, p); - domUtils.remove(node); - range.setStart(p, 0).setCursor(); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js deleted file mode 100644 index 89b1e28..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/defaultfilter.js +++ /dev/null @@ -1,276 +0,0 @@ -///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); - // } - }); - }); - - //从编辑器出去的内容处理 - 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: "" - }); - } - } - } - }); - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js deleted file mode 100644 index 21c0c45..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/directionality.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * 设置文字输入的方向的插件 - * @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); - }, - 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; - } - - current = domUtils.getNextDomNode(current, false, filterFn); - } else { - current = domUtils.getNextDomNode(current, true, filterFn); - } - } - return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); - }; - - /** - * 文字输入方向 - * @command directionality - * @method execCommand - * @param { String } cmdName 命令字符串 - * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 - * @example - * ```javascript - * editor.execCommand( 'directionality', 'ltr'); - * ``` - */ - - /** - * 查询当前选区的文字输入方向 - * @command directionality - * @method queryCommandValue - * @param { String } cmdName 命令字符串 - * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 - * @example - * ```javascript - * 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); - } - - range.select(); - return true; - }, - queryCommandValue: function() { - var node = getObj(this); - return node ? node.getAttribute("dir") : "ltr"; - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js deleted file mode 100644 index ab99589..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/dragdrop.js +++ /dev/null @@ -1,65 +0,0 @@ -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 ( - ((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"); - } - } - }); - }); - 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"); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js deleted file mode 100644 index 1f5b7a6..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/elementpath.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 选取路径命令 - * @file - */ -UE.plugins["elementpath"] = function() { - var currentLevel, - tagNames, - me = this; - me.setOpt("elementPathEnabled", true); - if (!me.options.elementPathEnabled) { - return; - } - me.commands["elementpath"] = { - execCommand: function(cmdName, level) { - var start = tagNames[level], - range = me.selection.getRange(); - currentLevel = level * 1; - range.selectNode(start).select(); - }, - queryCommandValue: function() { - //产生一个副本,不能修改原来的startElementPath; - var parents = [].concat(this.selection.getStartElementPath()).reverse(), - names = []; - tagNames = parents; - for (var i = 0, ci; (ci = parents[i]); i++) { - if (ci.nodeType == 3) { - continue; - } - var name = ci.tagName.toLowerCase(); - if (name == "img" && ci.getAttribute("anchorname")) { - name = "anchor"; - } - names[i] = name; - if (currentLevel == i) { - currentLevel = -1; - break; - } - } - return names; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js deleted file mode 100644 index d8728a4..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/enterkey.js +++ /dev/null @@ -1,200 +0,0 @@ -///import core -///import plugins/undo.js -///commands 设置回车标签p或br -///commandsName EnterKey -///commandsTitle 设置回车标签p或br -/** - * @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; - - //修正在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(); - } - } - //没有站位符,会出现多行的问题 - 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(); - } 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(); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js deleted file mode 100644 index 7da97c0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/fiximgclick.js +++ /dev/null @@ -1,382 +0,0 @@ -///import core -///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 -///commandsName FixImgClick -///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 }; - } - - (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] - ]; - - Scale.prototype = { - init: function(editor) { - var me = this; - me.editor = editor; - me.startPos = this.prePos = { x: 0, y: 0 }; - me.dragId = -1; - - var hands = [], - cover = (me.cover = document.createElement("div")), - resizer = (me.resizer = document.createElement("div")); - - 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(); - }); - - 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 + - ";"; - - 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, - pressMouseLeft = e.buttons === undefined ? e.which === 1 : e.buttons === 1; - 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 && pressMouseLeft) { - 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); - - var doc = me.editor.document; - domUtils.setStyles(resizer, { - width: target.width + "px", - height: target.height + "px", - left: - iframePos.x + - imgPos.x - - (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0) - - editorPos.x - - parseInt(resizer.style.borderLeftWidth) + - "px", - top: - iframePos.y + - imgPos.y - - (doc.documentElement.scrollTop || doc.body.scrollTop || 0) - - 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") { - if ( - img.className.indexOf("edui-faked-music") != -1 || - 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); - } - }, - 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(); - } - }); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js deleted file mode 100644 index 5968df7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/font.js +++ /dev/null @@ -1,556 +0,0 @@ -/** - * 字体颜色,背景色,字号,字体,下划线,删除线 - * @file - * @since 1.2.6.1 - */ - -/** - * 字体颜色 - * @command forecolor - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 色值(必须十六进制) - * @example - * ```javascript - * editor.execCommand( 'forecolor', '#000' ); - * ``` - */ -/** - * 返回选区字体颜色 - * @command forecolor - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体颜色 - * @example - * ```javascript - * editor.queryCommandValue( 'forecolor' ); - * ``` - */ - -/** - * 字体背景颜色 - * @command backcolor - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 色值(必须十六进制) - * @example - * ```javascript - * editor.execCommand( 'backcolor', '#000' ); - * ``` - */ -/** - * 返回选区字体颜色 - * @command backcolor - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体背景颜色 - * @example - * ```javascript - * editor.queryCommandValue( 'backcolor' ); - * ``` - */ - -/** - * 字体大小 - * @command fontsize - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 字体大小 - * @example - * ```javascript - * editor.execCommand( 'fontsize', '14px' ); - * ``` - */ -/** - * 返回选区字体大小 - * @command fontsize - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体大小 - * @example - * ```javascript - * editor.queryCommandValue( 'fontsize' ); - * ``` - */ - -/** - * 字体样式 - * @command fontfamily - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 字体样式 - * @example - * ```javascript - * editor.execCommand( 'fontfamily', '微软雅黑' ); - * ``` - */ -/** - * 返回选区字体样式 - * @command fontfamily - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回字体样式 - * @example - * ```javascript - * editor.queryCommandValue( 'fontfamily' ); - * ``` - */ - -/** - * 字体下划线,与删除线互斥 - * @command underline - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'underline' ); - * ``` - */ - -/** - * 字体删除线,与下划线互斥 - * @command strikethrough - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'strikethrough' ); - * ``` - */ - -/** - * 字体边框 - * @command fontborder - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'fontborder' ); - * ``` - */ - -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] - }); - - 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) { - rng.traversal(function(node){ - var start; - if(domUtils.isTagNode(node,'span')){ - start = node; - }else{ - start = domUtils.getElementsByTagName(node,'span')[0]; - } - 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); - } - }); - } - } - } - 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); - } - 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) - ); - }); - if (parent && !/background-color/.test(span.style.cssText)) { - span.style.backgroundColor = parent.style.backgroundColor; - } - } - }); - 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"; - }); - // 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.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; - - 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); - - 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); - } - - 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; - } - 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]); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js deleted file mode 100644 index 9161c6e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/formatmatch.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * 格式刷,只格式inline的 - * @file - * @since 1.2.6.1 - */ - -/** - * 格式刷 - * @command formatmatch - * @method execCommand - * @remind 该操作不能复制段落格式 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * //获取格式刷 - * editor.execCommand( 'formatmatch' ); - * ``` - */ -UE.plugins["formatmatch"] = function() { - var me = this, - list = [], - img, - flag = 0; - - me.addListener("reset", function() { - list = []; - flag = 0; - }); - - function addList(type, evt) { - if (browser.webkit) { - var target = evt.target.tagName == "IMG" ? evt.target : null; - } - - function addFormat(range) { - if (text) { - range.selectNode(text); - } - return range.applyInlineStyle(list[list.length - 1].tagName, null, list); - } - - me.undoManger && me.undoManger.save(); - - var range = me.selection.getRange(), - imgT = target || range.getClosedNode(); - if (img && imgT && imgT.tagName == "IMG") { - //trace:964 - - imgT.style.cssText += - ";float:" + - (img.style.cssFloat || img.style.styleFloat || "none") + - ";display:" + - (img.style.display || "inline"); - - img = null; - } else { - if (!img) { - var collapsed = range.collapsed; - if (collapsed) { - var text = me.document.createTextNode("match"); - range.insertNode(text).select(); - } - me.__hasEnterExecCommand = true; - //不能把block上的属性干掉 - //trace:1553 - var removeFormatAttributes = me.options.removeFormatAttributes; - me.options.removeFormatAttributes = ""; - me.execCommand("removeformat"); - me.options.removeFormatAttributes = removeFormatAttributes; - me.__hasEnterExecCommand = false; - //trace:969 - range = me.selection.getRange(); - if (list.length) { - addFormat(range); - } - if (text) { - range.setStartBefore(text).collapse(true); - } - range.select(); - text && domUtils.remove(text); - } - } - - me.undoManger && me.undoManger.save(); - me.removeListener("mouseup", addList); - flag = 0; - } - - me.commands["formatmatch"] = { - execCommand: function(cmdName) { - if (flag) { - flag = 0; - list = []; - me.removeListener("mouseup", addList); - return; - } - - var range = me.selection.getRange(); - img = range.getClosedNode(); - if (!img || img.tagName != "IMG") { - range.collapse(true).shrinkBoundary(); - var start = range.startContainer; - list = domUtils.findParents(start, true, function(node) { - return !domUtils.isBlockElm(node) && node.nodeType == 1; - }); - //a不能加入格式刷, 并且克隆节点 - for (var i = 0, ci; (ci = list[i]); i++) { - if (ci.tagName == "A") { - list.splice(i, 1); - break; - } - } - } - - me.addListener("mouseup", addList); - flag = 1; - }, - queryCommandState: function() { - return flag; - }, - notNeedUndo: 1 - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js deleted file mode 100644 index 536ab32..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/horizontal.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * 插入分割线插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入分割线 - * @command horizontal - * @method execCommand - * @param { String } cmdName 命令字符串 - * @example - * ```javascript - * 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(); - } - } - } - } - 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; - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js deleted file mode 100644 index f2d43e3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/iframe.js +++ /dev/null @@ -1,17 +0,0 @@ -///import core -///import plugins\inserthtml.js -///commands 插入框架 -///commandsName InsertFrame -///commandsTitle 插入Iframe -///commandsDialog dialogs\insertframe - -UE.plugins["insertframe"] = function() { - var me = this; - function deleteIframe() { - me._iframe && delete me._iframe; - } - - me.addListener("selectionchange", function() { - deleteIframe(); - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js deleted file mode 100644 index 1eeaf88..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/image.js +++ /dev/null @@ -1,303 +0,0 @@ -/** - * 图片插入、排版插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 图片对齐方式 - * @command imagefloat - * @method execCommand - * @remind 值center为独占一行居中 - * @param { String } cmd 命令字符串 - * @param { String } align 对齐方式,可传left、right、none、center - * @remaind center表示图片独占一行 - * @example - * ```javascript - * editor.execCommand( 'imagefloat', 'center' ); - * ``` - */ - -/** - * 如果选区所在位置是图片区域 - * @command imagefloat - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回图片对齐方式 - * @example - * ```javascript - * editor.queryCommandValue( 'imagefloat' ); - * ``` - */ - -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", ""); - } - } - - 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") { - var 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.getElementsByClassName("_img_parent_tmp")[0]; - tmpNode.removeAttribute("class"); - 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"); - - 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; - - startNode = range.getClosedNode(); - if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { - return 0; - } - return -1; - } -}; - -/** - * 插入图片 - * @command insertimage - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 - * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, - * 此时数组的每一个元素都是一个Object类型的图片属性集合。 - * @example - * ```javascript - * editor.execCommand( 'insertimage', { - * src:'a/b/c.jpg', - * width:'100', - * height:'100' - * } ); - * ``` - * @example - * ```javascript - * editor.execCommand( 'insertimage', [{ - * src:'a/b/c.jpg', - * width:'100', - * height:'100' - * },{ - * src:'a/b/d.jpg', - * width:'100', - * height:'100' - * }] ); - * ``` - */ - -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("word_img") - ) { - 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); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js deleted file mode 100644 index 8d960d3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/indent.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 首行缩进 - * @file - * @since 1.2.6.1 - */ - -/** - * 缩进 - * @command indent - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'indent' ); - * ``` - */ -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; - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js deleted file mode 100644 index f2a0b7a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertcode.js +++ /dev/null @@ -1,612 +0,0 @@ -/** - * 插入代码插件 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["insertcode"] = function() { - var me = this; - me.ready(function() { - utils.cssRule( - "pre", - "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", - me.document - ); - }); - 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" - }); - - /** - * 插入代码 - * @command insertcode - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } lang 插入代码的语言 - * @example - * ```javascript - * editor.execCommand( 'insertcode', 'javascript' ); - * ``` - */ - - /** - * 如果选区所在位置是插入插入代码区域,返回代码的语言 - * @command insertcode - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回代码的语言 - * @example - * ```javascript - * editor.queryCommandValue( 'insertcode' ); - * ``` - */ - - 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"; - } - } - } 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; - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js deleted file mode 100644 index a42add3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertfile.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * 插入附件 - */ -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); - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js deleted file mode 100644 index 2a2b6a9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/inserthtml.js +++ /dev/null @@ -1,276 +0,0 @@ -/** - * 插入html字符串插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入html代码 - * @command inserthtml - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } html 插入的html字符串 - * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 - * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 - * @example - * ```javascript - * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 - * //执行命令,插入CC - * //插入后的效果 xxxCCxxx - * //

    xx|xxx

    当前选区为闭合状态 - * //插入

    CC

    - * //结果

    xx

    CC

    xxx

    - * //

    xxxx

    |

    xxx

    当前选区在两个p标签之间 - * //插入 xxxx - * //结果

    xxxx

    xxxx

    xxx

    - * ``` - */ - -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"; - - 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; - } - 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 { - 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; - } - } - - 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); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js deleted file mode 100644 index 32fd84e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/insertparagraph.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 插入段落 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入段落 - * @command insertparagraph - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * //editor是编辑器实例 - * editor.execCommand( 'insertparagraph' ); - * ``` - */ - -UE.commands["insertparagraph"] = { - execCommand: function(cmdName, front) { - var me = this, - range = me.selection.getRange(), - start = range.startContainer, - tmpNode; - while (start) { - if (domUtils.isBody(start)) { - break; - } - tmpNode = start; - start = start.parentNode; - } - if (tmpNode) { - var p = me.document.createElement("p"); - if (front) { - tmpNode.parentNode.insertBefore(p, tmpNode); - } else { - tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling); - } - domUtils.fillNode(me.document, p); - range.setStart(p, 0).setCursor(false, true); - } - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js deleted file mode 100644 index dbdda0c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/justify.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * 段落格式 - * @file - * @since 1.2.6.1 - */ - -/** - * 段落对齐方式 - * @command justify - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 - * @example - * ```javascript - * editor.execCommand( 'justify', 'center' ); - * ``` - */ -/** - * 如果选区所在位置是段落区域,返回当前段落对齐方式 - * @command justify - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回段落对齐方式 - * @example - * ```javascript - * editor.queryCommandValue( 'justify' ); - * ``` - */ - -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); - }; - - 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; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js deleted file mode 100644 index 7c3dbeb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/keystrokes.js +++ /dev/null @@ -1,265 +0,0 @@ -/* 处理特殊键的兼容性问题 */ -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 - ) { - 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(); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js deleted file mode 100644 index 367ee69..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/lineheight.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * 设置行内间距 - * @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"] }); - - /** - * 行距 - * @command lineheight - * @method execCommand - * @param { String } cmdName 命令字符串 - * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 - * @example - * ```javascript - * editor.execCommand( 'lineheight', 1.5); - * ``` - */ - /** - * 查询当前选区内容的行高大小 - * @command lineheight - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回当前行高大小 - * @example - * ```javascript - * editor.queryCommandValue( 'lineheight' ); - * ``` - */ - - 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, ""); - } - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js deleted file mode 100644 index 4884d15..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/link.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * 超链接 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入超链接 - * @command link - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } options 设置自定义属性,例如:url、title、target - * @example - * ```javascript - * editor.execCommand( 'link', '{ - * url:'neditor.baidu.com', - * title:'neditor', - * target:'_blank' - * }' ); - * ``` - */ -/** - * 返回当前选中的第一个超链接节点 - * @command link - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { Element } 超链接节点 - * @example - * ```javascript - * editor.queryCommandValue( 'link' ); - * ``` - */ - -/** - * 取消超链接 - * @command unlink - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'unlink'); - * ``` - */ - -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; - } - } 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; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js deleted file mode 100644 index affdb3b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/list.js +++ /dev/null @@ -1,1436 +0,0 @@ -/** - * 有序列表,无序列表插件 - * @file - * @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: me.options.UEDITOR_HOME_URL + "themes/ueditor-list/", - 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) { - 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 - * @param { String } command 命令字符串 - * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 - * @example - * ```javascript - * editor.execCommand( 'insertorderedlist','decimal'); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertorderedlist - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果当前选区是有序列表返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'insertorderedlist' ); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertorderedlist - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 - * @example - * ```javascript - * editor.queryCommandValue( 'insertorderedlist' ); - * ``` - */ - - /** - * 无序列表,与“insertorderedlist”命令互斥 - * @command insertunorderedlist - * @method execCommand - * @param { String } command 命令字符串 - * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot - * @example - * ```javascript - * editor.execCommand( 'insertunorderedlist','circle'); - * ``` - */ - /** - * 查询当前是否有word文档粘贴进来的图片 - * @command insertunorderedlist - * @method insertunorderedlist - * @param { String } command 命令字符串 - * @return { int } 如果当前选区是无序列表返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'insertunorderedlist' ); - * ``` - */ - /** - * 查询当前选区内容是否有序列表 - * @command insertunorderedlist - * @method queryCommandValue - * @param { String } command 命令字符串 - * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot - * @example - * ```javascript - * editor.queryCommandValue( 'insertunorderedlist' ); - * ``` - */ - - 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); - } - 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; - } - } - - 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); - 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; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js deleted file mode 100644 index 788c7f1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/music.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * 插入音乐命令 - * @file - */ -UE.plugin.register("music", function() { - var me = this; - function creatInsertStr(url, width, height, align, cssfloat, toEmbed) { - return !toEmbed - ? "' - : ''; - } - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(node) { - var html; - if (node.getAttr("class") == "edui-faked-music") { - var cssfloat = node.getStyle("float"); - var align = node.getAttr("align"); - html = creatInsertStr( - node.getAttr("_url"), - node.getAttr("width"), - node.getAttr("height"), - align, - cssfloat, - true - ); - var embed = UE.uNode.createElement(html); - node.parentNode.replaceChild(embed, node); - } - }); - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("embed"), function(node) { - if (node.getAttr("class") == "edui-faked-music") { - var cssfloat = node.getStyle("float"); - var align = node.getAttr("align"); - html = creatInsertStr( - node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - align, - cssfloat, - false - ); - var img = UE.uNode.createElement(html); - node.parentNode.replaceChild(img, node); - } - }); - }, - commands: { - /** - * 插入音乐 - * @command music - * @method execCommand - * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; - * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'music' , { - * width: 400, - * height: 95, - * align: "center", - * url: "音乐地址" - * } ); - * ``` - */ - music: { - execCommand: function(cmd, musicObj) { - var me = this, - str = creatInsertStr( - musicObj.url, - musicObj.width || 400, - musicObj.height || 95, - "none", - false - ); - me.execCommand("inserthtml", str); - }, - queryCommandState: function() { - var me = this, - img = me.selection.getRange().getClosedNode(), - flag = img && img.className == "edui-faked-music"; - return flag ? 1 : 0; - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js deleted file mode 100644 index d0b5c85..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/pagebreak.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * 分页功能插件 - * @file - * @since 1.2.6.1 - */ -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; - - 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( - '
    ' - ); - 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 - * @param { String } cmd 命令字符串 - * @remind 在表格中插入分页符会把表格切分成两部分 - * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, - * 以便于提交数据到服务器端后处理分页。 - * @example - * ```javascript - * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak - * ``` - */ - - 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 { - 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); - } - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js deleted file mode 100644 index 11f7e7e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paragraph.js +++ /dev/null @@ -1,219 +0,0 @@ -/** - * 段落样式 - * @file - * @since 1.2.6.1 - */ - -/** - * 段落格式 - * @command paragraph - * @method execCommand - * @param { String } cmd 命令字符串 - * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' - * @param {Object} attrs 标签的属性 - * @example - * ```javascript - * editor.execCommand( 'Paragraph','h1','{ - * class:'test' - * }' ); - * ``` - */ - -/** - * 返回选区内节点标签名 - * @command paragraph - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @return { String } 节点标签名 - * @example - * ```javascript - * editor.queryCommandValue( 'Paragraph' ); - * ``` - */ - -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, 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; - }, - queryCommandValue: function () { - var node = domUtils.filterNodeList( - this.selection.getStartElementPath(), - "p h1 h2 h3 h4 h5 h6" - ); - return node ? node.tagName.toLowerCase() : ""; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js deleted file mode 100644 index a90d253..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/paste.js +++ /dev/null @@ -1,354 +0,0 @@ -///import core -///import plugins/inserthtml.js -///import plugins/undo.js -///import plugins/serialize.js -///commands 粘贴 -///commandsName PastePlain -///commandsTitle 纯文本粘贴模式 -/** - * @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; - } - } - } - 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 - ); - } 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) { - if (me.undoManger.list.length < 1) me.undoManger.save(); - setTimeout(function() { - 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")); - } - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js deleted file mode 100644 index ceef25d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/preview.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * 预览 - * @file - * @since 1.2.6.1 - */ - -/** - * 预览 - * @command preview - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'preview' ); - * ``` - */ -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 -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js deleted file mode 100644 index 23ecdfd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/print.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * 打印 - * @file - * @since 1.2.6.1 - */ - -/** - * 打印 - * @command print - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'print' ); - * ``` - */ -UE.commands["print"] = { - execCommand: function() { - this.window.print(); - }, - notNeedUndo: 1 -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js deleted file mode 100644 index 748c5e1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/puretxtpaste.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * 纯文本粘贴插件 - * @file - * @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); - } - } - } - 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 - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.queryCommandState( 'pasteplain' ); - * ``` - */ - - /** - * 查询当前是否处于纯文本粘贴模式 - * @command pasteplain - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果处于纯文本模式,返回1,否则,返回0 - * @example - * ```javascript - * editor.queryCommandState( 'pasteplain' ); - * ``` - */ - me.commands["pasteplain"] = { - queryCommandState: function() { - return pasteplain ? 1 : 0; - }, - execCommand: function() { - pasteplain = !pasteplain | 0; - }, - notNeedUndo: 1 - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js deleted file mode 100644 index 608232e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/removeformat.js +++ /dev/null @@ -1,207 +0,0 @@ -/** - * 清除格式 - * @file - * @since 1.2.6.1 - */ - -/** - * 清除文字样式 - * @command removeformat - * @method execCommand - * @param { String } cmd 命令字符串 - * @param {String} tags 以逗号隔开的标签。如:strong - * @param {String} style 样式如:color - * @param {String} attrs 属性如:width - * @example - * ```javascript - * editor.execCommand( 'removeformat', 'strong','color','width' ); - * ``` - */ - -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); - } - } else { - //trace:939 不能把list上的样式去掉 - if ( - !dtd.$tableContent[current.tagName] && - !dtd.$list[current.tagName] - ) { - domUtils.removeAttributes(current, removeFormatAttributes); - if (isRedundantSpan(current)) { - domUtils.remove(current, true); - } - } - } - } - 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(); - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js deleted file mode 100644 index 80c7369..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/rowspacing.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * 段前段后间距插件 - * @file - * @since 1.2.6.1 - */ - -/** - * 设置段间距 - * @command rowspacing - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } value 段间距的值,以px为单位 - * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 - * @example - * ```javascript - * editor.execCommand( 'rowspacing', '10', 'top' ); - * ``` - */ - -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; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js deleted file mode 100644 index e373c6d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/scrawl.js +++ /dev/null @@ -1,10 +0,0 @@ -///import core -///commands 涂鸦 -///commandsName Scrawl -///commandsTitle 涂鸦 -///commandsDialog dialogs\scrawl -UE.commands["scrawl"] = { - queryCommandState: function() { - return browser.ie && browser.version <= 8 ? -1 : 0; - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js deleted file mode 100644 index 34b7462..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/searchreplace.js +++ /dev/null @@ -1,238 +0,0 @@ -///import core -///commands 查找替换 -///commandsName SearchReplace -///commandsTitle 查询替换 -///commandsDialog dialogs\searchreplace -/** - * @description 查找替换 - * @author zhanyi - */ - -UE.plugin.register("searchreplace", function() { - var me = this; - - var _blockElm = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; - - var lastRng = null; - - function getText(node) { - var text = node.nodeType == 3 - ? node.nodeValue - : node[browser.ie ? "innerText" : "textContent"]; - return text.replace(domUtils.fillChar, ""); - } - - function findTextInString(textContent, opt, currentIndex) { - var str = opt.searchStr; - - var reg = new RegExp(str, "g" + (opt.casesensitive ? "" : "i")), - match; - - if (opt.dir == -1) { - textContent = textContent.substr(0, currentIndex); - textContent = textContent.split("").reverse().join(""); - str = str.split("").reverse().join(""); - match = reg.exec(textContent); - if (match) { - return currentIndex - match.index - str.length; - } - } else { - textContent = textContent.substr(currentIndex); - match = reg.exec(textContent); - if (match) { - return match.index + currentIndex; - } - } - - return -1; - } - function findTextBlockElm(node, currentIndex, opt) { - var textContent, - index, - methodName = opt.all || opt.dir == 1 ? "getNextDomNode" : "getPreDomNode"; - if (domUtils.isBody(node)) { - node = node.firstChild; - } - var first = 1; - while (node) { - textContent = getText(node); - index = findTextInString(textContent, opt, currentIndex); - first = 0; - if (index != -1) { - return { - node: node, - index: index - }; - } - node = domUtils[methodName](node); - while (node && _blockElm[node.nodeName.toLowerCase()]) { - node = domUtils[methodName](node, true); - } - if (node) { - currentIndex = opt.dir == -1 ? getText(node).length : 0; - } - } - } - function findNTextInBlockElm(node, index, str) { - var currentIndex = 0, - currentNode = node.firstChild, - currentNodeLength = 0, - result; - while (currentNode) { - if (currentNode.nodeType == 3) { - currentNodeLength = getText(currentNode).replace( - /(^[\t\r\n]+)|([\t\r\n]+$)/, - "" - ).length; - currentIndex += currentNodeLength; - if (currentIndex >= index) { - return { - node: currentNode, - index: currentNodeLength - (currentIndex - index) - }; - } - } else if (!dtd.$empty[currentNode.tagName]) { - currentNodeLength = getText(currentNode).replace( - /(^[\t\r\n]+)|([\t\r\n]+$)/, - "" - ).length; - currentIndex += currentNodeLength; - if (currentIndex >= index) { - result = findNTextInBlockElm( - currentNode, - currentNodeLength - (currentIndex - index), - str - ); - if (result) { - return result; - } - } - } - currentNode = domUtils.getNextDomNode(currentNode); - } - } - - function searchReplace(me, opt) { - var rng = lastRng || me.selection.getRange(), - startBlockNode, - searchStr = opt.searchStr, - span = me.document.createElement("span"); - span.innerHTML = "$$ueditor_searchreplace_key$$"; - - rng.shrinkBoundary(true); - - //判断是不是第一次选中 - if (!rng.collapsed) { - rng.select(); - var rngText = me.selection.getText(); - if ( - new RegExp( - "^" + opt.searchStr + "$", - opt.casesensitive ? "" : "i" - ).test(rngText) - ) { - if (opt.replaceStr != undefined) { - replaceText(rng, opt.replaceStr); - rng.select(); - return true; - } else { - rng.collapse(opt.dir == -1); - } - } - } - - rng.insertNode(span); - rng.enlargeToBlockElm(true); - startBlockNode = rng.startContainer; - var currentIndex = getText(startBlockNode).indexOf( - "$$ueditor_searchreplace_key$$" - ); - rng.setStartBefore(span); - domUtils.remove(span); - var result = findTextBlockElm(startBlockNode, currentIndex, opt); - if (result) { - var rngStart = findNTextInBlockElm(result.node, result.index, searchStr); - var rngEnd = findNTextInBlockElm( - result.node, - result.index + searchStr.length, - searchStr - ); - rng - .setStart(rngStart.node, rngStart.index) - .setEnd(rngEnd.node, rngEnd.index); - - if (opt.replaceStr !== undefined) { - replaceText(rng, opt.replaceStr); - } - rng.select(); - return true; - } else { - rng.setCursor(); - } - } - function replaceText(rng, str) { - str = me.document.createTextNode(str); - rng.deleteContents().insertNode(str); - } - return { - commands: { - searchreplace: { - execCommand: function(cmdName, opt) { - utils.extend( - opt, - { - all: false, - casesensitive: false, - dir: 1 - }, - true - ); - var num = 0; - if (opt.all) { - lastRng = null; - var rng = me.selection.getRange(), - first = me.body.firstChild; - if (first && first.nodeType == 1) { - rng.setStart(first, 0); - rng.shrinkBoundary(true); - } else if (first.nodeType == 3) { - rng.setStartBefore(first); - } - rng.collapse(true).select(true); - if (opt.replaceStr !== undefined) { - me.fireEvent("saveScene"); - } - while (searchReplace(this, opt)) { - num++; - lastRng = me.selection.getRange(); - lastRng.collapse(opt.dir == -1); - } - if (num) { - me.fireEvent("saveScene"); - } - } else { - if (opt.replaceStr !== undefined) { - me.fireEvent("saveScene"); - } - if (searchReplace(this, opt)) { - num++; - lastRng = me.selection.getRange(); - lastRng.collapse(opt.dir == -1); - } - if (num) { - me.fireEvent("saveScene"); - } - } - - return num; - }, - notNeedUndo: 1 - } - }, - bindEvents: { - clearlastSearchResult: function() { - lastRng = null; - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js deleted file mode 100644 index b6790ec..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/section.js +++ /dev/null @@ -1,305 +0,0 @@ -/** - * 目录大纲支持插件 - * @file - * @since 1.3.0 - */ -UE.plugin.register("section", function() { - /* 目录节点对象 */ - function Section(option) { - this.tag = ""; - (this.level = -1), (this.dom = null); - this.nextSection = null; - this.previousSection = null; - this.parentSection = null; - this.startAddress = []; - this.endAddress = []; - this.children = []; - } - function getSection(option) { - var section = new Section(); - return utils.extend(section, option); - } - function getNodeFromAddress(startAddress, root) { - var current = root; - for (var i = 0; i < startAddress.length; i++) { - if (!current.childNodes) return null; - current = current.childNodes[startAddress[i]]; - } - return current; - } - - var me = this; - - return { - bindMultiEvents: { - type: "aftersetcontent afterscencerestore", - handler: function() { - me.fireEvent("updateSections"); - } - }, - bindEvents: { - /* 初始化、拖拽、粘贴、执行setcontent之后 */ - ready: function() { - me.fireEvent("updateSections"); - domUtils.on(me.body, "drop paste", function() { - me.fireEvent("updateSections"); - }); - }, - /* 执行paragraph命令之后 */ - afterexeccommand: function(type, cmd) { - if (cmd == "paragraph") { - me.fireEvent("updateSections"); - } - }, - /* 部分键盘操作,触发updateSections事件 */ - keyup: function(type, e) { - var me = this, - range = me.selection.getRange(); - if (range.collapsed != true) { - me.fireEvent("updateSections"); - } else { - var keyCode = e.keyCode || e.which; - if (keyCode == 13 || keyCode == 8 || keyCode == 46) { - me.fireEvent("updateSections"); - } - } - } - }, - commands: { - getsections: { - execCommand: function(cmd, levels) { - var levelFn = levels || ["h1", "h2", "h3", "h4", "h5", "h6"]; - - for (var i = 0; i < levelFn.length; i++) { - if (typeof levelFn[i] == "string") { - levelFn[i] = (function(fn) { - return function(node) { - return node.tagName == fn.toUpperCase(); - }; - })(levelFn[i]); - } else if (typeof levelFn[i] != "function") { - levelFn[i] = function(node) { - return null; - }; - } - } - function getSectionLevel(node) { - for (var i = 0; i < levelFn.length; i++) { - if (levelFn[i](node)) return i; - } - return -1; - } - - var me = this, - Directory = getSection({ level: -1, title: "root" }), - previous = Directory; - - function traversal(node, Directory) { - var level, - tmpSection = null, - parent, - child, - children = node.childNodes; - for (var i = 0, len = children.length; i < len; i++) { - child = children[i]; - level = getSectionLevel(child); - if (level >= 0) { - var address = me.selection - .getRange() - .selectNode(child) - .createAddress(true).startAddress, - current = getSection({ - tag: child.tagName, - title: child.innerText || child.textContent || "", - level: level, - dom: child, - startAddress: utils.clone(address, []), - endAddress: utils.clone(address, []), - children: [] - }); - previous.nextSection = current; - current.previousSection = previous; - parent = previous; - while (level <= parent.level) { - parent = parent.parentSection; - } - current.parentSection = parent; - parent.children.push(current); - tmpSection = previous = current; - } else { - child.nodeType === 1 && traversal(child, Directory); - tmpSection && - tmpSection.endAddress[tmpSection.endAddress.length - 1]++; - } - } - } - traversal(me.body, Directory); - return Directory; - }, - notNeedUndo: true - }, - movesection: { - execCommand: function(cmd, sourceSection, targetSection, isAfter) { - var me = this, - targetAddress, - target; - - if (!sourceSection || !targetSection || targetSection.level == -1) - return; - - targetAddress = isAfter - ? targetSection.endAddress - : targetSection.startAddress; - target = getNodeFromAddress(targetAddress, me.body); - - /* 判断目标地址是否被源章节包含 */ - if ( - !targetAddress || - !target || - isContainsAddress( - sourceSection.startAddress, - sourceSection.endAddress, - targetAddress - ) - ) - return; - - var startNode = getNodeFromAddress( - sourceSection.startAddress, - me.body - ), - endNode = getNodeFromAddress(sourceSection.endAddress, me.body), - current, - nextNode; - - if (isAfter) { - current = endNode; - while ( - current && - !( - domUtils.getPosition(startNode, current) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.previousSibling; - domUtils.insertAfter(target, current); - if (current == startNode) break; - current = nextNode; - } - } else { - current = startNode; - while ( - current && - !( - domUtils.getPosition(current, endNode) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.nextSibling; - target.parentNode.insertBefore(current, target); - if (current == endNode) break; - current = nextNode; - } - } - - me.fireEvent("updateSections"); - - /* 获取地址的包含关系 */ - function isContainsAddress(startAddress, endAddress, addressTarget) { - var isAfterStartAddress = false, - isBeforeEndAddress = false; - for (var i = 0; i < startAddress.length; i++) { - if (i >= addressTarget.length) break; - if (addressTarget[i] > startAddress[i]) { - isAfterStartAddress = true; - break; - } else if (addressTarget[i] < startAddress[i]) { - break; - } - } - for (var i = 0; i < endAddress.length; i++) { - if (i >= addressTarget.length) break; - if (addressTarget[i] < startAddress[i]) { - isBeforeEndAddress = true; - break; - } else if (addressTarget[i] > startAddress[i]) { - break; - } - } - return isAfterStartAddress && isBeforeEndAddress; - } - } - }, - deletesection: { - execCommand: function(cmd, section, keepChildren) { - var me = this; - - if (!section) return; - - function getNodeFromAddress(startAddress) { - var current = me.body; - for (var i = 0; i < startAddress.length; i++) { - if (!current.childNodes) return null; - current = current.childNodes[startAddress[i]]; - } - return current; - } - - var startNode = getNodeFromAddress(section.startAddress), - endNode = getNodeFromAddress(section.endAddress), - current = startNode, - nextNode; - - if (!keepChildren) { - while ( - current && - domUtils.inDoc(endNode, me.document) && - !( - domUtils.getPosition(current, endNode) & - domUtils.POSITION_FOLLOWING - ) - ) { - nextNode = current.nextSibling; - domUtils.remove(current); - current = nextNode; - } - } else { - domUtils.remove(current); - } - - me.fireEvent("updateSections"); - } - }, - selectsection: { - execCommand: function(cmd, section) { - if (!section && !section.dom) return false; - var me = this, - range = me.selection.getRange(), - address = { - startAddress: utils.clone(section.startAddress, []), - endAddress: utils.clone(section.endAddress, []) - }; - address.endAddress[address.endAddress.length - 1]++; - range.moveToAddress(address).select().scrollToView(); - return true; - }, - notNeedUndo: true - }, - scrolltosection: { - execCommand: function(cmd, section) { - if (!section && !section.dom) return false; - var me = this, - range = me.selection.getRange(), - address = { - startAddress: section.startAddress, - endAddress: section.endAddress - }; - address.endAddress[address.endAddress.length - 1]++; - range.moveToAddress(address).scrollToView(); - return true; - }, - notNeedUndo: true - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js deleted file mode 100644 index d25e77d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/selectall.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 全选 - * @file - * @since 1.2.6.1 - */ - -/** - * 选中所有内容 - * @command selectall - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * 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 - }; - - //快捷键 - me.addshortcutkey({ - selectAll: "ctrl+65" - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js deleted file mode 100644 index 8e05120..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/serverparam.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * 服务器提交的额外参数列表设置插件 - * @file - * @since 1.2.6.1 - */ -UE.plugin.register("serverparam", function() { - var me = this, - serverParam = {}; - - return { - commands: { - /** - * 修改服务器提交的额外参数列表,清除所有项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand('serverparam'); - * editor.queryCommandValue('serverparam'); //返回空 - * ``` - */ - /** - * 修改服务器提交的额外参数列表,删除指定项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } key 要清除的属性 - * @example - * ```javascript - * editor.execCommand('serverparam', 'name'); //删除属性name - * ``` - */ - /** - * 修改服务器提交的额外参数列表,使用键值添加项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { String } key 要添加的属性 - * @param { String } value 要添加属性的值 - * @example - * ```javascript - * editor.execCommand('serverparam', 'name', 'hello'); - * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} - * ``` - */ - /** - * 修改服务器提交的额外参数列表,传入键值对对象添加多项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } key 传入的键值对对象 - * @example - * ```javascript - * editor.execCommand('serverparam', {'name': 'hello'}); - * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} - * ``` - */ - /** - * 修改服务器提交的额外参数列表,使用自定义函数添加多项 - * @command serverparam - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Function } key 自定义获取参数的函数 - * @example - * ```javascript - * editor.execCommand('serverparam', function(editor){ - * return {'key': 'value'}; - * }); - * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} - * ``` - */ - - /** - * 获取服务器提交的额外参数列表 - * @command serverparam - * @method queryCommandValue - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * 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; - } - } else if (utils.isObject(key)) { - //传入对象,覆盖列表项 - utils.extend(serverParam, key, false); - } else if (utils.isFunction(key)) { - //传入函数,添加列表项 - utils.extend(serverParam, key(), false); - } - }, - queryCommandValue: function() { - return serverParam || {}; - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js deleted file mode 100644 index 322bbb9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/shortcutmenu.js +++ /dev/null @@ -1,73 +0,0 @@ -///import core -///commands 弹出菜单 -// commandsName popupmenu -///commandsTitle 弹出菜单 -/** - * 弹出菜单 - * @function - * @name baidu.editor.plugins.popupmenu - * @author xuheng - */ - -UE.plugins["shortcutmenu"] = function() { - var me = this, - menu, - items = me.options.shortcutMenu || []; - - if (!items.length) { - return; - } - - me.addListener("contextmenu mouseup", function(type, e) { - var me = this, - customEvt = { - type: type, - target: e.target || e.srcElement, - screenX: e.screenX, - screenY: e.screenY, - clientX: e.clientX, - clientY: e.clientY - }; - - setTimeout(function() { - var rng = me.selection.getRange(); - if (rng.collapsed === false || type == "contextmenu") { - if (!menu) { - menu = new baidu.editor.ui.ShortCutMenu({ - editor: me, - items: items, - theme: me.options.theme, - className: "edui-shortcutmenu" - }); - - menu.render(); - me.fireEvent("afterrendershortcutmenu", menu); - } - - menu.show(customEvt, !!UE.plugins["contextmenu"]); - } - }); - - if (type == "contextmenu") { - domUtils.preventDefault(e); - if (browser.ie9below) { - var ieRange; - try { - ieRange = me.selection.getNative().createRange(); - } catch (e) { - return; - } - if (ieRange.item) { - var range = new dom.Range(me.document); - range.selectNode(ieRange.item(0)).select(true, true); - } - } - } - }); - - me.addListener("keydown", function(type) { - if (type == "keydown") { - menu && !menu.isHidden && menu.hide(); - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js deleted file mode 100644 index cc11817..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/simpleupload.js +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @description - * 简单上传:点击按钮,直接选择文件上传 - * @author Jinqn - * @date 2014-03-31 - */ -UE.plugin.register("simpleupload", function() { - var me = this, - isLoaded = false, - containerBtn; - - function initUploadBtn() { - var w = containerBtn.offsetWidth || 20, - h = containerBtn.offsetHeight || 20, - btnIframe = document.createElement("iframe"), - btnStyle = - "display:block;width:" + - w + - "px;height:" + - h + - "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;"; - - domUtils.on(btnIframe, "load", function() { - var timestrap = (+new Date()).toString(36), - wrapper, - btnIframeDoc, - btnIframeBody; - - btnIframeDoc = - btnIframe.contentDocument || btnIframe.contentWindow.document; - btnIframeBody = btnIframeDoc.body; - wrapper = btnIframeDoc.createElement("div"); - - wrapper.innerHTML = - '
    ' + - '' + - "
    " + - ''; - - 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, - json, - loader, - body = (iframe.contentDocument || iframe.contentWindow.document) - .body, - result = body.innerText || body.textContent || ""; - json = new Function("return " + result)(); - link = me.options.imageUrlPrefix + json.url; - if (json.state == "SUCCESS" && json.url) { - loader = me.document.getElementById(loadingId); - domUtils.removeClasses(loader, "loadingclass"); - domUtils.on(loader,'load',function(){ - me.fireEvent('contentchange'); - }); - loader.setAttribute("src", link); - loader.setAttribute("_src", link); - loader.setAttribute("alt", json.original || ""); - loader.removeAttribute("id"); - } else { - showErrorLoader && showErrorLoader(json.state); - } - } 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 - }); - } - } - - /* 判断后端配置是否没有加载成功 */ - 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; - } - - domUtils.on(iframe, "load", callback); - form.action = utils.formatUrl( - imageActionUrl + - (imageActionUrl.indexOf("?") == -1 ? "?" : "&") + - params - ); - form.submit(); - }); - - 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; - }); - - 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:1px solid #cccccc;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:1px solid #cccccc;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; - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js deleted file mode 100644 index ad9ed7d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/snapscreen.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * 截屏插件,为UEditor提供插入支持 - * @file - * @since 1.4.2 - */ -UE.plugin.register("snapscreen", function() { - var me = this; - var snapplugin; - - function getLocation(url) { - var search, - a = document.createElement("a"), - params = utils.serializeParam(me.queryCommandValue("serverparam")) || ""; - - a.href = url; - if (browser.ie) { - a.href = a.href; - } - - search = a.search; - if (params) { - search = search + (search.indexOf("?") == -1 ? "?" : "&") + params; - search = search.replace(/[&]+/gi, "&"); - } - return { - port: a.port, - hostname: a.hostname, - path: a.pathname + search || +a.hash - }; - } - - return { - commands: { - /** - * 字体背景颜色 - * @command snapscreen - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand('snapscreen'); - * ``` - */ - snapscreen: { - execCommand: function(cmd) { - var url, local, res; - var lang = me.getLang("snapScreen_plugin"); - - if (!snapplugin) { - var container = me.container; - var doc = me.container.ownerDocument || me.container.document; - snapplugin = doc.createElement("object"); - try { - snapplugin.type = "application/x-pluginbaidusnap"; - } catch (e) { - return; - } - snapplugin.style.cssText = - "position:absolute;left:-9999px;width:0;height:0;"; - snapplugin.setAttribute("width", "0"); - snapplugin.setAttribute("height", "0"); - container.appendChild(snapplugin); - } - - function onSuccess(rs) { - try { - rs = eval("(" + rs + ")"); - if (rs.state == "SUCCESS") { - var opt = me.options; - me.execCommand("insertimage", { - src: opt.snapscreenUrlPrefix + rs.url, - _src: opt.snapscreenUrlPrefix + rs.url, - alt: rs.title || "", - floatStyle: opt.snapscreenImgAlign - }); - } else { - alert(rs.state); - } - } catch (e) { - alert(lang.callBackErrorMsg); - } - } - url = me.getActionUrl(me.getOpt("snapscreenActionName")); - local = getLocation(url); - setTimeout(function() { - try { - res = snapplugin.saveSnapshot( - local.hostname, - local.path, - local.port - ); - } catch (e) { - me.ui._dialogs["snapscreenDialog"].open(); - return; - } - - onSuccess(res); - }, 50); - }, - queryCommandState: function() { - return navigator.userAgent.indexOf("Windows", 0) != -1 ? 0 : -1; - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js deleted file mode 100644 index 20ae308..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/source.js +++ /dev/null @@ -1,347 +0,0 @@ -/** - * 源码编辑插件 - * @file - * @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; - }, - 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 - }); - 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); - } - - var bakCssText; - //解决在源码模式下getContent不能得到最新的内容问题 - var oldGetContent, bakAddress; - - /** - * 切换源码模式和编辑模式 - * @command source - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'source'); - * ``` - */ - - /** - * 查询当前编辑区域的状态是源码模式还是可视化模式 - * @command source - * @method queryCommandState - * @param { String } cmd 命令字符串 - * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 - * @example - * ```javascript - * editor.queryCommandState( 'source' ); - * ``` - */ - - 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()); - } - } - 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); - }; - - 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" - }); - }); - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js deleted file mode 100644 index dcbc45d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.action.js +++ /dev/null @@ -1,2023 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: taoqili - * Date: 12-10-12 - * Time: 上午10:05 - * To change this template use File | Settings | File Templates. - */ -UE.plugins["table"] = function() { - var me = this, - tabTimer = null, - //拖动计时器 - tableDragTimer = null, - //双击计时器 - tableResizeTimer = null, - //单元格最小宽度 - cellMinWidth = 5, - isInResizeBuffer = false, - //单元格边框大小 - cellBorderWidth = 5, - //鼠标偏移距离 - offsetOfTableCell = 10, - //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 - singleClickState = 0, - userActionStatus = null, - //双击允许的时间范围 - dblclickTime = 360, - UT = UE.UETable, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }, - getUETableBySelected = function(editor) { - return UT.getUETableBySelected(editor); - }, - getDefaultValue = function(editor, table) { - return UT.getDefaultValue(editor, table); - }, - removeSelectedClass = function(cells) { - return UT.removeSelectedClass(cells); - }; - - function showError(e) { - // throw e; - } - me.ready(function() { - var me = this; - var orgGetText = me.selection.getText; - me.selection.getText = function() { - var table = getUETableBySelected(me); - if (table) { - var str = ""; - utils.each(table.selectedTds, function(td) { - str += td[browser.ie ? "innerText" : "textContent"]; - }); - return str; - } else { - return orgGetText.call(me.selection); - } - }; - }); - - //处理拖动及框选相关方法 - var startTd = null, //鼠标按下时的锚点td - currentTd = null, //当前鼠标经过时的td - onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 - onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 - dragButton = null, - dragOver = false, - dragLine = null, //模拟的拖动线 - dragTd = null; //发生拖动的目标td - - var mousedown = false, - //todo 判断混乱模式 - needIEHack = true; - - me.setOpt({ - maxColNum: 20, - maxRowNum: 100, - defaultCols: 5, - defaultRows: 5, - tdvalign: "top", - cursorpath: me.options.UEDITOR_HOME_URL + "themes/" + me.options.theme + "/images/cursor_", - tableDragable: false, - classList: [ - "ue-table-interlace-color-single", - "ue-table-interlace-color-double" - ] - }); - me.getUETable = getUETable; - var commands = { - deletetable: 1, - inserttable: 1, - cellvalign: 1, - insertcaption: 1, - deletecaption: 1, - inserttitle: 1, - deletetitle: 1, - mergeright: 1, - mergedown: 1, - mergecells: 1, - insertrow: 1, - insertrownext: 1, - deleterow: 1, - insertcol: 1, - insertcolnext: 1, - deletecol: 1, - splittocells: 1, - splittorows: 1, - splittocols: 1, - adaptbytext: 1, - adaptbywindow: 1, - adaptbycustomer: 1, - insertparagraph: 1, - insertparagraphbeforetable: 1, - averagedistributecol: 1, - averagedistributerow: 1 - }; - me.ready(function() { - utils.cssRule( - "table", - //选中的td上的样式 - ".selectTdClass{background-color:#edf5fa !important}" + - "table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}" + - //插入的表格的默认样式 - "table{margin-bottom:10px;border-collapse:collapse;display:table;}" + - "td,th{padding: 5px 10px;border: 1px solid #DDD;}" + - "caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + - "th{border-top:1px solid #BBB;background-color:#F7F7F7;}" + - "table tr.firstRow th{border-top-width:2px;}" + - ".ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }" + - "td p{margin:0;padding:0;}", - me.document - ); - - var tableCopyList, isFullCol, isFullRow; - //注册del/backspace事件 - me.addListener("keydown", function(cmd, evt) { - var me = this; - var keyCode = evt.keyCode || evt.which; - - if (keyCode == 8) { - var ut = getUETableBySelected(me); - if (ut && ut.selectedTds.length) { - if (ut.isFullCol()) { - me.execCommand("deletecol"); - } else if (ut.isFullRow()) { - me.execCommand("deleterow"); - } else { - me.fireEvent("delcells"); - } - domUtils.preventDefault(evt); - } - - var caption = domUtils.findParentByTagName( - me.selection.getStart(), - "caption", - true - ), - range = me.selection.getRange(); - if (range.collapsed && caption && isEmptyBlock(caption)) { - me.fireEvent("saveScene"); - var table = caption.parentNode; - domUtils.remove(caption); - if (table) { - range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); - } - me.fireEvent("saveScene"); - } - } - - if (keyCode == 46) { - ut = getUETableBySelected(me); - if (ut) { - me.fireEvent("saveScene"); - for (var i = 0, ci; (ci = ut.selectedTds[i++]); ) { - domUtils.fillNode(me.document, ci); - } - me.fireEvent("saveScene"); - domUtils.preventDefault(evt); - } - } - if (keyCode == 13) { - var rng = me.selection.getRange(), - caption = domUtils.findParentByTagName( - rng.startContainer, - "caption", - true - ); - if (caption) { - var table = domUtils.findParentByTagName(caption, "table"); - if (!rng.collapsed) { - rng.deleteContents(); - me.fireEvent("saveScene"); - } else { - if (caption) { - rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); - } - } - domUtils.preventDefault(evt); - return; - } - if (rng.collapsed) { - var table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - var cell = table.rows[0].cells[0], - start = domUtils.findParentByTagName( - me.selection.getStart(), - ["td", "th"], - true - ), - preNode = table.previousSibling; - if ( - cell === start && - (!preNode || - (preNode.nodeType == 1 && preNode.tagName == "TABLE")) && - domUtils.isStartInblock(rng) - ) { - var first = domUtils.findParent( - me.selection.getStart(), - function(n) { - return domUtils.isBlockElm(n); - }, - true - ); - if ( - first && - (/t(h|d)/i.test(first.tagName) || first === start.firstChild) - ) { - me.execCommand("insertparagraphbeforetable"); - domUtils.preventDefault(evt); - } - } - } - } - } - - if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == "67") { - tableCopyList = null; - var ut = getUETableBySelected(me); - if (ut) { - var tds = ut.selectedTds; - isFullCol = ut.isFullCol(); - isFullRow = ut.isFullRow(); - tableCopyList = [[ut.cloneCell(tds[0], null, true)]]; - for (var i = 1, ci; (ci = tds[i]); i++) { - if (ci.parentNode !== tds[i - 1].parentNode) { - tableCopyList.push([ut.cloneCell(ci, null, true)]); - } else { - tableCopyList[tableCopyList.length - 1].push( - ut.cloneCell(ci, null, true) - ); - } - } - } - } - }); - me.addListener("tablehasdeleted", function() { - toggleDraggableState(this, false, "", null); - if (dragButton) domUtils.remove(dragButton); - }); - - me.addListener("beforepaste", function(cmd, html) { - var me = this; - var rng = me.selection.getRange(); - if (domUtils.findParentByTagName(rng.startContainer, "caption", true)) { - var div = me.document.createElement("div"); - div.innerHTML = html.html; - //trace:3729 - html.html = div[browser.ie9below ? "innerText" : "textContent"]; - return; - } - var table = getUETableBySelected(me); - if (tableCopyList) { - me.fireEvent("saveScene"); - var rng = me.selection.getRange(); - var td = domUtils.findParentByTagName( - rng.startContainer, - ["td", "th"], - true - ), - tmpNode, - preNode; - if (td) { - var ut = getUETable(td); - if (isFullRow) { - var rowIndex = ut.getCellInfo(td).rowIndex; - if (td.tagName == "TH") { - rowIndex++; - } - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - var tr = ut.insertRow(rowIndex++, "td"); - for (var j = 0, cj; (cj = ci[j]); j++) { - var cell = tr.cells[j]; - if (!cell) { - cell = tr.insertCell(j); - } - cell.innerHTML = cj.innerHTML; - cj.getAttribute("width") && - cell.setAttribute("width", cj.getAttribute("width")); - cj.getAttribute("vAlign") && - cell.setAttribute("vAlign", cj.getAttribute("vAlign")); - cj.getAttribute("align") && - cell.setAttribute("align", cj.getAttribute("align")); - cj.style.cssText && (cell.style.cssText = cj.style.cssText); - } - for (var j = 0, cj; (cj = tr.cells[j]); j++) { - if (!ci[j]) break; - cj.innerHTML = ci[j].innerHTML; - ci[j].getAttribute("width") && - cj.setAttribute("width", ci[j].getAttribute("width")); - ci[j].getAttribute("vAlign") && - cj.setAttribute("vAlign", ci[j].getAttribute("vAlign")); - ci[j].getAttribute("align") && - cj.setAttribute("align", ci[j].getAttribute("align")); - ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText); - } - } - } else { - if (isFullCol) { - cellInfo = ut.getCellInfo(td); - var maxColNum = 0; - for (var j = 0, ci = tableCopyList[0], cj; (cj = ci[j++]); ) { - maxColNum += cj.colSpan || 1; - } - me.__hasEnterExecCommand = true; - for (i = 0; i < maxColNum; i++) { - me.execCommand("insertcol"); - } - me.__hasEnterExecCommand = false; - td = ut.table.rows[0].cells[cellInfo.cellIndex]; - if (td.tagName == "TH") { - td = ut.table.rows[1].cells[cellInfo.cellIndex]; - } - } - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - tmpNode = td; - for (var j = 0, cj; (cj = ci[j++]); ) { - if (td) { - td.innerHTML = cj.innerHTML; - //todo 定制处理 - cj.getAttribute("width") && - td.setAttribute("width", cj.getAttribute("width")); - cj.getAttribute("vAlign") && - td.setAttribute("vAlign", cj.getAttribute("vAlign")); - cj.getAttribute("align") && - td.setAttribute("align", cj.getAttribute("align")); - cj.style.cssText && (td.style.cssText = cj.style.cssText); - preNode = td; - td = td.nextSibling; - } else { - var cloneTd = cj.cloneNode(true); - domUtils.removeAttributes(cloneTd, [ - "class", - "rowSpan", - "colSpan" - ]); - - preNode.parentNode.appendChild(cloneTd); - } - } - td = ut.getNextCell(tmpNode, true, true); - if (!tableCopyList[i]) break; - if (!td) { - var cellInfo = ut.getCellInfo(tmpNode); - ut.table.insertRow(ut.table.rows.length); - ut.update(); - td = ut.getVSideCell(tmpNode, true); - } - } - } - ut.update(); - } else { - table = me.document.createElement("table"); - for (var i = 0, ci; (ci = tableCopyList[i++]); ) { - var tr = table.insertRow(table.rows.length); - for (var j = 0, cj; (cj = ci[j++]); ) { - cloneTd = UT.cloneCell(cj, null, true); - domUtils.removeAttributes(cloneTd, ["class"]); - tr.appendChild(cloneTd); - } - if (j == 2 && cloneTd.rowSpan > 1) { - cloneTd.rowSpan = 1; - } - } - - var defaultValue = getDefaultValue(me), - width = - me.body.offsetWidth - - (needIEHack - ? parseInt( - domUtils.getComputedStyle(me.body, "margin-left"), - 10 - ) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (me.options.offsetWidth || 0); - me.execCommand( - "insertHTML", - "" + - table.innerHTML - .replace(/>\s*<") - .replace(/\bth\b/gi, "td") + - "
    " - ); - } - me.fireEvent("contentchange"); - me.fireEvent("saveScene"); - html.html = ""; - return true; - } else { - var div = me.document.createElement("div"), - tables; - div.innerHTML = html.html; - tables = div.getElementsByTagName("table"); - if (domUtils.findParentByTagName(me.selection.getStart(), "table")) { - utils.each(tables, function(t) { - domUtils.remove(t); - }); - if ( - domUtils.findParentByTagName( - me.selection.getStart(), - "caption", - true - ) - ) { - div.innerHTML = div[browser.ie ? "innerText" : "textContent"]; - } - } else { - utils.each(tables, function(table) { - removeStyleSize(table, true); - domUtils.removeAttributes(table, ["style", "border"]); - utils.each(domUtils.getElementsByTagName(table, "td"), function( - td - ) { - if (isEmptyBlock(td)) { - domUtils.fillNode(me.document, td); - } - removeStyleSize(td, true); - // domUtils.removeAttributes(td, ['style']) - }); - }); - } - html.html = div.innerHTML; - } - }); - - me.addListener("afterpaste", function() { - utils.each(domUtils.getElementsByTagName(me.body, "table"), function( - table - ) { - if (table.offsetWidth > me.body.offsetWidth) { - var defaultValue = getDefaultValue(me, table); - table.style.width = - me.body.offsetWidth - - (needIEHack - ? parseInt( - domUtils.getComputedStyle(me.body, "margin-left"), - 10 - ) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (me.options.offsetWidth || 0) + - "px"; - } - }); - }); - me.addListener("blur", function() { - tableCopyList = null; - }); - var timer; - me.addListener("keydown", function() { - clearTimeout(timer); - timer = setTimeout(function() { - var rng = me.selection.getRange(), - cell = domUtils.findParentByTagName( - rng.startContainer, - ["th", "td"], - true - ); - if (cell) { - var table = cell.parentNode.parentNode.parentNode; - if (table.offsetWidth > table.getAttribute("width")) { - cell.style.wordBreak = "break-all"; - } - } - }, 100); - }); - me.addListener("selectionchange", function() { - toggleDraggableState(me, false, "", null); - }); - - //内容变化时触发索引更新 - //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 - me.addListener("contentchange", function() { - var me = this; - //尽可能排除一些不需要更新的状况 - hideDragLine(me); - if (getUETableBySelected(me)) return; - var rng = me.selection.getRange(); - var start = rng.startContainer; - start = domUtils.findParentByTagName(start, ["td", "th"], true); - utils.each(domUtils.getElementsByTagName(me.document, "table"), function( - table - ) { - if (me.fireEvent("excludetable", table) === true) return; - table.ueTable = new UT(table); - //trace:3742 - // utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { - // - // if (domUtils.isEmptyBlock(td) && td !== start) { - // domUtils.fillNode(me.document, td); - // if (browser.ie && browser.version == 6) { - // td.innerHTML = ' ' - // } - // } - // }); - // utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { - // if (domUtils.isEmptyBlock(th) && th !== start) { - // domUtils.fillNode(me.document, th); - // if (browser.ie && browser.version == 6) { - // th.innerHTML = ' ' - // } - // } - // }); - table.onmouseover = function() { - me.fireEvent("tablemouseover", table); - }; - table.onmousemove = function() { - me.fireEvent("tablemousemove", table); - me.options.tableDragable && toggleDragButton(true, this, me); - utils.defer(function() { - me.fireEvent("contentchange", 50); - }, true); - }; - table.onmouseout = function() { - me.fireEvent("tablemouseout", table); - toggleDraggableState(me, false, "", null); - hideDragLine(me); - }; - table.onclick = function(evt) { - evt = me.window.event || evt; - var target = getParentTdOrTh(evt.target || evt.srcElement); - if (!target) return; - var ut = getUETable(target), - table = ut.table, - cellInfo = ut.getCellInfo(target), - cellsRange, - rng = me.selection.getRange(); - // if ("topLeft" == inPosition(table, mouseCoords(evt))) { - // cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); - // ut.setSelected(cellsRange); - // return; - // } - // if ("bottomRight" == inPosition(table, mouseCoords(evt))) { - // - // return; - // } - if (inTableSide(table, target, evt, true)) { - var endTdCol = ut.getCell( - ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, - ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex - ); - if (evt.shiftKey && ut.selectedTds.length) { - if (ut.selectedTds[0] !== endTdCol) { - cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdCol).select(); - } - } else { - if (target !== endTdCol) { - cellsRange = ut.getCellsRange(target, endTdCol); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdCol).select(); - } - } - return; - } - if (inTableSide(table, target, evt)) { - var endTdRow = ut.getCell( - ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, - ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex - ); - if (evt.shiftKey && ut.selectedTds.length) { - if (ut.selectedTds[0] !== endTdRow) { - cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdRow).select(); - } - } else { - if (target !== endTdRow) { - cellsRange = ut.getCellsRange(target, endTdRow); - ut.setSelected(cellsRange); - } else { - rng && rng.selectNodeContents(endTdRow).select(); - } - } - } - }; - }); - - switchBorderColor(me, true); - }); - - domUtils.on(me.document, "mousemove", mouseMoveEvent); - - domUtils.on(me.document, "mouseout", function(evt) { - var target = evt.target || evt.srcElement; - if (target.tagName == "TABLE") { - toggleDraggableState(me, false, "", null); - } - }); - /** - * 表格隔行变色 - */ - me.addListener("interlacetable", function(type, table, classList) { - if (!table) return; - var me = this, - rows = table.rows, - len = rows.length, - getClass = function(list, index, repeat) { - return list[index] - ? list[index] - : repeat ? list[index % list.length] : ""; - }; - for (var i = 0; i < len; i++) { - rows[i].className = getClass( - classList || me.options.classList, - i, - true - ); - } - }); - me.addListener("uninterlacetable", function(type, table) { - if (!table) return; - var me = this, - rows = table.rows, - classList = me.options.classList, - len = rows.length; - for (var i = 0; i < len; i++) { - domUtils.removeClasses(rows[i], classList); - } - }); - - me.addListener("mousedown", mouseDownEvent); - me.addListener("mouseup", mouseUpEvent); - //拖动的时候触发mouseup - domUtils.on(me.body, "dragstart", function(evt) { - mouseUpEvent.call(me, "dragstart", evt); - }); - me.addOutputRule(function(root) { - utils.each(root.getNodesByTagName("div"), function(n) { - if (n.getAttr("id") == "ue_tableDragLine") { - n.parentNode.removeChild(n); - } - }); - }); - - var currentRowIndex = 0; - me.addListener("mousedown", function() { - currentRowIndex = 0; - }); - me.addListener("tabkeydown", function() { - var range = this.selection.getRange(), - common = range.getCommonAncestor(true, true), - table = domUtils.findParentByTagName(common, "table"); - if (table) { - if (domUtils.findParentByTagName(common, "caption", true)) { - var cell = domUtils.getElementsByTagName(table, "th td"); - if (cell && cell.length) { - range.setStart(cell[0], 0).setCursor(false, true); - } - } else { - var cell = domUtils.findParentByTagName(common, ["td", "th"], true), - ua = getUETable(cell); - currentRowIndex = cell.rowSpan > 1 - ? currentRowIndex - : ua.getCellInfo(cell).rowIndex; - var nextCell = ua.getTabNextCell(cell, currentRowIndex); - if (nextCell) { - if (isEmptyBlock(nextCell)) { - range.setStart(nextCell, 0).setCursor(false, true); - } else { - range.selectNodeContents(nextCell).select(); - } - } else { - me.fireEvent("saveScene"); - me.__hasEnterExecCommand = true; - this.execCommand("insertrownext"); - me.__hasEnterExecCommand = false; - range = this.selection.getRange(); - range - .setStart(table.rows[table.rows.length - 1].cells[0], 0) - .setCursor(); - me.fireEvent("saveScene"); - } - } - return true; - } - }); - browser.ie && - me.addListener("selectionchange", function() { - toggleDraggableState(this, false, "", null); - }); - me.addListener("keydown", function(type, evt) { - var me = this; - //处理在表格的最后一个输入tab产生新的表格 - var keyCode = evt.keyCode || evt.which; - if (keyCode == 8 || keyCode == 46) { - return; - } - var notCtrlKey = - !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; - notCtrlKey && - removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); - var ut = getUETableBySelected(me); - if (!ut) return; - notCtrlKey && ut.clearSelected(); - }); - - me.addListener("beforegetcontent", function() { - switchBorderColor(this, false); - browser.ie && - utils.each(this.document.getElementsByTagName("caption"), function(ci) { - if (domUtils.isEmptyNode(ci)) { - ci.innerHTML = " "; - } - }); - }); - me.addListener("aftergetcontent", function() { - switchBorderColor(this, true); - }); - me.addListener("getAllHtml", function() { - removeSelectedClass(me.document.getElementsByTagName("td")); - }); - //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 - me.addListener("fullscreenchanged", function(type, fullscreen) { - if (!fullscreen) { - var ratio = this.body.offsetWidth / document.body.offsetWidth, - tables = domUtils.getElementsByTagName(this.body, "table"); - utils.each(tables, function(table) { - if (table.offsetWidth < me.body.offsetWidth) return false; - var tds = domUtils.getElementsByTagName(table, "td"), - backWidths = []; - utils.each(tds, function(td) { - backWidths.push(td.offsetWidth); - }); - for (var i = 0, td; (td = tds[i]); i++) { - td.setAttribute("width", Math.floor(backWidths[i] * ratio)); - } - table.setAttribute( - "width", - Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))) - ); - }); - } - }); - - //重写execCommand命令,用于处理框选时的处理 - var oldExecCommand = me.execCommand; - me.execCommand = function(cmd, datatat) { - var me = this, - args = arguments; - - cmd = cmd.toLowerCase(); - var ut = getUETableBySelected(me), - tds, - range = new dom.Range(me.document), - cmdFun = me.commands[cmd] || UE.commands[cmd], - result; - if (!cmdFun) return; - if ( - ut && - !commands[cmd] && - !cmdFun.notNeedUndo && - !me.__hasEnterExecCommand - ) { - me.__hasEnterExecCommand = true; - me.fireEvent("beforeexeccommand", cmd); - tds = ut.selectedTds; - var lastState = -2, - lastValue = -2, - value, - state; - for (var i = 0, td; (td = tds[i]); i++) { - if (isEmptyBlock(td)) { - range.setStart(td, 0).setCursor(false, true); - } else { - range.selectNode(td).select(true); - } - state = me.queryCommandState(cmd); - value = me.queryCommandValue(cmd); - if (state != -1) { - if (lastState !== state || lastValue !== value) { - me._ignoreContentChange = true; - result = oldExecCommand.apply(me, arguments); - me._ignoreContentChange = false; - } - lastState = me.queryCommandState(cmd); - lastValue = me.queryCommandValue(cmd); - if (domUtils.isEmptyBlock(td)) { - domUtils.fillNode(me.document, td); - } - } - } - range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); - me.fireEvent("contentchange"); - me.fireEvent("afterexeccommand", cmd); - me.__hasEnterExecCommand = false; - me._selectionChange(); - } else { - result = oldExecCommand.apply(me, arguments); - } - return result; - }; - }); - /** - * 删除obj的宽高style,改成属性宽高 - * @param obj - * @param replaceToProperty - */ - function removeStyleSize(obj, replaceToProperty) { - removeStyle(obj, "width", true); - removeStyle(obj, "height", true); - } - - function removeStyle(obj, styleName, replaceToProperty) { - if (obj.style[styleName]) { - replaceToProperty && - obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); - obj.style[styleName] = ""; - } - } - - function getParentTdOrTh(ele) { - if (ele.tagName == "TD" || ele.tagName == "TH") return ele; - var td; - if ( - (td = - domUtils.findParentByTagName(ele, "td", true) || - domUtils.findParentByTagName(ele, "th", true)) - ) - return td; - return null; - } - - function isEmptyBlock(node) { - var reg = new RegExp(domUtils.fillChar, "g"); - if ( - node[browser.ie ? "innerText" : "textContent"] - .replace(/^\s*$/, "") - .replace(reg, "").length > 0 - ) { - return 0; - } - for (var n in dtd.$isNotEmpty) { - if (node.getElementsByTagName(n).length) { - return 0; - } - } - return 1; - } - - function mouseCoords(evt) { - if (evt.pageX || evt.pageY) { - return { x: evt.pageX, y: evt.pageY }; - } - return { - x: - evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, - y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop - }; - } - - function mouseMoveEvent(evt) { - if (isEditorDisabled()) { - return; - } - - try { - //普通状态下鼠标移动 - var target = getParentTdOrTh(evt.target || evt.srcElement), - pos; - - //区分用户的行为是拖动还是双击 - if (isInResizeBuffer) { - me.body.style.webkitUserSelect = "none"; - - if ( - Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell || - Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell - ) { - clearTableDragTimer(); - isInResizeBuffer = false; - singleClickState = 0; - //drag action - tableBorderDrag(evt); - } - } - - //修改单元格大小时的鼠标移动 - if (onDrag && dragTd) { - singleClickState = 0; - me.body.style.webkitUserSelect = "none"; - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - pos = mouseCoords(evt); - toggleDraggableState(me, true, onDrag, pos, target); - if (onDrag == "h") { - dragLine.style.left = getPermissionX(dragTd, evt) + "px"; - } else if (onDrag == "v") { - dragLine.style.top = getPermissionY(dragTd, evt) + "px"; - } - return; - } - //当鼠标处于table上时,修改移动过程中的光标状态 - if (target) { - //针对使用table作为容器的组件不触发拖拽效果 - if (me.fireEvent("excludetable", target) === true) return; - pos = mouseCoords(evt); - var state = getRelation(target, pos), - table = domUtils.findParentByTagName(target, "table", true); - - if (inTableSide(table, target, evt, true)) { - if (me.fireEvent("excludetable", table) === true) return; - me.body.style.cursor = - "url(" + me.options.cursorpath + "h.png),pointer"; - } else if (inTableSide(table, target, evt)) { - if (me.fireEvent("excludetable", table) === true) return; - me.body.style.cursor = - "url(" + me.options.cursorpath + "v.png),pointer"; - } else { - me.body.style.cursor = "text"; - var curCell = target; - if (/\d/.test(state)) { - state = state.replace(/\d/, ""); - target = getUETable(target).getPreviewCell(target, state == "v"); - } - //位于第一行的顶部或者第一列的左边时不可拖动 - toggleDraggableState( - me, - target ? !!state : false, - target ? state : "", - pos, - target - ); - } - } else { - toggleDragButton(false, table, me); - } - } catch (e) { - showError(e); - } - } - - var dragButtonTimer; - - function toggleDragButton(show, table, editor) { - if (!show) { - if (dragOver) return; - dragButtonTimer = setTimeout(function() { - !dragOver && - dragButton && - dragButton.parentNode && - dragButton.parentNode.removeChild(dragButton); - }, 2000); - } else { - createDragButton(table, editor); - } - } - - function createDragButton(table, editor) { - var pos = domUtils.getXY(table), - doc = table.ownerDocument; - if (dragButton && dragButton.parentNode) return dragButton; - dragButton = doc.createElement("div"); - dragButton.contentEditable = false; - dragButton.innerHTML = ""; - dragButton.style.cssText = - "width:15px;height:15px;background-image:url(" + - editor.options.UEDITOR_HOME_URL + - "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + - (pos.y - 15) + - "px;left:" + - pos.x + - "px;"; - domUtils.unSelectable(dragButton); - dragButton.onmouseover = function(evt) { - dragOver = true; - }; - dragButton.onmouseout = function(evt) { - dragOver = false; - }; - domUtils.on(dragButton, "click", function(type, evt) { - doClick(evt, this); - }); - domUtils.on(dragButton, "dblclick", function(type, evt) { - doDblClick(evt); - }); - domUtils.on(dragButton, "dragstart", function(type, evt) { - domUtils.preventDefault(evt); - }); - var timer; - - function doClick(evt, button) { - // 部分浏览器下需要清理 - clearTimeout(timer); - timer = setTimeout(function() { - editor.fireEvent("tableClicked", table, button); - }, 300); - } - - function doDblClick(evt) { - clearTimeout(timer); - var ut = getUETable(table), - start = table.rows[0].cells[0], - end = ut.getLastCell(), - range = ut.getCellsRange(start, end); - editor.selection.getRange().setStart(start, 0).setCursor(false, true); - ut.setSelected(range); - } - - doc.body.appendChild(dragButton); - } - - // function inPosition(table, pos) { - // var tablePos = domUtils.getXY(table), - // width = table.offsetWidth, - // height = table.offsetHeight; - // if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { - // return "topLeft"; - // } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { - // return "bottomRight"; - // } - // } - - function inTableSide(table, cell, evt, top) { - var pos = mouseCoords(evt), - state = getRelation(cell, pos); - - if (top) { - var caption = table.getElementsByTagName("caption")[0], - capHeight = caption ? caption.offsetHeight : 0; - return state == "v1" && pos.y - domUtils.getXY(table).y - capHeight < 8; - } else { - return state == "h1" && pos.x - domUtils.getXY(table).x < 8; - } - } - - /** - * 获取拖动时允许的X轴坐标 - * @param dragTd - * @param evt - */ - function getPermissionX(dragTd, evt) { - var ut = getUETable(dragTd); - if (ut) { - var preTd = ut.getSameEndPosCells(dragTd, "x")[0], - nextTd = ut.getSameStartPosXCells(dragTd)[0], - mouseX = mouseCoords(evt).x, - left = - (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20, - right = nextTd - ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 - : me.body.offsetWidth + 5 || - parseInt(domUtils.getComputedStyle(me.body, "width"), 10); - - left += cellMinWidth; - right -= cellMinWidth; - - return mouseX < left ? left : mouseX > right ? right : mouseX; - } - } - - /** - * 获取拖动时允许的Y轴坐标 - */ - function getPermissionY(dragTd, evt) { - try { - var top = domUtils.getXY(dragTd).y, - mousePosY = mouseCoords(evt).y; - return mousePosY < top ? top : mousePosY; - } catch (e) { - showError(e); - } - } - - /** - * 移动状态切换 - */ - function toggleDraggableState(editor, draggable, dir, mousePos, cell) { - try { - editor.body.style.cursor = dir == "h" - ? "col-resize" - : dir == "v" ? "row-resize" : "text"; - if (browser.ie) { - if (dir && !mousedown && !getUETableBySelected(editor)) { - getDragLine(editor, editor.document); - showDragLineAt(dir, cell); - } else { - hideDragLine(editor); - } - } - onBorder = draggable; - } catch (e) { - showError(e); - } - } - - /** - * 获取与UETable相关的resize line - * @param uetable UETable对象 - */ - function getResizeLineByUETable() { - var lineId = "_UETableResizeLine", - line = this.document.getElementById(lineId); - - if (!line) { - line = this.document.createElement("div"); - line.id = lineId; - line.contnetEditable = false; - line.setAttribute("unselectable", "on"); - - var styles = { - width: 2 * cellBorderWidth + 1 + "px", - position: "absolute", - "z-index": 100000, - cursor: "col-resize", - background: "red", - display: "none" - }; - - //切换状态 - line.onmouseout = function() { - this.style.display = "none"; - }; - - utils.extend(line.style, styles); - - this.document.body.appendChild(line); - } - - return line; - } - - /** - * 更新resize-line - */ - function updateResizeLine(cell, uetable) { - var line = getResizeLineByUETable.call(this), - table = uetable.table, - styles = { - top: domUtils.getXY(table).y + "px", - left: - domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + "px", - display: "block", - height: table.offsetHeight + "px" - }; - - utils.extend(line.style, styles); - } - - /** - * 显示resize-line - */ - function showResizeLine(cell) { - var uetable = getUETable(cell); - - updateResizeLine.call(this, cell, uetable); - } - - /** - * 获取鼠标与当前单元格的相对位置 - * @param ele - * @param mousePos - */ - function getRelation(ele, mousePos) { - var elePos = domUtils.getXY(ele); - - if (!elePos) { - return ""; - } - - if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { - return "h"; - } - if (mousePos.x - elePos.x < cellBorderWidth) { - return "h1"; - } - if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { - return "v"; - } - if (mousePos.y - elePos.y < cellBorderWidth) { - return "v1"; - } - return ""; - } - - function mouseDownEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - userActionStatus = { - x: evt.clientX, - y: evt.clientY - }; - - //右键菜单单独处理 - if (evt.button == 2) { - var ut = getUETableBySelected(me), - flag = false; - - if (ut) { - var td = getTargetTd(me, evt); - utils.each(ut.selectedTds, function(ti) { - if (ti === td) { - flag = true; - } - }); - if (!flag) { - removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); - ut.clearSelected(); - } else { - td = ut.selectedTds[0]; - setTimeout(function() { - me.selection.getRange().setStart(td, 0).setCursor(false, true); - }, 0); - } - } - } else { - tableClickHander(evt); - } - } - - //清除表格的计时器 - function clearTableTimer() { - tabTimer && clearTimeout(tabTimer); - tabTimer = null; - } - - //双击收缩 - function tableDbclickHandler(evt) { - singleClickState = 0; - evt = evt || me.window.event; - var target = getParentTdOrTh(evt.target || evt.srcElement); - if (target) { - var h; - if ((h = getRelation(target, mouseCoords(evt)))) { - hideDragLine(me); - - if (h == "h1") { - h = "h"; - if ( - inTableSide( - domUtils.findParentByTagName(target, "table"), - target, - evt - ) - ) { - me.execCommand("adaptbywindow"); - } else { - target = getUETable(target).getPreviewCell(target); - if (target) { - var rng = me.selection.getRange(); - rng.selectNodeContents(target).setCursor(true, true); - } - } - } - if (h == "h") { - var ut = getUETable(target), - table = ut.table, - cells = getCellsByMoveBorder(target, table, true); - - cells = extractArray(cells, "left"); - - ut.width = ut.offsetWidth; - - var oldWidth = [], - newWidth = []; - - utils.each(cells, function(cell) { - oldWidth.push(cell.offsetWidth); - }); - - utils.each(cells, function(cell) { - cell.removeAttribute("width"); - }); - - window.setTimeout(function() { - //是否允许改变 - var changeable = true; - - utils.each(cells, function(cell, index) { - var width = cell.offsetWidth; - - if (width > oldWidth[index]) { - changeable = false; - return false; - } - - newWidth.push(width); - }); - - var change = changeable ? newWidth : oldWidth; - - utils.each(cells, function(cell, index) { - cell.width = change[index] - getTabcellSpace(); - }); - }, 0); - - // minWidth -= cellMinWidth; - // - // table.removeAttribute("width"); - // utils.each(cells, function (cell) { - // cell.style.width = ""; - // cell.width -= minWidth; - // }); - } - } - } - } - - function tableClickHander(evt) { - removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); - //trace:3113 - //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 - utils.each(me.document.getElementsByTagName("table"), function(t) { - t.ueTable = null; - }); - startTd = getTargetTd(me, evt); - if (!startTd) return; - var table = domUtils.findParentByTagName(startTd, "table", true); - ut = getUETable(table); - ut && ut.clearSelected(); - - //判断当前鼠标状态 - if (!onBorder) { - me.document.body.style.webkitUserSelect = ""; - mousedown = true; - me.addListener("mouseover", mouseOverEvent); - } else { - //边框上的动作处理 - borderActionHandler(evt); - } - } - - //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 - function borderActionHandler(evt) { - if (browser.ie) { - evt = reconstruct(evt); - } - - clearTableDragTimer(); - - //是否正在等待resize的缓冲中 - isInResizeBuffer = true; - - tableDragTimer = setTimeout(function() { - tableBorderDrag(evt); - }, dblclickTime); - } - - function extractArray(originArr, key) { - var result = [], - tmp = null; - - for (var i = 0, len = originArr.length; i < len; i++) { - tmp = originArr[i][key]; - - if (tmp) { - result.push(tmp); - } - } - - return result; - } - - function clearTableDragTimer() { - tableDragTimer && clearTimeout(tableDragTimer); - tableDragTimer = null; - } - - function reconstruct(obj) { - var attrs = [ - "pageX", - "pageY", - "clientX", - "clientY", - "srcElement", - "target" - ], - newObj = {}; - - if (obj) { - for (var i = 0, key, val; (key = attrs[i]); i++) { - val = obj[key]; - val && (newObj[key] = val); - } - } - - return newObj; - } - - //边框拖动 - function tableBorderDrag(evt) { - isInResizeBuffer = false; - - startTd = evt.target || evt.srcElement; - if (!startTd) return; - var state = getRelation(startTd, mouseCoords(evt)); - if (/\d/.test(state)) { - state = state.replace(/\d/, ""); - startTd = getUETable(startTd).getPreviewCell(startTd, state == "v"); - } - hideDragLine(me); - getDragLine(me, me.document); - me.fireEvent("saveScene"); - showDragLineAt(state, startTd); - mousedown = true; - //拖动开始 - onDrag = state; - dragTd = startTd; - } - - function mouseUpEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - clearTableDragTimer(); - - isInResizeBuffer = false; - - if (onBorder) { - singleClickState = ++singleClickState % 3; - - userActionStatus = { - x: evt.clientX, - y: evt.clientY - }; - - tableResizeTimer = setTimeout(function() { - singleClickState > 0 && singleClickState--; - }, dblclickTime); - - if (singleClickState === 2) { - singleClickState = 0; - tableDbclickHandler(evt); - return; - } - } - - if (evt.button == 2) return; - var me = this; - //清除表格上原生跨选问题 - var range = me.selection.getRange(), - start = domUtils.findParentByTagName(range.startContainer, "table", true), - end = domUtils.findParentByTagName(range.endContainer, "table", true); - - if (start || end) { - if (start === end) { - start = domUtils.findParentByTagName( - range.startContainer, - ["td", "th", "caption"], - true - ); - end = domUtils.findParentByTagName( - range.endContainer, - ["td", "th", "caption"], - true - ); - if (start !== end) { - me.selection.clearRange(); - } - } else { - me.selection.clearRange(); - } - } - mousedown = false; - me.document.body.style.webkitUserSelect = ""; - //拖拽状态下的mouseUP - if (onDrag && dragTd) { - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - - singleClickState = 0; - dragLine = me.document.getElementById("ue_tableDragLine"); - - // trace 3973 - if (dragLine) { - var dragTdPos = domUtils.getXY(dragTd), - dragLinePos = domUtils.getXY(dragLine); - - switch (onDrag) { - case "h": - changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); - break; - case "v": - changeRowHeight( - dragTd, - dragLinePos.y - dragTdPos.y - dragTd.offsetHeight - ); - break; - default: - } - onDrag = ""; - dragTd = null; - - hideDragLine(me); - me.fireEvent("saveScene"); - return; - } - } - //正常状态下的mouseup - if (!startTd) { - var target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - "td", - true - ); - if (!target) - target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - "th", - true - ); - if (target && (target.tagName == "TD" || target.tagName == "TH")) { - if (me.fireEvent("excludetable", target) === true) return; - range = new dom.Range(me.document); - range.setStart(target, 0).setCursor(false, true); - } - } else { - var ut = getUETable(startTd), - cell = ut ? ut.selectedTds[0] : null; - if (cell) { - range = new dom.Range(me.document); - if (domUtils.isEmptyBlock(cell)) { - range.setStart(cell, 0).setCursor(false, true); - } else { - range - .selectNodeContents(cell) - .shrinkBoundary() - .setCursor(false, true); - } - } else { - range = me.selection.getRange().shrinkBoundary(); - if (!range.collapsed) { - var start = domUtils.findParentByTagName( - range.startContainer, - ["td", "th"], - true - ), - end = domUtils.findParentByTagName( - range.endContainer, - ["td", "th"], - true - ); - //在table里边的不能清除 - if ( - (start && !end) || - (!start && end) || - (start && end && start !== end) - ) { - range.setCursor(false, true); - } - } - } - startTd = null; - me.removeListener("mouseover", mouseOverEvent); - } - me._selectionChange(250, evt); - } - - function mouseOverEvent(type, evt) { - if (isEditorDisabled()) { - return; - } - - var me = this, - tar = evt.target || evt.srcElement; - currentTd = - domUtils.findParentByTagName(tar, "td", true) || - domUtils.findParentByTagName(tar, "th", true); - //需要判断两个TD是否位于同一个表格内 - if ( - startTd && - currentTd && - ((startTd.tagName == "TD" && currentTd.tagName == "TD") || - (startTd.tagName == "TH" && currentTd.tagName == "TH")) && - domUtils.findParentByTagName(startTd, "table") == - domUtils.findParentByTagName(currentTd, "table") - ) { - var ut = getUETable(currentTd); - if (startTd != currentTd) { - me.document.body.style.webkitUserSelect = "none"; - me.selection.getNative()[ - browser.ie9below ? "empty" : "removeAllRanges" - ](); - var range = ut.getCellsRange(startTd, currentTd); - ut.setSelected(range); - } else { - me.document.body.style.webkitUserSelect = ""; - ut.clearSelected(); - } - } - evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); - } - - function setCellHeight(cell, height, backHeight) { - var lineHight = parseInt( - domUtils.getComputedStyle(cell, "line-height"), - 10 - ), - tmpHeight = backHeight + height; - height = tmpHeight < lineHight ? lineHight : tmpHeight; - if (cell.style.height) cell.style.height = ""; - cell.rowSpan == 1 - ? cell.setAttribute("height", height) - : cell.removeAttribute && cell.removeAttribute("height"); - } - - function getWidth(cell) { - if (!cell) return 0; - return parseInt(domUtils.getComputedStyle(cell, "width"), 10); - } - - function changeColWidth(cell, changeValue) { - var ut = getUETable(cell); - if (ut) { - //根据当前移动的边框获取相关的单元格 - var table = ut.table, - cells = getCellsByMoveBorder(cell, table); - - table.style.width = ""; - table.removeAttribute("width"); - - //修正改变量 - changeValue = correctChangeValue(changeValue, cell, cells); - - if (cell.nextSibling) { - var i = 0; - - utils.each(cells, function(cellGroup) { - cellGroup.left.width = +cellGroup.left.width + changeValue; - cellGroup.right && - (cellGroup.right.width = +cellGroup.right.width - changeValue); - }); - } else { - utils.each(cells, function(cellGroup) { - cellGroup.left.width -= -changeValue; - }); - } - } - } - - function isEditorDisabled() { - return me.body.contentEditable === "false"; - } - - function changeRowHeight(td, changeValue) { - if (Math.abs(changeValue) < 10) return; - var ut = getUETable(td); - if (ut) { - var cells = ut.getSameEndPosCells(td, "y"), - //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 - backHeight = cells[0] ? cells[0].offsetHeight : 0; - for (var i = 0, cell; (cell = cells[i++]); ) { - setCellHeight(cell, changeValue, backHeight); - } - } - } - - /** - * 获取调整单元格大小的相关单元格 - * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 - */ - function getCellsByMoveBorder(cell, table, isContainMergeCell) { - if (!table) { - table = domUtils.findParentByTagName(cell, "table"); - } - - if (!table) { - return null; - } - - //获取到该单元格所在行的序列号 - var index = domUtils.getNodeIndex(cell), - temp = cell, - rows = table.rows, - colIndex = 0; - - while (temp) { - //获取到当前单元格在未发生单元格合并时的序列 - if (temp.nodeType === 1) { - colIndex += temp.colSpan || 1; - } - temp = temp.previousSibling; - } - - temp = null; - - //记录想关的单元格 - var borderCells = []; - - utils.each(rows, function(tabRow) { - var cells = tabRow.cells, - currIndex = 0; - - utils.each(cells, function(tabCell) { - currIndex += tabCell.colSpan || 1; - - if (currIndex === colIndex) { - borderCells.push({ - left: tabCell, - right: tabCell.nextSibling || null - }); - - return false; - } else if (currIndex > colIndex) { - if (isContainMergeCell) { - borderCells.push({ - left: tabCell - }); - } - - return false; - } - }); - }); - - return borderCells; - } - - /** - * 通过给定的单元格集合获取最小的单元格width - */ - function getMinWidthByTableCells(cells) { - var minWidth = Number.MAX_VALUE; - - for (var i = 0, curCell; (curCell = cells[i]); i++) { - minWidth = Math.min( - minWidth, - curCell.width || getTableCellWidth(curCell) - ); - } - - return minWidth; - } - - function correctChangeValue(changeValue, relatedCell, cells) { - //为单元格的paading预留空间 - changeValue -= getTabcellSpace(); - - if (changeValue < 0) { - return 0; - } - - changeValue -= getTableCellWidth(relatedCell); - - //确定方向 - var direction = changeValue < 0 ? "left" : "right"; - - changeValue = Math.abs(changeValue); - - //只关心非最后一个单元格就可以 - utils.each(cells, function(cellGroup) { - var curCell = cellGroup[direction]; - - //为单元格保留最小空间 - if (curCell) { - changeValue = Math.min( - changeValue, - getTableCellWidth(curCell) - cellMinWidth - ); - } - }); - - //修正越界 - changeValue = changeValue < 0 ? 0 : changeValue; - - return direction === "left" ? -changeValue : changeValue; - } - - function getTableCellWidth(cell) { - var width = 0, - //偏移纠正量 - offset = 0, - width = cell.offsetWidth - getTabcellSpace(); - - //最后一个节点纠正一下 - if (!cell.nextSibling) { - width -= getTableCellOffset(cell); - } - - width = width < 0 ? 0 : width; - - try { - cell.width = width; - } catch (e) {} - - return width; - } - - /** - * 获取单元格所在表格的最末单元格的偏移量 - */ - function getTableCellOffset(cell) { - tab = domUtils.findParentByTagName(cell, "table", false); - - if (tab.offsetVal === undefined) { - var prev = cell.previousSibling; - - if (prev) { - //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 - tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth - ? UT.borderWidth - : 0; - } else { - tab.offsetVal = 0; - } - } - - return tab.offsetVal; - } - - function getTabcellSpace() { - if (UT.tabcellSpace === undefined) { - var cell = null, - tab = me.document.createElement("table"), - tbody = me.document.createElement("tbody"), - trow = me.document.createElement("tr"), - tabcell = me.document.createElement("td"), - mirror = null; - - tabcell.style.cssText = "border: 0;"; - tabcell.width = 1; - - trow.appendChild(tabcell); - trow.appendChild((mirror = tabcell.cloneNode(false))); - - tbody.appendChild(trow); - - tab.appendChild(tbody); - - tab.style.cssText = "visibility: hidden;"; - - me.body.appendChild(tab); - - UT.paddingSpace = tabcell.offsetWidth - 1; - - var tmpTabWidth = tab.offsetWidth; - - tabcell.style.cssText = ""; - mirror.style.cssText = ""; - - UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3; - - UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; - - me.body.removeChild(tab); - } - - getTabcellSpace = function() { - return UT.tabcellSpace; - }; - - return UT.tabcellSpace; - } - - function getDragLine(editor, doc) { - if (mousedown) return; - dragLine = editor.document.createElement("div"); - domUtils.setAttributes(dragLine, { - id: "ue_tableDragLine", - unselectable: "on", - contenteditable: false, - onresizestart: "return false", - ondragstart: "return false", - onselectstart: "return false", - style: - "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" - }); - editor.body.appendChild(dragLine); - } - - function hideDragLine(editor) { - if (mousedown) return; - var line; - while ((line = editor.document.getElementById("ue_tableDragLine"))) { - domUtils.remove(line); - } - } - - /** - * 依据state(v|h)在cell位置显示横线 - * @param state - * @param cell - */ - function showDragLineAt(state, cell) { - if (!cell) return; - var table = domUtils.findParentByTagName(cell, "table"), - caption = table.getElementsByTagName("caption"), - width = table.offsetWidth, - height = - table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), - tablePos = domUtils.getXY(table), - cellPos = domUtils.getXY(cell), - css; - switch (state) { - case "h": - css = - "height:" + - height + - "px;top:" + - (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + - "px;left:" + - (cellPos.x + cell.offsetWidth); - dragLine.style.cssText = - css + - "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)"; - break; - case "v": - css = - "width:" + - width + - "px;left:" + - tablePos.x + - "px;top:" + - (cellPos.y + cell.offsetHeight); - //必须加上border:0和color:blue,否则低版ie不支持背景色显示 - dragLine.style.cssText = - css + - "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"; - break; - default: - } - } - - /** - * 当表格边框颜色为白色时设置为虚线,true为添加虚线 - * @param editor - * @param flag - */ - function switchBorderColor(editor, flag) { - var tableArr = domUtils.getElementsByTagName(editor.body, "table"), - color; - for (var i = 0, node; (node = tableArr[i++]); ) { - var td = domUtils.getElementsByTagName(node, "td"); - if (td[0]) { - if (flag) { - color = td[0].style.borderColor.replace(/\s/g, ""); - if (/(#ffffff)|(rgb\(255,255,255\))/gi.test(color)) - domUtils.addClass(node, "noBorderTable"); - } else { - domUtils.removeClasses(node, "noBorderTable"); - } - } - } - } - - function getTableWidth(editor, needIEHack, defaultValue) { - var body = editor.body; - return ( - body.offsetWidth - - (needIEHack - ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (editor.options.offsetWidth || 0) - ); - } - - /** - * 获取当前拖动的单元格 - */ - function getTargetTd(editor, evt) { - var target = domUtils.findParentByTagName( - evt.target || evt.srcElement, - ["td", "th"], - true - ), - dir = null; - - if (!target) { - return null; - } - - dir = getRelation(target, mouseCoords(evt)); - - //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td - - if (!target) { - return null; - } - - if (dir === "h1" && target.previousSibling) { - var position = domUtils.getXY(target), - cellWidth = target.offsetWidth; - - if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) { - target = target.previousSibling; - } - } else if (dir === "v1" && target.parentNode.previousSibling) { - var position = domUtils.getXY(target), - cellHeight = target.offsetHeight; - - if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) { - target = target.parentNode.previousSibling.firstChild; - } - } - - //排除了非td内部以及用于代码高亮部分的td - return target && !(editor.fireEvent("excludetable", target) === true) - ? target - : null; - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js deleted file mode 100644 index 8dd9c8a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.cmds.js +++ /dev/null @@ -1,1045 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: taoqili - * Date: 13-2-20 - * Time: 下午6:25 - * To change this template use File | Settings | File Templates. - */ -;(function() { - var UT = UE.UETable, - getTableItemsByRange = function(editor) { - return UT.getTableItemsByRange(editor); - }, - getUETableBySelected = function(editor) { - return UT.getUETableBySelected(editor); - }, - getDefaultValue = function(editor, table) { - return UT.getDefaultValue(editor, table); - }, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }; - - UE.commands["inserttable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? -1 : 0; - }, - execCommand: function(cmd, opt) { - function createTable(opt, tdWidth) { - var html = [], - rowsNum = opt.numRows, - colsNum = opt.numCols; - for (var r = 0; r < rowsNum; r++) { - html.push(""); - for (var c = 0; c < colsNum; c++) { - html.push( - '
  • ' + - (browser.ie && browser.version < 11 - ? domUtils.fillChar - : "
    ") + - "
    " + html.join("") + "
    "; - } - - if (!opt) { - opt = utils.extend( - {}, - { - numCols: this.options.defaultCols, - numRows: this.options.defaultRows, - tdvalign: this.options.tdvalign - } - ); - } - var me = this; - var range = this.selection.getRange(), - start = range.startContainer, - firstParentBlock = - domUtils.findParent( - start, - function(node) { - return domUtils.isBlockElm(node); - }, - true - ) || me.body; - - var defaultValue = getDefaultValue(me), - tableWidth = firstParentBlock.offsetWidth, - tdWidth = Math.floor( - tableWidth / opt.numCols - - defaultValue.tdPadding * 2 - - defaultValue.tdBorder - ); - - //todo其他属性 - !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); - me.execCommand("inserthtml", createTable(opt, tdWidth)); - } - }; - - UE.commands["insertparagraphbeforetable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).cell ? 0 : -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var p = this.document.createElement("p"); - p.innerHTML = browser.ie ? " " : "
    "; - table.parentNode.insertBefore(p, table); - this.selection.getRange().setStart(p, 0).setCursor(); - } - } - }; - - UE.commands["deletetable"] = { - queryCommandState: function() { - var rng = this.selection.getRange(); - return domUtils.findParentByTagName(rng.startContainer, "table", true) - ? 0 - : -1; - }, - execCommand: function(cmd, table) { - var rng = this.selection.getRange(); - table = - table || - domUtils.findParentByTagName(rng.startContainer, "table", true); - if (table) { - var next = table.nextSibling; - if (!next) { - next = domUtils.createElement(this.document, "p", { - innerHTML: browser.ie ? domUtils.fillChar : "
    " - }); - table.parentNode.insertBefore(next, table); - } - domUtils.remove(table); - rng = this.selection.getRange(); - if (next.nodeType == 3) { - rng.setStartBefore(next); - } else { - rng.setStart(next, 0); - } - rng.setCursor(false, true); - this.fireEvent("tablehasdeleted"); - } - } - }; - UE.commands["cellalign"] = { - queryCommandState: function() { - return getSelectedArr(this).length ? 0 : -1; - }, - execCommand: function(cmd, align) { - var selectedTds = getSelectedArr(this); - if (selectedTds.length) { - for (var i = 0, ci; (ci = selectedTds[i++]); ) { - ci.setAttribute("align", align); - } - } - } - }; - UE.commands["cellvalign"] = { - queryCommandState: function() { - return getSelectedArr(this).length ? 0 : -1; - }, - execCommand: function(cmd, valign) { - var selectedTds = getSelectedArr(this); - if (selectedTds.length) { - for (var i = 0, ci; (ci = selectedTds[i++]); ) { - ci.setAttribute("vAlign", valign); - } - } - } - }; - UE.commands["insertcaption"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - return table.getElementsByTagName("caption").length == 0 ? 1 : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var caption = this.document.createElement("caption"); - caption.innerHTML = browser.ie ? domUtils.fillChar : "
    "; - table.insertBefore(caption, table.firstChild); - var range = this.selection.getRange(); - range.setStart(caption, 0).setCursor(); - } - } - }; - UE.commands["deletecaption"] = { - queryCommandState: function() { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - return table.getElementsByTagName("caption").length == 0 ? -1 : 1; - } - return -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - domUtils.remove(table.getElementsByTagName("caption")[0]); - var range = this.selection.getRange(); - range.setStart(table.rows[0].cells[0], 0).setCursor(); - } - } - }; - UE.commands["inserttitle"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var firstRow = table.rows[0]; - return firstRow.cells[ - firstRow.cells.length - 1 - ].tagName.toLowerCase() != "th" - ? 0 - : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - getUETable(table).insertRow(0, "th"); - } - var th = table.getElementsByTagName("th")[0]; - this.selection.getRange().setStart(th, 0).setCursor(false, true); - } - }; - UE.commands["deletetitle"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var firstRow = table.rows[0]; - return firstRow.cells[ - firstRow.cells.length - 1 - ].tagName.toLowerCase() == "th" - ? 0 - : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - domUtils.remove(table.rows[0]); - } - var td = table.getElementsByTagName("td")[0]; - this.selection.getRange().setStart(td, 0).setCursor(false, true); - } - }; - UE.commands["inserttitlecol"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var lastRow = table.rows[table.rows.length - 1]; - return lastRow.getElementsByTagName("th").length ? -1 : 0; - } - return -1; - }, - execCommand: function(cmd) { - var table = getTableItemsByRange(this).table; - if (table) { - getUETable(table).insertCol(0, "th"); - } - resetTdWidth(table, this); - var th = table.getElementsByTagName("th")[0]; - this.selection.getRange().setStart(th, 0).setCursor(false, true); - } - }; - UE.commands["deletetitlecol"] = { - queryCommandState: function() { - var table = getTableItemsByRange(this).table; - if (table) { - var lastRow = table.rows[table.rows.length - 1]; - return lastRow.getElementsByTagName("th").length ? 0 : -1; - } - return -1; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - if (table) { - for (var i = 0; i < table.rows.length; i++) { - domUtils.remove(table.rows[i].children[0]); - } - } - resetTdWidth(table, this); - var td = table.getElementsByTagName("td")[0]; - this.selection.getRange().setStart(td, 0).setCursor(false, true); - } - }; - - UE.commands["mergeright"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table, - cell = tableItems.cell; - - if (!table || !cell) return -1; - var ut = getUETable(table); - if (ut.selectedTds.length) return -1; - - var cellInfo = ut.getCellInfo(cell), - rightColIndex = cellInfo.colIndex + cellInfo.colSpan; - if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 - - var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], - rightCell = - table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; - if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 - - // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 - return rightCellInfo.rowIndex == cellInfo.rowIndex && - rightCellInfo.rowSpan == cellInfo.rowSpan - ? 0 - : -1; - }, - execCommand: function(cmd) { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.mergeRight(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["mergedown"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table, - cell = tableItems.cell; - - if (!table || !cell) return -1; - var ut = getUETable(table); - if (ut.selectedTds.length) return -1; - - var cellInfo = ut.getCellInfo(cell), - downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; - if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 - - var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], - downCell = - table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; - if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 - - // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 - return downCellInfo.colIndex == cellInfo.colIndex && - downCellInfo.colSpan == cellInfo.colSpan - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.mergeDown(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["mergecells"] = { - queryCommandState: function() { - return getUETableBySelected(this) ? 0 : -1; - }, - execCommand: function() { - var ut = getUETableBySelected(this); - if (ut && ut.selectedTds.length) { - var cell = ut.selectedTds[0]; - ut.mergeRange(); - var rng = this.selection.getRange(); - if (domUtils.isEmptyBlock(cell)) { - rng.setStart(cell, 0).collapse(true); - } else { - rng.selectNodeContents(cell); - } - rng.select(); - } - } - }; - UE.commands["insertrow"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - (cell.tagName == "TD" || - (cell.tagName == "TH" && - tableItems.tr !== tableItems.table.rows[0])) && - getUETable(tableItems.table).rowsNum < this.options.maxRowNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell, - table = tableItems.table, - ut = getUETable(table), - cellInfo = ut.getCellInfo(cell); - //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); - if (!ut.selectedTds.length) { - ut.insertRow(cellInfo.rowIndex, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; - i < len; - i++ - ) { - ut.insertRow(range.beginRowIndex, cell); - } - } - rng.moveToBookmark(bk).select(); - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - //后插入行 - UE.commands["insertrownext"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - cell.tagName == "TD" && - getUETable(tableItems.table).rowsNum < this.options.maxRowNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell, - table = tableItems.table, - ut = getUETable(table), - cellInfo = ut.getCellInfo(cell); - //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); - if (!ut.selectedTds.length) { - ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; - i < len; - i++ - ) { - ut.insertRow(range.endRowIndex + 1, cell); - } - } - rng.moveToBookmark(bk).select(); - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - UE.commands["deleterow"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this); - return tableItems.cell ? 0 : -1; - }, - execCommand: function() { - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellsRange = ut.cellsRange, - cellInfo = ut.getCellInfo(cell), - preCell = ut.getVSideCell(cell), - nextCell = ut.getVSideCell(cell, true), - rng = this.selection.getRange(); - if (utils.isEmptyObject(cellsRange)) { - ut.deleteRow(cellInfo.rowIndex); - } else { - for ( - var i = cellsRange.beginRowIndex; - i < cellsRange.endRowIndex + 1; - i++ - ) { - ut.deleteRow(cellsRange.beginRowIndex); - } - } - var table = ut.table; - if (!table.getElementsByTagName("td").length) { - var nextSibling = table.nextSibling; - domUtils.remove(table); - if (nextSibling) { - rng.setStart(nextSibling, 0).setCursor(false, true); - } - } else { - if ( - cellInfo.rowSpan == 1 || - cellInfo.rowSpan == - cellsRange.endRowIndex - cellsRange.beginRowIndex + 1 - ) { - if (nextCell || preCell) - rng.selectNodeContents(nextCell || preCell).setCursor(false, true); - } else { - var newCell = ut.getCell( - cellInfo.rowIndex, - ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex - ); - if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); - } - } - if (table.getAttribute("interlaced") === "enabled") - this.fireEvent("interlacetable", table); - } - }; - UE.commands["insertcol"] = { - queryCommandState: function(cmd) { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - (cell.tagName == "TD" || - (cell.tagName == "TH" && cell !== tableItems.tr.cells[0])) && - getUETable(tableItems.table).colsNum < this.options.maxColNum - ? 0 - : -1; - }, - execCommand: function(cmd) { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - if (this.queryCommandState(cmd) == -1) return; - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellInfo = ut.getCellInfo(cell); - - //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); - if (!ut.selectedTds.length) { - ut.insertCol(cellInfo.colIndex, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endColIndex - range.beginColIndex + 1; - i < len; - i++ - ) { - ut.insertCol(range.beginColIndex, cell); - } - } - rng.moveToBookmark(bk).select(true); - } - }; - UE.commands["insertcolnext"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - return cell && - getUETable(tableItems.table).colsNum < this.options.maxColNum - ? 0 - : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - cellInfo = ut.getCellInfo(cell); - //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); - if (!ut.selectedTds.length) { - ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); - } else { - var range = ut.cellsRange; - for ( - var i = 0, len = range.endColIndex - range.beginColIndex + 1; - i < len; - i++ - ) { - ut.insertCol(range.endColIndex + 1, cell); - } - } - rng.moveToBookmark(bk).select(); - } - }; - - UE.commands["deletecol"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this); - return tableItems.cell ? 0 : -1; - }, - execCommand: function() { - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell), - range = ut.cellsRange, - cellInfo = ut.getCellInfo(cell), - preCell = ut.getHSideCell(cell), - nextCell = ut.getHSideCell(cell, true); - if (utils.isEmptyObject(range)) { - ut.deleteCol(cellInfo.colIndex); - } else { - for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { - ut.deleteCol(range.beginColIndex); - } - } - var table = ut.table, - rng = this.selection.getRange(); - - if (!table.getElementsByTagName("td").length) { - var nextSibling = table.nextSibling; - domUtils.remove(table); - if (nextSibling) { - rng.setStart(nextSibling, 0).setCursor(false, true); - } - } else { - if (domUtils.inDoc(cell, this.document)) { - rng.setStart(cell, 0).setCursor(false, true); - } else { - if (nextCell && domUtils.inDoc(nextCell, this.document)) { - rng.selectNodeContents(nextCell).setCursor(false, true); - } else { - if (preCell && domUtils.inDoc(preCell, this.document)) { - rng.selectNodeContents(preCell).setCursor(true, true); - } - } - } - } - } - }; - UE.commands["splittocells"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToCells(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["splittorows"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && cell.rowSpan > 1 ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToRows(cell); - rng.moveToBookmark(bk).select(); - } - }; - UE.commands["splittocols"] = { - queryCommandState: function() { - var tableItems = getTableItemsByRange(this), - cell = tableItems.cell; - if (!cell) return -1; - var ut = getUETable(tableItems.table); - if (ut.selectedTds.length > 0) return -1; - return cell && cell.colSpan > 1 ? 0 : -1; - }, - execCommand: function() { - var rng = this.selection.getRange(), - bk = rng.createBookmark(true); - var cell = getTableItemsByRange(this).cell, - ut = getUETable(cell); - ut.splitToCols(cell); - rng.moveToBookmark(bk).select(); - } - }; - - UE.commands["adaptbytext"] = UE.commands["adaptbywindow"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd) { - var tableItems = getTableItemsByRange(this), - table = tableItems.table; - if (table) { - if (cmd == "adaptbywindow") { - resetTdWidth(table, this); - } else { - var cells = domUtils.getElementsByTagName(table, "td th"); - utils.each(cells, function(cell) { - cell.removeAttribute("width"); - }); - table.removeAttribute("width"); - } - } - } - }; - - //平均分配各列 - UE.commands["averagedistributecol"] = { - queryCommandState: function() { - var ut = getUETableBySelected(this); - if (!ut) return -1; - return ut.isFullRow() || ut.isFullCol() ? 0 : -1; - }, - execCommand: function(cmd) { - var me = this, - ut = getUETableBySelected(me); - - function getAverageWidth() { - var tb = ut.table, - averageWidth, - sumWidth = 0, - colsNum = 0, - tbAttr = getDefaultValue(me, tb); - - if (ut.isFullRow()) { - sumWidth = tb.offsetWidth; - colsNum = ut.colsNum; - } else { - var begin = ut.cellsRange.beginColIndex, - end = ut.cellsRange.endColIndex, - node; - for (var i = begin; i <= end; ) { - node = ut.selectedTds[i]; - sumWidth += node.offsetWidth; - i += node.colSpan; - colsNum += 1; - } - } - averageWidth = - Math.ceil(sumWidth / colsNum) - - tbAttr.tdBorder * 2 - - tbAttr.tdPadding * 2; - return averageWidth; - } - - function setAverageWidth(averageWidth) { - utils.each(domUtils.getElementsByTagName(ut.table, "th"), function( - node - ) { - node.setAttribute("width", ""); - }); - var cells = ut.isFullRow() - ? domUtils.getElementsByTagName(ut.table, "td") - : ut.selectedTds; - - utils.each(cells, function(node) { - if (node.colSpan == 1) { - node.setAttribute("width", averageWidth); - } - }); - } - - if (ut && ut.selectedTds.length) { - setAverageWidth(getAverageWidth()); - } - } - }; - //平均分配各行 - UE.commands["averagedistributerow"] = { - queryCommandState: function() { - var ut = getUETableBySelected(this); - if (!ut) return -1; - if (ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName)) return -1; - return ut.isFullRow() || ut.isFullCol() ? 0 : -1; - }, - execCommand: function(cmd) { - var me = this, - ut = getUETableBySelected(me); - - function getAverageHeight() { - var averageHeight, - rowNum, - sumHeight = 0, - tb = ut.table, - tbAttr = getDefaultValue(me, tb), - tdpadding = parseInt( - domUtils.getComputedStyle( - tb.getElementsByTagName("td")[0], - "padding-top" - ) - ); - - if (ut.isFullCol()) { - var captionArr = domUtils.getElementsByTagName(tb, "caption"), - thArr = domUtils.getElementsByTagName(tb, "th"), - captionHeight, - thHeight; - - if (captionArr.length > 0) { - captionHeight = captionArr[0].offsetHeight; - } - if (thArr.length > 0) { - thHeight = thArr[0].offsetHeight; - } - - sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); - rowNum = thArr.length == 0 ? ut.rowsNum : ut.rowsNum - 1; - } else { - var begin = ut.cellsRange.beginRowIndex, - end = ut.cellsRange.endRowIndex, - count = 0, - trs = domUtils.getElementsByTagName(tb, "tr"); - for (var i = begin; i <= end; i++) { - sumHeight += trs[i].offsetHeight; - count += 1; - } - rowNum = count; - } - //ie8下是混杂模式 - if (browser.ie && browser.version < 9) { - averageHeight = Math.ceil(sumHeight / rowNum); - } else { - averageHeight = - Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; - } - return averageHeight; - } - - function setAverageHeight(averageHeight) { - var cells = ut.isFullCol() - ? domUtils.getElementsByTagName(ut.table, "td") - : ut.selectedTds; - utils.each(cells, function(node) { - if (node.rowSpan == 1) { - node.setAttribute("height", averageHeight); - } - }); - } - - if (ut && ut.selectedTds.length) { - setAverageHeight(getAverageHeight()); - } - } - }; - - //单元格对齐方式 - UE.commands["cellalignment"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, data) { - var me = this, - ut = getUETableBySelected(me); - - if (!ut) { - var start = me.selection.getStart(), - cell = - start && - domUtils.findParentByTagName(start, ["td", "th", "caption"], true); - if (!/caption/gi.test(cell.tagName)) { - domUtils.setAttributes(cell, data); - } else { - cell.style.textAlign = data.align; - cell.style.verticalAlign = data.vAlign; - } - me.selection.getRange().setCursor(true); - } else { - utils.each(ut.selectedTds, function(cell) { - domUtils.setAttributes(cell, data); - }); - } - }, - /** - * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 - * @see UE.UETable.getTableCellAlignState - */ - queryCommandValue: function(cmd) { - var activeMenuCell = getTableItemsByRange(this).cell; - - if (!activeMenuCell) { - activeMenuCell = getSelectedArr(this)[0]; - } - - if (!activeMenuCell) { - return null; - } else { - //获取同时选中的其他单元格 - var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; - - !cells.length && (cells = activeMenuCell); - - return UE.UETable.getTableCellAlignState(cells); - } - } - }; - //表格对齐方式 - UE.commands["tablealignment"] = { - queryCommandState: function() { - if (browser.ie && browser.version < 8) { - return -1; - } - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, value) { - var me = this, - start = me.selection.getStart(), - table = start && domUtils.findParentByTagName(start, ["table"], true); - - if (table) { - table.setAttribute("align", value); - } - } - }; - - //表格属性 - UE.commands["edittable"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, color) { - var rng = this.selection.getRange(), - table = domUtils.findParentByTagName(rng.startContainer, "table"); - if (table) { - var arr = domUtils - .getElementsByTagName(table, "td") - .concat( - domUtils.getElementsByTagName(table, "th"), - domUtils.getElementsByTagName(table, "caption") - ); - utils.each(arr, function(node) { - node.style.borderColor = color; - }); - } - } - }; - //单元格属性 - UE.commands["edittd"] = { - queryCommandState: function() { - return getTableItemsByRange(this).table ? 0 : -1; - }, - execCommand: function(cmd, bkColor) { - var me = this, - ut = getUETableBySelected(me); - - if (!ut) { - var start = me.selection.getStart(), - cell = - start && - domUtils.findParentByTagName(start, ["td", "th", "caption"], true); - if (cell) { - cell.style.backgroundColor = bkColor; - } - } else { - utils.each(ut.selectedTds, function(cell) { - cell.style.backgroundColor = bkColor; - }); - } - } - }; - - UE.commands["settablebackground"] = { - queryCommandState: function() { - return getSelectedArr(this).length > 1 ? 0 : -1; - }, - execCommand: function(cmd, value) { - var cells, ut; - cells = getSelectedArr(this); - ut = getUETable(cells[0]); - ut.setBackground(cells, value); - } - }; - - UE.commands["cleartablebackground"] = { - queryCommandState: function() { - var cells = getSelectedArr(this); - if (!cells.length) return -1; - for (var i = 0, cell; (cell = cells[i++]); ) { - if (cell.style.backgroundColor !== "") return 0; - } - return -1; - }, - execCommand: function() { - var cells = getSelectedArr(this), - ut = getUETable(cells[0]); - ut.removeBackground(cells); - } - }; - - UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (!table) return -1; - var interlaced = table.getAttribute("interlaced"); - if (cmd == "interlacetable") { - //TODO 待定 - //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 - return interlaced === "enabled" ? -1 : 0; - } else { - return !interlaced || interlaced === "disabled" ? -1 : 0; - } - }, - execCommand: function(cmd, classList) { - var table = getTableItemsByRange(this).table; - if (cmd == "interlacetable") { - table.setAttribute("interlaced", "enabled"); - this.fireEvent("interlacetable", table, classList); - } else { - table.setAttribute("interlaced", "disabled"); - this.fireEvent("uninterlacetable", table); - } - } - }; - UE.commands["setbordervisible"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (!table) return -1; - return 0; - }, - execCommand: function() { - var table = getTableItemsByRange(this).table; - utils.each(domUtils.getElementsByTagName(table, "td"), function(td) { - td.style.borderWidth = "1px"; - td.style.borderStyle = "solid"; - }); - } - }; - function resetTdWidth(table, editor) { - var tds = domUtils.getElementsByTagName(table, "td th"); - utils.each(tds, function(td) { - td.removeAttribute("width"); - }); - table.setAttribute( - "width", - getTableWidth(editor, true, getDefaultValue(editor, table)) - ); - var tdsWidths = []; - setTimeout(function() { - utils.each(tds, function(td) { - td.colSpan == 1 && tdsWidths.push(td.offsetWidth); - }); - utils.each(tds, function(td, i) { - td.colSpan == 1 && td.setAttribute("width", tdsWidths[i] + ""); - }); - }, 0); - } - - function getTableWidth(editor, needIEHack, defaultValue) { - var body = editor.body; - return ( - body.offsetWidth - - (needIEHack - ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 - : 0) - - defaultValue.tableBorder * 2 - - (editor.options.offsetWidth || 0) - ); - } - - function getSelectedArr(editor) { - var cell = getTableItemsByRange(editor).cell; - if (cell) { - var ut = getUETable(cell); - return ut.selectedTds.length ? ut.selectedTds : [cell]; - } else { - return []; - } - } -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js deleted file mode 100644 index 67dcf85..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.core.js +++ /dev/null @@ -1,1354 +0,0 @@ -/** - * Created with JetBrains WebStorm. - * User: taoqili - * Date: 13-1-18 - * Time: 上午11:09 - * To change this template use File | Settings | File Templates. - */ -/** - * UE表格操作类 - * @param table - * @constructor - */ -;(function() { - var UETable = (UE.UETable = function(table) { - this.table = table; - this.indexTable = []; - this.selectedTds = []; - this.cellsRange = {}; - this.update(table); - }); - - //===以下为静态工具方法=== - UETable.removeSelectedClass = function(cells) { - utils.each(cells, function(cell) { - domUtils.removeClasses(cell, "selectTdClass"); - }); - }; - UETable.addSelectedClass = function(cells) { - utils.each(cells, function(cell) { - domUtils.addClass(cell, "selectTdClass"); - }); - }; - UETable.isEmptyBlock = function(node) { - var reg = new RegExp(domUtils.fillChar, "g"); - if ( - node[browser.ie ? "innerText" : "textContent"] - .replace(/^\s*$/, "") - .replace(reg, "").length > 0 - ) { - return 0; - } - for (var i in dtd.$isNotEmpty) - if (dtd.$isNotEmpty.hasOwnProperty(i)) { - if (node.getElementsByTagName(i).length) { - return 0; - } - } - return 1; - }; - UETable.getWidth = function(cell) { - if (!cell) return 0; - return parseInt(domUtils.getComputedStyle(cell, "width"), 10); - }; - - /** - * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 - * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; - * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 - * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null - */ - UETable.getTableCellAlignState = function(cells) { - !utils.isArray(cells) && (cells = [cells]); - - var result = {}, - status = ["align", "valign"], - tempStatus = null, - isSame = true; //状态是否相同 - - utils.each(cells, function(cellNode) { - utils.each(status, function(currentState) { - tempStatus = cellNode.getAttribute(currentState); - - if (!result[currentState] && tempStatus) { - result[currentState] = tempStatus; - } else if ( - !result[currentState] || - tempStatus !== result[currentState] - ) { - isSame = false; - return false; - } - }); - - return isSame; - }); - - return isSame ? result : null; - }; - - /** - * 根据当前选区获取相关的table信息 - * @return {Object} - */ - UETable.getTableItemsByRange = function(editor) { - var start = editor.selection.getStart(); - - //ff下会选中bookmark - if ( - start && - start.id && - start.id.indexOf("_baidu_bookmark_start_") === 0 && - start.nextSibling - ) { - start = start.nextSibling; - } - - //在table或者td边缘有可能存在选中tr的情况 - var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), - tr = cell && cell.parentNode, - table = tr && domUtils.findParentByTagName(tr, ["table"]), - caption = table && table.getElementsByTagName("caption")[0]; - - return { - cell: cell, - tr: tr, - table: table, - caption: caption - }; - }; - UETable.getUETableBySelected = function(editor) { - var table = UETable.getTableItemsByRange(editor).table; - if (table && table.ueTable && table.ueTable.selectedTds.length) { - return table.ueTable; - } - return null; - }; - - UETable.getDefaultValue = function(editor, table) { - var borderMap = { - thin: "0px", - medium: "1px", - thick: "2px" - }, - tableBorder, - tdPadding, - tdBorder, - tmpValue; - if (!table) { - table = editor.document.createElement("table"); - table.insertRow(0).insertCell(0).innerHTML = "xxx"; - editor.body.appendChild(table); - var td = table.getElementsByTagName("td")[0]; - tmpValue = domUtils.getComputedStyle(table, "border-left-width"); - tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "padding-left"); - tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "border-left-width"); - tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - domUtils.remove(table); - return { - tableBorder: tableBorder, - tdPadding: tdPadding, - tdBorder: tdBorder - }; - } else { - td = table.getElementsByTagName("td")[0]; - tmpValue = domUtils.getComputedStyle(table, "border-left-width"); - tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "padding-left"); - tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); - tmpValue = domUtils.getComputedStyle(td, "border-left-width"); - tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); - return { - tableBorder: tableBorder, - tdPadding: tdPadding, - tdBorder: tdBorder - }; - } - }; - /** - * 根据当前点击的td或者table获取索引对象 - * @param tdOrTable - */ - UETable.getUETable = function(tdOrTable) { - var tag = tdOrTable.tagName.toLowerCase(); - tdOrTable = tag == "td" || tag == "th" || tag == "caption" - ? domUtils.findParentByTagName(tdOrTable, "table", true) - : tdOrTable; - if (!tdOrTable.ueTable) { - tdOrTable.ueTable = new UETable(tdOrTable); - } - return tdOrTable.ueTable; - }; - - UETable.cloneCell = function(cell, ignoreMerge, keepPro) { - if (!cell || utils.isString(cell)) { - return this.table.ownerDocument.createElement(cell || "td"); - } - var flag = domUtils.hasClass(cell, "selectTdClass"); - flag && domUtils.removeClasses(cell, "selectTdClass"); - var tmpCell = cell.cloneNode(true); - if (ignoreMerge) { - tmpCell.rowSpan = tmpCell.colSpan = 1; - } - //去掉宽高 - !keepPro && domUtils.removeAttributes(tmpCell, "width height"); - !keepPro && domUtils.removeAttributes(tmpCell, "style"); - - tmpCell.style.borderLeftStyle = ""; - tmpCell.style.borderTopStyle = ""; - tmpCell.style.borderLeftColor = cell.style.borderRightColor; - tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; - tmpCell.style.borderTopColor = cell.style.borderBottomColor; - tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; - flag && domUtils.addClass(cell, "selectTdClass"); - return tmpCell; - }; - - UETable.prototype = { - getMaxRows: function() { - var rows = this.table.rows, - maxLen = 1; - for (var i = 0, row; (row = rows[i]); i++) { - var currentMax = 1; - for (var j = 0, cj; (cj = row.cells[j++]); ) { - currentMax = Math.max(cj.rowSpan || 1, currentMax); - } - maxLen = Math.max(currentMax + i, maxLen); - } - return maxLen; - }, - /** - * 获取当前表格的最大列数 - */ - getMaxCols: function() { - var rows = this.table.rows, - maxLen = 0, - cellRows = {}; - for (var i = 0, row; (row = rows[i]); i++) { - var cellsNum = 0; - for (var j = 0, cj; (cj = row.cells[j++]); ) { - cellsNum += cj.colSpan || 1; - if (cj.rowSpan && cj.rowSpan > 1) { - for (var k = 1; k < cj.rowSpan; k++) { - if (!cellRows["row_" + (i + k)]) { - cellRows["row_" + (i + k)] = cj.colSpan || 1; - } else { - cellRows["row_" + (i + k)]++; - } - } - } - } - cellsNum += cellRows["row_" + i] || 0; - maxLen = Math.max(cellsNum, maxLen); - } - return maxLen; - }, - getCellColIndex: function(cell) {}, - /** - * 获取当前cell旁边的单元格, - * @param cell - * @param right - */ - getHSideCell: function(cell, right) { - try { - var cellInfo = this.getCellInfo(cell), - previewRowIndex, - previewColIndex; - var len = this.selectedTds.length, - range = this.cellsRange; - //首行或者首列没有前置单元格 - if ( - (!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || - (right && - (!len - ? cellInfo.colIndex == this.colsNum - 1 - : range.endColIndex == this.colsNum - 1)) - ) - return null; - - previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; - previewColIndex = !right - ? !len - ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 - : range.beginColIndex - 1 - : !len ? cellInfo.colIndex + 1 : range.endColIndex + 1; - return this.getCell( - this.indexTable[previewRowIndex][previewColIndex].rowIndex, - this.indexTable[previewRowIndex][previewColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - getTabNextCell: function(cell, preRowIndex) { - var cellInfo = this.getCellInfo(cell), - rowIndex = preRowIndex || cellInfo.rowIndex, - colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), - nextCell; - try { - nextCell = this.getCell( - this.indexTable[rowIndex][colIndex].rowIndex, - this.indexTable[rowIndex][colIndex].cellIndex - ); - } catch (e) { - try { - rowIndex = rowIndex * 1 + 1; - colIndex = 0; - nextCell = this.getCell( - this.indexTable[rowIndex][colIndex].rowIndex, - this.indexTable[rowIndex][colIndex].cellIndex - ); - } catch (e) {} - } - return nextCell; - }, - /** - * 获取视觉上的后置单元格 - * @param cell - * @param bottom - */ - getVSideCell: function(cell, bottom, ignoreRange) { - try { - var cellInfo = this.getCellInfo(cell), - nextRowIndex, - nextColIndex; - var len = this.selectedTds.length && !ignoreRange, - range = this.cellsRange; - //末行或者末列没有后置单元格 - if ( - (!bottom && cellInfo.rowIndex == 0) || - (bottom && - (!len - ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 - : range.endRowIndex == this.rowsNum - 1)) - ) - return null; - - nextRowIndex = !bottom - ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 - : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; - nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; - return this.getCell( - this.indexTable[nextRowIndex][nextColIndex].rowIndex, - this.indexTable[nextRowIndex][nextColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - /** - * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 - */ - getSameEndPosCells: function(cell, xOrY) { - try { - var flag = xOrY.toLowerCase() === "x", - end = - domUtils.getXY(cell)[flag ? "x" : "y"] + - cell["offset" + (flag ? "Width" : "Height")], - rows = this.table.rows, - cells = null, - returns = []; - for (var i = 0; i < this.rowsNum; i++) { - cells = rows[i].cells; - for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { - var tmpEnd = - domUtils.getXY(tmpCell)[flag ? "x" : "y"] + - tmpCell["offset" + (flag ? "Width" : "Height")]; - //对应行的td已经被上面行rowSpan了 - if (tmpEnd > end && flag) break; - if (cell == tmpCell || end == tmpEnd) { - //只获取单一的单元格 - //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 - if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { - returns.push(tmpCell); - } - if (flag) break; - } - } - } - return returns; - } catch (e) { - showError(e); - } - }, - setCellContent: function(cell, content) { - cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
    "); - }, - cloneCell: UETable.cloneCell, - /** - * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 - */ - getSameStartPosXCells: function(cell) { - try { - var start = domUtils.getXY(cell).x + cell.offsetWidth, - rows = this.table.rows, - cells, - returns = []; - for (var i = 0; i < this.rowsNum; i++) { - cells = rows[i].cells; - for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { - var tmpStart = domUtils.getXY(tmpCell).x; - if (tmpStart > start) break; - if (tmpStart == start && tmpCell.colSpan == 1) { - returns.push(tmpCell); - break; - } - } - } - return returns; - } catch (e) { - showError(e); - } - }, - /** - * 更新table对应的索引表 - */ - update: function(table) { - this.table = table || this.table; - this.selectedTds = []; - this.cellsRange = {}; - this.indexTable = []; - var rows = this.table.rows, - rowsNum = this.getMaxRows(), - dNum = rowsNum - rows.length, - colsNum = this.getMaxCols(); - while (dNum--) { - this.table.insertRow(rows.length); - } - this.rowsNum = rowsNum; - this.colsNum = colsNum; - for (var i = 0, len = rows.length; i < len; i++) { - this.indexTable[i] = new Array(colsNum); - } - //填充索引表 - for (var rowIndex = 0, row; (row = rows[rowIndex]); rowIndex++) { - for ( - var cellIndex = 0, cell, cells = row.cells; - (cell = cells[cellIndex]); - cellIndex++ - ) { - //修正整行被rowSpan时导致的行数计算错误 - if (cell.rowSpan > rowsNum) { - cell.rowSpan = rowsNum; - } - var colIndex = cellIndex, - rowSpan = cell.rowSpan || 1, - colSpan = cell.colSpan || 1; - //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 - while (this.indexTable[rowIndex][colIndex]) colIndex++; - for (var j = 0; j < rowSpan; j++) { - for (var k = 0; k < colSpan; k++) { - this.indexTable[rowIndex + j][colIndex + k] = { - rowIndex: rowIndex, - cellIndex: cellIndex, - colIndex: colIndex, - rowSpan: rowSpan, - colSpan: colSpan - }; - } - } - } - } - //修复残缺td - for (j = 0; j < rowsNum; j++) { - for (k = 0; k < colsNum; k++) { - if (this.indexTable[j][k] === undefined) { - row = rows[j]; - cell = row.cells[row.cells.length - 1]; - cell = cell - ? cell.cloneNode(true) - : this.table.ownerDocument.createElement("td"); - this.setCellContent(cell); - if (cell.colSpan !== 1) cell.colSpan = 1; - if (cell.rowSpan !== 1) cell.rowSpan = 1; - row.appendChild(cell); - this.indexTable[j][k] = { - rowIndex: j, - cellIndex: cell.cellIndex, - colIndex: k, - rowSpan: 1, - colSpan: 1 - }; - } - } - } - //当框选后删除行或者列后撤销,需要重建选区。 - var tds = domUtils.getElementsByTagName(this.table, "td"), - selectTds = []; - utils.each(tds, function(td) { - if (domUtils.hasClass(td, "selectTdClass")) { - selectTds.push(td); - } - }); - if (selectTds.length) { - var start = selectTds[0], - end = selectTds[selectTds.length - 1], - startInfo = this.getCellInfo(start), - endInfo = this.getCellInfo(end); - this.selectedTds = selectTds; - this.cellsRange = { - beginRowIndex: startInfo.rowIndex, - beginColIndex: startInfo.colIndex, - endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1, - endColIndex: endInfo.colIndex + endInfo.colSpan - 1 - }; - } - //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 - if (!domUtils.hasClass(this.table.rows[0], "firstRow")) { - domUtils.addClass(this.table.rows[0], "firstRow"); - for (var i = 1; i < this.table.rows.length; i++) { - domUtils.removeClasses(this.table.rows[i], "firstRow"); - } - } - }, - /** - * 获取单元格的索引信息 - */ - getCellInfo: function(cell) { - if (!cell) return; - var cellIndex = cell.cellIndex, - rowIndex = cell.parentNode.rowIndex, - rowInfo = this.indexTable[rowIndex], - numCols = this.colsNum; - for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { - var cellInfo = rowInfo[colIndex]; - if ( - cellInfo.rowIndex === rowIndex && - cellInfo.cellIndex === cellIndex - ) { - return cellInfo; - } - } - }, - /** - * 根据行列号获取单元格 - */ - getCell: function(rowIndex, cellIndex) { - return ( - (rowIndex < this.rowsNum && - this.table.rows[rowIndex].cells[cellIndex]) || - null - ); - }, - /** - * 删除单元格 - */ - deleteCell: function(cell, rowIndex) { - rowIndex = typeof rowIndex == "number" - ? rowIndex - : cell.parentNode.rowIndex; - var row = this.table.rows[rowIndex]; - row.deleteCell(cell.cellIndex); - }, - /** - * 根据始末两个单元格获取被框选的所有单元格范围 - */ - getCellsRange: function(cellA, cellB) { - function checkRange( - beginRowIndex, - beginColIndex, - endRowIndex, - endColIndex - ) { - var tmpBeginRowIndex = beginRowIndex, - tmpBeginColIndex = beginColIndex, - tmpEndRowIndex = endRowIndex, - tmpEndColIndex = endColIndex, - cellInfo, - colIndex, - rowIndex; - // 通过indexTable检查是否存在超出TableRange上边界的情况 - if (beginRowIndex > 0) { - for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { - cellInfo = me.indexTable[beginRowIndex][colIndex]; - rowIndex = cellInfo.rowIndex; - if (rowIndex < beginRowIndex) { - tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); - } - } - } - // 通过indexTable检查是否存在超出TableRange右边界的情况 - if (endColIndex < me.colsNum) { - for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { - cellInfo = me.indexTable[rowIndex][endColIndex]; - colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; - if (colIndex > endColIndex) { - tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); - } - } - } - // 检查是否有超出TableRange下边界的情况 - if (endRowIndex < me.rowsNum) { - for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { - cellInfo = me.indexTable[endRowIndex][colIndex]; - rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; - if (rowIndex > endRowIndex) { - tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); - } - } - } - // 检查是否有超出TableRange左边界的情况 - if (beginColIndex > 0) { - for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { - cellInfo = me.indexTable[rowIndex][beginColIndex]; - colIndex = cellInfo.colIndex; - if (colIndex < beginColIndex) { - tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); - } - } - } - //递归调用直至所有完成所有框选单元格的扩展 - if ( - tmpBeginRowIndex != beginRowIndex || - tmpBeginColIndex != beginColIndex || - tmpEndRowIndex != endRowIndex || - tmpEndColIndex != endColIndex - ) { - return checkRange( - tmpBeginRowIndex, - tmpBeginColIndex, - tmpEndRowIndex, - tmpEndColIndex - ); - } else { - // 不需要扩展TableRange的情况 - return { - beginRowIndex: beginRowIndex, - beginColIndex: beginColIndex, - endRowIndex: endRowIndex, - endColIndex: endColIndex - }; - } - } - - try { - var me = this, - cellAInfo = me.getCellInfo(cellA); - if (cellA === cellB) { - return { - beginRowIndex: cellAInfo.rowIndex, - beginColIndex: cellAInfo.colIndex, - endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1, - endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1 - }; - } - var cellBInfo = me.getCellInfo(cellB); - // 计算TableRange的四个边 - var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), - beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), - endRowIndex = Math.max( - cellAInfo.rowIndex + cellAInfo.rowSpan - 1, - cellBInfo.rowIndex + cellBInfo.rowSpan - 1 - ), - endColIndex = Math.max( - cellAInfo.colIndex + cellAInfo.colSpan - 1, - cellBInfo.colIndex + cellBInfo.colSpan - 1 - ); - - return checkRange( - beginRowIndex, - beginColIndex, - endRowIndex, - endColIndex - ); - } catch (e) { - //throw e; - } - }, - /** - * 依据cellsRange获取对应的单元格集合 - */ - getCells: function(range) { - //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 - this.clearSelected(); - var beginRowIndex = range.beginRowIndex, - beginColIndex = range.beginColIndex, - endRowIndex = range.endRowIndex, - endColIndex = range.endColIndex, - cellInfo, - rowIndex, - colIndex, - tdHash = {}, - returnTds = []; - for (var i = beginRowIndex; i <= endRowIndex; i++) { - for (var j = beginColIndex; j <= endColIndex; j++) { - cellInfo = this.indexTable[i][j]; - rowIndex = cellInfo.rowIndex; - colIndex = cellInfo.colIndex; - // 如果Cells里已经包含了此Cell则跳过 - var key = rowIndex + "|" + colIndex; - if (tdHash[key]) continue; - tdHash[key] = 1; - if ( - rowIndex < i || - colIndex < j || - rowIndex + cellInfo.rowSpan - 1 > endRowIndex || - colIndex + cellInfo.colSpan - 1 > endColIndex - ) { - return null; - } - returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); - } - } - return returnTds; - }, - /** - * 清理已经选中的单元格 - */ - clearSelected: function() { - UETable.removeSelectedClass(this.selectedTds); - this.selectedTds = []; - this.cellsRange = {}; - }, - /** - * 根据range设置已经选中的单元格 - */ - setSelected: function(range) { - var cells = this.getCells(range); - UETable.addSelectedClass(cells); - this.selectedTds = cells; - this.cellsRange = range; - }, - isFullRow: function() { - var range = this.cellsRange; - return range.endColIndex - range.beginColIndex + 1 == this.colsNum; - }, - isFullCol: function() { - var range = this.cellsRange, - table = this.table, - ths = table.getElementsByTagName("th"), - rows = range.endRowIndex - range.beginRowIndex + 1; - return !ths.length - ? rows == this.rowsNum - : rows == this.rowsNum || rows == this.rowsNum - 1; - }, - /** - * 获取视觉上的前置单元格,默认是左边,top传入时 - * @param cell - * @param top - */ - getNextCell: function(cell, bottom, ignoreRange) { - try { - var cellInfo = this.getCellInfo(cell), - nextRowIndex, - nextColIndex; - var len = this.selectedTds.length && !ignoreRange, - range = this.cellsRange; - //末行或者末列没有后置单元格 - if ( - (!bottom && cellInfo.rowIndex == 0) || - (bottom && - (!len - ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 - : range.endRowIndex == this.rowsNum - 1)) - ) - return null; - - nextRowIndex = !bottom - ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 - : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; - nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; - return this.getCell( - this.indexTable[nextRowIndex][nextColIndex].rowIndex, - this.indexTable[nextRowIndex][nextColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - getPreviewCell: function(cell, top) { - try { - var cellInfo = this.getCellInfo(cell), - previewRowIndex, - previewColIndex; - var len = this.selectedTds.length, - range = this.cellsRange; - //首行或者首列没有前置单元格 - if ( - (!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || - (top && - (!len - ? cellInfo.rowIndex > this.colsNum - 1 - : range.endColIndex == this.colsNum - 1)) - ) - return null; - - previewRowIndex = !top - ? !len ? cellInfo.rowIndex : range.beginRowIndex - : !len - ? cellInfo.rowIndex < 1 ? 0 : cellInfo.rowIndex - 1 - : range.beginRowIndex; - previewColIndex = !top - ? !len - ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 - : range.beginColIndex - 1 - : !len ? cellInfo.colIndex : range.endColIndex + 1; - return this.getCell( - this.indexTable[previewRowIndex][previewColIndex].rowIndex, - this.indexTable[previewRowIndex][previewColIndex].cellIndex - ); - } catch (e) { - showError(e); - } - }, - /** - * 移动单元格中的内容 - */ - moveContent: function(cellTo, cellFrom) { - if (UETable.isEmptyBlock(cellFrom)) return; - if (UETable.isEmptyBlock(cellTo)) { - cellTo.innerHTML = cellFrom.innerHTML; - return; - } - var child = cellTo.lastChild; - if (child.nodeType == 3 || !dtd.$block[child.tagName]) { - cellTo.appendChild(cellTo.ownerDocument.createElement("br")); - } - while ((child = cellFrom.firstChild)) { - cellTo.appendChild(child); - } - }, - /** - * 向右合并单元格 - */ - mergeRight: function(cell) { - var cellInfo = this.getCellInfo(cell), - rightColIndex = cellInfo.colIndex + cellInfo.colSpan, - rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], - rightCell = this.getCell( - rightCellInfo.rowIndex, - rightCellInfo.cellIndex - ); - //合并 - cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; - //被合并的单元格不应存在宽度属性 - cell.removeAttribute("width"); - //移动内容 - this.moveContent(cell, rightCell); - //删掉被合并的Cell - this.deleteCell(rightCell, rightCellInfo.rowIndex); - this.update(); - }, - /** - * 向下合并单元格 - */ - mergeDown: function(cell) { - var cellInfo = this.getCellInfo(cell), - downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, - downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], - downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); - cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; - cell.removeAttribute("height"); - this.moveContent(cell, downCell); - this.deleteCell(downCell, downCellInfo.rowIndex); - this.update(); - }, - /** - * 合并整个range中的内容 - */ - mergeRange: function() { - //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 - var range = this.cellsRange, - leftTopCell = this.getCell( - range.beginRowIndex, - this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex - ); - - // 这段关于行表头或者列表头的特殊处理会导致表头合并范围错误 - // 为什么有这段代码的原因未明,暂且注释掉,希望原作者看到后出面说明下 - // if ( - // leftTopCell.tagName == "TH" && - // range.endRowIndex !== range.beginRowIndex - // ) { - // var index = this.indexTable, - // info = this.getCellInfo(leftTopCell); - // leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); - // range = this.getCellsRange( - // leftTopCell, - // this.getCell( - // index[this.rowsNum - 1][info.colIndex].rowIndex, - // index[this.rowsNum - 1][info.colIndex].cellIndex - // ) - // ); - // } - - // 删除剩余的Cells - var cells = this.getCells(range); - for (var i = 0, ci; (ci = cells[i++]); ) { - if (ci !== leftTopCell) { - this.moveContent(leftTopCell, ci); - this.deleteCell(ci); - } - } - // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 - leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; - leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); - leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; - leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); - if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { - leftTopCell.colSpan = 1; - } - - if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { - var rowIndex = leftTopCell.parentNode.rowIndex; - //解决IE下的表格操作问题 - if (this.table.deleteRow) { - for ( - var i = rowIndex + 1, - curIndex = rowIndex + 1, - len = leftTopCell.rowSpan; - i < len; - i++ - ) { - this.table.deleteRow(curIndex); - } - } else { - for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) { - var row = this.table.rows[rowIndex + 1]; - row.parentNode.removeChild(row); - } - } - leftTopCell.rowSpan = 1; - } - this.update(); - }, - /** - * 插入一行单元格 - */ - insertRow: function(rowIndex, sourceCell) { - var numCols = this.colsNum, - table = this.table, - row = table.insertRow(rowIndex), - cell, - thead = null, - isInsertTitle = - typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; - - function replaceTdToTh(colIndex, cell, tableRow) { - if (colIndex == 0) { - var tr = tableRow.nextSibling || tableRow.previousSibling, - th = tr.cells[colIndex]; - if (th.tagName == "TH") { - th = cell.ownerDocument.createElement("th"); - th.appendChild(cell.firstChild); - tableRow.insertBefore(th, cell); - domUtils.remove(cell); - } - } else { - if (cell.tagName == "TH") { - var td = cell.ownerDocument.createElement("td"); - td.appendChild(cell.firstChild); - tableRow.insertBefore(td, cell); - domUtils.remove(cell); - } - } - } - - //首行直接插入,无需考虑部分单元格被rowspan的情况 - if (rowIndex == 0 || rowIndex == this.rowsNum) { - for (var colIndex = 0; colIndex < numCols; colIndex++) { - cell = this.cloneCell(sourceCell, true); - this.setCellContent(cell); - cell.getAttribute("vAlign") && - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - row.appendChild(cell); - if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); - } - - if (isInsertTitle) { - thead = table.createTHead(); - thead.insertBefore(row, thead.firstChild); - } - } else { - var infoRow = this.indexTable[rowIndex], - cellIndex = 0; - for (colIndex = 0; colIndex < numCols; colIndex++) { - var cellInfo = infoRow[colIndex]; - //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 - if (cellInfo.rowIndex < rowIndex) { - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - cell.rowSpan = cellInfo.rowSpan + 1; - } else { - cell = this.cloneCell(sourceCell, true); - this.setCellContent(cell); - row.appendChild(cell); - } - if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); - } - } - //框选时插入不触发contentchange,需要手动更新索引。 - this.update(); - return row; - }, - /** - * 删除一行单元格 - * @param rowIndex - */ - deleteRow: function(rowIndex) { - var row = this.table.rows[rowIndex], - infoRow = this.indexTable[rowIndex], - colsNum = this.colsNum, - count = 0; //处理计数 - for (var colIndex = 0; colIndex < colsNum; ) { - var cellInfo = infoRow[colIndex], - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - if (cell.rowSpan > 1) { - if (cellInfo.rowIndex == rowIndex) { - var clone = cell.cloneNode(true); - clone.rowSpan = cell.rowSpan - 1; - clone.innerHTML = ""; - cell.rowSpan = 1; - var nextRowIndex = rowIndex + 1, - nextRow = this.table.rows[nextRowIndex], - insertCellIndex, - preMerged = - this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; - if (preMerged < colIndex) { - insertCellIndex = colIndex - preMerged - 1; - //nextRow.insertCell(insertCellIndex); - domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); - } else { - if (nextRow.cells.length) - nextRow.insertBefore(clone, nextRow.cells[0]); - } - count += 1; - //cell.parentNode.removeChild(cell); - } - } - colIndex += cell.colSpan || 1; - } - var deleteTds = [], - cacheMap = {}; - for (colIndex = 0; colIndex < colsNum; colIndex++) { - var tmpRowIndex = infoRow[colIndex].rowIndex, - tmpCellIndex = infoRow[colIndex].cellIndex, - key = tmpRowIndex + "_" + tmpCellIndex; - if (cacheMap[key]) continue; - cacheMap[key] = 1; - cell = this.getCell(tmpRowIndex, tmpCellIndex); - deleteTds.push(cell); - } - var mergeTds = []; - utils.each(deleteTds, function(td) { - if (td.rowSpan == 1) { - td.parentNode.removeChild(td); - } else { - mergeTds.push(td); - } - }); - utils.each(mergeTds, function(td) { - td.rowSpan--; - }); - row.parentNode.removeChild(row); - //浏览器方法本身存在bug,采用自定义方法删除 - //this.table.deleteRow(rowIndex); - this.update(); - }, - insertCol: function(colIndex, sourceCell, defaultValue) { - var rowsNum = this.rowsNum, - rowIndex = 0, - tableRow, - cell, - backWidth = parseInt( - (this.table.offsetWidth - - (this.colsNum + 1) * 20 - - (this.colsNum + 1)) / - (this.colsNum + 1), - 10 - ), - isInsertTitleCol = - typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; - - function replaceTdToTh(rowIndex, cell, tableRow) { - if (rowIndex == 0) { - var th = cell.nextSibling || cell.previousSibling; - if (th.tagName == "TH") { - th = cell.ownerDocument.createElement("th"); - th.appendChild(cell.firstChild); - tableRow.insertBefore(th, cell); - domUtils.remove(cell); - } - } else { - if (cell.tagName == "TH") { - var td = cell.ownerDocument.createElement("td"); - td.appendChild(cell.firstChild); - tableRow.insertBefore(td, cell); - domUtils.remove(cell); - } - } - } - - var preCell; - if (colIndex == 0 || colIndex == this.colsNum) { - for (; rowIndex < rowsNum; rowIndex++) { - tableRow = this.table.rows[rowIndex]; - preCell = - tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; - cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); - this.setCellContent(cell); - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - preCell && cell.setAttribute("width", preCell.getAttribute("width")); - if (!colIndex) { - tableRow.insertBefore(cell, tableRow.cells[0]); - } else { - domUtils.insertAfter( - tableRow.cells[tableRow.cells.length - 1], - cell - ); - } - if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); - } - } else { - for (; rowIndex < rowsNum; rowIndex++) { - var cellInfo = this.indexTable[rowIndex][colIndex]; - if (cellInfo.colIndex < colIndex) { - cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - cell.colSpan = cellInfo.colSpan + 1; - } else { - tableRow = this.table.rows[rowIndex]; - preCell = tableRow.cells[cellInfo.cellIndex]; - - cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(cellInfo.cellIndex); - this.setCellContent(cell); - cell.setAttribute("vAlign", cell.getAttribute("vAlign")); - preCell && - cell.setAttribute("width", preCell.getAttribute("width")); - //防止IE下报错 - preCell - ? tableRow.insertBefore(cell, preCell) - : tableRow.appendChild(cell); - } - if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); - } - } - //框选时插入不触发contentchange,需要手动更新索引 - this.update(); - this.updateWidth( - backWidth, - defaultValue || { tdPadding: 10, tdBorder: 1 } - ); - }, - updateWidth: function(width, defaultValue) { - var table = this.table, - tmpWidth = - UETable.getWidth(table) - - defaultValue.tdPadding * 2 - - defaultValue.tdBorder + - width; - if (tmpWidth < table.ownerDocument.body.offsetWidth) { - table.setAttribute("width", tmpWidth); - return; - } - var tds = domUtils.getElementsByTagName(this.table, "td th"); - utils.each(tds, function(td) { - td.setAttribute("width", width); - }); - }, - deleteCol: function(colIndex) { - var indexTable = this.indexTable, - tableRows = this.table.rows, - backTableWidth = this.table.getAttribute("width"), - backTdWidth = 0, - rowsNum = this.rowsNum, - cacheMap = {}; - for (var rowIndex = 0; rowIndex < rowsNum; ) { - var infoRow = indexTable[rowIndex], - cellInfo = infoRow[colIndex], - key = cellInfo.rowIndex + "_" + cellInfo.colIndex; - // 跳过已经处理过的Cell - if (cacheMap[key]) continue; - cacheMap[key] = 1; - var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); - if (!backTdWidth) - backTdWidth = - cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); - // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell - if (cell.colSpan > 1) { - cell.colSpan--; - } else { - tableRows[rowIndex].deleteCell(cellInfo.cellIndex); - } - rowIndex += cellInfo.rowSpan || 1; - } - this.table.setAttribute("width", backTableWidth - backTdWidth); - this.update(); - }, - splitToCells: function(cell) { - var me = this, - cells = this.splitToRows(cell); - utils.each(cells, function(cell) { - me.splitToCols(cell); - }); - }, - splitToRows: function(cell) { - var cellInfo = this.getCellInfo(cell), - rowIndex = cellInfo.rowIndex, - colIndex = cellInfo.colIndex, - results = []; - // 修改Cell的rowSpan - cell.rowSpan = 1; - results.push(cell); - // 补齐单元格 - for ( - var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; - i < endRow; - i++ - ) { - if (i == rowIndex) continue; - var tableRow = this.table.rows[i], - tmpCell = tableRow.insertCell( - colIndex - this.getPreviewMergedCellsNum(i, colIndex) - ); - tmpCell.colSpan = cellInfo.colSpan; - this.setCellContent(tmpCell); - tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); - tmpCell.setAttribute("align", cell.getAttribute("align")); - if (cell.style.cssText) { - tmpCell.style.cssText = cell.style.cssText; - } - results.push(tmpCell); - } - this.update(); - return results; - }, - getPreviewMergedCellsNum: function(rowIndex, colIndex) { - var indexRow = this.indexTable[rowIndex], - num = 0; - for (var i = 0; i < colIndex; ) { - var colSpan = indexRow[i].colSpan, - tmpRowIndex = indexRow[i].rowIndex; - num += colSpan - (tmpRowIndex == rowIndex ? 1 : 0); - i += colSpan; - } - return num; - }, - splitToCols: function(cell) { - var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), - cellInfo = this.getCellInfo(cell), - rowIndex = cellInfo.rowIndex, - colIndex = cellInfo.colIndex, - results = []; - // 修改Cell的rowSpan - cell.colSpan = 1; - cell.setAttribute("width", backWidth); - results.push(cell); - // 补齐单元格 - for ( - var j = colIndex, endCol = colIndex + cellInfo.colSpan; - j < endCol; - j++ - ) { - if (j == colIndex) continue; - var tableRow = this.table.rows[rowIndex], - tmpCell = tableRow.insertCell( - this.indexTable[rowIndex][j].cellIndex + 1 - ); - tmpCell.rowSpan = cellInfo.rowSpan; - this.setCellContent(tmpCell); - tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); - tmpCell.setAttribute("align", cell.getAttribute("align")); - tmpCell.setAttribute("width", backWidth); - if (cell.style.cssText) { - tmpCell.style.cssText = cell.style.cssText; - } - //处理th的情况 - if (cell.tagName == "TH") { - var th = cell.ownerDocument.createElement("th"); - th.appendChild(tmpCell.firstChild); - th.setAttribute("vAlign", cell.getAttribute("vAlign")); - th.rowSpan = tmpCell.rowSpan; - tableRow.insertBefore(th, tmpCell); - domUtils.remove(tmpCell); - } - results.push(tmpCell); - } - this.update(); - return results; - }, - isLastCell: function(cell, rowsNum, colsNum) { - rowsNum = rowsNum || this.rowsNum; - colsNum = colsNum || this.colsNum; - var cellInfo = this.getCellInfo(cell); - return ( - cellInfo.rowIndex + cellInfo.rowSpan == rowsNum && - cellInfo.colIndex + cellInfo.colSpan == colsNum - ); - }, - getLastCell: function(cells) { - cells = cells || this.table.getElementsByTagName("td"); - var firstInfo = this.getCellInfo(cells[0]); - var me = this, - last = cells[0], - tr = last.parentNode, - cellsNum = 0, - cols = 0, - rows; - utils.each(cells, function(cell) { - if (cell.parentNode == tr) cols += cell.colSpan || 1; - cellsNum += cell.rowSpan * cell.colSpan || 1; - }); - rows = cellsNum / cols; - utils.each(cells, function(cell) { - if (me.isLastCell(cell, rows, cols)) { - last = cell; - return false; - } - }); - return last; - }, - selectRow: function(rowIndex) { - var indexRow = this.indexTable[rowIndex], - start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), - end = this.getCell( - indexRow[this.colsNum - 1].rowIndex, - indexRow[this.colsNum - 1].cellIndex - ), - range = this.getCellsRange(start, end); - this.setSelected(range); - }, - selectTable: function() { - var tds = this.table.getElementsByTagName("td"), - range = this.getCellsRange(tds[0], tds[tds.length - 1]); - this.setSelected(range); - }, - setBackground: function(cells, value) { - if (typeof value === "string") { - utils.each(cells, function(cell) { - cell.style.backgroundColor = value; - }); - } else if (typeof value === "object") { - value = utils.extend( - { - repeat: true, - colorList: ["#ddd", "#fff"] - }, - value - ); - var rowIndex = this.getCellInfo(cells[0]).rowIndex, - count = 0, - colors = value.colorList, - getColor = function(list, index, repeat) { - return list[index] - ? list[index] - : repeat ? list[index % list.length] : ""; - }; - for (var i = 0, cell; (cell = cells[i++]); ) { - var cellInfo = this.getCellInfo(cell); - cell.style.backgroundColor = getColor( - colors, - rowIndex + count == cellInfo.rowIndex ? count : ++count, - value.repeat - ); - } - } - }, - removeBackground: function(cells) { - utils.each(cells, function(cell) { - cell.style.backgroundColor = ""; - }); - } - }; - function showError(e) {} -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js deleted file mode 100644 index 9e4a2e7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/table.sort.js +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Created with JetBrains PhpStorm. - * User: Jinqn - * Date: 13-10-12 - * Time: 上午10:20 - * To change this template use File | Settings | File Templates. - */ - -UE.UETable.prototype.sortTable = function(sortByCellIndex, compareFn) { - var table = this.table, - rows = table.rows, - trArray = [], - flag = rows[0].cells[0].tagName === "TH", - lastRowIndex = 0; - if (this.selectedTds.length) { - var range = this.cellsRange, - len = range.endRowIndex + 1; - for (var i = range.beginRowIndex; i < len; i++) { - trArray[i] = rows[i]; - } - trArray.splice(0, range.beginRowIndex); - lastRowIndex = range.endRowIndex + 1 === this.rowsNum - ? 0 - : range.endRowIndex + 1; - } else { - for (var i = 0, len = rows.length; i < len; i++) { - trArray[i] = rows[i]; - } - } - - var Fn = { - reversecurrent: function(td1, td2) { - return 1; - }, - orderbyasc: function(td1, td2) { - var value1 = td1.innerText || td1.textContent, - value2 = td2.innerText || td2.textContent; - return value1.localeCompare(value2); - }, - reversebyasc: function(td1, td2) { - var value1 = td1.innerHTML, - value2 = td2.innerHTML; - return value2.localeCompare(value1); - }, - orderbynum: function(td1, td2) { - var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), - value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value1 || 0) - (value2 || 0); - }, - reversebynum: function(td1, td2) { - var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), - value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); - if (value1) value1 = +value1[0]; - if (value2) value2 = +value2[0]; - return (value2 || 0) - (value1 || 0); - } - }; - - //对表格设置排序的标记data-sort-type - table.setAttribute( - "data-sort-type", - compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : "" - ); - - //th不参与排序 - flag && trArray.splice(0, 1); - trArray = utils.sort(trArray, function(tr1, tr2) { - var result; - if (compareFn && typeof compareFn === "function") { - result = compareFn.call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else if (compareFn && typeof compareFn === "number") { - result = 1; - } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { - result = Fn[compareFn].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } else { - result = Fn["orderbyasc"].call( - this, - tr1.cells[sortByCellIndex], - tr2.cells[sortByCellIndex] - ); - } - return result; - }); - var fragment = table.ownerDocument.createDocumentFragment(); - for (var j = 0, len = trArray.length; j < len; j++) { - fragment.appendChild(trArray[j]); - } - var tbody = table.getElementsByTagName("tbody")[0]; - if (!lastRowIndex) { - tbody.appendChild(fragment); - } else { - tbody.insertBefore( - fragment, - rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] - ); - } -}; - -UE.plugins["tablesort"] = function() { - var me = this, - UT = UE.UETable, - getUETable = function(tdOrTable) { - return UT.getUETable(tdOrTable); - }, - getTableItemsByRange = function(editor) { - return UT.getTableItemsByRange(editor); - }; - - me.ready(function() { - //添加表格可排序的样式 - utils.cssRule( - "tablesort", - "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;" + - " background-image:url(" + - me.options.themePath + - me.options.theme + - "/images/sortable.png);}", - me.document - ); - - //做单元格合并操作时,清除可排序标识 - me.addListener("afterexeccommand", function(type, cmd) { - if (cmd == "mergeright" || cmd == "mergedown" || cmd == "mergecells") { - this.execCommand("disablesort"); - } - }); - }); - - //表格排序 - UE.commands["sorttable"] = { - queryCommandState: function() { - var me = this, - tableItems = getTableItemsByRange(me); - if (!tableItems.cell) return -1; - var table = tableItems.table, - cells = table.getElementsByTagName("td"); - for (var i = 0, cell; (cell = cells[i++]); ) { - if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; - } - return 0; - }, - execCommand: function(cmd, fn) { - var me = this, - range = me.selection.getRange(), - bk = range.createBookmark(true), - tableItems = getTableItemsByRange(me), - cell = tableItems.cell, - ut = getUETable(tableItems.table), - cellInfo = ut.getCellInfo(cell); - ut.sortTable(cellInfo.cellIndex, fn); - range.moveToBookmark(bk); - try { - range.select(); - } catch (e) {} - } - }; - - //设置表格可排序,清除表格可排序 - UE.commands["enablesort"] = UE.commands["disablesort"] = { - queryCommandState: function(cmd) { - var table = getTableItemsByRange(this).table; - if (table && cmd == "enablesort") { - var cells = domUtils.getElementsByTagName(table, "th td"); - for (var i = 0; i < cells.length; i++) { - if ( - cells[i].getAttribute("colspan") > 1 || - cells[i].getAttribute("rowspan") > 1 - ) - return -1; - } - } - - return !table - ? -1 - : (cmd == "enablesort") ^ - (table.getAttribute("data-sort") != "sortEnabled") - ? -1 - : 0; - }, - execCommand: function(cmd) { - var table = getTableItemsByRange(this).table; - table.setAttribute( - "data-sort", - cmd == "enablesort" ? "sortEnabled" : "sortDisabled" - ); - cmd == "enablesort" - ? domUtils.addClass(table, "sortEnabled") - : domUtils.removeClasses(table, "sortEnabled"); - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js deleted file mode 100644 index adb5e1a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/template.js +++ /dev/null @@ -1,47 +0,0 @@ -///import core -///import plugins\inserthtml.js -///import plugins\cleardoc.js -///commands 模板 -///commandsName template -///commandsTitle 模板 -///commandsDialog dialogs\template -UE.plugins["template"] = function() { - UE.commands["template"] = { - execCommand: function(cmd, obj) { - obj.html && this.execCommand("inserthtml", obj.html); - } - }; - this.addListener("click", function(type, evt) { - var el = evt.target || evt.srcElement, - range = this.selection.getRange(); - var tnode = domUtils.findParent( - el, - function(node) { - if (node.className && domUtils.hasClass(node, "ue_t")) { - return node; - } - }, - true - ); - tnode && range.selectNode(tnode).shrinkBoundary().select(); - }); - this.addListener("keydown", function(type, evt) { - var range = this.selection.getRange(); - if (!range.collapsed) { - if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { - var tnode = domUtils.findParent( - range.startContainer, - function(node) { - if (node.className && domUtils.hasClass(node, "ue_t")) { - return node; - } - }, - true - ); - if (tnode) { - domUtils.removeClasses(tnode, ["ue_t"]); - } - } - } - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js deleted file mode 100644 index 2734ebf..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/time.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 插入时间和日期 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入时间,默认格式:12:59:59 - * @command time - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'time'); - * ``` - */ - -/** - * 插入日期,默认格式:2013-08-30 - * @command date - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'date'); - * ``` - */ -UE.commands["time"] = UE.commands["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); - } - - this.execCommand( - "insertHtml", - cmd == "time" ? formatTime(date, format) : formatDate(date, format) - ); - } -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js deleted file mode 100644 index 083b75b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/undo.js +++ /dev/null @@ -1,332 +0,0 @@ -/** - * undo redo - * @file - * @since 1.2.6.1 - */ - -/** - * 撤销上一次执行的命令 - * @command undo - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'undo' ); - * ``` - */ - -/** - * 重做上一次执行的命令 - * @command redo - * @method execCommand - * @param { String } cmd 命令字符串 - * @example - * ```javascript - * editor.execCommand( 'redo' ); - * ``` - */ - -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; - } - - 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; - } - 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.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); - } - }, 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; - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js deleted file mode 100644 index a406898..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/video.js +++ /dev/null @@ -1,239 +0,0 @@ -/** - * video插件, 为UEditor提供视频插入支持 - * @file - * @since 1.2.6.1 - */ - -UE.plugins["video"] = function() { - var me = this; - - /** - * 创建插入视频字符窜 - * @param url 视频地址 - * @param width 视频宽度 - * @param height 视频高度 - * @param align 视频对齐 - * @param toEmbed 是否以flash代替显示 - * @param addParagraph 是否需要添加P 标签 - */ - function creatInsertStr(url, width, height, id, align, classname, type) { - var str; - switch (type) { - case "image": - str = - "'; - break; - case "embed": - str = - ''; - break; - case "video": - var ext = url.substr(url.lastIndexOf(".") + 1); - if (ext == "ogv") ext = "ogg"; - str = - "' + - ''; - break; - } - return str; - } - - function switchImgAndVideo(root, img2video) { - utils.each( - root.getNodesByTagName(img2video ? "img" : "embed video"), - function(node) { - var className = node.getAttr("class"); - if (className && className.indexOf("edui-faked-video") != -1) { - var html = creatInsertStr( - img2video ? node.getAttr("_url") : node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - null, - node.getStyle("float") || "", - className, - img2video ? "embed" : "image" - ); - node.parentNode.replaceChild(UE.uNode.createElement(html), node); - } - if (className && className.indexOf("edui-upload-video") != -1) { - var html = creatInsertStr( - img2video ? node.getAttr("_url") : node.getAttr("src"), - node.getAttr("width"), - node.getAttr("height"), - null, - node.getStyle("float") || "", - className, - img2video ? "video" : "image" - ); - node.parentNode.replaceChild(UE.uNode.createElement(html), node); - } - } - ); - } - - me.addOutputRule(function(root) { - switchImgAndVideo(root, true); - }); - me.addInputRule(function(root) { - switchImgAndVideo(root); - }); - - /** - * 插入视频 - * @command insertvideo - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 - * @example - * ```javascript - * - * var videoAttr = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * }; - * - * //editor 是编辑器实例 - * //向编辑器插入单个视频 - * editor.execCommand( 'insertvideo', videoAttr ); - * ``` - */ - - /** - * 插入视频 - * @command insertvideo - * @method execCommand - * @param { String } cmd 命令字符串 - * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 - * @example - * ```javascript - * - * var videoAttr1 = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * }, - * videoAttr2 = { - * //视频地址 - * url: 'http://www.youku.com/xxx', - * //视频宽高值, 单位px - * width: 200, - * height: 100 - * } - * - * //editor 是编辑器实例 - * //该方法将会向编辑器内插入两个视频 - * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); - * ``` - */ - - /** - * 查询当前光标所在处是否是一个视频 - * @command insertvideo - * @method queryCommandState - * @param { String } cmd 需要查询的命令字符串 - * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 - * @example - * ```javascript - * - * //editor 是编辑器实例 - * editor.queryCommandState( 'insertvideo' ); - * ``` - */ - me.commands["insertvideo"] = { - execCommand: function(cmd, videoObjs, type) { - videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]; - - if (me.fireEvent("beforeinsertvideo", videoObjs) === true) { - return; - } - - var html = [], - id = "tmpVedio", - cl; - for (var i = 0, vi, len = videoObjs.length; i < len; i++) { - vi = videoObjs[i]; - cl = type == "upload" - ? "edui-upload-video video-js vjs-default-skin" - : "edui-faked-video"; - html.push( - creatInsertStr( - vi.url, - vi.width || 420, - vi.height || 280, - id + i, - null, - cl, - "image" - ) - ); - } - me.execCommand("inserthtml", html.join(""), true); - var rng = this.selection.getRange(); - for (var i = 0, len = videoObjs.length; i < len; i++) { - var img = this.document.getElementById("tmpVedio" + i); - domUtils.removeAttributes(img, "id"); - rng.selectNode(img).select(); - me.execCommand("imagefloat", videoObjs[i].align); - } - - me.fireEvent("afterinsertvideo", videoObjs); - }, - queryCommandState: function() { - var img = me.selection.getRange().getClosedNode(), - flag = - img && - (img.className == "edui-faked-video" || - img.className.indexOf("edui-upload-video") != -1); - return flag ? 1 : 0; - } - }; -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js deleted file mode 100644 index ddd5954..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/webapp.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * 百度应用 - * @file - * @since 1.2.6.1 - */ - -/** - * 插入百度应用 - * @command webapp - * @method execCommand - * @remind 需要百度APPKey - * @remind 百度应用主页: http://app.baidu.com/ - * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, - * height=>应用容器高度,logo=>应用logo,url=>应用地址 - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'webapp' , { - * title: '植物大战僵尸', - * width: 560, - * height: 465, - * logo: '应用展示的图片', - * url: '百度应用的地址' - * } ); - * ``` - */ - -//UE.plugins['webapp'] = function () { -// var me = this; -// function createInsertStr( obj, toIframe, addParagraph ) { -// return !toIframe ? -// (addParagraph ? '

    ' : '') + '' + -// (addParagraph ? '

    ' : '') -// : -// ''; -// } -// -// function switchImgAndIframe( img2frame ) { -// var tmpdiv, -// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); -// for ( var i = 0, node; node = nodes[i++]; ) { -// if ( node.className != "edui-faked-webapp" ){ -// continue; -// } -// tmpdiv = me.document.createElement( "div" ); -// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); -// node.parentNode.replaceChild( tmpdiv.firstChild, node ); -// } -// } -// -// me.addListener( "beforegetcontent", function () { -// switchImgAndIframe( true ); -// } ); -// me.addListener( 'aftersetcontent', function () { -// switchImgAndIframe( false ); -// } ); -// me.addListener( 'aftergetcontent', function ( cmdName ) { -// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ -// return; -// } -// switchImgAndIframe( false ); -// } ); -// -// me.commands['webapp'] = { -// execCommand:function ( cmd, obj ) { -// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); -// } -// }; -//}; - -UE.plugin.register("webapp", function() { - var me = this; - function createInsertStr(obj, toEmbed) { - return !toEmbed - ? '" - : ''; - } - return { - outputRule: function(root) { - utils.each(root.getNodesByTagName("img"), function(node) { - var html; - if (node.getAttr("class") == "edui-faked-webapp") { - html = createInsertStr( - { - title: node.getAttr("title"), - width: node.getAttr("width"), - height: node.getAttr("height"), - align: node.getAttr("align"), - cssfloat: node.getStyle("float"), - url: node.getAttr("_url"), - logo: node.getAttr("_logo_url") - }, - true - ); - var embed = UE.uNode.createElement(html); - node.parentNode.replaceChild(embed, node); - } - }); - }, - inputRule: function(root) { - utils.each(root.getNodesByTagName("iframe"), function(node) { - if (node.getAttr("class") == "edui-faked-webapp") { - var img = UE.uNode.createElement( - createInsertStr({ - title: node.getAttr("title"), - width: node.getAttr("width"), - height: node.getAttr("height"), - align: node.getAttr("align"), - cssfloat: node.getStyle("float"), - url: node.getAttr("src"), - logo: node.getAttr("logo_url") - }) - ); - node.parentNode.replaceChild(img, node); - } - }); - }, - commands: { - /** - * 插入百度应用 - * @command webapp - * @method execCommand - * @remind 需要百度APPKey - * @remind 百度应用主页: http://app.baidu.com/ - * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, - * height=>应用容器高度,logo=>应用logo,url=>应用地址 - * @example - * ```javascript - * //editor是编辑器实例 - * //在编辑器里插入一个“植物大战僵尸”的APP - * editor.execCommand( 'webapp' , { - * title: '植物大战僵尸', - * width: 560, - * height: 465, - * logo: '应用展示的图片', - * url: '百度应用的地址' - * } ); - * ``` - */ - webapp: { - execCommand: function(cmd, obj) { - var me = this, - str = createInsertStr( - utils.extend(obj, { - align: "none" - }), - false - ); - me.execCommand("inserthtml", str); - }, - queryCommandState: function() { - var me = this, - img = me.selection.getRange().getClosedNode(), - flag = img && img.className == "edui-faked-webapp"; - return flag ? 1 : 0; - } - } - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js deleted file mode 100644 index a0532e8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordcount.js +++ /dev/null @@ -1,41 +0,0 @@ -///import core -///commands 字数统计 -///commandsName WordCount,wordCount -///commandsTitle 字数统计 -/* - * Created by JetBrains WebStorm. - * User: taoqili - * Date: 11-9-7 - * Time: 下午8:18 - * 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() { - 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); - }); - }); -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js deleted file mode 100644 index 1878ef2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/wordimage.js +++ /dev/null @@ -1,58 +0,0 @@ -///import core -///commands 本地图片引导上传 -///commandsName WordImage -///commandsTitle 本地图片引导上传 -///commandsDialog dialogs\wordimage - -UE.plugin.register("wordimage", function() { - var me = this, - images = []; - 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("word_img"); - 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("word_img")) { - 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/notadd/images/spacer.gif"; - if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { - img.setAttr({ - width: attrs.width, - height: attrs.height, - alt: attrs.alt, - word_img: 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" - }); - } - }); - } - }; -}); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js deleted file mode 100644 index 39665ef..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/plugins/xssFilter.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file xssFilter.js - * @desc xss过滤器 - * @author robbenmu - */ - -UE.plugins.xssFilter = function() { - - var config = UEDITOR_CONFIG; - var whitList = config.whitList; - - function filter(node) { - - var tagName = node.tagName; - var attrs = node.attrs; - - if (!whitList.hasOwnProperty(tagName)) { - node.parentNode.removeChild(node); - return false; - } - - UE.utils.each(attrs, function (val, key) { - - if (whitList[tagName].indexOf(key) === -1) { - node.setAttr(key); - } - }); - } - - // 添加inserthtml\paste等操作用的过滤规则 - if (whitList && config.xssFilterRules) { - this.options.filterRules = function () { - - var result = {}; - - UE.utils.each(whitList, function(val, key) { - result[key] = function (node) { - return filter(node); - }; - }); - - return result; - }(); - } - - var tagList = []; - - UE.utils.each(whitList, function (val, key) { - tagList.push(key); - }); - - // 添加input过滤规则 - // - if (whitList && config.inputXssFilter) { - this.addInputRule(function (root) { - - root.traversal(function(node) { - if (node.type !== 'element') { - return false; - } - filter(node); - }); - }); - } - // 添加output过滤规则 - // - if (whitList && config.outputXssFilter) { - this.addOutputRule(function (root) { - - root.traversal(function(node) { - if (node.type !== 'element') { - return false; - } - filter(node); - }); - }); - } - -}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js deleted file mode 100644 index 68ed19d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetbutton.js +++ /dev/null @@ -1,151 +0,0 @@ -///import core -///import uicore -///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); - } - }); - - flag = 1; - }); - this.initSplitButton(); - } - }; - utils.inherits(AutoTypeSetButton, SplitButton); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js deleted file mode 100644 index 51ad3c9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/autotypesetpicker.js +++ /dev/null @@ -1,170 +0,0 @@ -///import core -///import uicore -;(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 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js deleted file mode 100644 index 908bd1e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/breakline.js +++ /dev/null @@ -1,18 +0,0 @@ -;(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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js deleted file mode 100644 index 969b844..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/button.js +++ /dev/null @@ -1,80 +0,0 @@ -///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; - } - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js deleted file mode 100644 index 2ebe3bb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/cellalignpicker.js +++ /dev/null @@ -1,99 +0,0 @@ -///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; - - /** - * 该参数将新增一个参数: 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 - }, - 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]; - } - }, - 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; - - tempIndex === 0 && tmpl.push(""); - - tmpl.push( - '
    ' - ); - - tempIndex === 2 && tmpl.push(""); - } - - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js deleted file mode 100644 index 1cc3a82..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorbutton.js +++ /dev/null @@ -1,61 +0,0 @@ -///import core -///import uicore -///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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js deleted file mode 100644 index d8f9cd3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/colorpicker.js +++ /dev/null @@ -1,98 +0,0 @@ -///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(); - }); - - 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"); - } - }; - 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; - } -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js deleted file mode 100644 index 7dc0651..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/combox.js +++ /dev/null @@ -1,99 +0,0 @@ -///import core -///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 - }); - - 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); - } - } - }; - utils.inherits(Combox, SplitButton); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js deleted file mode 100644 index 46afddb..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/dialog.js +++ /dev/null @@ -1,449 +0,0 @@ -///import core -///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 - ) - ); - } - } - } - }, - 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() { - var popBodyEl = this.getDom("body"); - // if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) { - // uiUtils.removeStyle(popBodyEl, 'width'); - // uiUtils.removeStyle(popBodyEl, 'height'); - // } - var size = this.mesureSize(); - 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; - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js deleted file mode 100644 index 955d162..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/iconfont.js +++ /dev/null @@ -1 +0,0 @@ -!function(o){var h,p='',l=(h=document.getElementsByTagName("script"))[h.length-1].getAttribute("data-injectcss");if(l&&!o.__iconfont__svg__cssinject__){o.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}!function(h){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(h,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(a=h,t=o.document,i=!1,v=function(){i||(i=!0,a())},(p=function(){try{t.documentElement.doScroll("left")}catch(h){return void setTimeout(p,50)}v()})(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())});var a,t,i,v,p}(function(){var h,l,a,t,i,v;(h=document.createElement("div")).innerHTML=p,p=null,(l=h.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",a=l,(t=document.body).firstChild?(i=a,(v=t.firstChild).parentNode.insertBefore(i,v)):t.appendChild(a))})}(window); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js deleted file mode 100644 index 68602ae..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/mask.js +++ /dev/null @@ -1,53 +0,0 @@ -///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; - - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js deleted file mode 100644 index 2ff853a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menu.js +++ /dev/null @@ -1,280 +0,0 @@ -///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, - 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); - } - } - }, - 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(); - } - }; - 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; - - //获取单元格对齐初始状态 - 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 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(); - } - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js deleted file mode 100644 index 2a9cfbd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/menubutton.js +++ /dev/null @@ -1,39 +0,0 @@ -///import core -///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; - } - } - }); - this.initSplitButton(); - }, - setValue: function(value) { - this._value = value; - } - }; - utils.inherits(MenuButton, SplitButton); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js deleted file mode 100644 index 98b7f8e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/message.js +++ /dev/null @@ -1,82 +0,0 @@ -///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(); - }); - }, - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js deleted file mode 100644 index f0c0b40..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/multiMenu.js +++ /dev/null @@ -1,45 +0,0 @@ -///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(); - }); - - 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(); - } - }; - - utils.inherits(MultiMenuPop, SplitButton); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js deleted file mode 100644 index edcc4d1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/pastepicker.js +++ /dev/null @@ -1,71 +0,0 @@ -///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; - - 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 (/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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js deleted file mode 100644 index 83cf4f3..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/popup.js +++ /dev/null @@ -1,268 +0,0 @@ -///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(); - }); - - 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(); - } - } - } - - 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上的鼠标滚轮事件, 防止用户的正常操作被误解 - if (window.XMLHttpRequest) { - 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; - } - } - ); - } else { - //ie6 - domUtils.on(this.getDom(), "mousewheel", function(e) { - e.returnValue = false; - - me.getDom("content").scrollTop -= e.wheelDelta / 120 * 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() { - 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; - } - - 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); - }); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js deleted file mode 100644 index b0deb13..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/separator.js +++ /dev/null @@ -1,18 +0,0 @@ -;(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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js deleted file mode 100644 index 16c2d8a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/shortcutmenu.js +++ /dev/null @@ -1,245 +0,0 @@ -;(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 ShortCutMenu = (UI.ShortCutMenu = function(options) { - this.initOptions(options); - this.initShortCutMenu(); - }); - - 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) { - 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, 0.2); - } - - 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(window, "scroll", function(e) { - hideAllMenu(e); - }); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js deleted file mode 100644 index 67a94bf..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/splitbutton.js +++ /dev/null @@ -1,99 +0,0 @@ -///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( - '
    ' - ) - ); - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js deleted file mode 100644 index c6e20b7..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/stateful.js +++ /dev/null @@ -1,110 +0,0 @@ -;(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);"'); - - 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"); - } - } - }; -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js deleted file mode 100644 index b94d8c8..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablebutton.js +++ /dev/null @@ -1,36 +0,0 @@ -///import core -///import uicore -///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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js deleted file mode 100644 index 2a99a31..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/tablepicker.js +++ /dev/null @@ -1,102 +0,0 @@ -///import core -///import uicore -;(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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js deleted file mode 100644 index 9768ca0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/toolbar.js +++ /dev/null @@ -1,49 +0,0 @@ -;(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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js deleted file mode 100644 index dcf6c4d..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/ui.js +++ /dev/null @@ -1,3 +0,0 @@ -var baidu = baidu || {}; -baidu.editor = baidu.editor || {}; -UE.ui = baidu.editor.ui = {}; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js deleted file mode 100644 index 3565944..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uibase.js +++ /dev/null @@ -1,82 +0,0 @@ -;(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); - - //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); - } - holder = holder || uiUtils.getFixedLayer(); - 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); -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js deleted file mode 100644 index 2558927..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_src/ui/uiutils.js +++ /dev/null @@ -1,273 +0,0 @@ -;(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 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 = []; - } - 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"; - } - 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"; - } - } - } - }); - 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) - ); - } -})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js index c2e5cd5..d20eb18 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/scrawl/scrawl.js @@ -645,24 +645,24 @@ function exec(scrawlObj) { if (!scrawlObj.isCancelScrawl) { if (data.responseSuccess) { var imgObj = {}, -// srcField = data.scrawlSrcField || 'url', + srcField = data.scrawlSrcField || 'url', src = '', -// srcFieldKeys = srcField.split('.'), + srcFieldKeys = srcField.split('.'), prefix = editor.options.scrawlUrlPrefix; - -// if(srcFieldKeys.length > 1) { -// function setSrc(obj, keys, index) { -// obj = obj[keys[index]]; -// if (index < keys.length - 1) { -// setSrc(obj, keys, index += 1) -// } else { -// src = obj; -// } -// } -// setSrc(data, srcFieldKeys, 0); -// } else { -// src = data[srcField]; -// } + + if(srcFieldKeys.length > 1) { + function setSrc(obj, keys, index) { + obj = obj[keys[index]]; + if (index < keys.length - 1) { + setSrc(obj, keys, index += 1) + } else { + src = obj; + } + } + setSrc(data, srcFieldKeys, 0); + } else { + src = data[srcField]; + } imgObj.src = prefix + src; imgObj._src = prefix + src; diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js index c08f797..ab0d32b 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/dialogs/video/video.js @@ -188,6 +188,11 @@ } function convert_url(url){ if ( !url ) return ''; + //去掉多余参数,否则可能导致插入后无法播放 + var arr = url.split('?'); + if (arr && arr.length > 1) { + url = arr[0]; + } url = utils.trim(url) .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") @@ -312,11 +317,29 @@ width = $G('upload_width').value || 420, height = $G('upload_height').value || 280, align = findFocus("upload_alignment","name") || 'none', - videoSrcField = editor.getOpt("imageUploadService")(this, editor).videoSrcField || 'url';; + videoSrcField = editor.getOpt("imageUploadService")(this, editor).videoSrcField || 'url', + videoSrc = '', + videoSrcFieldKeys = videoSrcField.split('.'); for(var key in uploadVideoList) { var file = uploadVideoList[key]; + + if(videoSrcFieldKeys.length > 1) { + function setVideoSrc(obj, keys, index) { + obj = obj[keys[index]]; + if (index < keys.length - 1) { + setVideoSrc(obj, keys, index += 1) + } else { + videoSrc = obj; + } + } + + setVideoSrc(file, videoSrcFieldKeys, 0); + } else { + videoSrc = file[videoSrcField]; + } + videoObjs.push({ - url: prefix + file[videoSrcField], + url: prefix + videoSrc, width:width, height:height, align:align @@ -338,7 +361,7 @@ } - /* 上传附件 */ + /* 上传视频 */ function UploadVideo(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html b/web/src/main/resources/static/plug-in/neditor/2.1.17/index.html similarity index 92% rename from web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html rename to web/src/main/resources/static/plug-in/neditor/2.1.17/index.html index bb68baa..e87f959 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/_examples/completeDemo.html +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/index.html @@ -4,15 +4,15 @@ 完整demo - - - + + + - + - - + + + * + * + * + * + * ``` + */ + 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)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + 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的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + 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 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault: function(evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + 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"]); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
    + * + * + * ``` + */ + getStyle: function(element, name) { + var value = element.style[utils.cssStyleToDomStyle(name)]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
    + * + * + * ``` + */ + 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 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
    + * + * + * ``` + */ + 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"); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
    + * + *
    + * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
    + * + *
    + * + * + * ``` + */ + 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 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode: function(node) { + return ( + !node.firstChild || + domUtils.getChildCount(node, function(node) { + return ( + !domUtils.isBr(node) && + !domUtils.isBookmarkNode(node) && + !domUtils.isWhitespace(node) + ); + }) == 0 + ); + }, + 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 + }; + } + }; + 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"; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @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; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
    + * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @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"); + + 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 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
    + * + * + * ``` + */ + 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 + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
    + * + * + * ``` + */ + 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 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
    + * + *
    + *
    + *
    + *
    + * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
    + * + *
    + *
    + *
    + *
    + * + * + * ``` + */ + 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 + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
    xxxx
    + * + * + * ``` + */ + hasNoAttributes: function(node) { + return browser.ie + ? /^<\w+\s*?>/.test(node.outerHTML) + : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode: function(node) { + return node.nodeType == 1 && node.getAttribute("_ue_custom_node_"); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
    + * + * + * ``` + */ + isTagNode: function(node, tagNames) { + return ( + node.nodeType == 1 && + new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) + ); + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * 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; + }, + + /** + * 查询给定的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; + } + 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"); + + +// core/Range.js +/** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + +/** + * dom操作封装 + * @unfile + * @module UE.dom + */ + +/** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + +;(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 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; + } + 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(""))); + } + 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)) + ); + //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; + } + 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); + } + } + } 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; + } + + /** + * 创建一个跟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; + }); + + /** + * 删除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, ""); + } + } + } 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; + } + } + + Range.prototype = { + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents: function() { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + 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 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents: function() { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart: function(node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd: function(node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter: function(node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore: function(node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter: function(node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore: function(node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst: function(node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @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 + ); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst: function(node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @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 + ); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode: function(node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + 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); + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + 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对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @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; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + 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 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + 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); + } + } + 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 + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @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); + } + } + } + + 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); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor: function(toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * 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++); + + 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; + }, + + /** + * 调整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; + } + 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; + }, + /** + * 调整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; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

    xxxx[xxxx]x

    ==> range.applyInlineStyle("strong") ==>

    xxxx[xxxx]x

    + * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

    xxxx[xxxx]x

    + * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

    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; + } + 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); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组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); + }, + + /** + * 获取当前选中的自闭合的节点 + * @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; + }, + + /** + * 在页面上高亮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); + } + } 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; + }, + + /** + * 判断当前选区内容是否占位符 + * @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; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

    + * aaaa + * + * + * bbbb + * + * + *

    + * + * + * + * ``` + */ + 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; + } + firstIndex++; + if (first.nodeType == 3) { + while (first && first.nodeType == 3) { + first = first.nextSibling; + } + } else { + first = first.nextSibling; + } + } + } + } + } 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; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

    + * aaaa + * + * + * bbbb + * + * + *

    + * + * + * + * ``` + */ + 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; + }, + + /** + * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + 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); + } + }; +})(); + + +// core/Selection.js +/** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 选区集合 + * @unfile + * @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 }; + } + + 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 ? -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); + } + } + 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() { + try { + if (!_getIERange(me) && me._bakIERange) { + me._bakIERange.select(); + } + } catch (ex) {} + me._bakIERange = null; + }); + } + iframe = doc = null; + }); + + 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对象 + * @example + * ```javascript + * 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; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + 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(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * 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 []; + }, + + /** + * 清空缓存 + * @method clear + */ + 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; + } + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * 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); + } + } + + 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 } 获得开始元素 + * @example + * ```javascript + * 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; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * 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 ""; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange: function() { + this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](); + } + }; +})(); + + +// core/Editor.js +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + +;(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; + } + } + } else { + textarea = editor.textarea; + } + } + 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; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行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 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * 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到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @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)); + + /* 尝试异步加载后台配置 */ + //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", + 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; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function(fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener("ready", fn); + } + }, + /** + * 该方法用于设置placeholder + * @method setPlaceholder + * @param { String } placeholder 编辑器的placeholder文案 + * @example + * ```javascript + * editor.setPlaceholder('请输入内容'); + * ``` + */ + setPlaceholder: function(){ + + function contentChange(){ + var localHtml = this.getPlainTxt(); + if(!localHtml.trim()){ + UE.dom.domUtils.addClass( this.body, 'empty' ); + }else{ + UE.dom.domUtils.removeClasses( this.body, 'empty' ); + } + } + + return function(placeholder){ + var _editor = this; + + _editor.ready(function () { + contentChange.call(_editor); + _editor.body.setAttribute('placeholder', placeholder); + }); + _editor.removeListener('keyup contentchange', contentChange); + _editor.addListener('keyup contentchange', contentChange); + } + }(), + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + 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 + * ```javascript + * 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 = ""; + } + + 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 + * @remind 执行该方法,会触发ready事件 + * @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; + } + + 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 html = + (ie && browser.version < 9 ? "" : "") + + "" + + "" + + "" + + (options.iframeCssUrl + ? "" + : "") + + (options.initialStyle + ? "" + : "") + + "" + + "" + + "" + + (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"; + } + }); + } + }, + + /** + * 编辑器初始化 + * @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; + } + } 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项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的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); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * 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"); + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * 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); + }, + + /** + * 对编辑器设置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); + } + } + } + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

    123456

    + * var content = editor.getContent(); //返回值:

    123456

    + * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + 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文档字符串 + * @eaxmple + * ```javascript + * 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) + + "" + ); + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

    1

    2

    + * 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, " "); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

    1

    2

    + * 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, " "); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

    test

    '); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

    old text

    + * editor.setContent('

    new text

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

    old text

    new text

    + * ``` + */ + setContent: function(html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent("beforesetcontent", html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + 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; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement("p"); + } + } + child = child.nextSibling; + } + } + } + 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); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * 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); + } 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 { + sel.removeAllRanges(); + } + + //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); + }); + }, + /** + * 触发事件代理 + * @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() + ); + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _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); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @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); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function(cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this; + var result; + var 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 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function(cmdName) { + return this._callCmdFn("queryCommandState", arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function(cmdName) { + return this._callCmdFn("queryCommandValue", arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * 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; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function() { + this.fireEvent("reset"); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * 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(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * 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); + }, + + /** + * 设置默认内容 + * @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); + } + } + + return function(cont) { + var me = this; + me.body.innerHTML = '

    ' + cont + "

    "; + + me.addListener("firstBeforeExecCommand focus", clear); + }; + })(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * 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(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * 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(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * 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; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

    132

    + * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

    132

    + * 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; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function(rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function(root) { + for (var i = 0, ci; (ci = this.inputRules[i++]); ) { + ci.call(this, root); + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function(rule) { + this.outputRules.push(rule); + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function(root) { + for (var i = 0, ci; (ci = this.outputRules[i++]); ) { + ci.call(this, root); + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * 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"); + /* if (!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"); + } + + if (serverUrl) { + serverUrl = + serverUrl + + (serverUrl.indexOf("?") == -1 ? "?" : "&") + + "action=" + + (actionName || ""); + return utils.formatUrl(serverUrl); + } else { + return ""; + } */ + + if (serverUrl) { + serverUrl = serverUrl + "?"; + 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", + 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 + "i18n/", + 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" + ) + ); + + 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); + 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' + //}); + } + }; + + 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); + } + }; +})(); + + +// core/ajax.js +/** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + +/** + * 提供对ajax请求的支持 + * @module UE.ajax + */ +UE.ajax = (function() { + //创建一个ajaxRequest对象 + var fnStr = "XMLHttpRequest()"; + try { + 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]) + ); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method: "POST", + timeout: 5000, + async: true, + 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; + + 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 (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); + + 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 + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'neditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + 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/filterword.js +/** + * UE过滤word的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + +/** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * 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; + } + + 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); + + for (var i = 0, v; (v = s[i]); i++) { + var name, + value, + parts = v.split(":"); + + 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; + } + + 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 (!/]/.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 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] ? "/" : "") + + ">" + ); + //插入新行 + 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); + } + 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); + } + } + 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; + } + } + } + } + + 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字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml: function(formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join(""); + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * 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(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * 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, ""); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData: function() { + if (this.type == "element") return ""; + return this.data; + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild: function() { + // if (this.type != 'element' || dtd.$empty[this.tagName]) { + // return this; + // } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + 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 } 返回前一个节点 + * @example + * ```javascript + * 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]; + } + } + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * 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]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * 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; + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr: function(attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()]; + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * 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; + } + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * 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; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * 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; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * 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; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * 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 ""; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * 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; + } + } + + 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 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal: function(fn) { + if (this.children && this.children.length) { + nodeTraversal(this, fn); + } + return this; + } + }; +})(); + + +// core/htmlparser.js +/** + * html字符串转换成uNode节点 + * @file + * @module UE + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * html字符串转换成uNode节点的静态方法 + * @method htmlparser + * @param { String } htmlstr 要转换的html代码 + * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 + * @return { uNode } 给定的html片段转换形成的uNode对象 + * @example + * ```javascript + * var root = UE.htmlparser('

    htmlparser

    ', true); + * ``` + */ + +var htmlparser = (UE.htmlparser = function(htmlstr, ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 " + ); + } + html.push(""); + } + //禁止指定table-width + 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; + + //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" + }; + + 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)); + } + } + + 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; +}); + + +// core/filternode.js +/** + * UE过滤节点的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + +/** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * 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); + } + }); + 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); + } + } + 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; + }; +})()); + + +// core/plugin.js +/** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * 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); + } + }); + } + } 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); + } + } + }; +})(); + + +// core/keymap.js +var keymap = (UE.keymap = { + Backspace: 8, + Tab: 9, + Enter: 13, + + Shift: 16, + Control: 17, + Alt: 18, + CapsLock: 20, + + Esc: 27, + + Spacebar: 32, + + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + + Left: 37, + Up: 38, + Right: 39, + Down: 40, + + Insert: 45, + + Del: 46, + + NumLock: 144, + + Cmd: 91, + + "=": 187, + "-": 189, + + b: 66, + i: 73, + //回退 + z: 90, + y: 89, + //粘贴 + v: 86, + x: 88, + + s: 83, + + n: 78 +}); + + +// core/localstorage.js +//存储媒介封装 +var LocalStorage = (UE.LocalStorage = (function() { + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = "localStorage"; + + return { + saveLocalData: function(key, data) { + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + }, + + getLocalData: function(key) { + if (storage) { + return storage.getItem(key); + } + + return null; + }, + + removeItem: function(key) { + storage && storage.removeItem(key); + } + }; + + function getUserData() { + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + getItem: function(key) { + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) {} + + return result; + }, + + setItem: function(key, value) { + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function(key) { + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + } + }; + } +})()); + +;(function() { + var ROOTKEY = "ueditor_preference"; + + UE.Editor.prototype.setPreferences = function(key, value) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function(key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data; + } + return null; + }; + + UE.Editor.prototype.removePreferences = function(key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key]; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; +})(); + + +// plugins/defaultfilter.js +///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); + // } + }); + }); + + //从编辑器出去的内容处理 + 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: "" + }); + } + } + } + }); + }); +}; + + +// plugins/inserthtml.js +/** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

    xx|xxx

    当前选区为闭合状态 + * //插入

    CC

    + * //结果

    xx

    CC

    xxx

    + * //

    xxxx

    |

    xxx

    当前选区在两个p标签之间 + * //插入 xxxx + * //结果

    xxxx

    xxxx

    xxx

    + * ``` + */ + +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"; + + 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; + } + 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 { + 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; + } + } + + 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); + } +}; + + +// plugins/autotypeset.js +/** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + +/** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + +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 + } + }); + + 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) { + 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"); + + 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); + } + }); + 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); + } + }); + 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) { + me.addListener("beforepaste", autotype); + } + autotype.call(me); + } + }; +}; + + +// plugins/autosubmit.js +/** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + +/** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + +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(); + } + } + } + } + }; +}); + + +// plugins/background.js +/** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ +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); + } + } + //重写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 + } + } + }; +}); + + +// plugins/image.js +/** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + +/** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + +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", ""); + } + } + + 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") { + var 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.getElementsByClassName("_img_parent_tmp")[0]; + tmpNode.removeAttribute("class"); + 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"); + + 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; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == "IMG") { + return 0; + } + return -1; + } +}; + +/** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + +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("word_img") + ) { + 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); + } +}; + + +// plugins/justify.js +/** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ +/** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + +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); + }; + + 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; + } + }; +}; + + +// plugins/font.js +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + +/** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + +/** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + +/** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ +/** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + +/** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ +/** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + +/** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + +/** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + +/** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + +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] + }); + + 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) { + rng.traversal(function(node){ + var start; + if(domUtils.isTagNode(node,'span')){ + start = node; + }else{ + start = domUtils.getElementsByTagName(node,'span')[0]; + } + 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); + } + }); + } + } + } + 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); + } + 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) + ); + }); + if (parent && !/background-color/.test(span.style.cssText)) { + span.style.backgroundColor = parent.style.backgroundColor; + } + } + }); + 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"; + }); + // 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.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; + + 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); + + 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); + } + + 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; + } + 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]); + } +}; + + +// plugins/link.js +/** + * 超链接 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'neditor.baidu.com', + * title:'neditor', + * target:'_blank' + * }' ); + * ``` + */ +/** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + +/** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + +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; + } + } 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; + } + }; +}; + + +// plugins/iframe.js +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + +UE.plugins["insertframe"] = function() { + var me = this; + function deleteIframe() { + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange", function() { + deleteIframe(); + }); +}; + + +// plugins/scrawl.js +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl +UE.commands["scrawl"] = { + queryCommandState: function() { + return browser.ie && browser.version <= 8 ? -1 : 0; + } +}; + + +// plugins/removeformat.js +/** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + +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); + } + } else { + //trace:939 不能把list上的样式去掉 + if ( + !dtd.$tableContent[current.tagName] && + !dtd.$list[current.tagName] + ) { + domUtils.removeAttributes(current, removeFormatAttributes); + if (isRedundantSpan(current)) { + domUtils.remove(current, true); + } + } + } + } + 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(); + } + }; +}; + + +// plugins/blockquote.js +/** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + +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(); + + 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; + } + }; +}; + + +// plugins/convertcase.js +/** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + +/** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + +/** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ +UE.commands["touppercase"] = UE.commands["tolowercase"] = { + 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(); + } +}; + + +// plugins/indent.js +/** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + +/** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ +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; + } +}; + + +// plugins/print.js +/** + * 打印 + * @file + * @since 1.2.6.1 + */ + +/** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ +UE.commands["print"] = { + execCommand: function() { + this.window.print(); + }, + notNeedUndo: 1 +}; + + +// plugins/preview.js +/** + * 预览 + * @file + * @since 1.2.6.1 + */ + +/** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ +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 +}; + + +// plugins/selectall.js +/** + * 全选 + * @file + * @since 1.2.6.1 + */ + +/** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * 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 + }; + + //快捷键 + me.addshortcutkey({ + selectAll: "ctrl+65" + }); +}; + + +// plugins/paragraph.js +/** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + +/** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + +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, 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; + }, + queryCommandValue: function () { + var node = domUtils.filterNodeList( + this.selection.getStartElementPath(), + "p h1 h2 h3 h4 h5 h6" + ); + return node ? node.tagName.toLowerCase() : ""; + } + }; +}; + + +// plugins/directionality.js +/** + * 设置文字输入的方向的插件 + * @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); + }, + 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; + } + + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * 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); + } + + range.select(); + return true; + }, + queryCommandValue: function() { + var node = getObj(this); + return node ? node.getAttribute("dir") : "ltr"; + } + }; +})(); + + +// plugins/horizontal.js +/** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * 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(); + } + } + } + } + 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; + } + } + }); +}; + + +// plugins/time.js +/** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + +/** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ +UE.commands["time"] = UE.commands["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); + } + + this.execCommand( + "insertHtml", + cmd == "time" ? formatTime(date, format) : formatDate(date, format) + ); + } +}; + + +// plugins/rowspacing.js +/** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + +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; + } + }; +}; + + +// plugins/lineheight.js +/** + * 设置行内间距 + * @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"] }); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + 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, ""); + } + } + }; +}; + + +// plugins/insertcode.js +/** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["insertcode"] = function() { + var me = this; + me.ready(function() { + utils.cssRule( + "pre", + "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", + me.document + ); + }); + 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" + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + 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"; + } + } + } 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; + } + }); +}; + + +// plugins/cleardoc.js +/** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + +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); + } + setTimeout(function() { + me.fireEvent("clearDoc"); + }, 0); + } +}; + + +// plugins/anchor.js +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register("anchor", function () { + var me = this; + 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: 16px;}", + 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); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = utils.renderTplstr('', { + name: name + }); + me.execCommand("inserthtml", anchor, true); + } + } + } + } + } + }; +}); + + +// plugins/wordcount.js +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 +/* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * 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() { + 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); + }); + }); +}; + + +// plugins/pagebreak.js +/** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ +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; + + 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( + '
    ' + ); + 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 + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + 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 { + 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); + } + } + }; +}; + + +// plugins/wordimage.js +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + +UE.plugin.register("wordimage", function() { + var me = this, + images = []; + 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("word_img"); + 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("word_img")) { + 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/notadd/images/spacer.gif"; + if (attrs["src"] && /^(?:(file:\/+))/.test(attrs["src"])) { + img.setAttr({ + width: attrs.width, + height: attrs.height, + alt: attrs.alt, + word_img: 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" + }); + } + }); + } + }; +}); + + +// 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(); + + 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.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"); + } + } + } + }); +}; + + +// plugins/undo.js +/** + * undo redo + * @file + * @since 1.2.6.1 + */ + +/** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + +/** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + +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; + } + + 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; + } + 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.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); + } + }, 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; + + function initZeroClipboard() { + ZeroClipboard.config({ + debug: false, + swfPath: + me.options.UEDITOR_HOME_URL + + "third-party/zeroclipboard/ZeroClipboard.swf" + }); + + var client = (me.zeroclipboard = new ZeroClipboard()); + + // 复制内容 + 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(); + }); + + // 触发事件 + 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")); + } + } + } + } + }; +}); + + +// plugins/paste.js +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @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; + } + } + } + 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 + ); + } 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) { + if (me.undoManger.list.length < 1) me.undoManger.save(); + setTimeout(function() { + 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")); + } + } + }; +}; + + +// plugins/puretxtpaste.js +/** + * 纯文本粘贴插件 + * @file + * @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); + } + } + } + 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 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands["pasteplain"] = { + queryCommandState: function() { + return pasteplain ? 1 : 0; + }, + execCommand: function() { + pasteplain = !pasteplain | 0; + }, + notNeedUndo: 1 + }; +}; + + +// plugins/list.js +/** + * 有序列表,无序列表插件 + * @file + * @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: me.options.UEDITOR_HOME_URL + "themes/ueditor-list/", + 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) { + 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 + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + 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); + } + 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; + } + } + + 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); + 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; + } + }; +}; + + +// plugins/source.js +/** + * 源码编辑插件 + * @file + * @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; + }, + 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 + }); + 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); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + 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()); + } + } + 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); + }; + + 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" + }); + }); + } + }; +})(); + + +// plugins/enterkey.js +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @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; + + //修正在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(); + } + } + //没有站位符,会出现多行的问题 + 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(); + } 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(); + + //处理全选的情况 + 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 + ) { + 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(); + } + } + } + }); +}; + + +// plugins/fiximgclick.js +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///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 }; + } + + (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] + ]; + + Scale.prototype = { + init: function(editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = { x: 0, y: 0 }; + me.dragId = -1; + + var hands = [], + cover = (me.cover = document.createElement("div")), + resizer = (me.resizer = document.createElement("div")); + + 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(); + }); + + 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 + + ";"; + + 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, + pressMouseLeft = e.buttons === undefined ? e.which === 1 : e.buttons === 1; + 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 && pressMouseLeft) { + 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); + + var doc = me.editor.document; + domUtils.setStyles(resizer, { + width: target.width + "px", + height: target.height + "px", + left: + iframePos.x + + imgPos.x - + (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0) - + editorPos.x - + parseInt(resizer.style.borderLeftWidth) + + "px", + top: + iframePos.y + + imgPos.y - + (doc.documentElement.scrollTop || doc.body.scrollTop || 0) - + 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") { + if ( + img.className.indexOf("edui-faked-music") != -1 || + 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); + } + }, + 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(); + } + }); + } + }; +})(); + + +// plugins/autolink.js +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 +/** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + +UE.plugin.register( + "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; + + 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; + } + + 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); + + 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(); + } + } + } + } + } + : {}; + }, + 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; + + 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; + } + } + 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); + } + } + } + }); + } +); + + +// plugins/autoheight.js +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 +/** + * @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() { + 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; + } + } +}; + + +// plugins/autofloat.js +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 +/** + * 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; + + //如果不固定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; + } + + 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); + //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar + var scrollBox = document.getElementById("scrollBox"); + if (scrollBox) { + domUtils.un(scrollBox, ['scroll','resize'], 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 = me.ui.getDom("iframeholder").offsetHeight + "px"; + if (LteIE6) { + fixIE6FixedPos(); + } + domUtils.on(window, ["scroll", "resize"], updateFloating); + me.addListener("keydown", defer_updateFloating); + //适用于在DIV scrollbox中滚动,但页面不滚动的浮动toolbar + var scrollBox = document.getElementById("scrollBox"); + if (scrollBox) { + domUtils.on(scrollBox, ['scroll','resize'], 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); + }); + } + }); +}; + + +// plugins/video.js +/** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["video"] = function() { + var me = this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url, width, height, id, align, classname, type) { + var str; + switch (type) { + case "image": + str = + "'; + break; + case "embed": + str = + ''; + break; + case "video": + var ext = url.substr(url.lastIndexOf(".") + 1); + if (ext == "ogv") ext = "ogg"; + str = + "' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root, img2video) { + utils.each( + root.getNodesByTagName(img2video ? "img" : "embed video"), + function(node) { + var className = node.getAttr("class"); + if (className && className.indexOf("edui-faked-video") != -1) { + var html = creatInsertStr( + img2video ? node.getAttr("_url") : node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + null, + node.getStyle("float") || "", + className, + img2video ? "embed" : "image" + ); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + if (className && className.indexOf("edui-upload-video") != -1) { + var html = creatInsertStr( + img2video ? node.getAttr("_url") : node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + null, + node.getStyle("float") || "", + className, + img2video ? "video" : "image" + ); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + } + ); + } + + me.addOutputRule(function(root) { + switchImgAndVideo(root, true); + }); + me.addInputRule(function(root) { + switchImgAndVideo(root); + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function(cmd, videoObjs, type) { + videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]; + + if (me.fireEvent("beforeinsertvideo", videoObjs) === true) { + return; + } + + var html = [], + id = "tmpVedio", + cl; + for (var i = 0, vi, len = videoObjs.length; i < len; i++) { + vi = videoObjs[i]; + cl = type == "upload" + ? "edui-upload-video video-js vjs-default-skin" + : "edui-faked-video"; + html.push( + creatInsertStr( + vi.url, + vi.width || 420, + vi.height || 280, + id + i, + null, + cl, + "image" + ) + ); + } + me.execCommand("inserthtml", html.join(""), true); + var rng = this.selection.getRange(); + for (var i = 0, len = videoObjs.length; i < len; i++) { + var img = this.document.getElementById("tmpVedio" + i); + domUtils.removeAttributes(img, "id"); + rng.selectNode(img).select(); + me.execCommand("imagefloat", videoObjs[i].align); + } + + me.fireEvent("afterinsertvideo", videoObjs); + }, + queryCommandState: function() { + var img = me.selection.getRange().getClosedNode(), + flag = + img && + (img.className == "edui-faked-video" || + img.className.indexOf("edui-upload-video") != -1); + return flag ? 1 : 0; + } + }; +}; + + +// plugins/table.core.js +/** + * Created with JetBrains WebStorm. + * User: taoqili + * Date: 13-1-18 + * Time: 上午11:09 + * To change this template use File | Settings | File Templates. + */ +/** + * UE表格操作类 + * @param table + * @constructor + */ +;(function() { + var UETable = (UE.UETable = function(table) { + this.table = table; + this.indexTable = []; + this.selectedTds = []; + this.cellsRange = {}; + this.update(table); + }); + + //===以下为静态工具方法=== + UETable.removeSelectedClass = function(cells) { + utils.each(cells, function(cell) { + domUtils.removeClasses(cell, "selectTdClass"); + }); + }; + UETable.addSelectedClass = function(cells) { + utils.each(cells, function(cell) { + domUtils.addClass(cell, "selectTdClass"); + }); + }; + UETable.isEmptyBlock = function(node) { + var reg = new RegExp(domUtils.fillChar, "g"); + if ( + node[browser.ie ? "innerText" : "textContent"] + .replace(/^\s*$/, "") + .replace(reg, "").length > 0 + ) { + return 0; + } + for (var i in dtd.$isNotEmpty) + if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function(cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function(cells) { + !utils.isArray(cells) && (cells = [cells]); + + var result = {}, + status = ["align", "valign"], + tempStatus = null, + isSame = true; //状态是否相同 + + utils.each(cells, function(cellNode) { + utils.each(status, function(currentState) { + tempStatus = cellNode.getAttribute(currentState); + + if (!result[currentState] && tempStatus) { + result[currentState] = tempStatus; + } else if ( + !result[currentState] || + tempStatus !== result[currentState] + ) { + isSame = false; + return false; + } + }); + + return isSame; + }); + + return isSame ? result : null; + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function(editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if ( + start && + start.id && + start.id.indexOf("_baidu_bookmark_start_") === 0 && + start.nextSibling + ) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + table = tr && domUtils.findParentByTagName(tr, ["table"]), + caption = table && table.getElementsByTagName("caption")[0]; + + return { + cell: cell, + tr: tr, + table: table, + caption: caption + }; + }; + UETable.getUETableBySelected = function(editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function(editor, table) { + var borderMap = { + thin: "0px", + medium: "1px", + thick: "2px" + }, + tableBorder, + tdPadding, + tdBorder, + tmpValue; + if (!table) { + table = editor.document.createElement("table"); + table.insertRow(0).insertCell(0).innerHTML = "xxx"; + editor.body.appendChild(table); + var td = table.getElementsByTagName("td")[0]; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } else { + td = table.getElementsByTagName("td")[0]; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function(tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = tag == "td" || tag == "th" || tag == "caption" + ? domUtils.findParentByTagName(tdOrTable, "table", true) + : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function(cell, ignoreMerge, keepPro) { + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || "td"); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell, "width height"); + !keepPro && domUtils.removeAttributes(tmpCell, "style"); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + }; + + UETable.prototype = { + getMaxRows: function() { + var rows = this.table.rows, + maxLen = 1; + for (var i = 0, row; (row = rows[i]); i++) { + var currentMax = 1; + for (var j = 0, cj; (cj = row.cells[j++]); ) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols: function() { + var rows = this.table.rows, + maxLen = 0, + cellRows = {}; + for (var i = 0, row; (row = rows[i]); i++) { + var cellsNum = 0; + for (var j = 0, cj; (cj = row.cells[j++]); ) { + cellsNum += cj.colSpan || 1; + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows["row_" + (i + k)]) { + cellRows["row_" + (i + k)] = cj.colSpan || 1; + } else { + cellRows["row_" + (i + k)]++; + } + } + } + } + cellsNum += cellRows["row_" + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex: function(cell) {}, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell: function(cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, + previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ( + (!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || + (right && + (!len + ? cellInfo.colIndex == this.colsNum - 1 + : range.endColIndex == this.colsNum - 1)) + ) + return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right + ? !len + ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 + : range.beginColIndex - 1 + : !len ? cellInfo.colIndex + 1 : range.endColIndex + 1; + return this.getCell( + this.indexTable[previewRowIndex][previewColIndex].rowIndex, + this.indexTable[previewRowIndex][previewColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + getTabNextCell: function(cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell( + this.indexTable[rowIndex][colIndex].rowIndex, + this.indexTable[rowIndex][colIndex].cellIndex + ); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell( + this.indexTable[rowIndex][colIndex].rowIndex, + this.indexTable[rowIndex][colIndex].cellIndex + ); + } catch (e) {} + } + return nextCell; + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell: function(cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, + nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ( + (!bottom && cellInfo.rowIndex == 0) || + (bottom && + (!len + ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 + : range.endRowIndex == this.rowsNum - 1)) + ) + return null; + + nextRowIndex = !bottom + ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 + : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell( + this.indexTable[nextRowIndex][nextColIndex].rowIndex, + this.indexTable[nextRowIndex][nextColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells: function(cell, xOrY) { + try { + var flag = xOrY.toLowerCase() === "x", + end = + domUtils.getXY(cell)[flag ? "x" : "y"] + + cell["offset" + (flag ? "Width" : "Height")], + rows = this.table.rows, + cells = null, + returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { + var tmpEnd = + domUtils.getXY(tmpCell)[flag ? "x" : "y"] + + tmpCell["offset" + (flag ? "Width" : "Height")]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent: function(cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
    "); + }, + cloneCell: UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells: function(cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, + cells, + returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update: function(table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; (row = rows[rowIndex]); rowIndex++) { + for ( + var cellIndex = 0, cell, cells = row.cells; + (cell = cells[cellIndex]); + cellIndex++ + ) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex: rowIndex, + cellIndex: cellIndex, + colIndex: colIndex, + rowSpan: rowSpan, + colSpan: colSpan + }; + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell + ? cell.cloneNode(true) + : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1) cell.colSpan = 1; + if (cell.rowSpan !== 1) cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex: j, + cellIndex: cell.cellIndex, + colIndex: k, + rowSpan: 1, + colSpan: 1 + }; + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function(td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex: startInfo.rowIndex, + beginColIndex: startInfo.colIndex, + endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex: endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for (var i = 1; i < this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo: function(cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if ( + cellInfo.rowIndex === rowIndex && + cellInfo.cellIndex === cellIndex + ) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell: function(rowIndex, cellIndex) { + return ( + (rowIndex < this.rowsNum && + this.table.rows[rowIndex].cells[cellIndex]) || + null + ); + }, + /** + * 删除单元格 + */ + deleteCell: function(cell, rowIndex) { + rowIndex = typeof rowIndex == "number" + ? rowIndex + : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange: function(cellA, cellB) { + function checkRange( + beginRowIndex, + beginColIndex, + endRowIndex, + endColIndex + ) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, + colIndex, + rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if ( + tmpBeginRowIndex != beginRowIndex || + tmpBeginColIndex != beginColIndex || + tmpEndRowIndex != endRowIndex || + tmpEndColIndex != endColIndex + ) { + return checkRange( + tmpBeginRowIndex, + tmpBeginColIndex, + tmpEndRowIndex, + tmpEndColIndex + ); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex: beginRowIndex, + beginColIndex: beginColIndex, + endRowIndex: endRowIndex, + endColIndex: endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex: cellAInfo.rowIndex, + beginColIndex: cellAInfo.colIndex, + endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max( + cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + cellBInfo.rowIndex + cellBInfo.rowSpan - 1 + ), + endColIndex = Math.max( + cellAInfo.colIndex + cellAInfo.colSpan - 1, + cellBInfo.colIndex + cellBInfo.colSpan - 1 + ); + + return checkRange( + beginRowIndex, + beginColIndex, + endRowIndex, + endColIndex + ); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells: function(range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, + rowIndex, + colIndex, + tdHash = {}, + returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + "|" + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if ( + rowIndex < i || + colIndex < j || + rowIndex + cellInfo.rowSpan - 1 > endRowIndex || + colIndex + cellInfo.colSpan - 1 > endColIndex + ) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected: function() { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected: function(range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow: function() { + var range = this.cellsRange; + return range.endColIndex - range.beginColIndex + 1 == this.colsNum; + }, + isFullCol: function() { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length + ? rows == this.rowsNum + : rows == this.rowsNum || rows == this.rowsNum - 1; + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell: function(cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, + nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ( + (!bottom && cellInfo.rowIndex == 0) || + (bottom && + (!len + ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1 + : range.endRowIndex == this.rowsNum - 1)) + ) + return null; + + nextRowIndex = !bottom + ? !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1 + : !len ? cellInfo.rowIndex + cellInfo.rowSpan : range.endRowIndex + 1; + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell( + this.indexTable[nextRowIndex][nextColIndex].rowIndex, + this.indexTable[nextRowIndex][nextColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + getPreviewCell: function(cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, + previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ( + (!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || + (top && + (!len + ? cellInfo.rowIndex > this.colsNum - 1 + : range.endColIndex == this.colsNum - 1)) + ) + return null; + + previewRowIndex = !top + ? !len ? cellInfo.rowIndex : range.beginRowIndex + : !len + ? cellInfo.rowIndex < 1 ? 0 : cellInfo.rowIndex - 1 + : range.beginRowIndex; + previewColIndex = !top + ? !len + ? cellInfo.colIndex < 1 ? 0 : cellInfo.colIndex - 1 + : range.beginColIndex - 1 + : !len ? cellInfo.colIndex : range.endColIndex + 1; + return this.getCell( + this.indexTable[previewRowIndex][previewColIndex].rowIndex, + this.indexTable[previewRowIndex][previewColIndex].cellIndex + ); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent: function(cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement("br")); + } + while ((child = cellFrom.firstChild)) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight: function(cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell( + rightCellInfo.rowIndex, + rightCellInfo.cellIndex + ); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown: function(cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange: function() { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell( + range.beginRowIndex, + this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex + ); + + // 这段关于行表头或者列表头的特殊处理会导致表头合并范围错误 + // 为什么有这段代码的原因未明,暂且注释掉,希望原作者看到后出面说明下 + // if ( + // leftTopCell.tagName == "TH" && + // range.endRowIndex !== range.beginRowIndex + // ) { + // var index = this.indexTable, + // info = this.getCellInfo(leftTopCell); + // leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + // range = this.getCellsRange( + // leftTopCell, + // this.getCell( + // index[this.rowsNum - 1][info.colIndex].rowIndex, + // index[this.rowsNum - 1][info.colIndex].cellIndex + // ) + // ); + // } + + // 删除剩余的Cells + var cells = this.getCells(range); + for (var i = 0, ci; (ci = cells[i++]); ) { + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if (this.table.deleteRow) { + for ( + var i = rowIndex + 1, + curIndex = rowIndex + 1, + len = leftTopCell.rowSpan; + i < len; + i++ + ) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow: function(rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), + cell, + thead = null, + isInsertTitle = + typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == "TH") { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell); + } + } else { + if (cell.tagName == "TH") { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell); + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute("vAlign") && + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + row.appendChild(cell); + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + + if (isInsertTitle) { + thead = table.createTHead(); + thead.insertBefore(row, thead.firstChild); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow: function(rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum; ) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = + this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) + nextRow.insertBefore(clone, nextRow.cells[0]); + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], + cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key]) continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function(td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function(td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol: function(colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, + cell, + backWidth = parseInt( + (this.table.offsetWidth - + (this.colsNum + 1) * 20 - + (this.colsNum + 1)) / + (this.colsNum + 1), + 10 + ), + isInsertTitleCol = + typeof sourceCell == "string" && sourceCell.toUpperCase() == "TH"; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == "TH") { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell); + } + } else { + if (cell.tagName == "TH") { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell); + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = + tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + preCell && cell.setAttribute("width", preCell.getAttribute("width")); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter( + tableRow.cells[tableRow.cells.length - 1], + cell + ); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + preCell && + cell.setAttribute("width", preCell.getAttribute("width")); + //防止IE下报错 + preCell + ? tableRow.insertBefore(cell, preCell) + : tableRow.appendChild(cell); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth( + backWidth, + defaultValue || { tdPadding: 10, tdBorder: 1 } + ); + }, + updateWidth: function(width, defaultValue) { + var table = this.table, + tmpWidth = + UETable.getWidth(table) - + defaultValue.tdPadding * 2 - + defaultValue.tdBorder + + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function(td) { + td.setAttribute("width", width); + }); + }, + deleteCol: function(colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum; ) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + "_" + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key]) continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) + backTdWidth = + cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells: function(cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function(cell) { + me.splitToCols(cell); + }); + }, + splitToRows: function(cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for ( + var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; + i < endRow; + i++ + ) { + if (i == rowIndex) continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell( + colIndex - this.getPreviewMergedCellsNum(i, colIndex) + ); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + tmpCell.setAttribute("align", cell.getAttribute("align")); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum: function(rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex; ) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += colSpan - (tmpRowIndex == rowIndex ? 1 : 0); + i += colSpan; + } + return num; + }, + splitToCols: function(cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for ( + var j = colIndex, endCol = colIndex + cellInfo.colSpan; + j < endCol; + j++ + ) { + if (j == colIndex) continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell( + this.indexTable[rowIndex][j].cellIndex + 1 + ); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + tmpCell.setAttribute("align", cell.getAttribute("align")); + tmpCell.setAttribute("width", backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == "TH") { + var th = cell.ownerDocument.createElement("th"); + th.appendChild(tmpCell.firstChild); + th.setAttribute("vAlign", cell.getAttribute("vAlign")); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell: function(cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ( + cellInfo.rowIndex + cellInfo.rowSpan == rowsNum && + cellInfo.colIndex + cellInfo.colSpan == colsNum + ); + }, + getLastCell: function(cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, + last = cells[0], + tr = last.parentNode, + cellsNum = 0, + cols = 0, + rows; + utils.each(cells, function(cell) { + if (cell.parentNode == tr) cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function(cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + }, + selectRow: function(rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell( + indexRow[this.colsNum - 1].rowIndex, + indexRow[this.colsNum - 1].cellIndex + ), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable: function() { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground: function(cells, value) { + if (typeof value === "string") { + utils.each(cells, function(cell) { + cell.style.backgroundColor = value; + }); + } else if (typeof value === "object") { + value = utils.extend( + { + repeat: true, + colorList: ["#ddd", "#fff"] + }, + value + ); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function(list, index, repeat) { + return list[index] + ? list[index] + : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; (cell = cells[i++]); ) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor( + colors, + rowIndex + count == cellInfo.rowIndex ? count : ++count, + value.repeat + ); + } + } + }, + removeBackground: function(cells) { + utils.each(cells, function(cell) { + cell.style.backgroundColor = ""; + }); + } + }; + function showError(e) {} +})(); + + +// plugins/table.cmds.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ +;(function() { + var UT = UE.UETable, + getTableItemsByRange = function(editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function(editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function(editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + UE.commands["inserttable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function(cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(""); + for (var c = 0; c < colsNum; c++) { + html.push( + '
  • ' + + (browser.ie && browser.version < 11 + ? domUtils.fillChar + : "
    ") + + "
    " + html.join("") + "
    "; + } + + if (!opt) { + opt = utils.extend( + {}, + { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + } + ); + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = + domUtils.findParent( + start, + function(node) { + return domUtils.isBlockElm(node); + }, + true + ) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor( + tableWidth / opt.numCols - + defaultValue.tdPadding * 2 - + defaultValue.tdBorder + ); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands["insertparagraphbeforetable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? " " : "
    "; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands["deletetable"] = { + queryCommandState: function() { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, "table", true) + ? 0 + : -1; + }, + execCommand: function(cmd, table) { + var rng = this.selection.getRange(); + table = + table || + domUtils.findParentByTagName(rng.startContainer, "table", true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, "p", { + innerHTML: browser.ie ? domUtils.fillChar : "
    " + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next); + } else { + rng.setStart(next, 0); + } + rng.setCursor(false, true); + this.fireEvent("tablehasdeleted"); + } + } + }; + UE.commands["cellalign"] = { + queryCommandState: function() { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function(cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; (ci = selectedTds[i++]); ) { + ci.setAttribute("align", align); + } + } + } + }; + UE.commands["cellvalign"] = { + queryCommandState: function() { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function(cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; (ci = selectedTds[i++]); ) { + ci.setAttribute("vAlign", valign); + } + } + } + }; + UE.commands["insertcaption"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName("caption").length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement("caption"); + caption.innerHTML = browser.ie ? domUtils.fillChar : "
    "; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + } + }; + UE.commands["deletecaption"] = { + queryCommandState: function() { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + return table.getElementsByTagName("caption").length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + domUtils.remove(table.getElementsByTagName("caption")[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + } + }; + UE.commands["inserttitle"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[ + firstRow.cells.length - 1 + ].tagName.toLowerCase() != "th" + ? 0 + : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, "th"); + } + var th = table.getElementsByTagName("th")[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands["deletetitle"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[ + firstRow.cells.length - 1 + ].tagName.toLowerCase() == "th" + ? 0 + : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]); + } + var td = table.getElementsByTagName("td")[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands["inserttitlecol"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName("th").length ? -1 : 0; + } + return -1; + }, + execCommand: function(cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, "th"); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName("th")[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands["deletetitlecol"] = { + queryCommandState: function() { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName("th").length ? 0 : -1; + } + return -1; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + if (table) { + for (var i = 0; i < table.rows.length; i++) { + domUtils.remove(table.rows[i].children[0]); + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName("td")[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = + table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return rightCellInfo.rowIndex == cellInfo.rowIndex && + rightCellInfo.rowSpan == cellInfo.rowSpan + ? 0 + : -1; + }, + execCommand: function(cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = + table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return downCellInfo.colIndex == cellInfo.colIndex && + downCellInfo.colSpan == cellInfo.colSpan + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function() { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function() { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true); + } else { + rng.selectNodeContents(cell); + } + rng.select(); + } + } + }; + UE.commands["insertrow"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + (cell.tagName == "TD" || + (cell.tagName == "TH" && + tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; + i < len; + i++ + ) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + cell.tagName == "TD" && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; + i < len; + i++ + ) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function() { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for ( + var i = cellsRange.beginRowIndex; + i < cellsRange.endRowIndex + 1; + i++ + ) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName("td").length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if ( + cellInfo.rowSpan == 1 || + cellInfo.rowSpan == + cellsRange.endRowIndex - cellsRange.beginRowIndex + 1 + ) { + if (nextCell || preCell) + rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell( + cellInfo.rowIndex, + ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex + ); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled") + this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function(cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + (cell.tagName == "TD" || + (cell.tagName == "TH" && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum + ? 0 + : -1; + }, + execCommand: function(cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1) return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endColIndex - range.beginColIndex + 1; + i < len; + i++ + ) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && + getUETable(tableItems.table).colsNum < this.options.maxColNum + ? 0 + : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for ( + var i = 0, len = range.endColIndex - range.beginColIndex + 1; + i < len; + i++ + ) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function() { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName("td").length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function() { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function() { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["adaptbytext"] = UE.commands["adaptbywindow"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == "adaptbywindow") { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function(cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands["averagedistributecol"] = { + queryCommandState: function() { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function(cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, + sumWidth = 0, + colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end; ) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = + Math.ceil(sumWidth / colsNum) - + tbAttr.tdBorder * 2 - + tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function( + node + ) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() + ? domUtils.getElementsByTagName(ut.table, "td") + : ut.selectedTds; + + utils.each(cells, function(node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands["averagedistributerow"] = { + queryCommandState: function() { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function(cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, + rowNum, + sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt( + domUtils.getComputedStyle( + tb.getElementsByTagName("td")[0], + "padding-top" + ) + ); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, + thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : ut.rowsNum - 1; + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = + Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() + ? domUtils.getElementsByTagName(ut.table, "td") + : ut.selectedTds; + utils.each(cells, function(node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands["cellalignment"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = + start && + domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/gi.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function(cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function(cmd) { + var activeMenuCell = getTableItemsByRange(this).cell; + + if (!activeMenuCell) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + return null; + } else { + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && (cells = activeMenuCell); + + return UE.UETable.getTableCellAlignState(cells); + } + } + }; + //表格对齐方式 + UE.commands["tablealignment"] = { + queryCommandState: function() { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align", value); + } + } + }; + + //表格属性 + UE.commands["edittable"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + var arr = domUtils + .getElementsByTagName(table, "td") + .concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function(node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands["edittd"] = { + queryCommandState: function() { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand: function(cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = + start && + domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function(cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function() { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function(cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function() { + var cells = getSelectedArr(this); + if (!cells.length) return -1; + for (var i = 0, cell; (cell = cells[i++]); ) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function() { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return interlaced === "enabled" ? -1 : 0; + } else { + return !interlaced || interlaced === "disabled" ? -1 : 0; + } + }, + execCommand: function(cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function() { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table, "td"), function(td) { + td.style.borderWidth = "1px"; + td.style.borderStyle = "solid"; + }); + } + }; + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table, "td th"); + utils.each(tds, function(td) { + td.removeAttribute("width"); + }); + table.setAttribute( + "width", + getTableWidth(editor, true, getDefaultValue(editor, table)) + ); + var tdsWidths = []; + setTimeout(function() { + utils.each(tds, function(td) { + td.colSpan == 1 && tdsWidths.push(td.offsetWidth); + }); + utils.each(tds, function(td, i) { + td.colSpan == 1 && td.setAttribute("width", tdsWidths[i] + ""); + }); + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return ( + body.offsetWidth - + (needIEHack + ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (editor.options.offsetWidth || 0) + ); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } +})(); + + +// plugins/table.action.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ +UE.plugins["table"] = function() { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function(editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function(editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function(cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { + // throw e; + } + me.ready(function() { + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function() { + var table = getUETableBySelected(me); + if (table) { + var str = ""; + utils.each(table.selectedTds, function(td) { + str += td[browser.ie ? "innerText" : "textContent"]; + }); + return str; + } else { + return orgGetText.call(me.selection); + } + }; + }); + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + maxColNum: 20, + maxRowNum: 100, + defaultCols: 5, + defaultRows: 5, + tdvalign: "top", + cursorpath: me.options.UEDITOR_HOME_URL + "themes/" + me.options.theme + "/images/cursor_", + tableDragable: false, + classList: [ + "ue-table-interlace-color-single", + "ue-table-interlace-color-double" + ] + }); + me.getUETable = getUETable; + var commands = { + deletetable: 1, + inserttable: 1, + cellvalign: 1, + insertcaption: 1, + deletecaption: 1, + inserttitle: 1, + deletetitle: 1, + mergeright: 1, + mergedown: 1, + mergecells: 1, + insertrow: 1, + insertrownext: 1, + deleterow: 1, + insertcol: 1, + insertcolnext: 1, + deletecol: 1, + splittocells: 1, + splittorows: 1, + splittocols: 1, + adaptbytext: 1, + adaptbywindow: 1, + adaptbycustomer: 1, + insertparagraph: 1, + insertparagraphbeforetable: 1, + averagedistributecol: 1, + averagedistributerow: 1 + }; + me.ready(function() { + utils.cssRule( + "table", + //选中的td上的样式 + ".selectTdClass{background-color:#edf5fa !important}" + + "table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}" + + //插入的表格的默认样式 + "table{margin-bottom:10px;border-collapse:collapse;display:table;}" + + "td,th{padding: 5px 10px;border: 1px solid #DDD;}" + + "caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + + "th{border-top:1px solid #BBB;background-color:#F7F7F7;}" + + "table tr.firstRow th{border-top-width:2px;}" + + ".ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }" + + "td p{margin:0;padding:0;}", + me.document + ); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener("keydown", function(cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + if (ut.isFullCol()) { + me.execCommand("deletecol"); + } else if (ut.isFullRow()) { + me.execCommand("deleterow"); + } else { + me.fireEvent("delcells"); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName( + me.selection.getStart(), + "caption", + true + ), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent("saveScene"); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent("saveScene"); + } + } + + if (keyCode == 46) { + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent("saveScene"); + for (var i = 0, ci; (ci = ut.selectedTds[i++]); ) { + domUtils.fillNode(me.document, ci); + } + me.fireEvent("saveScene"); + domUtils.preventDefault(evt); + } + } + if (keyCode == 13) { + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName( + rng.startContainer, + "caption", + true + ); + if (caption) { + var table = domUtils.findParentByTagName(caption, "table"); + if (!rng.collapsed) { + rng.deleteContents(); + me.fireEvent("saveScene"); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, "table"); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName( + me.selection.getStart(), + ["td", "th"], + true + ), + preNode = table.previousSibling; + if ( + cell === start && + (!preNode || + (preNode.nodeType == 1 && preNode.tagName == "TABLE")) && + domUtils.isStartInblock(rng) + ) { + var first = domUtils.findParent( + me.selection.getStart(), + function(n) { + return domUtils.isBlockElm(n); + }, + true + ); + if ( + first && + (/t(h|d)/i.test(first.tagName) || first === start.firstChild) + ) { + me.execCommand("insertparagraphbeforetable"); + domUtils.preventDefault(evt); + } + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == "67") { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [[ut.cloneCell(tds[0], null, true)]]; + for (var i = 1, ci; (ci = tds[i]); i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci, null, true)]); + } else { + tableCopyList[tableCopyList.length - 1].push( + ut.cloneCell(ci, null, true) + ); + } + } + } + } + }); + me.addListener("tablehasdeleted", function() { + toggleDraggableState(this, false, "", null); + if (dragButton) domUtils.remove(dragButton); + }); + + me.addListener("beforepaste", function(cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, "caption", true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? "innerText" : "textContent"]; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent("saveScene"); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName( + rng.startContainer, + ["td", "th"], + true + ), + tmpNode, + preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == "TH") { + rowIndex++; + } + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; (cj = ci[j]); j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j); + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute("width") && + cell.setAttribute("width", cj.getAttribute("width")); + cj.getAttribute("vAlign") && + cell.setAttribute("vAlign", cj.getAttribute("vAlign")); + cj.getAttribute("align") && + cell.setAttribute("align", cj.getAttribute("align")); + cj.style.cssText && (cell.style.cssText = cj.style.cssText); + } + for (var j = 0, cj; (cj = tr.cells[j]); j++) { + if (!ci[j]) break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute("width") && + cj.setAttribute("width", ci[j].getAttribute("width")); + ci[j].getAttribute("vAlign") && + cj.setAttribute("vAlign", ci[j].getAttribute("vAlign")); + ci[j].getAttribute("align") && + cj.setAttribute("align", ci[j].getAttribute("align")); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText); + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; (cj = ci[j++]); ) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand("insertcol"); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == "TH") { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + tmpNode = td; + for (var j = 0, cj; (cj = ci[j++]); ) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute("width") && + td.setAttribute("width", cj.getAttribute("width")); + cj.getAttribute("vAlign") && + td.setAttribute("vAlign", cj.getAttribute("vAlign")); + cj.getAttribute("align") && + td.setAttribute("align", cj.getAttribute("align")); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, [ + "class", + "rowSpan", + "colSpan" + ]); + + preNode.parentNode.appendChild(cloneTd); + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement("table"); + for (var i = 0, ci; (ci = tableCopyList[i++]); ) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; (cj = ci[j++]); ) { + cloneTd = UT.cloneCell(cj, null, true); + domUtils.removeAttributes(cloneTd, ["class"]); + tr.appendChild(cloneTd); + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = + me.body.offsetWidth - + (needIEHack + ? parseInt( + domUtils.getComputedStyle(me.body, "margin-left"), + 10 + ) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (me.options.offsetWidth || 0); + me.execCommand( + "insertHTML", + "" + + table.innerHTML + .replace(/>\s*<") + .replace(/\bth\b/gi, "td") + + "
    " + ); + } + me.fireEvent("contentchange"); + me.fireEvent("saveScene"); + html.html = ""; + return true; + } else { + var div = me.document.createElement("div"), + tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), "table")) { + utils.each(tables, function(t) { + domUtils.remove(t); + }); + if ( + domUtils.findParentByTagName( + me.selection.getStart(), + "caption", + true + ) + ) { + div.innerHTML = div[browser.ie ? "innerText" : "textContent"]; + } + } else { + utils.each(tables, function(table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ["style", "border"]); + utils.each(domUtils.getElementsByTagName(table, "td"), function( + td + ) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); + // domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener("afterpaste", function() { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function( + table + ) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = + me.body.offsetWidth - + (needIEHack + ? parseInt( + domUtils.getComputedStyle(me.body, "margin-left"), + 10 + ) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (me.options.offsetWidth || 0) + + "px"; + } + }); + }); + me.addListener("blur", function() { + tableCopyList = null; + }); + var timer; + me.addListener("keydown", function() { + clearTimeout(timer); + timer = setTimeout(function() { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName( + rng.startContainer, + ["th", "td"], + true + ); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + }, 100); + }); + me.addListener("selectionchange", function() { + toggleDraggableState(me, false, "", null); + }); + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function() { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me)) return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ["td", "th"], true); + utils.each(domUtils.getElementsByTagName(me.document, "table"), function( + table + ) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 + // utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { + // + // if (domUtils.isEmptyBlock(td) && td !== start) { + // domUtils.fillNode(me.document, td); + // if (browser.ie && browser.version == 6) { + // td.innerHTML = ' ' + // } + // } + // }); + // utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { + // if (domUtils.isEmptyBlock(th) && th !== start) { + // domUtils.fillNode(me.document, th); + // if (browser.ie && browser.version == 6) { + // th.innerHTML = ' ' + // } + // } + // }); + table.onmouseover = function() { + me.fireEvent("tablemouseover", table); + }; + table.onmousemove = function() { + me.fireEvent("tablemousemove", table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function() { + me.fireEvent("contentchange", 50); + }, true); + }; + table.onmouseout = function() { + me.fireEvent("tablemouseout", table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function(evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target) return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); + // if ("topLeft" == inPosition(table, mouseCoords(evt))) { + // cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); + // ut.setSelected(cellsRange); + // return; + // } + // if ("bottomRight" == inPosition(table, mouseCoords(evt))) { + // + // return; + // } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell( + ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, + ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex + ); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell( + ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, + ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex + ); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function(evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable", function(type, table, classList) { + if (!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function(list, index, repeat) { + return list[index] + ? list[index] + : repeat ? list[index % list.length] : ""; + }; + for (var i = 0; i < len; i++) { + rows[i].className = getClass( + classList || me.options.classList, + i, + true + ); + } + }); + me.addListener("uninterlacetable", function(type, table) { + if (!table) return; + var me = this, + rows = table.rows, + classList = me.options.classList, + len = rows.length; + for (var i = 0; i < len; i++) { + domUtils.removeClasses(rows[i], classList); + } + }); + + me.addListener("mousedown", mouseDownEvent); + me.addListener("mouseup", mouseUpEvent); + //拖动的时候触发mouseup + domUtils.on(me.body, "dragstart", function(evt) { + mouseUpEvent.call(me, "dragstart", evt); + }); + me.addOutputRule(function(root) { + utils.each(root.getNodesByTagName("div"), function(n) { + if (n.getAttr("id") == "ue_tableDragLine") { + n.parentNode.removeChild(n); + } + }); + }); + + var currentRowIndex = 0; + me.addListener("mousedown", function() { + currentRowIndex = 0; + }); + me.addListener("tabkeydown", function() { + var range = this.selection.getRange(), + common = range.getCommonAncestor(true, true), + table = domUtils.findParentByTagName(common, "table"); + if (table) { + if (domUtils.findParentByTagName(common, "caption", true)) { + var cell = domUtils.getElementsByTagName(table, "th td"); + if (cell && cell.length) { + range.setStart(cell[0], 0).setCursor(false, true); + } + } else { + var cell = domUtils.findParentByTagName(common, ["td", "th"], true), + ua = getUETable(cell); + currentRowIndex = cell.rowSpan > 1 + ? currentRowIndex + : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true); + } else { + range.selectNodeContents(nextCell).select(); + } + } else { + me.fireEvent("saveScene"); + me.__hasEnterExecCommand = true; + this.execCommand("insertrownext"); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range + .setStart(table.rows[table.rows.length - 1].cells[0], 0) + .setCursor(); + me.fireEvent("saveScene"); + } + } + return true; + } + }); + browser.ie && + me.addListener("selectionchange", function() { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function(type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = + !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function() { + switchBorderColor(this, false); + browser.ie && + utils.each(this.document.getElementsByTagName("caption"), function(ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = " "; + } + }); + }); + me.addListener("aftergetcontent", function() { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function() { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function(type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function(table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function(td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; (td = tds[i]); i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute( + "width", + Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))) + ); + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function(cmd, datatat) { + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), + tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if ( + ut && + !commands[cmd] && + !cmdFun.notNeedUndo && + !me.__hasEnterExecCommand + ) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, + lastValue = -2, + value, + state; + for (var i = 0, td; (td = tds[i]); i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true); + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent("contentchange"); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + }); + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && + obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if ( + (td = + domUtils.findParentByTagName(ele, "td", true) || + domUtils.findParentByTagName(ele, "th", true)) + ) + return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, "g"); + if ( + node[browser.ie ? "innerText" : "textContent"] + .replace(/^\s*$/, "") + .replace(reg, "").length > 0 + ) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return { x: evt.pageX, y: evt.pageY }; + } + return { + x: + evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + if (isEditorDisabled()) { + return; + } + + try { + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if (isInResizeBuffer) { + me.body.style.webkitUserSelect = "none"; + + if ( + Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell || + Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell + ) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = "none"; + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent("excludetable", target) === true) return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = + "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = + "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ""); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState( + me, + target ? !!state : false, + target ? state : "", + pos, + target + ); + } + } else { + toggleDragButton(false, table, me); + } + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver) return; + dragButtonTimer = setTimeout(function() { + !dragOver && + dragButton && + dragButton.parentNode && + dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode) return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = + "width:15px;height:15px;background-image:url(" + + editor.options.UEDITOR_HOME_URL + + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + + (pos.y - 15) + + "px;left:" + + pos.x + + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function(evt) { + dragOver = true; + }; + dragButton.onmouseout = function(evt) { + dragOver = false; + }; + domUtils.on(dragButton, "click", function(type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, "dblclick", function(type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, "dragstart", function(type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function() { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + // function inPosition(table, pos) { + // var tablePos = domUtils.getXY(table), + // width = table.offsetWidth, + // height = table.offsetHeight; + // if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { + // return "topLeft"; + // } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { + // return "bottomRight"; + // } + // } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return state == "v1" && pos.y - domUtils.getXY(table).y - capHeight < 8; + } else { + return state == "h1" && pos.x - domUtils.getXY(table).x < 8; + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = + (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20, + right = nextTd + ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 + : me.body.offsetWidth + 5 || + parseInt(domUtils.getComputedStyle(me.body, "width"), 10); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" + ? "col-resize" + : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor); + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + var lineId = "_UETableResizeLine", + line = this.document.getElementById(lineId); + + if (!line) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2 * cellBorderWidth + 1 + "px", + position: "absolute", + "z-index": 100000, + cursor: "col-resize", + background: "red", + display: "none" + }; + + //切换状态 + line.onmouseout = function() { + this.style.display = "none"; + }; + + utils.extend(line.style, styles); + + this.document.body.appendChild(line); + } + + return line; + } + + /** + * 更新resize-line + */ + function updateResizeLine(cell, uetable) { + var line = getResizeLineByUETable.call(this), + table = uetable.table, + styles = { + top: domUtils.getXY(table).y + "px", + left: + domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + "px", + display: "block", + height: table.offsetHeight + "px" + }; + + utils.extend(line.style, styles); + } + + /** + * 显示resize-line + */ + function showResizeLine(cell) { + var uetable = getUETable(cell); + + updateResizeLine.call(this, cell, uetable); + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if (!elePos) { + return ""; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return "h1"; + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return "v1"; + } + return ""; + } + + function mouseDownEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function(ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected(); + } else { + td = ut.selectedTds[0]; + setTimeout(function() { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + } + } + } else { + tableClickHander(evt); + } + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout(tabTimer); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if ((h = getRelation(target, mouseCoords(evt)))) { + hideDragLine(me); + + if (h == "h1") { + h = "h"; + if ( + inTableSide( + domUtils.findParentByTagName(target, "table"), + target, + evt + ) + ) { + me.execCommand("adaptbywindow"); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true); + } + } + } + if (h == "h") { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder(target, table, true); + + cells = extractArray(cells, "left"); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each(cells, function(cell) { + oldWidth.push(cell.offsetWidth); + }); + + utils.each(cells, function(cell) { + cell.removeAttribute("width"); + }); + + window.setTimeout(function() { + //是否允许改变 + var changeable = true; + + utils.each(cells, function(cell, index) { + var width = cell.offsetWidth; + + if (width > oldWidth[index]) { + changeable = false; + return false; + } + + newWidth.push(width); + }); + + var change = changeable ? newWidth : oldWidth; + + utils.each(cells, function(cell, index) { + cell.width = change[index] - getTabcellSpace(); + }); + }, 0); + + // minWidth -= cellMinWidth; + // + // table.removeAttribute("width"); + // utils.each(cells, function (cell) { + // cell.style.width = ""; + // cell.width -= minWidth; + // }); + } + } + } + } + + function tableClickHander(evt) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName("table"), function(t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if (!startTd) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ""; + mousedown = true; + me.addListener("mouseover", mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler(evt); + } + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler(evt) { + if (browser.ie) { + evt = reconstruct(evt); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function() { + tableBorderDrag(evt); + }, dblclickTime); + } + + function extractArray(originArr, key) { + var result = [], + tmp = null; + + for (var i = 0, len = originArr.length; i < len; i++) { + tmp = originArr[i][key]; + + if (tmp) { + result.push(tmp); + } + } + + return result; + } + + function clearTableDragTimer() { + tableDragTimer && clearTimeout(tableDragTimer); + tableDragTimer = null; + } + + function reconstruct(obj) { + var attrs = [ + "pageX", + "pageY", + "clientX", + "clientY", + "srcElement", + "target" + ], + newObj = {}; + + if (obj) { + for (var i = 0, key, val; (key = attrs[i]); i++) { + val = obj[key]; + val && (newObj[key] = val); + } + } + + return newObj; + } + + //边框拖动 + function tableBorderDrag(evt) { + isInResizeBuffer = false; + + startTd = evt.target || evt.srcElement; + if (!startTd) return; + var state = getRelation(startTd, mouseCoords(evt)); + if (/\d/.test(state)) { + state = state.replace(/\d/, ""); + startTd = getUETable(startTd).getPreviewCell(startTd, state == "v"); + } + hideDragLine(me); + getDragLine(me, me.document); + me.fireEvent("saveScene"); + showDragLineAt(state, startTd); + mousedown = true; + //拖动开始 + onDrag = state; + dragTd = startTd; + } + + function mouseUpEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + clearTableDragTimer(); + + isInResizeBuffer = false; + + if (onBorder) { + singleClickState = ++singleClickState % 3; + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + tableResizeTimer = setTimeout(function() { + singleClickState > 0 && singleClickState--; + }, dblclickTime); + + if (singleClickState === 2) { + singleClickState = 0; + tableDbclickHandler(evt); + return; + } + } + + if (evt.button == 2) return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, "table", true), + end = domUtils.findParentByTagName(range.endContainer, "table", true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName( + range.startContainer, + ["td", "th", "caption"], + true + ); + end = domUtils.findParentByTagName( + range.endContainer, + ["td", "th", "caption"], + true + ); + if (start !== end) { + me.selection.clearRange(); + } + } else { + me.selection.clearRange(); + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ""; + //拖拽状态下的mouseUP + if (onDrag && dragTd) { + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + + singleClickState = 0; + dragLine = me.document.getElementById("ue_tableDragLine"); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight( + dragTd, + dragLinePos.y - dragTdPos.y - dragTd.offsetHeight + ); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent("saveScene"); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + "td", + true + ); + if (!target) + target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + "th", + true + ); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range + .selectNodeContents(cell) + .shrinkBoundary() + .setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName( + range.startContainer, + ["td", "th"], + true + ), + end = domUtils.findParentByTagName( + range.endContainer, + ["td", "th"], + true + ); + //在table里边的不能清除 + if ( + (start && !end) || + (!start && end) || + (start && end && start !== end) + ) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener("mouseover", mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + if (isEditorDisabled()) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = + domUtils.findParentByTagName(tar, "td", true) || + domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if ( + startTd && + currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || + (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, "table") == + domUtils.findParentByTagName(currentTd, "table") + ) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = "none"; + me.selection.getNative()[ + browser.ie9below ? "empty" : "removeAllRanges" + ](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ""; + ut.clearSelected(); + } + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt( + domUtils.getComputedStyle(cell, "line-height"), + 10 + ), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 + ? cell.setAttribute("height", height) + : cell.removeAttribute && cell.removeAttribute("height"); + } + + function getWidth(cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + var ut = getUETable(cell); + if (ut) { + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder(cell, table); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue(changeValue, cell, cells); + + if (cell.nextSibling) { + var i = 0; + + utils.each(cells, function(cellGroup) { + cellGroup.left.width = +cellGroup.left.width + changeValue; + cellGroup.right && + (cellGroup.right.width = +cellGroup.right.width - changeValue); + }); + } else { + utils.each(cells, function(cellGroup) { + cellGroup.left.width -= -changeValue; + }); + } + } + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; (cell = cells[i++]); ) { + setCellHeight(cell, changeValue, backHeight); + } + } + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder(cell, table, isContainMergeCell) { + if (!table) { + table = domUtils.findParentByTagName(cell, "table"); + } + + if (!table) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex(cell), + temp = cell, + rows = table.rows, + colIndex = 0; + + while (temp) { + //获取到当前单元格在未发生单元格合并时的序列 + if (temp.nodeType === 1) { + colIndex += temp.colSpan || 1; + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function(tabRow) { + var cells = tabRow.cells, + currIndex = 0; + + utils.each(cells, function(tabCell) { + currIndex += tabCell.colSpan || 1; + + if (currIndex === colIndex) { + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + } else if (currIndex > colIndex) { + if (isContainMergeCell) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + }); + }); + + return borderCells; + } + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells(cells) { + var minWidth = Number.MAX_VALUE; + + for (var i = 0, curCell; (curCell = cells[i]); i++) { + minWidth = Math.min( + minWidth, + curCell.width || getTableCellWidth(curCell) + ); + } + + return minWidth; + } + + function correctChangeValue(changeValue, relatedCell, cells) { + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if (changeValue < 0) { + return 0; + } + + changeValue -= getTableCellWidth(relatedCell); + + //确定方向 + var direction = changeValue < 0 ? "left" : "right"; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each(cells, function(cellGroup) { + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if (curCell) { + changeValue = Math.min( + changeValue, + getTableCellWidth(curCell) - cellMinWidth + ); + } + }); + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === "left" ? -changeValue : changeValue; + } + + function getTableCellWidth(cell) { + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if (!cell.nextSibling) { + width -= getTableCellOffset(cell); + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch (e) {} + + return width; + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset(cell) { + tab = domUtils.findParentByTagName(cell, "table", false); + + if (tab.offsetVal === undefined) { + var prev = cell.previousSibling; + + if (prev) { + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth + ? UT.borderWidth + : 0; + } else { + tab.offsetVal = 0; + } + } + + return tab.offsetVal; + } + + function getTabcellSpace() { + if (UT.tabcellSpace === undefined) { + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = "border: 0;"; + tabcell.width = 1; + + trow.appendChild(tabcell); + trow.appendChild((mirror = tabcell.cloneNode(false))); + + tbody.appendChild(trow); + + tab.appendChild(tbody); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild(tab); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ""; + mirror.style.cssText = ""; + + UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild(tab); + } + + getTabcellSpace = function() { + return UT.tabcellSpace; + }; + + return UT.tabcellSpace; + } + + function getDragLine(editor, doc) { + if (mousedown) return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id: "ue_tableDragLine", + unselectable: "on", + contenteditable: false, + onresizestart: "return false", + ondragstart: "return false", + onselectstart: "return false", + style: + "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown) return; + var line; + while ((line = editor.document.getElementById("ue_tableDragLine"))) { + domUtils.remove(line); + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName("caption"), + width = table.offsetWidth, + height = + table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), + css; + switch (state) { + case "h": + css = + "height:" + + height + + "px;top:" + + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + + "px;left:" + + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = + css + + "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)"; + break; + case "v": + css = + "width:" + + width + + "px;left:" + + tablePos.x + + "px;top:" + + (cellPos.y + cell.offsetHeight); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = + css + + "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), + color; + for (var i = 0, node; (node = tableArr[i++]); ) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = td[0].style.borderColor.replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/gi.test(color)) + domUtils.addClass(node, "noBorderTable"); + } else { + domUtils.removeClasses(node, "noBorderTable"); + } + } + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return ( + body.offsetWidth - + (needIEHack + ? parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2 + : 0) - + defaultValue.tableBorder * 2 - + (editor.options.offsetWidth || 0) + ); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + var target = domUtils.findParentByTagName( + evt.target || evt.srcElement, + ["td", "th"], + true + ), + dir = null; + + if (!target) { + return null; + } + + dir = getRelation(target, mouseCoords(evt)); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if (!target) { + return null; + } + + if (dir === "h1" && target.previousSibling) { + var position = domUtils.getXY(target), + cellWidth = target.offsetWidth; + + if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) { + target = target.previousSibling; + } + } else if (dir === "v1" && target.parentNode.previousSibling) { + var position = domUtils.getXY(target), + cellHeight = target.offsetHeight; + + if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) { + target = target.parentNode.previousSibling.firstChild; + } + } + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) + ? target + : null; + } +}; + + +// plugins/table.sort.js +/** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + +UE.UETable.prototype.sortTable = function(sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if (this.selectedTds.length) { + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0, range.beginRowIndex); + lastRowIndex = range.endRowIndex + 1 === this.rowsNum + ? 0 + : range.endRowIndex + 1; + } else { + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + reversecurrent: function(td1, td2) { + return 1; + }, + orderbyasc: function(td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + reversebyasc: function(td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + orderbynum: function(td1, td2) { + var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), + value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + reversebynum: function(td1, td2) { + var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/), + value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute( + "data-sort-type", + compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : "" + ); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray, function(tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else { + result = Fn["orderbyasc"].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore( + fragment, + rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] + ); + } +}; + +UE.plugins["tablesort"] = function() { + var me = this, + UT = UE.UETable, + getUETable = function(tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function(editor) { + return UT.getTableItemsByRange(editor); + }; + + me.ready(function() { + //添加表格可排序的样式 + utils.cssRule( + "tablesort", + "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;" + + " background-image:url(" + + me.options.themePath + + me.options.theme + + "/images/sortable.png);}", + me.document + ); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function(type, cmd) { + if (cmd == "mergeright" || cmd == "mergedown" || cmd == "mergecells") { + this.execCommand("disablesort"); + } + }); + }); + + //表格排序 + UE.commands["sorttable"] = { + queryCommandState: function() { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; (cell = cells[i++]); ) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function(cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try { + range.select(); + } catch (e) {} + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function(cmd) { + var table = getTableItemsByRange(this).table; + if (table && cmd == "enablesort") { + var cells = domUtils.getElementsByTagName(table, "th td"); + for (var i = 0; i < cells.length; i++) { + if ( + cells[i].getAttribute("colspan") > 1 || + cells[i].getAttribute("rowspan") > 1 + ) + return -1; + } + } + + return !table + ? -1 + : (cmd == "enablesort") ^ + (table.getAttribute("data-sort") != "sortEnabled") + ? -1 + : 0; + }, + execCommand: function(cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute( + "data-sort", + cmd == "enablesort" ? "sortEnabled" : "sortDisabled" + ); + cmd == "enablesort" + ? domUtils.addClass(table, "sortEnabled") + : domUtils.removeClasses(table, "sortEnabled"); + } + }; +}; + + +// plugins/contextmenu.js +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins["contextmenu"] = function() { + var me = this; + + me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true); + + if (me.getOpt("enableContextMenu") === false) { + return; + } + var lang = me.getLang("contextMenu"), + menu, + items = me.options.contextMenu || [ + { label: lang["selectall"], cmdName: "selectall" }, + { + label: lang.cleardoc, + cmdName: "cleardoc", + exec: function() { + if (confirm(lang.confirmclear)) { + this.execCommand("cleardoc"); + } + } + }, + "-", + { + label: lang.unlink, + cmdName: "unlink" + }, + "-", + { + group: lang.paragraph, + icon: "justifyjustify", + subMenu: [ + { + label: lang.justifyleft, + cmdName: "justify", + value: "left" + }, + { + label: lang.justifyright, + cmdName: "justify", + value: "right" + }, + { + label: lang.justifycenter, + cmdName: "justify", + value: "center" + }, + { + label: lang.justifyjustify, + cmdName: "justify", + value: "justify" + } + ] + }, + "-", + { + group: lang.table, + icon: "table", + subMenu: [ + { + label: lang.inserttable, + cmdName: "inserttable" + }, + { + label: lang.deletetable, + cmdName: "deletetable" + }, + "-", + { + label: lang.deleterow, + cmdName: "deleterow" + }, + { + label: lang.deletecol, + cmdName: "deletecol" + }, + { + label: lang.insertcol, + cmdName: "insertcol" + }, + { + label: lang.insertcolnext, + cmdName: "insertcolnext" + }, + { + label: lang.insertrow, + cmdName: "insertrow" + }, + { + label: lang.insertrownext, + cmdName: "insertrownext" + }, + "-", + { + label: lang.insertcaption, + cmdName: "insertcaption" + }, + { + label: lang.deletecaption, + cmdName: "deletecaption" + }, + { + label: lang.inserttitle, + cmdName: "inserttitle" + }, + { + label: lang.deletetitle, + cmdName: "deletetitle" + }, + { + label: lang.inserttitlecol, + cmdName: "inserttitlecol" + }, + { + label: lang.deletetitlecol, + cmdName: "deletetitlecol" + }, + "-", + { + label: lang.mergecells, + cmdName: "mergecells" + }, + { + label: lang.mergeright, + cmdName: "mergeright" + }, + { + label: lang.mergedown, + cmdName: "mergedown" + }, + "-", + { + label: lang.splittorows, + cmdName: "splittorows" + }, + { + label: lang.splittocols, + cmdName: "splittocols" + }, + { + label: lang.splittocells, + cmdName: "splittocells" + }, + "-", + { + label: lang.averageDiseRow, + cmdName: "averagedistributerow" + }, + { + label: lang.averageDisCol, + cmdName: "averagedistributecol" + }, + "-", + { + label: lang.edittd, + cmdName: "edittd", + exec: function() { + if (UE.ui["edittd"]) { + new UE.ui["edittd"](this); + } + this.getDialog("edittd").open(); + } + }, + { + label: lang.edittable, + cmdName: "edittable", + exec: function() { + if (UE.ui["edittable"]) { + new UE.ui["edittable"](this); + } + this.getDialog("edittable").open(); + } + }, + { + label: lang.setbordervisible, + cmdName: "setbordervisible" + } + ] + }, + { + group: lang.tablesort, + icon: "tablesort", + subMenu: [ + { + label: lang.enablesort, + cmdName: "enablesort" + }, + { + label: lang.disablesort, + cmdName: "disablesort" + }, + "-", + { + label: lang.reversecurrent, + cmdName: "sorttable", + value: "reversecurrent" + }, + { + label: lang.orderbyasc, + cmdName: "sorttable", + value: "orderbyasc" + }, + { + label: lang.reversebyasc, + cmdName: "sorttable", + value: "reversebyasc" + }, + { + label: lang.orderbynum, + cmdName: "sorttable", + value: "orderbynum" + }, + { + label: lang.reversebynum, + cmdName: "sorttable", + value: "reversebynum" + } + ] + }, + { + group: lang.borderbk, + icon: "borderBack", + subMenu: [ + { + label: lang.setcolor, + cmdName: "interlacetable", + exec: function() { + this.execCommand("interlacetable"); + } + }, + { + label: lang.unsetcolor, + cmdName: "uninterlacetable", + exec: function() { + this.execCommand("uninterlacetable"); + } + }, + { + label: lang.setbackground, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["#bbb", "#ccc"] + }); + } + }, + { + label: lang.unsetbackground, + cmdName: "cleartablebackground", + exec: function() { + this.execCommand("cleartablebackground"); + } + }, + { + label: lang.redandblue, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["red", "blue"] + }); + } + }, + { + label: lang.threecolorgradient, + cmdName: "settablebackground", + exec: function() { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["#aaa", "#bbb", "#ccc"] + }); + } + } + ] + }, + { + group: lang.aligntd, + icon: "aligntd", + subMenu: [ + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "top" } + }, + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "middle" } + }, + { + cmdName: "cellalignment", + value: { align: "left", vAlign: "bottom" } + }, + { + cmdName: "cellalignment", + value: { align: "center", vAlign: "bottom" } + }, + { + cmdName: "cellalignment", + value: { align: "right", vAlign: "bottom" } + } + ] + }, + { + group: lang.aligntable, + icon: "aligntable", + subMenu: [ + { + cmdName: "tablealignment", + className: "left", + label: lang.tableleft, + value: "left" + }, + { + cmdName: "tablealignment", + className: "center", + label: lang.tablecenter, + value: "center" + }, + { + cmdName: "tablealignment", + className: "right", + label: lang.tableright, + value: "right" + } + ] + }, + "-", + { + label: lang.insertparagraphbefore, + cmdName: "insertparagraph", + value: true + }, + { + label: lang.insertparagraphafter, + cmdName: "insertparagraph" + }, + { + label: lang["copy"], + cmdName: "copy" + }, + { + label: lang["paste"], + cmdName: "paste" + } + ]; + if (!items.length) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener("contextmenu", function(type, evt) { + var offset = uiUtils.getViewportOffsetByEvent(evt); + me.fireEvent("beforeselectionchange"); + if (menu) { + menu.destroy(); + } + for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) { + var last; + (function(item) { + if (item == "-") { + if ((last = contextItems[contextItems.length - 1]) && last !== "-") { + contextItems.push("-"); + } + } else if (item.hasOwnProperty("group")) { + for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) { + (function(subItem) { + if (subItem == "-") { + if ((last = subMenu[subMenu.length - 1]) && last !== "-") { + subMenu.push("-"); + } else { + subMenu.splice(subMenu.length - 1); + } + } else { + if ( + (me.commands[subItem.cmdName] || + UE.commands[subItem.cmdName] || + subItem.query) && + (subItem.query + ? subItem.query() + : me.queryCommandState(subItem.cmdName)) > -1 + ) { + subMenu.push({ + label: + subItem.label || + me.getLang( + "contextMenu." + + subItem.cmdName + + (subItem.value || "") + ) || + "", + className: + "edui-for-" + + subItem.cmdName + + (subItem.className + ? " edui-for-" + + subItem.cmdName + + "-" + + subItem.className + : ""), + onclick: subItem.exec + ? function() { + subItem.exec.call(me); + } + : function() { + me.execCommand(subItem.cmdName, subItem.value); + } + }); + } + } + })(cj); + } + if (subMenu.length) { + function getLabel() { + switch (item.icon) { + case "table": + return me.getLang("contextMenu.table"); + case "justifyjustify": + return me.getLang("contextMenu.paragraph"); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default: + return ""; + } + } + contextItems.push({ + //todo 修正成自动获取方式 + label: getLabel(), + className: "edui-for-" + item.icon, + subMenu: { + items: subMenu, + editor: me + } + }); + } + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ( + (me.commands[item.cmdName] || + UE.commands[item.cmdName] || + item.query) && + (item.query + ? item.query.call(me) + : me.queryCommandState(item.cmdName)) > -1 + ) { + contextItems.push({ + label: item.label || me.getLang("contextMenu." + item.cmdName), + className: + "edui-for-" + + (item.icon ? item.icon : item.cmdName + (item.value || "")), + onclick: item.exec + ? function() { + item.exec.call(me); + } + : function() { + me.execCommand(item.cmdName, item.value); + } + }); + } + } + })(ti); + } + if (contextItems[contextItems.length - 1] == "-") { + contextItems.pop(); + } + + menu = new UE.ui.Menu({ + items: contextItems, + className: "edui-contextmenu", + editor: me + }); + menu.render(); + menu.showAt(offset); + + me.fireEvent("aftershowcontextmenu", menu); + + domUtils.preventDefault(evt); + if (browser.ie) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + } + } + }); + + // 添加复制的flash按钮 + me.addListener("aftershowcontextmenu", function(type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == "edui-for-copy") { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); +}; + + +// plugins/shortcutmenu.js +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 +/** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + +UE.plugins["shortcutmenu"] = function() { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener("contextmenu mouseup", function(type, e) { + var me = this, + customEvt = { + type: type, + target: e.target || e.srcElement, + screenX: e.screenX, + screenY: e.screenY, + clientX: e.clientX, + clientY: e.clientY + }; + + setTimeout(function() { + var rng = me.selection.getRange(); + if (rng.collapsed === false || type == "contextmenu") { + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu({ + editor: me, + items: items, + theme: me.options.theme, + className: "edui-shortcutmenu" + }); + + menu.render(); + me.fireEvent("afterrendershortcutmenu", menu); + } + + menu.show(customEvt, !!UE.plugins["contextmenu"]); + } + }); + + if (type == "contextmenu") { + domUtils.preventDefault(e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + } + } + } + }); + + me.addListener("keydown", function(type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide(); + } + }); +}; + + +// plugins/basestyle.js +/** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins["basestyle"] = function() { + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + bold: ["strong", "b"], + italic: ["em", "i"], + subscript: ["sub"], + superscript: ["sup"] + }, + getObj = function(editor, tagNames) { + return domUtils.filterNodeList( + editor.selection.getStartElementPath(), + tagNames + ); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + Bold: "ctrl+66", //^B + Italic: "ctrl+73", //^I + Underline: "ctrl+85" //^U + }); + me.addInputRule(function(root) { + utils.each(root.getNodesByTagName("b i"), function(node) { + switch (node.tagName) { + case "b": + node.tagName = "strong"; + break; + case "i": + node.tagName = "em"; + } + }); + }); + for (var style in basestyles) { + (function(cmd, tagNames) { + me.commands[cmd] = { + execCommand: function(cmdName) { + var range = me.selection.getRange(), + obj = getObj(this, tagNames); + if (range.collapsed) { + if (obj) { + var tmpText = me.document.createTextNode(""); + range.insertNode(tmpText).removeInlineStyle(tagNames); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement(tagNames[0]); + if (cmdName == "superscript" || cmdName == "subscript") { + tmpText = me.document.createTextNode(""); + range + .insertNode(tmpText) + .removeInlineStyle(["sub", "sup"]) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode(tmpNode).setStart(tmpNode, 0); + } + range.collapse(true); + } else { + if (cmdName == "superscript" || cmdName == "subscript") { + if (!obj || obj.tagName.toLowerCase() != cmdName) { + range.removeInlineStyle(["sub", "sup"]); + } + } + obj + ? range.removeInlineStyle(tagNames) + : range.applyInlineStyle(tagNames[0]); + } + range.select(); + }, + queryCommandState: function() { + return getObj(this, tagNames) ? 1 : 0; + } + }; + })(style, basestyles[style]); + } +}; + + +// plugins/elementpath.js +/** + * 选取路径命令 + * @file + */ +UE.plugins["elementpath"] = function() { + var currentLevel, + tagNames, + me = this; + me.setOpt("elementPathEnabled", true); + if (!me.options.elementPathEnabled) { + return; + } + me.commands["elementpath"] = { + execCommand: function(cmdName, level) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level * 1; + range.selectNode(start).select(); + }, + queryCommandValue: function() { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for (var i = 0, ci; (ci = parents[i]); i++) { + if (ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if (name == "img" && ci.getAttribute("anchorname")) { + name = "anchor"; + } + names[i] = name; + if (currentLevel == i) { + currentLevel = -1; + break; + } + } + return names; + } + }; +}; + + +// plugins/formatmatch.js +/** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + +/** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ +UE.plugins["formatmatch"] = function() { + var me = this, + list = [], + img, + flag = 0; + + me.addListener("reset", function() { + list = []; + flag = 0; + }); + + function addList(type, evt) { + if (browser.webkit) { + var target = evt.target.tagName == "IMG" ? evt.target : null; + } + + function addFormat(range) { + if (text) { + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length - 1].tagName, null, list); + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if (img && imgT && imgT.tagName == "IMG") { + //trace:964 + + imgT.style.cssText += + ";float:" + + (img.style.cssFloat || img.style.styleFloat || "none") + + ";display:" + + (img.style.display || "inline"); + + img = null; + } else { + if (!img) { + var collapsed = range.collapsed; + if (collapsed) { + var text = me.document.createTextNode("match"); + range.insertNode(text).select(); + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ""; + me.execCommand("removeformat"); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if (list.length) { + addFormat(range); + } + if (text) { + range.setStartBefore(text).collapse(true); + } + range.select(); + text && domUtils.remove(text); + } + } + + me.undoManger && me.undoManger.save(); + me.removeListener("mouseup", addList); + flag = 0; + } + + me.commands["formatmatch"] = { + execCommand: function(cmdName) { + if (flag) { + flag = 0; + list = []; + me.removeListener("mouseup", addList); + return; + } + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if (!img || img.tagName != "IMG") { + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start, true, function(node) { + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for (var i = 0, ci; (ci = list[i]); i++) { + if (ci.tagName == "A") { + list.splice(i, 1); + break; + } + } + } + + me.addListener("mouseup", addList); + flag = 1; + }, + queryCommandState: function() { + return flag; + }, + notNeedUndo: 1 + }; +}; + + +// plugins/searchreplace.js +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace +/** + * @description 查找替换 + * @author zhanyi + */ + +UE.plugin.register("searchreplace", function() { + var me = this; + + var _blockElm = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; + + var lastRng = null; + + function getText(node) { + var text = node.nodeType == 3 + ? node.nodeValue + : node[browser.ie ? "innerText" : "textContent"]; + return text.replace(domUtils.fillChar, ""); + } + + function findTextInString(textContent, opt, currentIndex) { + var str = opt.searchStr; + + var reg = new RegExp(str, "g" + (opt.casesensitive ? "" : "i")), + match; + + if (opt.dir == -1) { + textContent = textContent.substr(0, currentIndex); + textContent = textContent.split("").reverse().join(""); + str = str.split("").reverse().join(""); + match = reg.exec(textContent); + if (match) { + return currentIndex - match.index - str.length; + } + } else { + textContent = textContent.substr(currentIndex); + match = reg.exec(textContent); + if (match) { + return match.index + currentIndex; + } + } + + return -1; + } + function findTextBlockElm(node, currentIndex, opt) { + var textContent, + index, + methodName = opt.all || opt.dir == 1 ? "getNextDomNode" : "getPreDomNode"; + if (domUtils.isBody(node)) { + node = node.firstChild; + } + var first = 1; + while (node) { + textContent = getText(node); + index = findTextInString(textContent, opt, currentIndex); + first = 0; + if (index != -1) { + return { + node: node, + index: index + }; + } + node = domUtils[methodName](node); + while (node && _blockElm[node.nodeName.toLowerCase()]) { + node = domUtils[methodName](node, true); + } + if (node) { + currentIndex = opt.dir == -1 ? getText(node).length : 0; + } + } + } + function findNTextInBlockElm(node, index, str) { + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while (currentNode) { + if (currentNode.nodeType == 3) { + currentNodeLength = getText(currentNode).replace( + /(^[\t\r\n]+)|([\t\r\n]+$)/, + "" + ).length; + currentIndex += currentNodeLength; + if (currentIndex >= index) { + return { + node: currentNode, + index: currentNodeLength - (currentIndex - index) + }; + } + } else if (!dtd.$empty[currentNode.tagName]) { + currentNodeLength = getText(currentNode).replace( + /(^[\t\r\n]+)|([\t\r\n]+$)/, + "" + ).length; + currentIndex += currentNodeLength; + if (currentIndex >= index) { + result = findNTextInBlockElm( + currentNode, + currentNodeLength - (currentIndex - index), + str + ); + if (result) { + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + } + } + + function searchReplace(me, opt) { + var rng = lastRng || me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement("span"); + span.innerHTML = "$$ueditor_searchreplace_key$$"; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if (!rng.collapsed) { + rng.select(); + var rngText = me.selection.getText(); + if ( + new RegExp( + "^" + opt.searchStr + "$", + opt.casesensitive ? "" : "i" + ).test(rngText) + ) { + if (opt.replaceStr != undefined) { + replaceText(rng, opt.replaceStr); + rng.select(); + return true; + } else { + rng.collapse(opt.dir == -1); + } + } + } + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = getText(startBlockNode).indexOf( + "$$ueditor_searchreplace_key$$" + ); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode, currentIndex, opt); + if (result) { + var rngStart = findNTextInBlockElm(result.node, result.index, searchStr); + var rngEnd = findNTextInBlockElm( + result.node, + result.index + searchStr.length, + searchStr + ); + rng + .setStart(rngStart.node, rngStart.index) + .setEnd(rngEnd.node, rngEnd.index); + + if (opt.replaceStr !== undefined) { + replaceText(rng, opt.replaceStr); + } + rng.select(); + return true; + } else { + rng.setCursor(); + } + } + function replaceText(rng, str) { + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + } + return { + commands: { + searchreplace: { + execCommand: function(cmdName, opt) { + utils.extend( + opt, + { + all: false, + casesensitive: false, + dir: 1 + }, + true + ); + var num = 0; + if (opt.all) { + lastRng = null; + var rng = me.selection.getRange(), + first = me.body.firstChild; + if (first && first.nodeType == 1) { + rng.setStart(first, 0); + rng.shrinkBoundary(true); + } else if (first.nodeType == 3) { + rng.setStartBefore(first); + } + rng.collapse(true).select(true); + if (opt.replaceStr !== undefined) { + me.fireEvent("saveScene"); + } + while (searchReplace(this, opt)) { + num++; + lastRng = me.selection.getRange(); + lastRng.collapse(opt.dir == -1); + } + if (num) { + me.fireEvent("saveScene"); + } + } else { + if (opt.replaceStr !== undefined) { + me.fireEvent("saveScene"); + } + if (searchReplace(this, opt)) { + num++; + lastRng = me.selection.getRange(); + lastRng.collapse(opt.dir == -1); + } + if (num) { + me.fireEvent("saveScene"); + } + } + + return num; + }, + notNeedUndo: 1 + } + }, + bindEvents: { + clearlastSearchResult: function() { + lastRng = null; + } + } + }; +}); + + +// plugins/customstyle.js +/** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ +UE.plugins["customstyle"] = function() { + var me = this; + me.setOpt({ + customstyle: [ + { + tag: "h1", + name: "tc", + style: + "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;" + }, + { + tag: "h1", + name: "tl", + style: + "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;" + }, + { + tag: "span", + name: "im", + style: + "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;" + }, + { + tag: "span", + name: "hi", + style: + "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;" + } + ] + }); + me.commands["customstyle"] = { + execCommand: function(cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label"); + }, + true + ), + range, + bk, + tmpObj = {}; + for (var p in obj) { + if (obj[p] !== undefined) tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute("label") == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if (dtd.$block[node.tagName]) { + var fillNode = me.document.createElement("p"); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + } else { + domUtils.remove(node, true); + } + } else { + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if (new RegExp(tagName, "i").test(common.tagName)) { + nodes.push(common); + } + for (var i = 0, ni; (ni = nodes[i++]); ) { + if (ni.getAttribute("label") == obj.label) { + var ps = domUtils.getPosition(ni, bk.start), + pe = domUtils.getPosition(ni, bk.end); + if ( + (ps & domUtils.POSITION_FOLLOWING || + ps & domUtils.POSITION_CONTAINS) && + (pe & domUtils.POSITION_PRECEDING || + pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement("p"); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent( + common, + function(node) { + return node.getAttribute("label") == obj.label; + }, + true + ); + if (node) { + domUtils.remove(node, true); + } + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand("paragraph", tagName, tmpObj, "customstyle"); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label") == obj.label; + }, + true + ); + var pNode = me.document.createElement("p"); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + }, + queryCommandValue: function() { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function(node) { + return node.getAttribute("label"); + } + ); + return parent ? parent.getAttribute("label") : ""; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener("keyup", function(type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent( + me.selection.getStart(), + function(node) { + return node.getAttribute("label"); + }, + true + ); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement("p"); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + } + } + } + }); +}; + + +// plugins/catchremoteimage.js +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 +/** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ +UE.plugins["catchremoteimage"] = function() { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function() { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function() { + var catcherLocalDomain = me.getOpt("catcherLocalDomain"), + catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), + catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), + catcherFieldName = me.getOpt("catcherFieldName"); + + var remoteImages = [], + loadingIMG = me.options.themePath + me.options.theme + '/images/spacer.gif', + imgs = me.document.querySelectorAll('[style*="url"],img'), + test = function(src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; (url = urls[j++]); ) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; (ci = imgs[i++]); ) { + if (ci.getAttribute("word_img")) { + continue; + } + if(ci.nodeName == "IMG"){ + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + // 添加上传时的uploading动画 + domUtils.setAttributes(ci, { + class: "loadingclass", + _src: src, + src: loadingIMG + }) + } + } else { + // 获取背景图片url + var backgroundImageurl = ci.style.cssText.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, ''); + if (/^(https?|ftp):/i.test(backgroundImageurl) && !test(backgroundImageurl, catcherLocalDomain)) { + remoteImages.push(backgroundImageurl); + ci.style.cssText = ci.style.cssText.replace(backgroundImageurl, loadingIMG); + domUtils.setAttributes(ci, { + "data-background": backgroundImageurl + }) + } + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function(r) { + try { + var info = r.state !== undefined + ? r + : eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, + j, + ci, + cj, + oldSrc, + newSrc, + list = info.list; + + /* 抓取失败统计 */ + var catchFailList = []; + /* 抓取成功统计 */ + var catchSuccessList = []; + /* 抓取失败时显示的图片 */ + var failIMG = me.options.themePath + me.options.theme + '/images/img-cracked.png'; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + oldBgIMG = ci.getAttribute("data-background") || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { + newSrc = catcherUrlPrefix + cj.url; + // 上传成功是删除uploading动画 + domUtils.removeClasses( ci, "loadingclass" ); + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc, + "data-catchResult":"img_catchSuccess" // 添加catch成功标记 + }); + catchSuccessList.push(ci); + break; + } else if (oldSrc == cj.source && cj.state == "FAIL") { + // 替换成统一的失败图片 + domUtils.removeClasses( ci, "loadingclass" ); + domUtils.setAttributes(ci, { + "src": failIMG, + "_src": failIMG, + "data-catchResult":"img_catchFail" // 添加catch失败标记 + }); + catchFailList.push(ci); + break; + } else if (oldBgIMG == cj.source && cj.state == "SUCCESS") { + newBgIMG = catcherUrlPrefix + cj.url; + ci.style.cssText = ci.style.cssText.replace(loadingIMG, newBgIMG); + domUtils.removeAttributes(ci,"data-background"); + domUtils.setAttributes(ci, { + "data-catchResult":"img_catchSuccess" // 添加catch成功标记 + }); + catchSuccessList.push(ci); + break; + } else if (oldBgIMG == cj.source && cj.state == "FAIL"){ + ci.style.cssText = ci.style.cssText.replace(loadingIMG, failIMG); + domUtils.removeAttributes(ci,"data-background"); + domUtils.setAttributes(ci, { + "data-catchResult":"img_catchFail" // 添加catch失败标记 + }); + catchFailList.push(ci); + break; + } + } + + } + // 监听事件添加成功抓取和抓取失败的dom列表参数 + me.fireEvent('catchremotesuccess',catchSuccessList,catchFailList); + }, + //回调失败,本次请求超时 + error: function() { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = + utils.serializeParam(me.queryCommandValue("serverparam")) || "", + url = utils.formatUrl( + catcherActionUrl + + (catcherActionUrl.indexOf("?") == -1 ? "?" : "&") + + params + ), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + method: "POST", + dataType: isJsonp ? "jsonp" : "", + timeout: 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + onsuccess: callbacks["success"], + onerror: callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + }); +}; + + +// plugins/snapscreen.js +/** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ +UE.plugin.register("snapscreen", function() { + var me = this; + var snapplugin; + + function getLocation(url) { + var search, + a = document.createElement("a"), + params = utils.serializeParam(me.queryCommandValue("serverparam")) || ""; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + search = a.search; + if (params) { + search = search + (search.indexOf("?") == -1 ? "?" : "&") + params; + search = search.replace(/[&]+/gi, "&"); + } + return { + port: a.port, + hostname: a.hostname, + path: a.pathname + search || +a.hash + }; + } + + return { + commands: { + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + snapscreen: { + execCommand: function(cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if (!snapplugin) { + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try { + snapplugin.type = "application/x-pluginbaidusnap"; + } catch (e) { + return; + } + snapplugin.style.cssText = + "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width", "0"); + snapplugin.setAttribute("height", "0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs) { + try { + rs = eval("(" + rs + ")"); + if (rs.state == "SUCCESS") { + var opt = me.options; + me.execCommand("insertimage", { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || "", + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + } catch (e) { + alert(lang.callBackErrorMsg); + } + } + url = me.getActionUrl(me.getOpt("snapscreenActionName")); + local = getLocation(url); + setTimeout(function() { + try { + res = snapplugin.saveSnapshot( + local.hostname, + local.path, + local.port + ); + } catch (e) { + me.ui._dialogs["snapscreenDialog"].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function() { + return navigator.userAgent.indexOf("Windows", 0) != -1 ? 0 : -1; + } + } + } + }; +}); + + +// plugins/insertparagraph.js +/** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + +UE.commands["insertparagraph"] = { + execCommand: function(cmdName, front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer, + tmpNode; + while (start) { + if (domUtils.isBody(start)) { + break; + } + tmpNode = start; + start = start.parentNode; + } + if (tmpNode) { + var p = me.document.createElement("p"); + if (front) { + tmpNode.parentNode.insertBefore(p, tmpNode); + } else { + tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling); + } + domUtils.fillNode(me.document, p); + range.setStart(p, 0).setCursor(false, true); + } + } +}; + + +// plugins/webapp.js +/** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

    ' : '') + '' + +// (addParagraph ? '

    ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + +UE.plugin.register("webapp", function() { + var me = this; + function createInsertStr(obj, toEmbed) { + return !toEmbed + ? '" + : ''; + } + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(node) { + var html; + if (node.getAttr("class") == "edui-faked-webapp") { + html = createInsertStr( + { + title: node.getAttr("title"), + width: node.getAttr("width"), + height: node.getAttr("height"), + align: node.getAttr("align"), + cssfloat: node.getStyle("float"), + url: node.getAttr("_url"), + logo: node.getAttr("_logo_url") + }, + true + ); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }); + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("iframe"), function(node) { + if (node.getAttr("class") == "edui-faked-webapp") { + var img = UE.uNode.createElement( + createInsertStr({ + title: node.getAttr("title"), + width: node.getAttr("width"), + height: node.getAttr("height"), + align: node.getAttr("align"), + cssfloat: node.getStyle("float"), + url: node.getAttr("src"), + logo: node.getAttr("logo_url") + }) + ); + node.parentNode.replaceChild(img, node); + } + }); + }, + commands: { + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + webapp: { + execCommand: function(cmd, obj) { + var me = this, + str = createInsertStr( + utils.extend(obj, { + align: "none" + }), + false + ); + me.execCommand("inserthtml", str); + }, + queryCommandState: function() { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && img.className == "edui-faked-webapp"; + return flag ? 1 : 0; + } + } + } + }; +}); + + +// plugins/template.js +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template +UE.plugins["template"] = function() { + UE.commands["template"] = { + execCommand: function(cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function(type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent( + el, + function(node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, + true + ); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function(type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent( + range.startContainer, + function(node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, + true + ); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); +}; + + +// plugins/music.js +/** + * 插入音乐命令 + * @file + */ +UE.plugin.register("music", function() { + var me = this; + function creatInsertStr(url, width, height, align, cssfloat, toEmbed) { + return !toEmbed + ? "' + : ''; + } + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(node) { + var html; + if (node.getAttr("class") == "edui-faked-music") { + var cssfloat = node.getStyle("float"); + var align = node.getAttr("align"); + html = creatInsertStr( + node.getAttr("_url"), + node.getAttr("width"), + node.getAttr("height"), + align, + cssfloat, + true + ); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }); + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("embed"), function(node) { + if (node.getAttr("class") == "edui-faked-music") { + var cssfloat = node.getStyle("float"); + var align = node.getAttr("align"); + html = creatInsertStr( + node.getAttr("src"), + node.getAttr("width"), + node.getAttr("height"), + align, + cssfloat, + false + ); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img, node); + } + }); + }, + commands: { + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + music: { + execCommand: function(cmd, musicObj) { + var me = this, + str = creatInsertStr( + musicObj.url, + musicObj.width || 400, + musicObj.height || 95, + "none", + false + ); + me.execCommand("inserthtml", str); + }, + queryCommandState: function() { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && img.className == "edui-faked-music"; + return flag ? 1 : 0; + } + } + } + }; +}); + + +// plugins/autoupload.js +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UE.plugin.register("autoupload", function() { + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, + urlPrefix, + maxSize, + allowFiles, + actionUrl, + loadingHtml, + errorHandler, + successHandler, + filetype = /image\/\w+/i.test(file.type) ? "image" : "file", + loadingId = "loading_" + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + "FieldName"); + urlPrefix = me.getOpt(filetype + "UrlPrefix"); + maxSize = me.getOpt(filetype + "MaxSize"); + allowFiles = me.getOpt(filetype + "AllowFiles"); + actionUrl = me.getActionUrl(me.getOpt(filetype + "ActionName")); + errorHandler = function(title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent("showmessage", { + id: loadingId, + content: title, + type: "error", + timeout: 4000 + }); + }; + + if (filetype == "image") { + loadingHtml = + ''; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + domUtils.removeClasses(loader, "loadingclass"); + loader.setAttribute("src", link); + loader.setAttribute("_src", link); + loader.setAttribute("alt", data.original || ""); + loader.removeAttribute("id"); + me.trigger("contentchange", loader); + } + }; + } else { + loadingHtml = + "

    " + + '' + + "

    "; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand("insertfile", { url: link }); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand("inserthtml", loadingHtml); + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + "ActionName")) { + errorHandler(me.getLang("autoupload.errorLoadConfig")); + return; + } + /* 判断文件大小是否超出限制 */ + if (file.size > maxSize) { + errorHandler(me.getLang("autoupload.exceedSizeError")); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf(".")) : ""; + if ( + (fileext && filetype != "image") || + (allowFiles && + (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") == -1) + ) { + errorHandler(me.getLang("autoupload.exceedTypeError")); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue("serverparam")) || "", + url = utils.formatUrl( + actionUrl + (actionUrl.indexOf("?") == -1 ? "?" : "&") + params + ); + + fd.append( + fieldName, + file, + file.name || "blob." + file.type.substr("image/".length) + ); + fd.append("type", "ajax"); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener("load", function(e) { + try { + var json = new Function("return " + utils.trim(e.target.response))(); + if (json.state == "SUCCESS" && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + } catch (er) { + errorHandler(me.getLang("autoupload.loadError")); + } + }); + xhr.send(fd); + } + + function getPasteImage(e) { + return e.clipboardData && + e.clipboardData.items && + e.clipboardData.items.length == 1 && + /^image\//.test(e.clipboardData.items[0].type) + ? e.clipboardData.items + : null; + } + function getDropImage(e) { + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; + } + + return { + outputRule: function(root) { + utils.each(root.getNodesByTagName("img"), function(n) { + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName("p"), function(n) { + if (/\bloadpara\b/.test(n.getAttr("class"))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents: { + defaultOptions: { + //默认间隔时间 + enableDragUpload: true, + enablePasteUpload: true + }, + //插入粘贴板的图片,拖放插入图片 + ready: function(e) { + var me = this; + if (window.FormData && window.FileReader) { + var handler = function(e) { + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == "paste" ? getPasteImage(e) : getDropImage(e); + if (items) { + var len = items.length, + file; + while (len--) { + file = items[len]; + if (file.getAsFile) file = file.getAsFile(); + if (file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + }; + + if (me.getOpt("enablePasteUpload") !== false) { + domUtils.on(me.body, "paste ", handler); + } + if (me.getOpt("enableDragUpload") !== false) { + domUtils.on(me.body, "drop", handler); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, "dragover", function(e) { + if (e.dataTransfer.types[0] == "Files") { + e.preventDefault(); + } + }); + } else { + if (browser.gecko) { + domUtils.on(me.body, "drop", function(e) { + if (getDropImage(e)) { + e.preventDefault(); + } + }); + } + } + + //设置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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" + + "}", + this.document + ); + } + } + } + }; +}); + + +// plugins/autosave.js +UE.plugin.register("autosave", function() { + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save(editor) { + var saveData; + + if (new Date() - lastSaveTime < MIN_TIME) { + return; + } + + if (!editor.hasContents()) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences(saveKey); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( + editor.fireEvent("beforeautosave", { + content: saveData + }) === false + ) { + return; + } + + me.setPreferences(saveKey, saveData); + + editor.fireEvent("afterautosave", { + content: saveData + }); + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500, + enableAutoSave: true + }, + bindEvents: { + ready: function() { + var _suffix = "-drafts-data", + key = null; + + if (me.key) { + key = me.key + _suffix; + } else { + key = (me.container.parentNode.id || "ue-common") + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = + (location.protocol + location.host + location.pathname).replace( + /[.:\/]/g, + "_" + ) + key; + }, + + contentchange: function() { + if (!me.getOpt("enableAutoSave")) { + return; + } + + if (!saveKey) { + return; + } + + if (me._saveFlag) { + window.clearTimeout(me._saveFlag); + } + + if (me.options.saveInterval > 0) { + me._saveFlag = window.setTimeout(function() { + save(me); + }, me.options.saveInterval); + } else { + save(me); + } + } + }, + commands: { + clearlocaldata: { + execCommand: function(cmd, name) { + if (saveKey && me.getPreferences(saveKey)) { + me.removePreferences(saveKey); + } + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + getlocaldata: { + execCommand: function(cmd, name) { + return saveKey ? me.getPreferences(saveKey) || "" : ""; + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + drafts: { + execCommand: function(cmd, name) { + if (saveKey) { + window.setTimeout(function(){ + me.body.innerHTML = + me.getPreferences(saveKey) || "

    " + domUtils.fillHtml + "

    "; + // me.focus(true); + }, 0); + } + }, + queryCommandState: function() { + return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1; + }, + notNeedUndo: true, + ignoreContentChange: true + } + } + }; +}); + + +// plugins/charts.js +UE.plugin.register("charts", function() { + var me = this; + + return { + bindEvents: { + chartserror: function() {} + }, + commands: { + charts: { + execCommand: function(cmd, data) { + var tableNode = domUtils.findParentByTagName( + this.selection.getRange().startContainer, + "table", + true + ), + flagText = [], + config = {}; + + if (!tableNode) { + return false; + } + + if (!validData(tableNode)) { + me.fireEvent("chartserror"); + return false; + } + + config.title = data.title || ""; + config.subTitle = data.subTitle || ""; + config.xTitle = data.xTitle || ""; + config.yTitle = data.yTitle || ""; + config.suffix = data.suffix || ""; + config.tip = data.tip || ""; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ""; + //图表类型 + config.chartType = data.chartType || 0; + + for (var key in config) { + if (!config.hasOwnProperty(key)) { + continue; + } + + flagText.push(key + ":" + config[key]); + } + + tableNode.setAttribute("data-chart", flagText.join(";")); + domUtils.addClass(tableNode, "edui-charts-table"); + }, + queryCommandState: function(cmd, name) { + var tableNode = domUtils.findParentByTagName( + this.selection.getRange().startContainer, + "table", + true + ); + return tableNode && validData(tableNode) ? 0 : -1; + } + } + }, + inputRule: function(root) { + utils.each(root.getNodesByTagName("table"), function(tableNode) { + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style"); + } + }); + }, + outputRule: function(root) { + utils.each(root.getNodesByTagName("table"), function(tableNode) { + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style", "display: none;"); + } + }); + } + }; + + function validData(table) { + var firstRows = null, + cellCount = 0; + + //行数不够 + if (table.rows.length < 2) { + return false; + } + + //列数不够 + if (table.rows[0].cells.length < 2) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[0].cells; + cellCount = firstRows.length; + + for (var i = 0, cell; (cell = firstRows[i]); i++) { + if (cell.tagName.toLowerCase() !== "th") { + return false; + } + } + + for (var i = 1, row; (row = table.rows[i]); i++) { + //每行单元格数不匹配, 返回false + if (row.cells.length != cellCount) { + return false; + } + + //第一列不是th也返回false + if (row.cells[0].tagName.toLowerCase() !== "th") { + return false; + } + + for (var j = 1, cell; (cell = row.cells[j]); j++) { + var value = utils.trim(cell.innerText || cell.textContent || ""); + + value = value + .replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "") + .replace(/^\s+|\s+$/g, ""); + + //必须是数字 + if (!/^\d*\.?\d+$/.test(value)) { + return false; + } + } + } + + return true; + } +}); + + +// plugins/section.js +/** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ +UE.plugin.register("section", function() { + /* 目录节点对象 */ + function Section(option) { + this.tag = ""; + (this.level = -1), (this.dom = null); + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + function getNodeFromAddress(startAddress, root) { + var current = root; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents: { + type: "aftersetcontent afterscencerestore", + handler: function() { + me.fireEvent("updateSections"); + } + }, + bindEvents: { + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + ready: function() { + me.fireEvent("updateSections"); + domUtils.on(me.body, "drop paste", function() { + me.fireEvent("updateSections"); + }); + }, + /* 执行paragraph命令之后 */ + afterexeccommand: function(type, cmd) { + if (cmd == "paragraph") { + me.fireEvent("updateSections"); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + keyup: function(type, e) { + var me = this, + range = me.selection.getRange(); + if (range.collapsed != true) { + me.fireEvent("updateSections"); + } else { + var keyCode = e.keyCode || e.which; + if (keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent("updateSections"); + } + } + } + }, + commands: { + getsections: { + execCommand: function(cmd, levels) { + var levelFn = levels || ["h1", "h2", "h3", "h4", "h5", "h6"]; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == "string") { + levelFn[i] = (function(fn) { + return function(node) { + return node.tagName == fn.toUpperCase(); + }; + })(levelFn[i]); + } else if (typeof levelFn[i] != "function") { + levelFn[i] = function(node) { + return null; + }; + } + } + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({ level: -1, title: "root" }), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection + .getRange() + .selectNode(child) + .createAddress(true).startAddress, + current = getSection({ + tag: child.tagName, + title: child.innerText || child.textContent || "", + level: level, + dom: child, + startAddress: utils.clone(address, []), + endAddress: utils.clone(address, []), + children: [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while (level <= parent.level) { + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && + tmpSection.endAddress[tmpSection.endAddress.length - 1]++; + } + } + } + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + movesection: { + execCommand: function(cmd, sourceSection, targetSection, isAfter) { + var me = this, + targetAddress, + target; + + if (!sourceSection || !targetSection || targetSection.level == -1) + return; + + targetAddress = isAfter + ? targetSection.endAddress + : targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if ( + !targetAddress || + !target || + isContainsAddress( + sourceSection.startAddress, + sourceSection.endAddress, + targetAddress + ) + ) + return; + + var startNode = getNodeFromAddress( + sourceSection.startAddress, + me.body + ), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if (isAfter) { + current = endNode; + while ( + current && + !( + domUtils.getPosition(startNode, current) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if (current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while ( + current && + !( + domUtils.getPosition(current, endNode) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if (current == endNode) break; + current = nextNode; + } + } + + me.fireEvent("updateSections"); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget) { + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for (var i = 0; i < startAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if (addressTarget[i] < startAddress[i]) { + break; + } + } + for (var i = 0; i < endAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if (addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + deletesection: { + execCommand: function(cmd, section, keepChildren) { + var me = this; + + if (!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if (!keepChildren) { + while ( + current && + domUtils.inDoc(endNode, me.document) && + !( + domUtils.getPosition(current, endNode) & + domUtils.POSITION_FOLLOWING + ) + ) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent("updateSections"); + } + }, + selectsection: { + execCommand: function(cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + startAddress: utils.clone(section.startAddress, []), + endAddress: utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + scrolltosection: { + execCommand: function(cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + startAddress: section.startAddress, + endAddress: section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + }; +}); + + +// plugins/simpleupload.js +/** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ +UE.plugin.register("simpleupload", function() { + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn() { + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement("iframe"), + btnStyle = + "display:block;width:" + + w + + "px;height:" + + h + + "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;"; + + domUtils.on(btnIframe, "load", function() { + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = + btnIframe.contentDocument || btnIframe.contentWindow.document; + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement("div"); + + wrapper.innerHTML = + '
    ' + + '' + + "
    " + + ''; + + 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, + json, + loader, + body = (iframe.contentDocument || iframe.contentWindow.document) + .body, + result = body.innerText || body.textContent || ""; + json = new Function("return " + result)(); + link = me.options.imageUrlPrefix + json.url; + if (json.state == "SUCCESS" && json.url) { + loader = me.document.getElementById(loadingId); + domUtils.removeClasses(loader, "loadingclass"); + domUtils.on(loader,'load',function(){ + me.fireEvent('contentchange'); + }); + loader.setAttribute("src", link); + loader.setAttribute("_src", link); + loader.setAttribute("alt", json.original || ""); + loader.removeAttribute("id"); + } else { + showErrorLoader && showErrorLoader(json.state); + } + } 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 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + 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; + } + + domUtils.on(iframe, "load", callback); + form.action = utils.formatUrl( + imageActionUrl + + (imageActionUrl.indexOf("?") == -1 ? "?" : "&") + + params + ); + form.submit(); + }); + + 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; + }); + + 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:1px solid #cccccc;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:1px solid #cccccc;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; + } + } + } + }; +}); + + +// plugins/serverparam.js +/** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register("serverparam", function() { + var me = this, + serverParam = {}; + + return { + commands: { + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * 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; + } + } else if (utils.isObject(key)) { + //传入对象,覆盖列表项 + utils.extend(serverParam, key, false); + } else if (utils.isFunction(key)) { + //传入函数,添加列表项 + utils.extend(serverParam, key(), false); + } + }, + queryCommandValue: function() { + return serverParam || {}; + } + } + } + }; +}); + + +// plugins/insertfile.js +/** + * 插入附件 + */ +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); + } + } + } + }; +}); + + +// plugins/xssFilter.js +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UE.plugins.xssFilter = function() { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; + + +// ui/ui.js +var baidu = baidu || {}; +baidu.editor = baidu.editor || {}; +UE.ui = baidu.editor.ui = {}; + + +// ui/uiutils.js +;(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 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 = []; + } + 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"; + } + 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"; + } + } + } + }); + 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() {}); + + 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); + + //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); + } + holder = holder || uiUtils.getFixedLayer(); + 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); +})(); + + +// 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); +})(); + + +// 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; + + 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(); + }); + + 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(); + } + } + } + + 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上的鼠标滚轮事件, 防止用户的正常操作被误解 + if (window.XMLHttpRequest) { + 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; + } + } + ); + } else { + //ie6 + domUtils.on(this.getDom(), "mousewheel", function(e) { + e.returnValue = false; + + me.getDom("content").scrollTop -= e.wheelDelta / 120 * 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() { + 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; + } + + 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(); + }); + + 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"); + } + }; + 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; + + 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; + + 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"); + } + } + }; +})(); + + +// ui/button.js +///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; + } + 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); +})(); + + +// ui/splitbutton.js +///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( + '
    ' + ) + ); + 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); +})(); + + +// ui/colorbutton.js +///import core +///import uicore +///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); +})(); + + +// ui/tablebutton.js +///import core +///import uicore +///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); +})(); + + +// ui/autotypesetpicker.js +///import core +///import uicore +;(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 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); +})(); + + +// ui/autotypesetbutton.js +///import core +///import uicore +///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); + } + }); + + 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; + + /** + * 该参数将新增一个参数: 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 + }, + 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]; + } + }, + 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; + + tempIndex === 0 && tmpl.push(""); + + tmpl.push( + '
    ' + ); + + tempIndex === 2 && tmpl.push(""); + } + + 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; + + 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 (/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); +})(); + + +// ui/menu.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, + 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); + } + } + }, + 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(); + } + }; + 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; + + //获取单元格对齐初始状态 + 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 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(); + } + 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); +})(); + + +// ui/combox.js +///import core +///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 + }); + + 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); + } + } + }; + utils.inherits(Combox, SplitButton); +})(); + + +// ui/dialog.js +///import core +///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 + ) + ); + } + } + } + }, + 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() { + var popBodyEl = this.getDom("body"); + // if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) { + // uiUtils.removeStyle(popBodyEl, 'width'); + // uiUtils.removeStyle(popBodyEl, 'height'); + // } + var size = this.mesureSize(); + 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; + 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); +})(); + + +// ui/menubutton.js +///import core +///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; + } + } + }); + this.initSplitButton(); + }, + setValue: function(value) { + this._value = value; + } + }; + utils.inherits(MenuButton, SplitButton); +})(); + + +// ui/multiMenu.js +///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(); + }); + + 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(); + } + }; + + 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; + + var allMenus = [], //存储所有快捷菜单 + timeID, + isSubMenuShow = false; //是否有子pop显示 + + var ShortCutMenu = (UI.ShortCutMenu = function(options) { + this.initOptions(options); + this.initShortCutMenu(); + }); + + 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) { + 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, 0.2); + } + + 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(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); +})(); + + +// 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(); + }); + }, + 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); +})(); + + +// ui/iconfont.js +!function(o){var h,p='',l=(h=document.getElementsByTagName("script"))[h.length-1].getAttribute("data-injectcss");if(l&&!o.__iconfont__svg__cssinject__){o.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}!function(h){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(h,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(a=h,t=o.document,i=!1,v=function(){i||(i=!0,a())},(p=function(){try{t.documentElement.doScroll("left")}catch(h){return void setTimeout(p,50)}v()})(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())});var a,t,i,v,p}(function(){var h,l,a,t,i,v;(h=document.createElement("div")).innerHTML=p,p=null,(l=h.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",a=l,(t=document.body).firstChild?(i=a,(v=t.firstChild).parentNode.insertBefore(i,v)):t.appendChild(a))})}(window); + +// adapter/editorui.js +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据neditor.config中的toolbars找到相应的进行实例化 +;(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", + insertimage: "~/dialogs/image/image.html", + link: "~/dialogs/link/link.html", + spechars: "~/dialogs/spechars/spechars.html", + searchreplace: "~/dialogs/searchreplace/searchreplace.html", + map: "~/dialogs/map/map.html", + gmap: "~/dialogs/gmap/gmap.html", + insertvideo: "~/dialogs/video/video.html", + help: "~/dialogs/help/help.html", + preview: "~/dialogs/preview/preview.html", + emotion: "~/dialogs/emotion/emotion.html", + wordimage: "~/dialogs/wordimage/wordimage.html", + attachment: "~/dialogs/attachment/attachment.html", + insertframe: "~/dialogs/insertframe/insertframe.html", + edittip: "~/dialogs/table/edittip.html", + edittable: "~/dialogs/table/edittable.html", + edittd: "~/dialogs/table/edittd.html", + webapp: "~/dialogs/webapp/webapp.html", + snapscreen: "~/dialogs/snapscreen/snapscreen.html", + scrawl: "~/dialogs/scrawl/scrawl.html", + music: "~/dialogs/music/music.html", + template: "~/dialogs/template/template.html", + background: "~/dialogs/background/background.html", + charts: "~/dialogs/charts/charts.html" + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + 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", + "drafts" + ]; + + 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); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + })(ci); + } + + //清除文档 + 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 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", "webapp", "preview"], + ok: [ + "attachment", + "anchor", + "link", + "insertimage", + "map", + "gmap", + "insertframe", + "wordimage", + "insertvideo", + "insertframe", + "edittip", + "edittable", + "edittd", + "scrawl", + "template", + "music", + "background", + "charts" + ] + }; + + 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, + className: "edui-for-" + cmd, + title: title, + holdScroll: cmd === "insertimage", + fullscreen: /charts|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 (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) || + cmd == "charts" + }); + 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.snapscreen = function(editor, iframeUrl, title) { + title = + editor.options.labelMap["snapscreen"] || + editor.getLang("labelMap.snapscreen") || + ""; + var ui = new editorui.Button({ + className: "edui-for-snapscreen", + title: title, + onclick: function() { + editor.execCommand("snapscreen"); + }, + theme: editor.options.theme + }); + editorui.buttons["snapscreen"] = ui; + iframeUrl = + iframeUrl || + (editor.options.iframeUrlMap || {})["snapscreen"] || + iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl: editor.ui.mapUrl(iframeUrl), + editor: editor, + className: "edui-for-snapscreen", + title: title, + 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); + } + } + ] + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener("selectionchange", function() { + ui.setDisabled(editor.queryCommandState("snapscreen") == -1); + }); + return ui; + }; + + 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); + } + }); + } + 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: 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.iframeUrlMap || {})[cmd] || + iframeUrlMap[cmd] + ) + }); + editorui.buttons[cmd] = 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["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; + }; +})(); + + +// adapter/editor.js +///import core +///commands 全屏 +///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 = []; + + 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; + + 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 + ); + + //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("property") + + ': ' + + 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.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog"; + } + if (img.src.indexOf("https://api.map.baidu.com") != -1) { + dialogName = "mapDialog"; + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog"; + } + if ( + img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1 + ) { + dialogName = "gmapDialog"; + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + "" + + editor.getLang("property") + + ': ' + + editor.getLang("modify") + + "  " + + "" + + editor.getLang("delete") + + "" + ); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog"; + } + if ( + domUtils.hasClass(img, "loadingclass") || + domUtils.hasClass(img, "loaderrorclass") + ) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = + "" + + editor.getLang("property") + + ": " + + '' + + editor.getLang("default") + + "  " + + '' + + editor.getLang("justifyleft") + + "  " + + '' + + editor.getLang("justifyright") + + "  " + + '' + + editor.getLang("justifycenter") + + "  " + + "' + + editor.getLang("modify") + + ""; + + !html && (html = popup.formatHtml(str)); + } + 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("anthorMsg") + + ': ' + + 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; + } + 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 + '
    ' + + '' + + '' + + '' + + "
    " + + '
    ' + + "
    " + ); + }, + 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" + ); + 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/neditor.css", + 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); + } + 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; + + 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; + } +}); + + +// adapter/autosave.js +UE.registerUI("autosave", function(editor) { + var timer = null, + uid = null; + editor.on("afterautosave", function() { + clearTimeout(timer); + + timer = setTimeout(function() { + if (uid) { + editor.trigger("hidemessage", uid); + } + uid = editor.trigger("showmessage", { + content: editor.getLang("autosave.success"), + timeout: 2000 + }); + }, 2000); + }); +}); + + + +})(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.all.min.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.all.min.js new file mode 100644 index 0000000..c566470 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.all.min.js @@ -0,0 +1,18 @@ +/*! + * neditor + * version: 2.1.18 + * build: Wed May 22 2019 09:16:49 GMT+0000 (UTC) + */!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor={plugins:{},commands:{},instants:{},I18N:{},_customizeUI:{},version:"1.5.0"};var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/i.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""","“":"“","”":"”",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',"“":"“","”":"”",">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file neditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.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+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
    "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode, +domUtils.remove(c),c=g}}catch(d){}}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),"SPAN"==k.tagName&&b&&b.style&&utils.each(k.getElementsByTagName("span"),function(a){a.style.cssText=a.style.cssText+";"+b.style}),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.options.textarea)if(utils.isString(b.options.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setPlaceholder:function(){function a(){var a=this.getPlainTxt();a.trim()?UE.dom.domUtils.removeClasses(this.body,"empty"):UE.dom.domUtils.addClass(this.body,"empty")}return function(b){var c=this;c.ready(function(){a.call(c),c.body.setAttribute("placeholder",b)}),c.removeListener("keyup contentchange",a),c.addListener("keyup contentchange",a)}}(),setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+""+(c.iframeJsUrl?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

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

    "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.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:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

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

    "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){ +function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

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

    ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

    '+b+"

    ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=(this.getOpt(a)||a,this.getOpt("imageUrl"),this.getOpt("serverUrl"));return b?(b+="?",utils.formatUrl(b)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"i18n/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,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),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).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(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){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":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={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};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={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"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":if(c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b),a.getOpt("rgb2Hex")){var d=b.getAttr("style");d&&b.setAttr("style",d.replace(/rgba?\(([\d,\s]+)\)/g,function(a,b){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;return b.toUpperCase()}))}break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

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

    ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
    "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


    '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){var i=e.parentNode;for(domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

    '+i.innerHTML+"

    "),f=c.document.getElementsByClassName("_img_parent_tmp")[0],f.removeAttribute("class"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){if(b=utils.isArray(b)?b:[b],b.length){var c=this,d=c.selection.getRange(),e=d.getClosedNode();if(c.fireEvent("beforeinsertimage",b)!==!0){if(!e||!/img/i.test(e.tagName)||"edui-faked-video"==e.className&&e.className.indexOf("edui-upload-video")==-1||e.getAttribute("word_img")){var f,g=[],h="";if(f=b[0],1==b.length)h=''+f.alt+'","center"==f.floatStyle&&(h='

    '+h+"

    "),g.push(h);else for(var i=0;f=b[i++];)h="

    ",g.push(h);c.execCommand("insertHtml",g.join(""))}else{var j=b.shift(),k=j.floatStyle;delete j.floatStyle,domUtils.setAttributes(e,j),c.execCommand("imagefloat",k),b.length>0&&(d.setStartAfter(e).setCursor(!1,!0),c.execCommand("insertimage",b))}c.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){g[b]&&(a.adjustmentBoundary(),a.collapsed||1!=a.startContainer.nodeType||a.traversal(function(d){var e;if(e=domUtils.isTagNode(d,"span")?d:domUtils.getElementsByTagName(d,"span")[0],e&&domUtils.isTagNode(e,"span")){var f=a.createBookmark();utils.each(domUtils.getElementsByTagName(e,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(f)}}))}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.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]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.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"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
    "+this.getContent(null,null,!0)+"
    "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
    ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.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"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
    ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
    ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
    ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
    ")):f+=a.data+"
    ",!a.nextSibling()&&/
    $/.test(f)&&(f=f.replace(/
    $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
    "}})}c.execCommand("inserthtml",'
    '+f+"
    ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.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};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
    ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

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

    ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){var a=this;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: 16px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;if((b=a.getAttr("name"))&&!a.getAttr("href")){if(/^\_Toc\d+$/.test(b))return void a.parentNode.removeChild(a);a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name")}})},commands:{anchor:{execCommand:function(b,c){var d=this.selection.getRange(),e=d.getClosedNode();if(e&&e.getAttribute("anchorname"))c?e.setAttribute("anchorname",c):(d.setStartBefore(e).setCursor(),domUtils.remove(e));else if(c){var f=utils.renderTplstr('',{name:c});a.execCommand("inserthtml",f,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
    ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/notadd/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),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=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;b&&("mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover"))}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()}),b.fireEvent("zeroclipboardready",a)}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


    ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&(d.undoManger.list.length<1&&d.undoManger.save(),setTimeout(function(){d.undoManger.save()}))}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,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:h.options.UEDITOR_HOME_URL+"themes/ueditor-list/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
    ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={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]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName; +});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

    ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null},focus:function(){c.focus()},blur:function(){c.blur()}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null},focus:function(){c.focus()},blur:function(){c.setOption("readOnly",!0),c.setOption("readOnly",!1)}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==h.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](g,b)}var c,d,e,f,g=this,h=this.options,i=!1;h.sourceEditor=browser.ie?"textarea":h.sourceEditor||"codemirror",g.setOpt({sourceEditorFirst:!1});var j,k,l;g.commands.source={execCommand:function(){if(i=!i){l=g.selection.getRange().createAddress(!1,!0),g.undoManger&&g.undoManger.save(!0),browser.gecko&&(g.body.contentEditable=!1),j=g.iframe.style.cssText,g.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",g.fireEvent("beforegetcontent");var a=UE.htmlparser(g.body.innerHTML);g.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),g.fireEvent("aftergetcontent");var h=a.toHtml(!0);c=b(g.iframe.parentNode),c.setContent(h),d=g.setContent,g.setContent=function(a){var b=UE.htmlparser(a);g.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),g.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),k=g.getContent,g.getContent=function(){return c.getContent()||"

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

    "},e=g.focus,f=g.blur,g.focus=function(){c.focus()},g.blur=function(){f.call(g),c.blur()}}else{g.iframe.style.cssText=j;var m=c.getContent()||"

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

    ";m=m.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),g.setContent=d,g.setContent(m),c.dispose(),c=null,g.getContent=k,g.focus=e,g.blur=f;var n=g.body.firstChild;if(n||(g.body.innerHTML="

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

    ",n=g.body.firstChild),g.undoManger&&g.undoManger.save(!0),browser.gecko){var o=document.createElement("input");o.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(o),g.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(o,{left:-32768,top:0}),o.focus(),setTimeout(function(){g.body.contentEditable=!0,g.selection.getRange().moveToAddress(l).select(!0),domUtils.remove(o)})})}else try{g.selection.getRange().moveToAddress(l).select(!0)}catch(p){}}this.fireEvent("sourcemodechanged",i)},queryCommandState:function(){return 0|i},notNeedUndo:1};var m=g.queryCommandState;g.queryCommandState=function(a){return a=a.toLowerCase(),i?a in{source:1,fullscreen:1}?1:-1:m.apply(this,arguments)},"codemirror"==h.sourceEditor&&g.addListener("ready",function(){utils.loadFile(document,{src:h.codeMirrorJsUrl||h.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){h.sourceEditorFirst&&setTimeout(function(){g.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:h.codeMirrorCssUrl||h.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

    "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

    "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

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

    ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[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]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.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 a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this,d=void 0===a.buttons?1===a.which:1===a.buttons;switch(a.type){case"mousedown":var e,e=a.target||a.srcElement;e.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=e.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&d&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode),h=b.editor.document;domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-(h.documentElement.scrollLeft||h.body.scrollLeft||0)-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-(h.documentElement.scrollTop||h.body.scrollTop||0)-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(f),g||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(f=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both", +e=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(i.minFrameHeight,i.initialFrameHeight)),e!=h&&(e!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=e+"px"),a.body.style.height=e+"px",h=e),domUtils.removeStyle(b,"clear"))},50))}function b(){c.window&&(null===j?j=c.window.scrollY:0==c.window.scrollY&&0!=j&&(c.window.scrollTo(0,0),j=null))}var c=this;if(c.autoHeightEnabled=c.options.autoHeightEnabled!==!1,c.autoHeightEnabled){var d,e,f,g,h=0,i=c.options;c.addListener("fullscreenchanged",function(a,b){g=b}),c.addListener("destroy",function(){domUtils.un(c.window,"scroll",b),c.removeListener("contentchange afterinserthtml keyup mouseup",a)}),c.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var c=b.document;b.autoHeightEnabled=!0,d=c.body.style.overflowY,c.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},c.disableAutoHeight=function(){c.body.style.overflowY=d||"",c.removeListener("contentchange",a),c.removeListener("keyup",a),c.removeListener("mouseup",a),c.autoHeightEnabled=!1,c.fireEvent("autoheightchanged",c.autoHeightEnabled)},c.on("setHeight",function(){c.disableAutoHeight()}),c.addListener("ready",function(){c.enableAutoHeight();var d;domUtils.on(browser.ie?c.body:c.document,browser.webkit?"dragover":"drop",function(){clearTimeout(d),d=setTimeout(function(){a.call(c)},100)}),domUtils.on(c.window,"scroll",b)});var j}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s);var a=document.getElementById("scrollBox");a&&domUtils.un(a,["scroll","resize"],e)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=f.ui.getDom("iframeholder").offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s);var c=document.getElementById("scrollBox");c&&domUtils.on(c,["scroll","resize"],e),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){if(d=utils.isArray(d)?d:[d],c.fireEvent("beforeinsertvideo",d)!==!0){for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=d&&domUtils.findParentByTagName(d,["table"]),f=e&&e.getElementsByTagName("caption")[0];return{cell:c,tr:d,table:e,caption:f}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
    ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){for(var a,b=this.cellsRange,c=this.getCell(b.beginRowIndex,this.indexTable[b.beginRowIndex][b.beginColIndex].cellIndex),d=this.getCells(b),e=0;a=d[e++];)a!==c&&(this.moveContent(c,a),this.deleteCell(a));if(c.rowSpan=b.endRowIndex-b.beginRowIndex+1,c.rowSpan>1&&c.removeAttribute("height"),c.colSpan=b.endColIndex-b.beginColIndex+1,c.colSpan>1&&c.removeAttribute("width"),c.rowSpan==this.rowsNum&&1!=c.colSpan&&(c.colSpan=1),c.colSpan==this.colsNum&&1!=c.rowSpan){var f=c.parentNode.rowIndex;if(this.table.deleteRow)for(var e=f+1,g=f+1,h=c.rowSpan;e1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
    ")+"");c.push("")}return"
    "+c.join("")+"
    "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
    ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
    "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
    ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/"+N.options.theme+"/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
    ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",a.getOpt("enableContextMenu")||!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a){var b=3==a.nodeType?a.nodeValue:a[browser.ie?"innerText":"textContent"];return b.replace(domUtils.fillChar,"")}function b(a,b,c){var d,e=b.searchStr,f=new RegExp(e,"g"+(b.casesensitive?"":"i"));if(b.dir==-1){if(a=a.substr(0,c),a=a.split("").reverse().join(""),e=e.split("").reverse().join(""),d=f.exec(a))return c-d.index-e.length}else if(a=a.substr(c),d=f.exec(a))return d.index+c;return-1}function c(c,d,e){var f,g,i=e.all||1==e.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(c)&&(c=c.firstChild);for(var j=1;c;){if(f=a(c),g=b(f,e,d),j=0,g!=-1)return{node:c,index:g};for(c=domUtils[i](c);c&&h[c.nodeName.toLowerCase()];)c=domUtils[i](c,!0);c&&(d=e.dir==-1?a(c).length:0)}}function d(b,c,e){for(var f,g=0,h=b.firstChild,i=0;h;){if(3==h.nodeType){if(i=a(h).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,g+=i,g>=c)return{node:h,index:i-(g-c)}}else if(!dtd.$empty[h.tagName]&&(i=a(h).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,g+=i,g>=c&&(f=d(h,i-(g-c),e))))return f;h=domUtils.getNextDomNode(h)}}function e(b,e){var g,h=i||b.selection.getRange(),j=e.searchStr,k=b.document.createElement("span");if(k.innerHTML="$$ueditor_searchreplace_key$$",h.shrinkBoundary(!0),!h.collapsed){h.select();var l=b.selection.getText();if(new RegExp("^"+e.searchStr+"$",e.casesensitive?"":"i").test(l)){if(void 0!=e.replaceStr)return f(h,e.replaceStr),h.select(),!0;h.collapse(e.dir==-1)}}h.insertNode(k),h.enlargeToBlockElm(!0),g=h.startContainer;var m=a(g).indexOf("$$ueditor_searchreplace_key$$");h.setStartBefore(k),domUtils.remove(k);var n=c(g,m,e);if(n){var o=d(n.node,n.index,j),p=d(n.node,n.index+j.length,j);return h.setStart(o.node,o.index).setEnd(p.node,p.index),void 0!==e.replaceStr&&f(h,e.replaceStr),h.select(),!0}h.setCursor()}function f(a,b){b=g.document.createTextNode(b),a.deleteContents().insertNode(b)}var g=this,h={table:1,tbody:1,tr:1,ol:1,ul:1},i=null;return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){i=null;var d=g.selection.getRange(),f=g.body.firstChild;for(f&&1==f.nodeType?(d.setStart(f,0),d.shrinkBoundary(!0)):3==f.nodeType&&d.setStartBefore(f),d.collapse(!0).select(!0),void 0!==b.replaceStr&&g.fireEvent("saveScene");e(this,b);)c++,i=g.selection.getRange(),i.collapse(b.dir==-1);c&&g.fireEvent("saveScene")}else void 0!==b.replaceStr&&g.fireEvent("saveScene"),e(this,b)&&(c++,i=g.selection.getRange(),i.collapse(b.dir==-1)),c&&g.fireEvent("saveScene");return c},notNeedUndo:1}},bindEvents:{clearlastSearchResult:function(){i=null}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],loadingIMG=me.options.themePath+me.options.theme+"/images/spacer.gif",imgs=me.document.querySelectorAll('[style*="url"],img'),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img"))if("IMG"==ci.nodeName){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&(remoteImages.push(src),domUtils.setAttributes(ci,{"class":"loadingclass",_src:src,src:loadingIMG}))}else{var backgroundImageurl=ci.style.cssText.replace(/.*\s?url\([\'\"]?/,"").replace(/[\'\"]?\).*/,"");/^(https?|ftp):/i.test(backgroundImageurl)&&!test(backgroundImageurl,catcherLocalDomain)&&(remoteImages.push(backgroundImageurl),ci.style.cssText=ci.style.cssText.replace(backgroundImageurl,loadingIMG),domUtils.setAttributes(ci,{"data-background":backgroundImageurl}))}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list,catchFailList=[],catchSuccessList=[],failIMG=me.options.themePath+me.options.theme+"/images/img-cracked.png";for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",oldBgIMG=ci.getAttribute("data-background")||"",j=0;cj=list[j++];){if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.removeClasses(ci,"loadingclass"),domUtils.setAttributes(ci,{src:newSrc,_src:newSrc,"data-catchResult":"img_catchSuccess"}),catchSuccessList.push(ci);break}if(oldSrc==cj.source&&"FAIL"==cj.state){domUtils.removeClasses(ci,"loadingclass"),domUtils.setAttributes(ci,{src:failIMG,_src:failIMG,"data-catchResult":"img_catchFail"}),catchFailList.push(ci);break}if(oldBgIMG==cj.source&&"SUCCESS"==cj.state){newBgIMG=catcherUrlPrefix+cj.url,ci.style.cssText=ci.style.cssText.replace(loadingIMG,newBgIMG),domUtils.removeAttributes(ci,"data-background"),domUtils.setAttributes(ci,{"data-catchResult":"img_catchSuccess"}),catchSuccessList.push(ci);break}if(oldBgIMG==cj.source&&"FAIL"==cj.state){ci.style.cssText=ci.style.cssText.replace(loadingIMG,failIMG),domUtils.removeAttributes(ci,"data-background"),domUtils.setAttributes(ci,{"data-catchResult":"img_catchFail"}),catchFailList.push(ci);break}}me.fireEvent("catchremotesuccess",catchSuccessList,catchFailList)},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(domUtils.removeClasses(c,"loadingclass"),c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),k.trigger("contentchange",c))}):(h='

    ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{defaultOptions:{enableDragUpload:!0,enablePasteUpload:!0},ready:function(d){var e=this;if(window.FormData&&window.FileReader){var f=function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}};e.getOpt("enablePasteUpload")!==!1&&domUtils.on(e.body,"paste ",f), +e.getOpt("enableDragUpload")!==!1?(domUtils.on(e.body,"drop",f),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()})):browser.gecko&&domUtils.on(e.body,"drop",function(a){c(a)&&a.preventDefault()}),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:1px solid #cccccc;margin-left: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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)}}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&window.setTimeout(function(){b.body.innerHTML=b.getPreferences(e)||"

    "+domUtils.fillHtml+"

    "},0)},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),domUtils.removeClasses(g,"loadingclass"),domUtils.on(g,"load",function(){c.fireEvent("contentchange")}),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("alt",f.original||""),g.removeAttribute("id")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){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:1px solid #cccccc;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:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!1):utils.isFunction(c)&&utils.extend(a,c(),!1)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={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 c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){if(d=utils.isArray(d)?d:[d],b.fireEvent("beforeinsertfile",d)!==!0){var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

    ";b.execCommand("insertHtml",i),b.fireEvent("afterinsertfile",d)}}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b'}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
    '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
    '+this.getContentHtmlTpl()+"
    "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
    '+a+'
    ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
    '+b.getLang("themeColor")+'
    '+b.getLang("standardColor")+"
    =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
    "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="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(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
    '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(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(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.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:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-"+(a.theme||"default")+" .edui-toolbar .edui-button.edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.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(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
    ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
    '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
    ')),this.getDom().className+=" edui-colorbutton"},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
    "+c.mergeLine+'"+c.delLine+'
    "+c.removeFormat+'"+c.indent+'
    "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.removeFontsize+'"+c.removeFontFamily+'
    "+c.removeHtml+'
    "+c.pasteFilter+'
    "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
    "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
    '),2===d&&e.push("");return'
    '+e.join("")+"
    "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
    '+this.editor.getLang("pasteOpt")+'
    '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+""},postRender:function(){for(var a=this.getDom(),c=0;c
    '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0;a'+a.join("")+""},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
    '+this.renderLabelHtml()+"
    "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,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"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
    '+b.join("")+"
    "}return'
    '+(this.title||"")+"
    "+this.closeButton.renderHtml()+'
    '+(this.autoReset?"":this.getContentHtml())+"
    "+a+"
    "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+""}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
    "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
    ×
    '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a); +},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),!function(a){var b,c='',d=(b=document.getElementsByTagName("script"))[b.length-1].getAttribute("data-injectcss"); +if(d&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(b){console&&console.log(b)}}!function(b){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(b,0);else{var c=function(){document.removeEventListener("DOMContentLoaded",c,!1),b()};document.addEventListener("DOMContentLoaded",c,!1)}else document.attachEvent&&(d=b,e=a.document,f=!1,g=function(){f||(f=!0,d())},(h=function(){try{e.documentElement.doScroll("left")}catch(a){return void setTimeout(h,50)}g()})(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,g())});var d,e,f,g,h}(function(){var a,b,d,e,f,g;(a=document.createElement("div")).innerHTML=c,c=null,(b=a.getElementsByTagName("svg")[0])&&(b.setAttribute("aria-hidden","true"),b.style.position="absolute",b.style.width=0,b.style.height=0,b.style.overflow="hidden",d=b,(e=document.body).firstChild?(f=d,(g=e.firstChild).parentNode.insertBefore(f,g)):e.appendChild(d))})}(window),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["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","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+""}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
    <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
    "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
    '+b.getLang("elementPathTip")+":
    "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("https://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
    '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=[],f=0;f
    '+(this.toolbars.length?'
    '+this.renderToolbarBoxHtml()+"
    ":"")+'
    '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"
    ");b.innerHTML='
    '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
    "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){baidu.editor.ui[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){if(c&&g.ui){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.setOpt("enableMessageShow",!0),g.getOpt("enableMessageShow")!==!1&&(g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()}))}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js index c3273ec..62e2d48 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.config.js @@ -24,12 +24,15 @@ * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 */ window.UEDITOR_CONFIG = { + videoAllowFiles: [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], //为编辑器实例添加一个路径,这个不能被注释 UEDITOR_HOME_URL: URL, // 服务器统一请求接口路径 //serverUrl: window.NEDITOR_UPLOAD || URL + "php/controller.php", - serverUrl: "", + serverUrl: "/fileUploads/ueditor/upload/file", imageActionName: "uploadimage", scrawlActionName: "uploadscrawl", videoActionName: "uploadvideo", diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js index 2fea85e..91a22e8 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.js @@ -1,64 +1,1230 @@ +/*! + * neditor parse + * version: 2.1.18 + * build: Wed May 22 2019 09:16:49 GMT+0000 (UTC) + */ + +(function(){ + (function() { - var paths = [ - 'parse.js', - 'insertcode.js', - 'table.js', - 'charts.js', - 'background.js', - 'list.js', - 'video.js' - ]; - - function getUEBasePath(docUrl, confUrl) { - return getBasePath( - docUrl || self.document.URL || self.location.href, - confUrl || getConfigFilePath() + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs: function(url) { + return url.replace(/\/$/, ""); + }, + extend: function(t, s) { + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE: isIE, + cssRule: isIE + ? function(key, style, doc) { + var indexList, index; + doc = doc || document; + if (doc.indexList) { + indexList = doc.indexList; + } else { + indexList = doc.indexList = {}; + } + var sheetStyle; + if (!indexList[key]) { + if (style === undefined) { + return ""; + } + sheetStyle = doc.createStyleSheet( + "", + (index = doc.styleSheets.length) + ); + indexList[key] = index; + } else { + sheetStyle = doc.styleSheets[indexList[key]]; + } + if (style === undefined) { + return sheetStyle.cssText; + } + sheetStyle.cssText = sheetStyle.cssText + "\n" + (style || ""); + } + : function(key, style, doc) { + doc = doc || document; + var head = doc.getElementsByTagName("head")[0], + node; + if (!(node = doc.getElementById(key))) { + if (style === undefined) { + return ""; + } + node = doc.createElement("style"); + node.id = key; + head.appendChild(node); + } + if (style === undefined) { + return node.innerHTML; + } + if (style !== "") { + node.innerHTML = node.innerHTML + "\n" + style; + } else { + head.removeChild(node); + } + }, + domReady: function(onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + } else { + if (isIE) { + (function() { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent("onload", function() { + onready(); + }); + } else { + doc.addEventListener( + "DOMContentLoaded", + function() { + doc.removeEventListener( + "DOMContentLoaded", + arguments.callee, + false + ); + onready(); + }, + false + ); + window.addEventListener( + "load", + function() { + onready(); + }, + 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; + } + } + } + }, + inArray: function(arr, item) { + var index = -1; + this.each(arr, function(v, i) { + if (v === item) { + index = i; + return false; + } + }); + return index; + }, + pushItem: function(arr, item) { + if (this.inArray(arr, item) == -1) { + arr.push(item); + } + }, + trim: function(str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); + }, + 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; + }, + hasClass: function(element, className) { + className = className + .replace(/(^[ ]+)|([ ]+$)/g, "") + .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; + }, + addClass: function(elm, classNames) { + if (!elm) return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); + for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) { + if (!new RegExp("\\b" + ci + "\\b").test(cls)) { + cls += " " + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass: function(elm, classNames) { + classNames = this.isArray(classNames) + ? classNames + : this.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 = this.trim(cls).replace(/[ ]{2,}/g, " "); + elm.className = cls; + !cls && elm.removeAttribute("className"); + }, + on: function(element, type, handler) { + var types = this.isArray(type) ? type : 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; + }, + off: function(element, type, handler) { + var types = this.isArray(type) ? type : 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]; + } + } + } + }, + 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(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function() { + throw Error( + "The load " + (obj.href || obj.src) + " fails,check the url" + ); + }; + doc.getElementsByTagName("head")[0].appendChild(element); + }; + })() + }; + utils.each( + ["String", "Function", "Array", "Number", "RegExp", "Object", "Boolean"], + function(v) { + utils["is" + v] = function(obj) { + return Object.prototype.toString.apply(obj) == "[object " + v + "]"; + }; + } + ); + var parselist = {}; + UE.parse = { + register: function(parseName, fn) { + parselist[parseName] = fn; + }, + load: function(opt) { + utils.each(parselist, function(v) { + v.call(opt, utils); + }); + } + }; + uParse = function(selector, opt) { + utils.domReady(function() { + var contents; + if (document.querySelectorAll) { + contents = document.querySelectorAll(selector); + } else { + if (/^#/.test(selector)) { + contents = [document.getElementById(selector.replace(/^#/, ""))]; + } else if (/^\./.test(selector)) { + var contents = []; + utils.each(document.getElementsByTagName("*"), function(node) { + if ( + node.className && + new RegExp("\\b" + selector.replace(/^\./, "") + "\\b", "i").test( + node.className + ) + ) { + contents.push(node); + } + }); + } else { + contents = document.getElementsByTagName(selector); + } + } + utils.each(contents, function(v) { + UE.parse.load(utils.extend({ root: v, selector: selector }, opt)); + }); + }); + }; +})(); + +UE.parse.register("insertcode", function(utils) { + var pres = this.root.getElementsByTagName("pre"); + if (pres.length) { + if (typeof XRegExp == "undefined") { + var jsurl, cssurl; + if (this.rootPath !== undefined) { + jsurl = + utils.removeLastbs(this.rootPath) + + "/third-party/SyntaxHighlighter/shCore.js"; + cssurl = + utils.removeLastbs(this.rootPath) + + "/third-party/SyntaxHighlighter/shCoreDefault.css"; + } else { + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document, { + id: "syntaxhighlighter_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile( + document, + { + id: "syntaxhighlighter_js", + src: jsurl, + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + utils.each(pres, function(pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + } + ); + } else { + utils.each(pres, function(pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + } + } +}); + +UE.parse.register("table", function(utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName("table"); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule( + "table", + selector + + " table.noBorderTable td," + + selector + + " table.noBorderTable th," + + selector + + " table.noBorderTable caption{border:1px dashed #ddd !important}" + + selector + + " table.sortEnabled tr.firstRow th," + + selector + + " table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;" + + "background-position: center right; background-image:url(" + + this.rootPath + + "themes/default/images/sortable.png);}" + + selector + + " table.sortEnabled tr.firstRow th:hover," + + selector + + " table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}" + + selector + + " table{margin-bottom:10px;border-collapse:collapse;display:table;}" + + selector + + " td," + + selector + + " th{padding: 5px 10px;border: 1px solid #DDD;}" + + selector + + " caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}" + + selector + + " th{border-top:1px solid #BBB;background:#F7F7F7;}" + + selector + + " table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}" + + selector + + " tr.ue-table-interlace-color-single td{ background: #fcfcfc; }" + + selector + + " tr.ue-table-interlace-color-double td{ background: #f7faff; }" + + selector + + " td p{margin:0;padding:0;width:auto;height:auto;}", + document ); + //填充空的单元格 + + utils.each("td th caption".split(" "), function(tag) { + var cells = root.getElementsByTagName(tag); + cells.length && + utils.each(cells, function(node) { + if (!node.firstChild) { + node.innerHTML = " "; + } + }); + }); + + //表格可排序 + var tables = root.getElementsByTagName("table"); + utils.each(tables, function(table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, "click", function(e) { + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ["td", "th"]); + var table = findParentByTagName(target, "table"), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute("data-sort-type"); + if (colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, + current = target; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + while (current) { + for (i = 0; i < tagNames.length; i++) { + if (current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + reversecurrent: function(td1, td2) { + return 1; + }, + orderbyasc: function(td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + reversebyasc: function(td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + orderbynum: function(td1, td2) { + var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( + /\d+/ + ), + value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + reversebynum: function(td1, td2) { + var value1 = td1[utils.isIE ? "innerText" : "textContent"].match( + /\d+/ + ), + value2 = td2[utils.isIE ? "innerText" : "textContent"].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute( + "data-sort-type", + compareFn && typeof compareFn === "string" && Fn[compareFn] + ? compareFn + : "" + ); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray, function(tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if ( + compareFn && + typeof compareFn === "string" && + Fn[compareFn] + ) { + result = Fn[compareFn].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } else { + result = Fn["orderbyasc"].call( + this, + tr1.cells[sortByCellIndex], + tr2.cells[sortByCellIndex] + ); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore( + fragment, + rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1] + ); + } + } + //冒泡排序 + function sort(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; + } + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!utils.hasClass(table.rows[0], "firstRow")) { + for (var i = 1; i < table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } } +}); - function getConfigFilePath() { - var configPath = document.getElementsByTagName("script"); +UE.parse.register("charts", function(utils) { + utils.cssRule( + "chartsContainerHeight", + ".edui-chart-container { height:" + + (this.chartContainerHeight || 300) + + "px}" + ); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; - return configPath[configPath.length - 1].src; + //不存在指定的根路径, 则直接退出 + if (!resourceRoot) { + return; } - function getBasePath(docUrl, confUrl) { - var basePath = confUrl; + if ((sources = parseSources())) { + loadResources(); + } - if (!/^[a-z]+:/i.test(confUrl)) { - docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ""); + function parseSources() { + if (!containers) { + return null; + } - basePath = docUrl + "" + confUrl; + return extractChartData(containers); + } + + /** + * 提取数据 + */ + function extractChartData(rootNode) { + var data = [], + tables = rootNode.getElementsByTagName("table"); + + for (var i = 0, tableNode; (tableNode = tables[i]); i++) { + if (tableNode.getAttribute("data-chart") !== null) { + data.push(formatData(tableNode)); + } } - return optimizationPath(basePath); + return data.length ? data : null; } - function optimizationPath(path) { - var protocol = /^[a-z]+:\/\//.exec(path)[0], - tmp = null, - res = []; + function formatData(tableNode) { + var meta = tableNode.getAttribute("data-chart"), + metaConfig = {}, + data = []; - path = path.replace(protocol, "").split("?")[0].split("#")[0]; + //提取table数据 + for (var i = 0, row; (row = tableNode.rows[i]); i++) { + var rowData = []; - path = path.replace(/\\/g, "/").split(/\//); + for (var j = 0, cell; (cell = row.cells[j]); j++) { + var value = cell.innerText || cell.textContent || ""; + rowData.push(cell.tagName == "TH" ? value : value | 0); + } + + data.push(rowData); + } + + //解析元信息 + meta = meta.split(";"); + for (var i = 0, metaData; (metaData = meta[i]); i++) { + metaData = metaData.split(":"); + metaConfig[metaData[0]] = metaData[1]; + } + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + } - path[path.length - 1] = ""; + //加载资源 + function loadResources() { + loadJQuery(); + } + + function loadJQuery() { + //不存在jquery, 则加载jquery + if (!window.jQuery) { + utils.loadFile( + document, + { + src: resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + loadHighcharts(); + } + ); + } else { + loadHighcharts(); + } + } + + function loadHighcharts() { + //不存在Highcharts, 则加载Highcharts + if (!window.Highcharts) { + utils.loadFile( + document, + { + src: resourceRoot + "/third-party/highcharts/highcharts.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + loadTypeConfig(); + } + ); + } else { + loadTypeConfig(); + } + } - while (path.length) { - if ((tmp = path.shift()) === "..") { - res.pop(); - } else if (tmp !== ".") { - res.push(tmp); + //加载图表差异化配置文件 + function loadTypeConfig() { + utils.loadFile( + document, + { + src: resourceRoot + "/dialogs/charts/chart.config.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, + function() { + render(); } + ); + } + + //渲染图表 + function render() { + var config = null, + chartConfig = null, + container = null; + + for (var i = 0, len = sources.length; i < len; i++) { + config = sources[i]; + + chartConfig = analysisConfig(config); + + container = createContainer(config.table); + + renderChart(container, typeConfig[config.meta.chartType], chartConfig); } + } - return protocol + res.join("/"); + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart(container, typeConfig, config) { + $(container).highcharts( + $.extend({}, typeConfig, { + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [ + { + value: 0, + width: 1, + color: "#808080" + } + ] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: "vertical", + align: "right", + verticalAlign: "middle", + borderWidth: 1 + }, + series: config.series + }) + ); } - var baseURL = getUEBasePath() + "_parse/"; - for (var i = 0, pi; (pi = paths[i++]); ) { - document.write( - '' + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer(tableNode) { + var container = document.createElement("div"); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild(container, tableNode); + + return container; + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig(config) { + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if (meta.dataFormat != "1") { + for (var i = 0, len = data.length; i < len; i++) { + for (var j = 0, jlen = data[i].length; j < jlen; j++) { + if (!result[j]) { + result[j] = []; + } + + result[j][i] = data[i][j]; + } + } + + data = result; + } + + result = {}; + + //普通图表 + if (meta.chartType != typeConfig.length - 1) { + categories = data[0].slice(1); + + for (var i = 1, curData; (curData = data[i]); i++) { + series.push({ + name: curData[0], + data: curData.slice(1) + }); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + } else { + var curData = []; + + for (var i = 1, len = data[0].length; i < len; i++) { + curData.push([data[0][i], data[1][i] | 0]); + } + + //饼图 + series[0] = { + type: "pie", + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + } + + return result; + } +}); + +UE.parse.register("background", function(utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName("p"), + styles; + + for (var i = 0, ci; (ci = p[i++]); ) { + styles = ci.getAttribute("data-background"); + if (styles) { + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && + utils.cssRule( + "ueditor_background", + me.selector + "{" + styles + "}", + document + ); +}); + +UE.parse.register("list", function(utils) { + var customCss = [], + customStyle = { + cn: "cn-1-", + cn1: "cn-2-", + cn2: "cn-3-", + num: "num-1-", + num1: "num-2-", + num2: "num-3-", + dash: "dash", + dot: "dot" + }; + + utils.extend(this, { + liiconpath : utils.removeLastbs(this.rootPath) + '/themes/ueditor-list/', + listDefaultPaddingLeft: "20" + },true); + + var root = this.root, + ols = root.getElementsByTagName("ol"), + uls = root.getElementsByTagName("ul"), + selector = this.selector; + + if (ols.length) { + applyStyle.call(this, ols); + } + + if (uls.length) { + applyStyle.call(this, uls); + } + + if (ols.length || uls.length) { + customCss.push(selector + " .list-paddingleft-1{padding-left:0}"); + customCss.push( + selector + + " .list-paddingleft-2{padding-left:" + + this.listDefaultPaddingLeft + + "px}" ); + customCss.push( + selector + + " .list-paddingleft-3{padding-left:" + + this.listDefaultPaddingLeft * 2 + + "px}" + ); + + utils.cssRule( + "list", + selector + + " ol," + + selector + + " ul{margin:0;padding:0;}\n" + + selector + + " li{clear:both;}\n" + + customCss.join("\n"), + document + ); + } + function applyStyle(nodes) { + var T = this; + utils.each(nodes, function(list) { + if (list.className && /custom_/i.test(list.className)) { + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if (listStyle == "dash" || listStyle == "dot") { + utils.pushItem( + customCss, + selector + + " li.list-" + + customStyle[listStyle] + + "{background-image:url(" + + T.liiconpath + + customStyle[listStyle] + + ".gif)}" + ); + utils.pushItem( + customCss, + selector + + " ul.custom_" + + listStyle + + "{list-style:none;} " + + selector + + " ul.custom_" + + listStyle + + " li{background-position:0 3px;background-repeat:no-repeat}" + ); + } else { + var index = 1; + utils.each(list.childNodes, function(li) { + if (li.tagName == "LI") { + utils.pushItem( + customCss, + selector + + " li.list-" + + customStyle[listStyle] + + index + + "{background-image:url(" + + T.liiconpath + + "list-" + + customStyle[listStyle] + + index + + ".gif)}" + ); + index++; + } + }); + utils.pushItem( + customCss, + selector + + " ol.custom_" + + listStyle + + "{list-style:none;}" + + selector + + " ol.custom_" + + listStyle + + " li{background-position:0 3px;background-repeat:no-repeat}" + ); + } + switch (listStyle) { + case "cn": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:25px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:55px}" + ); + break; + case "cn1": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:30px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:55px}" + ); + break; + case "cn2": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:40px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:55px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-3{padding-left:68px}" + ); + break; + case "num": + case "num1": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:25px}" + ); + break; + case "num2": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-1{padding-left:35px}" + ); + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft-2{padding-left:40px}" + ); + break; + case "dash": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft{padding-left:35px}" + ); + break; + case "dot": + utils.pushItem( + customCss, + selector + + " li.list-" + + listStyle + + "-paddingleft{padding-left:20px}" + ); + } + } + }); } +}); + +UE.parse.register("vedio", function(utils) { + var video = this.root.getElementsByTagName("video"), + audio = this.root.getElementsByTagName("audio"); + + document.createElement("video"); + document.createElement("audio"); + if (video.length || audio.length) { + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + "/third-party/video-js/video.js", + cssurl = sourcePath + "/third-party/video-js/video-js.min.css", + swfUrl = sourcePath + "/third-party/video-js/video-js.swf"; + + if (window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document, { + id: "video_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile( + document, + { + id: "video_js", + src: jsurl, + tag: "script", + type: "text/javascript" + }, + function() { + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + } + ); + } + } +}); + + })(); diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.min.js b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.min.js new file mode 100644 index 0000000..938628d --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/neditor.parse.min.js @@ -0,0 +1,5 @@ +/*! + * neditor parse + * version: 2.1.18 + * build: Wed May 22 2019 09:16:51 GMT+0000 (UTC) + */!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;c static */ - /*_position: static !important;* -} - -.edui-default .edui-editor-iframeholder textarea { - font-family: consolas, "Courier New", "lucida console", monospace; - font-size: 12px; - line-height: 18px; -} - -.edui-default .edui-editor-bottombar { - /*border-top: 1px solid #ccc;*/ - /*height: 20px;*/ - /*width: 40%;*/ - /*float: left;*/ - /*overflow: hidden;*/ -} - -.edui-default .edui-editor-bottomContainer { - overflow: hidden; -} - -.edui-default .edui-editor-bottomContainer table { - width: 100%; - height: 0; - overflow: hidden; - border-spacing: 0; -} - -.edui-default .edui-editor-bottomContainer td { - white-space: nowrap; - border-top: 1px solid #ccc; - line-height: 20px; - font-size: 12px; - font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; -} - -.edui-default .edui-editor-wordcount { - text-align: right; - margin-right: 5px; - color: #aaa; -} -.edui-default .edui-editor-scale { - width: 12px; -} -.edui-default .edui-editor-scale .edui-editor-icon { - float: right; - width: 100%; - height: 12px; - margin-top: 10px; - background: url(../images/scale.png) no-repeat; - cursor: se-resize; -} -.edui-default .edui-editor-breadcrumb { - margin: 2px 0 0 3px; -} - -.edui-default .edui-editor-breadcrumb span { - cursor: pointer; - text-decoration: underline; - color: blue; -} - -.edui-default .edui-toolbar .edui-for-fullscreen { - float: right; -} - -.edui-default .edui-bubble .edui-popup-content { - border: 1px solid #DCAC6C; - background-color: #fff6d9; - padding: 5px; - font-size: 10pt; - font-family: "宋体"; -} - -.edui-default .edui-bubble .edui-shadow { - /*box-shadow: 1px 1px 3px #818181;*/ - /*-webkit-box-shadow: 2px 2px 3px #818181;*/ - /*-moz-box-shadow: 2px 2px 3px #818181;*/ - /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ -} - -.edui-default .edui-editor-toolbarmsg { - background-color: #FFF6D9; - border-bottom: 1px solid #ccc; - position: absolute; - bottom: -25px; - left: 0; - z-index: 1009; - width: 99.9%; -} - -.edui-default .edui-editor-toolbarmsg-upload { - font-size: 14px; - color: blue; - width: 100px; - height: 16px; - line-height: 16px; - cursor: pointer; - position: absolute; - top: 5px; - left: 350px; -} - -.edui-default .edui-editor-toolbarmsg-label { - font-size: 12px; - line-height: 16px; - padding: 4px; -} - -.edui-default .edui-editor-toolbarmsg-close { - float: right; - width: 20px; - height: 16px; - line-height: 16px; - cursor: pointer; - color: red; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css deleted file mode 100644 index 92bf7aa..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menu.css +++ /dev/null @@ -1,46 +0,0 @@ -/* 可选中按钮弹出菜单*/ -.edui-default .edui-menu { - z-index: 3000; -} - -.edui-default .edui-menu .edui-popup-content { - padding: 3px; -} - -.edui-default .edui-menu-body { - _width: 150px; - min-width: 170px; - background: url("../images/sparator_v.png") repeat-y 25px; -} - -.edui-default .edui-menuitem-body { -} - -.edui-default .edui-menuitem { - height: 20px; - cursor: default; - vertical-align: top; -} - -.edui-default .edui-menuitem .edui-icon { - width: 20px !important; - height: 20px !important; - background: url(../images/icons.png) 0 -4000px; - background: url(../images/icons.gif) 0 -4000px\9; -} - -.edui-default .edui-menuitem .edui-label { - font-size: 12px; - line-height: 20px; - height: 20px; - padding-left: 10px; -} - -.edui-default .edui-state-checked .edui-menuitem-body { - background: url("../images/icons-all.gif") no-repeat 6px -205px; -} - -.edui-default .edui-state-disabled .edui-menuitem-label { - color: gray; -} - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css deleted file mode 100644 index 9665192..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/menubutton.css +++ /dev/null @@ -1,72 +0,0 @@ -/*可选中菜单按钮*/ -.edui-default .edui-list .edui-bordereraser { - display: none; -} - -.edui-default .edui-listitem { - padding: 1px; - white-space: nowrap; -} - -.edui-default .edui-list .edui-state-hover { - position: relative; - background-color: #fff5d4; - border: 1px solid #dcac6c; - padding: 0; -} - -.edui-default .edui-for-fontfamily .edui-listitem-label { - min-width: 130px; - _width: 120px; - font-size: 12px; - height: 22px; - line-height: 22px; - padding-left: 5px; -} -.edui-default .edui-for-insertcode .edui-listitem-label { - min-width: 120px; - _width: 120px; - font-size: 12px; - height: 22px; - line-height: 22px; - padding-left: 5px; -} -.edui-default .edui-for-underline .edui-listitem-label { - min-width: 120px; - _width: 120px; - padding: 3px 5px; - font-size: 12px; -} - -.edui-default .edui-for-fontsize .edui-listitem-label { - min-width: 120px; - _width: 120px; - padding: 3px 5px; - -} - -.edui-default .edui-for-paragraph .edui-listitem-label { - min-width: 200px; - _width: 200px; - padding: 2px 5px; -} - -.edui-default .edui-for-rowspacingtop .edui-listitem-label, -.edui-default .edui-for-rowspacingbottom .edui-listitem-label { - min-width: 53px; - _width: 53px; - padding: 2px 5px; -} - -.edui-default .edui-for-lineheight .edui-listitem-label { - min-width: 53px; - _width: 53px; - padding: 2px 5px; -} - -.edui-default .edui-for-customstyle .edui-listitem-label { - min-width: 200px; - _width: 200px; - width: 200px !important; - padding: 2px 5px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css deleted file mode 100644 index 3088efd..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/message.css +++ /dev/null @@ -1,66 +0,0 @@ -.edui-default .edui-editor-messageholder { - display: block; - width: 150px; - height: auto; - border: 0; - margin: 0; - padding: 0; - position: absolute; - top: 28px; - right: 3px; -} - -.edui-default .edui-message{ - min-height: 10px; - text-shadow: 0 1px 0 rgba(255,255,255,0.5); - padding: 0; - margin-bottom: 3px; - position: relative; -} -.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{ - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1 -} -.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{ - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7 -} -.edui-default .edui-message .edui-message-closer { - display: block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 0; - right: 0; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - float: right; - font-size: 20px; - font-weight: bold; - color: #999; - text-shadow: 0 1px 0 #fff; - 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; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css deleted file mode 100644 index 78f354b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/multiMenu.css +++ /dev/null @@ -1,29 +0,0 @@ -/*表情按钮及弹出菜单*/ -/*去除了表情的下拉箭头*/ -.edui-default .edui-for-emotion .edui-icon { - background-position: -60px -20px; -} -.edui-default .edui-for-emotion .edui-popup-content iframe -{ - width: 514px; - height: 380px; - overflow: hidden; -} -.edui-default .edui-for-emotion .edui-popup-content -{ - position: relative; - z-index: 555 -} - -.edui-default .edui-for-emotion .edui-splitborder { - display: none -} - -.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow -{ - width: 0 -} -.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder -{ - border-left: 1px solid transparent; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css deleted file mode 100644 index 9118c06..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/paragraphpicker.css +++ /dev/null @@ -1,45 +0,0 @@ -/*段落弹出菜单*/ -.edui-default .edui-for-paragraph .edui-listitem-label { - font-family: Tahoma, Verdana, Arial, Helvetica; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { - font-size: 22px; - line-height: 27px; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { - font-weight: bolder; - font-size: 32px; - line-height: 36px; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { - font-weight: bolder; - font-size: 27px; - line-height: 29px; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { - font-weight: bolder; - font-size: 19px; - line-height: 23px; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { - font-weight: bolder; - font-size: 16px; - line-height: 19px -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { - font-weight: bolder; - font-size: 13px; - line-height: 16px; -} - -.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { - font-weight: bolder; - font-size: 12px; - line-height: 14px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css deleted file mode 100644 index 73c5b95..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/pastepicker.css +++ /dev/null @@ -1,72 +0,0 @@ -/*粘贴弹出菜单*/ -.edui-default .edui-wordpastepop .edui-popup-content{ - border: none; - padding: 0; - width: 54px; - height: 21px; -} -.edui-default .edui-pasteicon { - width: 100%; - height: 100%; - background-image: url('../images/wordpaste.png'); - background-position: 0 0; -} - -.edui-default .edui-pasteicon.edui-state-opened { - background-position: 0 -34px; -} - -.edui-default .edui-pastecontainer { - position: relative; - visibility: hidden; - width: 97px; - background: #fff; - border: 1px solid #ccc; -} - -.edui-default .edui-pastecontainer .edui-title { - font-weight: bold; - background: #F8F8FF; - height: 25px; - line-height: 25px; - font-size: 12px; - padding-left: 5px; -} - -.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{ - float: left; - cursor: pointer; - width: 29px; - height: 29px; - margin-left: 5px; - background-image: url('../images/wordpaste.png'); - background-repeat: no-repeat; -} -.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { - margin-left: 0; - background-position: -109px 0; -} -.edui-default .edui-pastecontainer .edui-button .edui-tagicon { - background-position: -148px 1px; -} - -.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { - background-position: -72px 0; -} - -.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{ - background-position: -148px -34px; -} -.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ - background-position: -72px -34px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css deleted file mode 100644 index f304ab1..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/popup.css +++ /dev/null @@ -1,75 +0,0 @@ -/* 弹出菜单 */ -.edui-default .edui-popup { - z-index: 3000; - background-color: #ffffff; - width:auto; - height:auto; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.edui-default .edui-popup .edui-shadow { - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.edui-default .edui-popup-content { - border:1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - padding: 5px; - background:#ffffff; -} - -.edui-default .edui-popup .edui-bordereraser { - background-color: white; - height: 3px; -} - -.edui-default .edui-menu .edui-bordereraser { - height: 3px; -} - -.edui-default .edui-anchor-topleft .edui-bordereraser { - left: 1px; - top: -2px; -} - -.edui-default .edui-anchor-topright .edui-bordereraser { - right: 1px; - top: -2px; -} - -.edui-default .edui-anchor-bottomleft .edui-bordereraser { - left: 0; - bottom: -6px; - height: 7px; - border-left: 1px solid gray; - border-right: 1px solid gray; -} - -.edui-default .edui-anchor-bottomright .edui-bordereraser { - right: 0; - bottom: -6px; - height: 7px; - border-left: 1px solid gray; - border-right: 1px solid gray; -} - -.edui-popup div{ - width:auto; - height:auto; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css deleted file mode 100644 index f932a60..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/separtor.css +++ /dev/null @@ -1,8 +0,0 @@ -/*分隔线*/ -.edui-default .edui-toolbar .edui-separator { - width: 2px; - height: 20px; - margin: 2px 4px 2px 3px; - background: url(../images/icons.png) -181px 0; - background: url(../images/icons.gif) -181px 0 \9; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css deleted file mode 100644 index ec4a81a..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/shortcutmenu.css +++ /dev/null @@ -1,9 +0,0 @@ -/*弹出菜单*/ -.edui-default .edui-shortcutmenu { - padding: 2px; - width: 190px; - height: 50px; - background-color: #fff; - border: 1px solid #ccc; - border-radius: 5px; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css deleted file mode 100644 index ef76672..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/splitbutton.css +++ /dev/null @@ -1,84 +0,0 @@ -/*splitbutton*/ -.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, -.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { - background: url(../images/icons.png) -741px 0; - _background: url(../images/icons.gif) -741px 0; - height: 20px; - width: 9px; -} - -.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, -.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { - padding: 1px; -} - -.edui-default .edui-toolbar .edui-splitborder { - width: 1px; - height: 20px; -} - -.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { - width: 1px; - border-left: 0px solid #dcac6c; -} - -.edui-default .edui-toolbar .edui-state-active .edui-splitborder { - width: 0; - border-left: 1px solid gray; -} - -.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { - width: 1px; - border: 0; -} - -.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, -.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { - background-color: #fff5d4; - border: 1px solid #dcac6c; - padding: 0; -} - -.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, -.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { - background-color: #FFE69F; - border: 1px solid #DCAC6C; - padding: 0; -} - -.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, -.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { - background-color: #ffffff; - border: 1px solid gray; - padding: 0; -} - -.edui-default .edui-state-disabled .edui-arrow { - opacity: 0.3; - _filter: alpha(opacity = 30); -} - -.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, -.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { - background-color: white; - border: 1px solid gray; - padding: 0; -} - -.edui-default .edui-for-insertorderedlist .edui-bordereraser, -.edui-default .edui-for-lineheight .edui-bordereraser, -.edui-default .edui-for-rowspacingtop .edui-bordereraser, -.edui-default .edui-for-rowspacingbottom .edui-bordereraser, -.edui-default .edui-for-insertunorderedlist .edui-bordereraser { - background-color: white; -} - -/* 解决嵌套导致的图标问题 */ -.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, -.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, -.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, -.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 ; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css deleted file mode 100644 index 34232ed..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/tablepicker.css +++ /dev/null @@ -1,40 +0,0 @@ -/* 表格弹出菜单 */ -.edui-default .edui-for-inserttable .edui-splitborder { - display: none -} -.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { - width: 0 -} -.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; - font-size: 12px; - width: 220px; - margin-bottom: 3px; - clear: both; -} - -.edui-default .edui-tablepicker .edui-infoarea .edui-label { - float: left; -} - -.edui-default .edui-dialog-buttons .edui-label { - line-height: 24px; -} - -.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { - float: right; -} - -.edui-default .edui-tablepicker .edui-pickarea { - background: url("../images/unhighlighted.gif") repeat; - height: 220px; - width: 220px; -} - -.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { - background: url("../images/highlighted.gif") repeat; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css deleted file mode 100644 index 9f7db12..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/toolbar.css +++ /dev/null @@ -1,18 +0,0 @@ -/* 工具栏 */ -.edui-default .edui-toolbar { - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - padding: 1px; - overflow: hidden; /*全屏下单独一行不占位*/ - zoom: 1; - width:auto; - height:auto; -} - -.edui-default .edui-toolbar .edui-button, -.edui-default .edui-toolbar .edui-splitbutton, -.edui-default .edui-toolbar .edui-menubutton, -.edui-default .edui-toolbar .edui-combox { - margin: 1px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css deleted file mode 100644 index fee7d83..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/ueditor.css +++ /dev/null @@ -1,59 +0,0 @@ -/*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载 -*/ - -/*-------基础UI构建,必须加载-------*/ -@import "uibase.css"; -@import "toolbar.css"; -@import "editor.css"; - - -/*-------可选中菜单按钮,按需加载-------*/ - /*可选中菜单按钮--依赖splitbutton*/ -@import "menubutton.css"; - /*可选中菜单按钮-弹出菜单*/ -@import "menu.css"; - - -/*-------不可选中菜单按钮,按需加载-------*/ - /*不可选中菜单按钮--依赖splitbutton*/ -@import "combox.css"; - - -/*-------按钮类型,按需加载-------*/ - /*普通按钮*/ -@import "button.css"; - /*按钮icon*/ -@import "buttonicon.css"; - /*弹出菜单按钮-附加按钮*/ -@import "splitbutton.css"; - /*弹出菜单*/ -@import "popup.css"; - /*提示消息*/ -@import "message.css"; - - -/*-------独立按钮样式,按需加载-------*/ - /*弹出对话框样式*/ -@import "dialog.css"; - /*段落格式弹出菜单*/ -@import "paragraphpicker.css"; - /*表格弹出菜单*/ -@import "tablepicker.css"; - /*颜色弹出菜单*/ -@import "colorpicker.css"; - /*自动排版弹出菜单*/ -@import "autotypesetpicker.css"; - /*平均分布菜单*/ -@import "cellalignpicker.css"; - /*分隔线*/ -@import "separtor.css"; - /*颜色按钮--依赖splitbutton*/ -@import "colorbutton.css"; - /*表情按钮--依赖splitbutton*/ -@import "multiMenu.css"; - /*右键菜单*/ -@import "contextmenu.css"; - /*快捷菜单*/ -@import "shortcutmenu.css"; - /*粘贴提示*/ -@import "pastepicker.css"; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css deleted file mode 100644 index 6be464c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/_css/uibase.css +++ /dev/null @@ -1,115 +0,0 @@ -/*基础UI构建 -*/ -/* common layer */ -.edui-default .edui-box { - border: none; - padding: 0; - margin: 0; - overflow: hidden; -} - -.edui-default a.edui-box { - display: block; - text-decoration: none; - color: black; -} - -.edui-default a.edui-box:hover { - text-decoration: none; -} - -.edui-default a.edui-box:active { - text-decoration: none; -} - -.edui-default table.edui-box { - border-collapse: collapse; -} - -.edui-default ul.edui-box { - list-style-type: none; -} - -div.edui-box { - position: relative; - display: -moz-inline-box !important; - display: inline-block !important; - vertical-align: top; -} - -.edui-default .edui-clearfix { - zoom: 1 -} - -.edui-default .edui-clearfix:after { - content: '\20'; - display: block; - clear: both; -} - - * 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-popup { - position: absolute; - -webkit-user-select: none; - -moz-user-select: none; -} - -.edui-default .edui-popup .edui-shadow { - position: absolute; - z-index: -1; -} - -.edui-default .edui-popup .edui-bordereraser { - position: absolute; - overflow: hidden; -} - -.edui-default .edui-tablepicker .edui-canvas { - position: relative; -} - -.edui-default .edui-tablepicker .edui-canvas .edui-overlay { - position: absolute; -} - -.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.edui-default .edui-toolbar { - position: relative; -} - -/* - * default theme - */ -.edui-default .edui-label { - cursor: default; -} - -.edui-default span.edui-clickable { - color: blue; - cursor: pointer; - text-decoration: underline; -} - -.edui-default span.edui-unclickable { - color: gray; - cursor: default; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css deleted file mode 100644 index cd663d5..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/dialogbase.css +++ /dev/null @@ -1,100 +0,0 @@ -/*弹出对话框页面样式组件 -*/ - -/*reset -*/ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, font, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td { - margin: 0; - padding: 0; - outline: 0; - font-size: 100%; -} - -body { - line-height: 1; -} - -ol, ul { - list-style: none; -} - -blockquote, q { - quotes: none; -} - -ins { - text-decoration: none; -} - -del { - text-decoration: line-through; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -/*module -*/ -body { - background-color: #fff; - font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; - color: #646464; -} - -/*tab*/ -.tabhead { - position: relative; - z-index: 10; -} - -.tabhead span { - display: inline-block; - padding: 0 5px; - height: 30px; - border: 1px solid #ccc; - background: url("images/dialog-title-bg.png") repeat-x; - text-align: center; - line-height: 30px; - cursor: pointer; - *margin-right: 5px; -} - -.tabhead span.focus { - height: 31px; - border-bottom: none; - background: #fff; -} - -.tabbody { - position: relative; - top: -1px; - margin: 0 auto; - border: 1px solid #ccc; -} - -/*button*/ -a.button { - display: block; - text-align: center; - line-height: 24px; - text-decoration: none; - height: 24px; - width: 95px; - border: 0; - color: #838383; - background: url(../../themes/default/images/icons-all.gif) no-repeat; -} - -a.button:hover { - background-position: 0 -30px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/anchor.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/anchor.gif deleted file mode 100644 index 5aa797b2240a432d9f3f1d166ed5542eaf684937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmZ?wbhEHb6kygJ|Uu&?oD;%Ae!z@09(NL_hv#6Slx0y!YR{?r|LJZgAju=f-$sQVWNL{+Tsz18#+~Ke%+zTWns()WcPwy8dQcr!JH# U&i)o#ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_down.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_down.png deleted file mode 100644 index e9257e83b00375259f2f724c7cbac03d0df5ceb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_up.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/arrow_up.png deleted file mode 100644 index 74277af1e6a8ef91f8fe664efde11377a5292dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/button-bg.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/button-bg.gif deleted file mode 100644 index ec7fa2eabf0705226fe0c488d65198508bf547e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cancelbutton.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cancelbutton.gif deleted file mode 100644 index df4bc2c06d485df4403d689c98ee745a4cde8e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_h.gif deleted file mode 100644 index d7c3e7e9eb5755d57ec03c34097c258244abe61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/cursor_v.gif deleted file mode 100644 index bb508db552b6ac3f670f9ce1fcb1e55669db0dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/filescan.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/filescan.png deleted file mode 100644 index 1d271588692c1726e3521032f71d8354b66fab0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4282 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/highlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/highlighted.gif deleted file mode 100644 index 9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons-all.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons-all.gif deleted file mode 100644 index 21915e59dede0aa22cda8c7097a14f0f1f68906c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 zcmWlYc|g*K8^!@mQ327sYPRf{nw7a~O0^mt9=R-=9nQ=_hjV7mZB1R*0581p_$if} zc%)>OT8em^m|}{eqIpyzAYzIl2zf`Y0c|BYU+ z@9XPZTU%RQUDfGyTCG;2(EtFTR;!gt<;uzm>t(VQ)UK_r>9jg*R^g{tJNu0 zfJ_0X04--|eC(refH$!qQ}zyy^$d*8FDd4v%W~!Vf@(>jT97G3l6ir6Zf;2-UXaO@ zfK;xOtJb}s5&&gN6{yv&uB~ZxI#3I)u7|CyYJnjwzysA28s$51rAMRUXjJ`L^$@5W z)~ZK9B~Pm!1yy4j#amF`safgKDmfZuzg9H}t_*_99U4U!DDT!N`alI2R19fWhBeA@ z(!ERIQX431*DQB}vM!ChN2BQ1t_*4v!&-KVPX|sM1Sc=@;wtOHF!N3;4MSoNwiiywb`z z+T}t0bcSA#r5EPtMR|JBBmGQ)UR)WQa}uo0MPQHxsNH9l#r z{$E37&LE4fTi}ciyiu*lmZWo?)oE%zqrN;@J>59bU8WYabiB${3)=uud-IE&hUZyo z5v#wgL@n-`8*gf^%5Qp^$8IXoNe6X{Ja!A6|Gs--s8ihYM9p8%>JYuj5V0uY?tF1K zRlP7NXiN~crcA%OH_aeSJ^!8mGFl}b)oC^B6$C+0rBcb|a+ypfl}hL4=4NMSMIw+bIE=;&x`Yinw1VlWuR#l`9A>0~lF zIyyQsGBP3}A~ZAC*?3}(Ig+dxC;Is%YA|B>(?6A-u_qF?<2 z(*NNw6u!|Vm|b1ON<#1O4QBS+Goi2p;UCyF!nWJ9U4MRorj_>OI0sY&_q=-Ao9}FV z=Zl!gC*4mxOlW2vwDN&MY@F#9-&*=$i5IJA2jTTIuP7nK_aEOnmyzH21>r|MhAQ4y z;WDF-l#k3c!VHHhuJ$rsOx8yU-~ID_eS708zYW}vz4cX7Z7`X@%AZy}%_48y9n#0F z5q49|jBOUq6NtUk1Ghf)HN2i3pq)%@{r1s*@7|Jt=OLWKcYYb(yuqI8*Tj%cGXI$W z#A&Ku8n42e<*qg{mxb(m#o&Nvd_5BiE?Jh1~W z(HFA6t*@iKtRVXHTsbY#_V2Uf|UpA|J zZy}G--t@TCz#ns5{?Jv&SsWJe7hZF{c1vq{mu^Yx#*RIYvpAx2>vkD8OhGsuwL9O5 zl%R;L#s$XwVw0?E_fqr9&=JE%4=emB^8$yBl6_$d*iPihofe&M;7*mY4ur>ojD_}2 zi?UQ(;te;q86NJn@I(~FqkZD{$k{vdBji2K<(2YxJI#tZ(Vhpt{+@;it~q5L;IQp& z|F`M|#Q@fL?+W*nt@MCpz=fJlYXmpK)B1vg#arHm%eR#yfj_@cjt0l1e`9&!0^V~N zzn{Co_9n&RtxZI|R5cmZy;uF=&imWy$@7%+Mz&We`lDYN+@bk(*<7=V1g6POF9AWC z$08sk|61f>dj~-7Gzcwid23e?vk1=8l3X>C()`G~lI(nZ;>^Ko|1#`<>vYvF)V`0@ zN}01SwTq12BK7BkwsN)usndeJ%yz2M$@@H(bPBF_)qQ&sLhiGz(ySY@GXuR9zJs5% zZw(OT|GEZB%B$7@;)Nyn&T$r_We4fttF={Nw(2`gI$ZuxSB7uj;htsccLTN&euf6K zWw#q0mJ!iuG(%geiC^ipjhPUKn}$AEKb*kQ0Z|0^_UW*EEQ@zOQ)KE*HZi;AA4i(T zxtztP{E$ns!t@oPV%V%NHL@fuq8P0|jXxPsARukx*}2^>GQGg#CZ0?ywkr4Ww4bQ9 zD#IqY+@DT;l<@N4l<@BgK*Dcb?saGL8?4H9f?2oKD zb(P;?(+e+kFh0#bu~|+bpDEpLyUXVa|AcKTq-$@sh4ThxMJAJ7>gdtabM~%0hlY6S z?A>$P2X;O11Dxl6qbB7_d{$~JE^*J#r+b4Y-##-v@qLws}tREGRoz9=TI! zTjpD~KfkB%{EO|IJ^}$x%T9B`gA|X)`pVqvdpMDI6;I;jMu&LQs95IpEh3o_re;@0 z4DF=78Kxc9Nz91x`Q;zp9^)e&MS5yfb%{MtnTr`)Mt0qg+oDD|mo_h>9=bc)FZq|B z*gE6LlErNeZ=mDf9USyF!P+N|CmmBAhh#0X+ywCR-W!w|8|)GxAUElZ;y8r0hrea_ zZL4olvLC48xUz5d_Cfhs0bVU7U+m);AItL%VBIk&_q=Fz0$Gyz6oq@H!R|UzT;co& zo#h5FlY$nB<}5nPKG=`v!G{iYkqy3_^0`&a9?T%QiocLLBn3B3WH7dS*-NqWA=aL# zSo%qOA88_n2Q_a&MW5e*H~v-tHIEJy)lfN=p&q^C{dZNbX~-90-rr9QJyzAy{iN5O zveK?s7u!@~y!Ja51-;RePuL{^r#44W63^M6uq&p&xP;3xJ2=KS!TPwOBM6DX?I)NR z3r|-|X#5_4U_7QgZbP7ugAHvP?H_fzas974*%M79M@btQsfl>5P4i}==gxmA365B( z=_U5kgC~>(r&EFk8HfG#v7!xoVyDf1B6L{N2)KQ?<7R~zFT#P2)PoMisGn)9t!Q1s zcid^jpV(8IW531|c`yrGcf&34+Rv^1%J!7TaYR7+X5@eU+RhIM2g{d z%i{vejlzwG+&j14{a~`yc#}n;gI79!+SFeXXptw0&)Zu>c8Ke+hWzXHRnW4@bt|ED zl`Q`8U@+qP{bId!E`9mC?DN3~O2Gcxk*;6O=ra99#eHw#cW56AQvGFzcJzcL>?UQw zukYM$_cHA5zvg=>zVRfx7P{v?vPFuozh;<*s-t`Reg5HzhDSeJS8=&z+!9AKsLrUX z{P`mkkqc?v$%Y_s*DURB@JG2L5X0C9mUcKu^A-np-@}B6n}zY?T)*fu+p*bs*elE} zveS^eKV-vWwUd06s_xbkY51>4U{Gv*UDi=Zc!1VvIz!F8I7y6AcYgAE6che>b1cBdr-nKKt*BO?-i%phV7VQUt)HC!xje%+lAnzp8c~V?y|vd%3&V9UD*{O9OH7nfqm(4$JCz>b;BWG57TcUxf*HB zD8wYtPu)1Vx)?jq^vNj*hHBrkXz%={BK`^qQNWjx&ov7y2BIa`_y&&TW|7mmzk2>A z7_e0YvBv<|AG0PYmbM#tozo0G`Lseazis?OyJj>KXRsrzW#MMwUGB?P<@PZG{FIya zQ#nmlD8<505J-Zgc3Ah;R(bw+_xbl2274jL;iX$iHi)f;V*{9aHNVbFV%jcq}0VNWj4p2O-FQ|HRPP#IUf$0W^~T6p@NHin2@k9h3AM z96kUE;b4>Q(vvuZq$pVu!H&HC#{>A)VVMz`N={*tQ!z-s{u?9?ot%wH&h<&o2qQ;Q zk{>gZ3)so|&cQ=mqhd@-X<*7zXC(hCWJGmJ_AjD@ibX>3NvpUA)5GFJjKRbiR$AtCbEOkHdy2*3KCU<^A% zG5nFT0nA*EH8yRaAjT=kWJ;YUvIJ*r^<$RJUs=|NOl5&r#{7|^vMh&9+1pLBc?2Xr zHrx48wo60yp5!0})|{S*TIHhX(dJ5uZ&}-^0HG;<{`T+KDt5ptjAp#s3%a(DA1kHX!?vqQlD;Wp)6JCt|h$Gp(L^1>eFg*W8= zG-qBRHjhjWkJ^-9=AM7&bod{;@?(Aszt@xZ5X>iRqLL0#(ZU$57n=e*8&J|D-$)!AlS*c>zo^a}*K=;?Oxu1;q8$jw=) z#?tcJJQ3 z^m9Eb>Y%HuYi`xZlP6D-l8&{vw}<76fB#-PabYYyBjba)nW3TKwQJYb);BH{7k?A~ z92gkr>FF8h?#`|l8RYrQFRxq0*Ze%jSYF-GD*~Ud=>Iam^z8YYnmc#?uCJfFIXLxZ zwpC4~>fxYI&LZvdivt&b>g~Qf_3?K`am&-mZ-4&$NxeG!?0~}T{Ga*x`KUzR-PrB@ z!=ux)-+nAFAHE{ad@$SGJ@RpGK9+eq{N%0auRljdC&fO#Ih7xM5-!O37y6xi5x~9c za{6;kL(|64nY0^EqlcG@YCk0xJ-YpH;q?6`0 z@Npg33r?sr2 z=Rduin&`LpXa9b3@WJr!MAju$#+SRna#M|`s>UUkdghTQw!rt^eR?b8$?_|Og30Va z%l@ffKVFPxbbtP^wDM~*`uXcsMYm%Y@2_eK!y|6LNN9W~`tXCt<83Q!Np>;#yRy70 z`GaZlPPn#KHu^nxXk$pUbolzHkJ|IquXBIbegtOjo3C|l?wapUPAYv_@no{c z?GM99&iL%?{pXVI;aN4Wk?->}mwgHSk7|GX`E_cK4`@o_!+$x%a-9DoE~;ES5*v^5 z|1!JwCHlJT*_xMe`M<&h<&2wKrF0KWoijOx+VWR`l&v#P!EF zVn?B%gbG&=J}Vrxe)Z^sZ$nnp&m?V-gr70gyw>udWwrelohPy($aNHEN&Y{ye#5{Z zkOX83`WOF~6CjiXBta9X{L+q8l)Q0hKfkOi9nf(rp*EEFWaBp-e%;?t(RZHckVSB9 ztQ@#t=vNau&{#E8M3Q!1RK9of$yJ+UUtSN~yY=)2ITfSs*7SZjhc=PH_HDZT>=sS4 ze3B1#a)Q9h4}VZ8yVG5dYtB-Cl;D@A5ozFDmLH!9Q*|G+FUhB+y3qF4Hr4ifyMn;VP$^7hLS*-5X9CU%zr``WJImSD zamwUKP@1pWRR!HHh~uhGCC|~62(>4z>QD;Y+(`CFMSq$-+OtysSu*1ON#QANx8)AF z&oV5K^3cftWAURZBOFIpmqk;*Fs{YRJT5Z{s1$`-VKE8SrJ44M#*wc}60al)frvR~ zACW#sPsc)f?vF}g$DG)#y-K>bu_xw0y~LzBQZMklfr~TTJ|~7!9XMOleUHsc_zor? z4mFX}30^!S2P}OX53bOb-a{xq^8(XwZ1v_SVrui(`Fm>Bw+r&E{EvKt-CS?UC%ll_ zltbXLcI03ZY#dcIj?^v=TAU|v=#=lq3g5|#H7qU#Yi-%VLWPhh@{eQ`IIs<=*O5q? zTd=*wO!Po-*Pg6rw$Z zRzFQ6aMGI5M6^nV){5ql5X>M&MouNX&xAh7>NCkZK}M^ip73UHhWi-Zc6iMU-Vnr$ z%!)>hP6yW96?I_ocPAUvDK5hCOO;seA{dH`CU&7D{hklrAf8LMB5y;bad!+=LjJrz zCB?Puf-Q$U!5Ib;9zhN5F}wN*frOKz2ptqI6S$tbacWM-aStyO+uWRL&mDW1_>~)l zKFv3K8po4T1EP`_Qezpq|80R;v`I6DK`sJlU0z~lsQmcBaG`^DoWmv$HnR2eN4~=& zV22@)#!QyTrip!AgfJWBWw2R}CM;EUpFlQcec$-elrE&v+g%fRM-SN)$y}!3O&Kix zBv@p~YEU1H4FQ^%TJ&vGyWM&lF^%abB*h@OTsJO+Y7cE)6^zW#IXARmLHe)z@v2p+ zdb-B`x7jZ#Q~_wzR0Nd-F%c^l9i*<0q`&t=9g}QVtg$rh@S)=!C@<6U^=uY1F=!}! zWeZ^ByGU&O!lY~`nxuwOi2K{vc!^f8RY3z0%V)_>B$>ztcxcIGbRw0=*%pV$5JGU8 zV)zFXdi)^DWU_-`L*JCckU5^=p{t!8ww=vkf~Cm$Lm_3hn+NC!PrMwCN@jb=9YQ?T z>4)&>7+>vPA#O_|*V z52dH5`A~NI^8}~TOr?UOSqi?|ePS(6cF-C>cKL!EF# zI+;rcWAk_@^#ZD~awSIU;Ds{EN>7X0M=?~1q>e;FXlzgeQElg*8km-= z;wJB*XCZOd*+WYwn0;(&X*T@#j7pJe?khqt`7CY~A7TmtX%xM`7Ro))#FU#{Q6NOu7MY6P8Dg zU(I5LD-Q+D{!TzTp6>r)-BC6uLy=`XA$D#TvA;^kBAuwzYZ_KBxsjVOTlm=s)e4rg zlB1NpTXcRXK8&iQEtzd7vmK==7=)sdQ;ildn_a}BV=9ZH&h1ZgD(6jk8LMs2%1 zxbFI4*8oZ(?-*N^;!wH!zKs`jTe&%dSNay)p3up9o*khJd0Uk z1w7tSrg;aTR9p;)P!{cI!!wE%mWU(E6x9f+^qB)nj|Hs_jxWUl!B0Bi>>u%JQgR*I z$`6Ubb7Yi#DZ07wxe}WX-xH7zPo)-+<ug?$W=uMYzL)F>OO5yA`>E2Ndl0^fvFJDBtNb&NT zDs|ccH~5ngQpZgvj*%dnUb}BE1=2ntSayaX16C$-`MKtvh+5 z=|AbjJ42vkOVM))^Fql6?n}5sBT=0OP8vGG5g!(9E+QSZU&6+)TR_-ot>y-Yvpla+ zO18vC+oJcZAItRj>p8Dq1(H`sKC7w=n=4Cc~P1fOAIF$$Hsnz9o-JjBPyS=7nXd?{k2jPCjM==Y9e~&Q54zpw-__8 zCA%wh#v91_DX=(iHF{p7^^w=J1|-Dwnk*-Zdxnaf5u15-Q{>)VHCIek)w?@)4hLDM&QWvP|P=#VxlcT-H4~YOQ*}Gi&^PBj4^N^A3(c;yl)=_)cB`w3c(IcX*gTj z%m#*K?v0*>lw3@;$w=M)5jd`oyiIqj@^`y!?Hkv3;^+gg3)vIi5&L=zV4DDVMW2;g z)S<8)G)1ybGyA=WdfZ!{`&Xf1NlAz@rW6${gJQ{SV#X96vP@&5DUj{Iz*++DhbzFX z70bOHr>+~wN^2!I1|F&23NSN{w4TT?>bLs31#thEtSrfg9aq|SwmhbY4BkY>Vk!S# za#R~2$4Lmj2rwijAmz?(YsxfYLxQ7#?0)jabbwDnL@-j$oIEO920hF`y3@`{N}-T+ zs5=8G1Y4f(25IpQDA98IiUArEUPlD#m~iF=t&z^8BWboJ4Cu=w=!sP9tA4baB|MRq zKp?@?`3GM5A^mtbi7$J>W_!6j+L6h=^g?m&=KcZ~;8pYaZ#U1cN5>!*&x58okl&n7 zI*BOlAk=MeUa`a372Z+B<9C}Ps{#SLVvMB_mUBPoQR4|}kS>-9Dd|t1_{G^vKBGHz z9`O+P-Dr{Z(E{WEc#-tHXcxAey5J=d!y>7`R7>ug)!aS4xkt9>)o>tMq7dEEu()y@ zsuJ$Z!+ZmfrAW#G3)13qB+B<J0v})%m7EwGMRiE%aa%tcZx*!py{m<>a0K z5`iN5Y5PJEuy+xxON(^*Evo>4_YY_c*_^s$h%2N!B3O`S6fOgV&7h+^0BnN*mc}oB z`$^B{a>wV2zFXsNLyX|8VnrXwW(LysC6q6yxJrZS32;F` zQKE34lWLLSAzbK8i5%0mDflV`SLJgBw_k{8JH&EGg~yg6R7dq4ft%sRH}3&AT}cJF z?qh%PJV^!se^>y~;>l>;YM!ZlQtl>yyG$Vx82eqg=T;)v0a63p+(d$^39m`Vdkl=@ zh9$EeC617%)}F9M*iAZS={L0K%54Ot%5OUmfC>0CT`6>x(=3JWSOyOIszrvE)nba` zA=kgGTuZ-_VI5Deg&r8Iw2Hg4N`nlx#y2F7JhwCa@fnFZQ@}%dt znk$mS3#{Uk)^&5W(# z9eNy}+L!pN&}qcWq&tdWj2|8TlUzTLEj4-WXpTH0Z+tbwkZye7QFF|z=D0u247CSGkJKjYd2r(NgQTkuk{>-d^XkF5 zKM$B{E$kgFoINdRr&}_vwq!kO$$8b1_os!Y_Ar74kr!_&bZ;tn1sIZ`i3h4RMo$)> zuJFgT%E#N-p5A=uC_xO+A-7ZFbSo7^eQm(rwwBX z-5`S>h)@EOrhtKcKn8Cx8{}B{tPXr0SjCyvK7AFRJ&He%Q$bBbVDl*W8G$)n5N&O# z(Wtc?4Q%4Uvun?}R(J5A;R zT{;3LMmd%8l_+qVoG#OK+3L}*Di&_nd{^zOi%AKHLu71IDe52t9Vx&ii)5{V9$(uY zYr5X^`~wE|;Dg&k?|w!Qd2k}1iCygpGliq_VZvK&y?0E)FXN1P2nL~#G5i?5*qcD; zJ8lbP^7|-K(9Z34_KWKv2TRvkOsG40+LqtNLfM^OM^T~LzXnKk}0mx7Sh@_^vD$K zdk>fIsQpc8SThIkVfM)1@A;hpsF#8;A|MucGG_Z^tPM9#c;X9!Otn1;+ye9xdqIq| zF_>F&)14Q{a75V1+-pEb1Ti7OcJjLbEpU?q{4NQVTG|QA*LBy{otl=72K4-V^~kll z9!pQbb^q>l+brh5EIk=fyJgQBRc!`j_5zV~Y-S09E$mhWLv;iw?VV#fPoUPN$W4ym zFga6A2JGS|@>T|Fs}N!>c>}TB`HaW_4EkYP0H|7N&=vtq4ex!BfjGk$KSLWoWeXV7 z#;MoF5Aw$){Pyq(-Hj6U7mrfjWVZ+Wed?(V4&K}6l{@Zc)*f+o{J=FpUL>n5>Mt-I z@Dsw7MY6KCxYsjgqH=r!$^3(y`Bbk&jsc2dgrW%YtremuRF77$O=iH`L8eN~ zqPwABPm--C?-&7>AP34X(F5=A#NoFyR8`ZBpA<=iV|Q(U6rMCjjLlp_To5Cg_P)CR zBtc~q(HQ%RNXFI(Up;>F1Of(y$4JeT07tgt{FzTv`6Fh-uSeQ}Z|fsF>0LiO3|4ZU zu9=cx5u_=}C^#CV=hsQXhmqdCnVPO6%{~!sW%)xI0zmhNzwbOgH2)S_hAN_WuhqRf z1UzrNirWQx>qkPy?}Q_E!B3MQy965UtFrt1K(6AkwdF_hUenuR{js7QSwF$qdQcBO zXgC{Z%pAWVKz`$m`~H>HIXA9%ZpNn$*hhk#_@Zmh7r}AwH@zL%qVb<@+>D`l`_6?K zBl93-AsiVeIzWPd_kSU`XgjL2^K2~OwK4lg?E^e)GUJxdb9s5M@S}*_bKB@N1hEuTocCFIA+Ae$r0?5J<%ZX*gf|eaFHgP!&!nF& zN#TB;dHUNH{fA%|P5Roj?`xAxcVpbw);z@go3{(!+>Er}$!HMsXGJh@AVLex79O@I zqMgp7pIk@e649zS(P=t7uoOC#_brf*ROi2kh81c7^PVma6M?|X^+#Xo7q0Ge(j`K7 zszV7fHxrQs3TIuIy|vQ?su?- zm@Fgy^Y(kTEkv0FKOkIGzkzh~dZDW2o=l67r$sPmOGXwSjCoS8HmP~{{eQPlf8_$PWiNQx*fg}4MvFASO3BeBtxDUGEO?E&1EWkV|k3WYg{Z|*HUzP$MrMepc-0DA!3m>Dy$1wOf4~A#_tgHzL zQdE!85&d#eCU(Dp#DPG^(qETtU~;^_Na#;5qaF*<%wye(h&u5JJLi&7kn z2YVs&WAZ3*+)q4NI@&s5Oo;z z3hzjNf`2s+mWe&E6f+z2v9l*j%PFtc(1nZJspwxb&-Xn~-8PVu^O@8c<#|=7HzRcM zCfg2es2|i)+VL*qx|Xu8tN#%PqIu}yi@b(usH+0jI#l%X;+-_OAvI5Zk3YLnu}4_5 zclxMFaEq3M!gI0~430f!HZHB@+r>#yqH!_+?VL0e&N=1_sqq4&pV!5GmUh%s1}*1I z7??lr`Vq&N$@9tx-gGd8xV<`jCj=H8VHOExVg)Ob*w;<229;xv9#G#sb~(>z2&bOc zu5>Nd63@9VjfUry`}n;{{%Jn-YhJ@-FXW2FbVvHTA60877Ct|}d+^=czo%El#~8&o z-tSkCma<>|W+M0a+=kp>*)ADJxtW|z{&;6N>~1hX(VF>_&eUDu&)7>@%xa+_V`}z= zIL9?QY^T1kqFdf`JT>i({S_hx@18LYQHjXV%F+a7pD%M()vDGf?hsRSHO`))mdg|n ztaL4%sY?R}d*=jjOUJ`)>K&QQ)O((X6q+R zvt^9kCYdNK^$Oin+BabHbF8iqw+ms-?352VQl*%+t~;Jx{cygO$*x;_^{oqVV%sCV z<<=rDGx|sMOBzHr?94-#`70s%be>rA(Cv05Sct!mXJ{jcR|kL7n-K9PaS!8t=o`E! z57IdICfDYDauVD6Oc^=P+S2NkL#{b$WI<$pll-)usWH4kVa<-C5 zvL!|>;_q_^R-Zrp{1<+#ywBOtL!zB2*I55h`}XZPM{H)JdDszdcX5K7@>t-GZ^oBx zPsg^r`gkSh_UR_oBXtjJAGz=YfUENy^Kj86F-rD37D3LErD+!qZiP&zq z)*iHb^R9qX?_d37KU!MbJeeP-Vf5*m!;&Lwhr*KMRZi3NbzS`RNc(l8_J`~3;tK># z4Dj-#x8@?X|!*>Iht{Lf)SlA=y@x-WWtV2ka z)Nl~oEQuoJhQg{5(EZdINr!YeMR$M*Ras})D_j>#*Ur}0%s=#NAq8WQ$xs?zLHaA+v#*M2fw;NWFCK_@MHs#}8$xsA-p6)jXfzDXp z+MZ8`>s6Cy%V}We>)$n*hf`sb0`?wII3}9Og%P#n!hd%`qdqHvTY0X! z7<6i3V9{-h}%g<+<`3e@FDVN!&`* z)2V~FwcoPu7Vn;v%pIiMkT3XPeelNm+KvCH?_ty>Vi=|}T4hiGT_rccY)QqA=m97^ z+&Wc9?~to!2u>zX7a|EV3J!ef%dKqEF5ts8@dX!fybh)97df0Pp1di`6$19p(Bbn^ zHS}Q$+oGL*I{LHY^|fkjf>{2S4GTy-GQu+hjEfNlXm^(uh6&3t!-pqaN=Kb-bjSV) znG^Rvl5~%Ry6)ZG2uTX$)Ssv`+4t(pL{rVhI;~S*_q;bQmnG55F{Tb$cEauzP?iM5 z3uWmj2ZJpk7`Y7w1Swc}6oK81fb^ zrHqp6XRa0-7GjEj=TqWy_uO{-a6akJl=l*-QuBj;cQrMj-}kDU>cIe_)(g%A^$f#N zoTiLq01>DEGudZTxwZX69SY<-{q}gi?$#fA1M< zmZSaRAaXq7?ndh6!NA@Gd%1>e$Cgrv3H}FWIOd~;LAmxJrA?Qgp806qr)Wt5h zc78jrLGDOY3W5A^Z*6@aZeiRO4x|=$TNqmj{`U5uX-tUhT8vNLETwW`>ZIiHEn1q<>Z@|w{#0jB zM_7hS=#0E19gPgnmVapv57?n>=s6VDFw$*(^T>F%BZrK1htE}j=eJsEJc+2{kPdi^22ve_%`qJna zwb6d(n*h7dt$%c1Xa{oHy1OB>dz3c^irx(hQ56aUTf+g!8yR627FF)OR>&$B-AI7O!#2$NGv|q!v8@C#GuV)Q4r45^m zuyOl-EbBac4~XbGFDfiwe?Rp1YXk@$^DEx^{YS5du9EQRP0$qhyxxG$i0PRbgV~dd z*MI5i$A3@r-K*0JZY2V8f59* zy?^7!dAs0oVcLbQfBH^Ij!XXHqKlsyYgcc(dWWcbp`pcwoPx=;QOiawTak3Kk-BJj z;Vy19`LQ@1m}{NKf*qz4OxEucPSL4l1yQ~P=QPoa++IsL(nSW-=G(=AO+wLw4Ddl+d z=EbJreyMF!m%>7v-|dn8E6M^G^$+RSqdZWa9_OD8^~QKOwTO1M0Qw(V&~kvw0^Y^I zvQLKEJ4z(w-^+mRFpSG_IaT74T&aOQ>13)a*8@BxjhK`#&2FABUP(2l;tzQDm=@{!FmEfP(Z7Z&TCFe6Udx1$8)OCGanCs)#mxS z`$-mQcud#B#&GzZ?y#gm1PcYR)LOuR0PaD^w!}mK8KmmbUg}Il5MFu;7>pr|(ja2Tb8iEahF;0+gN~v#Y^q6AOn4#yG@mZ+FUtf#ozD9qM#&s;x&SzTzzkHxU z@@7?!O9o5xu5%cE=xLX`;;gL8tcfYVvBka=)3FT)Uv4ybHs;3rHgKpIu6+P)fY^&mhHMtFzO1tMkV-5BEDJ;T)-JXu z2m`HhYY}ly0T5;YH>Cy1yeQ0KassG9+`W?op)jk3o5UNEDQ=b%(Mt zX6AO%A^vlLy|JNGbf$gc4Tqmx`EB{=s&TJue=Z$9{1X{ijoOI^=RFS^{SYMgdt8mj zR^mY>0`?lUuzb}sErXu#&KR*2vi#3JZ{RT}E<(1oOG#8#!D{`k1SVJ^+Q3^q6V3yp z=x?AKM3dwyuKQFBBML-?rdOhz#!u9Fh|WWt>vY z=Rl|RvUf08dVHwN0)0miM48NKp+QY1p&H_m)>^!rbE^DXCG8-Xb}2lBH>Hc>Y>j5e z3b|JgQ1NrYniH4ui&^1RWMV(uo|;PTPdi%u1{eME&QG=~9c*+x-1vHU4`;@BB;4q~ z8N-PgnVn@L<;rSoOFXYbWcih_Zr*1;dVZ~2 zP-Pozq`ex^c^^#Um)qBC+g$^p4Po|p=E0=dgY?(>X`#Osk?(E2_V-76)7j_`k7G99 z_rRh9@!$h^cp#k{$^-dD!994)rvVwloiFV0yN~UB!{Y@^oK>DkRGxr?Ljp2%@lX=} zqooj}PfHELLwC1}cw{iZlLidg+xuC1j7c6p04?;wGuaqAWH@Ml6<^!L9%5_mSs-M} z@WDX>j;4TPJP3K0jX9N<)lz)$6ry^sYUbW@<QCmL8bVZK(3@?L_#lMZDk}+|MrwiQQr~9bAqU(uwncv? z1cAqR5U7kB>l%0e29g>Cc4s0|mevFhoip_mqOvCU^svdq)y6^4#XKA2sBR%Px`Z zAm2d{O)+lr2-nc-`ALrg<(mpC{ zPF~tYT1tsp($~bsaKVnNaFg^@ZlD{j6r5oW_ML-~KBak);o4+)9FZ%@tw-T)(rtmy zMzqvDL1`9zmX&xeUyLL`xhX;5n}@lC>Tf(6JoRt-)s6JfT|p^9knLp7HLs8G5te|E zsYy;XutC}s$HzB=35+jU%)@j3Ayw^PYV)#BnBMkHm%aNkt?9(q2TI8OsMH6|Q!UQ@ z8i-FC8)8l|D5RPjLLO1;=Z2C))NLAhbZ99prZIQkD?8@J1~TG7Oyke={!8;uZq7#> zoj-Im_DK55X6m=ibZEo#6T_iKcu*E`&iZyNdaD{`!m%sm*xy5HwJ{h6!lGegJty}cx?8K)tH&1I9oi3oWzHR)mk6t-a1^$|r z`sc8>J$+6&I{Q19B}Y!XkN9C}@xzOpCPx!nH?z%G!G{b}#dDBD%-tq7$O6HS?fowl z1&~9$Gy=nzD@JOO(@zW2d8J%5$;*g*+<8Al;?Ccj0vtY4k5WakdqHW(KwM~Nkk{^v z8_m$Wuic`F+GC(@PO1AvtEo4o=T?JY0VzkmOE#SPxlY3AV7vad-u056pDD#m#p-_* zI86=2v}UA}R}tz-tKm0h4)vvuLQpA?zpSvu?;^V`rb;u1GWzy+v9Z$H{x*x+y@Y zMh~+1myYBI2>45UC(E5ur!57H^*LS`X zseU+~gID(Li%x*`;*0LZHC4y{K~zyvZ>l6@R&=2(XmpXGOl7LFjrjqO%i1~~_>WIb z{4;#Q90s<;CMUdD{P{>`0ok5np|J0a_mb%J%HZtA*}K=H)&pvuXTQmDu|T!!EVE1O zqGDjFM*ZvYB389EYfv-3o8sXb4XbcICYTgMNr$@=+)2^P<4!8EF*8pwLDUGYwN48s z4=_umBA=Lj2XzgHVE9Vf<{qx(IM^&5*)j)qUIs*l+{G zbd5{FhaXm5$_C0%#p8x@k~HmXYd&=wnAdsppZYdbrf!N{Tl^AE;0pIqy>4J~i6oZ07?o>1L z-b6bYt3AQ!kX8;I?+lPTyNsJ?xoGPUC>I@DIbj;dEWH%sLg?tmoVZxY#InqA?xx$j z%XiDV0)f7IBY3I2@YT+BRUf2gNjC&8jwEQG@<|-y2l%n5oe$5G{ZFHCup%B4Vjc!MAp_|?9MB7QO0qXk z=zuHHSm}B|k)D-Sy@x;BRBukxUR33Df4E24q`z}-fd~Shqf7m3EYy#a(`9lRNXUxx zPUjBH3DR&Fl7){V`88yJCPtWpL8x$jUhuFzkyLTnJxahatnB@#z=CyS8LGKj9QmgF zsaQIF6SW0~SPF-LlZk^qZ&{!(d-9GEd2YJL|Cv-&`|&MSo44NoB-wd6<9yO#w5HAH zv7Id?&(5sy)48E6+@DivDWMHpIWRD~ng};`6T-BuS@?LHRNZ=&^Z>X6(jA{FqX5dZ z-Y~%*dX-_fBuuk{b>Xb5yUfyrX+|xMm~%mWwlWFZ&2l0LHV=!Sa5m&TP66JmGe@Qo zbGd;a8BasBOfo1{Gh+$af22=uSH7)NY5H|k+4be_XO2I@GEtrQ3oHCv*uAFq$~8nI zj|k&umz&W_ov9rb^9kvC9`=OCB6;s&k(7?;uF{u&r?N3oo*XJV06Pu#uP}aIz5OEG zSH0h#QhobY)aE+@A6QxdK2V7hP-BZrh3OL0?l&gZnM<@V(o_;lx0< zP++1wov5MBNl;M#S5yz^eS5Y1NIT6QjLGORK{n^RF`)zo0j@u%)fc)vktbo|HO-pY zvuh2y@nDu(n`Jh6q*HC76>J{LhRF4oqH`mkjOsIU3)0$ z7@iB7mfq8%+dGz5>)H8HS z%)e&Z-2|jgARJWX#C>MXeg#Uy5UoG+24*M1GmX5rX>L%{<{UrCcB{kSI{gXR&9(28 zzD$=v*(_yxY1B@91;M%W#?_9#Yuf~995sn8Rl?NZ1>QY1^~`CTe`(&Ou_j^KuHznO z!KoC1HgJL2Yj;?jMy4gp-8!DBl2HoANx9KJ3%S0YuM7>zEM(=bpSL}wxyH3w<8(e&ZB~X+D}2t;zevn_O?k?3QN03@z3)>b3m}#L z1FMgq)?4MJ9nZsbGcHTpM{h zzJJOuo=>iGHw6n`8kfTOd^2rObY|yjU|z*s9U-_w+5=xCtw^nxF(2u}@F|bBqGq)y z8vSbc!gNEi`4Qh|97B4%!Kr@AgYXgV(OIIb`C`ZYVkQ(4%EH(be^&=A#|mOfp)MMf z5EuGw8Cb(^*hR9*4Lv_?VzSN;t>|4V6+balQIiA(kthC!HtfG3C1d46xUwN@ctBfi zW)*5xyO>U150g5iaNe#J$nhjhX-XzJ1zX2vQ*)q+e=EV>HKj>C76Q#)8^`Q*I@Ye1 zJtUcA+R5P160KDVywCsvMu}2KbttyoEsoo)X?ZrG_RgdFaeAv;VE|rl z^|bix;@!bNCv5E2p4y$;cVTe-vx{VH$l~138#j<&e(mxup|LSGWt_h*)6PKxMC2Y6 zDGNs5)11Gj#Dfghc2o!gL7PHd`-dnrI$Q&Mau{U)yUVz?bN|C`WSd&sKcFDt#>i@F z+iE9{8kn+oz!_CyRm=1T38jn)U11QJkEJrcuVG+e1qc8jVSNud+s=d%)u;O}L%sV2 zNJj|;T^WidY5iF4Hlue~_Y;&oph`Au_oje72Pjcbl(pB#oJ|G!uAo+}YgM2i*Jv^l zl})a^IDQD99uVX@KAq-+*KotDFKDq(6|2C?iAo*k{Mjj}aMu{HdlKc}l8A11(3OWU z>)_PQk?b)!r(!(OJgZ%-ap?3>Gn+q#lug|W}cR%mZQq3bHYuPW#$6_ zGZfPC4t>77!ZPfu9#kbJ^Ws2U&>CpKie%jACGo%{PtnxpPC$C*4hap%D~la{nQ zEqNvnFWq@~-K6#Aoz{AjN6mL0{b%xz6l@zYX`hhXX@6_--^V-uEtouBx$}6#M1ZIj z$e4C0)plr@cIwx5{xdJO)OPJM?RKv1_AnQu>49EIoR zoeAHZfx3}6bl7pzo)Bsz^1?8^t6Wno}$n zW|sc#tC&;N>&f%;UL3Qql6hxR{rl|;N>UOI2>(qzZ@~)%0!qxk++6saX6`-wZF~bb z30j~8)!7BbdiO8bF`4AK`hVx>()9d3vxyD!sgH3l*31`A1YI&@zT0B)Zf3!`wced> z`ZK)tQVUk-Ykg06d&~_SfEP24>ejKg3MiJ^415vUMcPW z*=r_DaDDSO_U+s3AKNV!G|WGE#eG=m{!38TxBfn$E7sSox(nz!K zE2NV|Jh0=NWXs+8k=nt|m`ei5JZ>n)d)O2@Jnz+3r-0=sNW>pH>t&91t4V=Lg#xwZ zyNVH+%Z)N0>uY6@@mKwsBRE<4b-zn|(r+2q2WQf$Zwm_}4TNKTh)PAxUk#dn4*pGx zn2Z|0A6%qN#>R@w?1$?h45p5qm9B%;0tTd4WT|(7?;b+|U=)??I`_~7g9q~;)*Mi~ zLGT|O{bLD++2(kiZw4uh$v^?>-cmc=GE>ffUxF*KhcBhpDE*#co}E6{DP9H?-i;qiAGy?3;hM zEj#w|CbJiOldc~hWF(94(i*Okz>jB-nfgN)6_E0@_m~@oq}{26Pm5Uj@inF6;9uQ{ z;qU8+Mw^0rn(l&M=8YS1Fzp9S?Y_% zei#-l8GUzj`{Urc=f{s--**gc^495AI>Ru^<|B>_Jlh^ie#gM>U-SZwea9Sgea-KK z-P@_zZT>yZ;!lFy=^U5zroitU&>d@Q3+rS;+~x;)pcl1JwYZRHmMSNg{2wpa6~~%f zFtd|hn}c{qarX_;;lr zd%7C@zgzq5->jZ65P1INZfxwxu6qy#vrDgIg14H@TGb`L%eHd2^3mzG`Y#ibVgJkg zx~7#R0ePzH#HoV`N97x0e|5jIx+}LFn`=kTeZLU%e)a7{3t4Ql zFq7f&1Tu_ZyF|o2YN>CcAl0yUp%|1*7@n7BYgdxtk-fse8L^ zr@Oh=`CY6svTJ+RCjWay%e(gSIad=@nYXpO??i!90-^uAD;PSLkMCm}^im(Mg|l_J zP3V_xo)9=Z#0!C0QhK4?ubW_cil6vDsJ3`G?wos!$E&$dzxV@?dbvCKMqDhf_d3h> z`m3`}%PWCExO~=5Fp;OcGrPRb)B3N2u#jKNt1o#_kHE2K?Mmx(HnX_W`}t0c`MooJ zyC-?JOTEz_J>Z5s$b-DMZvoeHJ$i4!tqYNaZ9!Rgeb>Kx8Ke8Ue>=NZz183D(IR09=Ig5Uo=;QzhAL#+Z7d}Y^il_xxROaP>R8JInOF>E%)lh4}@ zgg9r3X=nbHaQ{4aEN}v2J5A?2-cFec@tLJ>n`vc1dxp4dZ&7Zza@4Tzi ze9ilO?3*%56Z>-;JKV>8z2E)QhqT=n|9A(#^YX&p^1}D(HUP)2@Vj^hE3g8q{f>wA z*Y$MX9=lDqdFh|K-ro5q%Q>Bke3jEZlB@sRPrtNJyW5jLzf(ac)W7}Pe>CKOCk+0* z07MFZ0|gTNcMu^$1quHtDCqBD3Wf|P%vj)Jm=KK{{dCmWVZlU^BT1Gtc@kwxl`C1c zbomlyOqu^Y47BM%CWDv&TJ!{9a*IuWK?i~;T6AO(r3#n|^~Y3c5RyR#D%f!qYt|hL zMb><(b^mKtt`imbt8fI#K}#!Gj4C9xD=q z(8M+u55z#SvA@WZ={~T08S~}CA{AuzYY+lnupLPC=>yZRQ^F4X zpsYXGe>s;nEHXuK;lqWO9PRrzVC02ElU<&CX7A^wN#daLr&A~F+Or2J5a16El@V=9 z9ACbCNfHyXbO;ebQ^$_B1lj7SDob?z`}z0x{~y2rY4U);0(064fCPUkDXIpQGD;{A z^mq+VnrH$TAb@Dh08F$L zFnH8aNa!I>%`r+?{Sg30zEE8DxM~M$60fteopD&c_{uTO zIp1`wBss^GvQ2UKq!Ted`7}w-c*}LysXh~`mD!tY@@rYIvJ5sQf4vOWR+79r*#Fjo zCt7SV2Hv!{U3Do-_uPr+m6*+ublNyidNZB~2Np^hndDNu8vy0+7*&!yG&yS&J(ooy zVZ9^{vFDJS4@pIZ`VK{40#}6|n&_g9rpYN`Us@|Brb}}6R;MI%?JFfXP+|wGmB@{^ zi3DbnS7#HpsWr}Q{O3+Q8T#6^Yp!bjl_ZjtY8L%a}o-sgo8$!hz+Q41rwg| z3RIxNGXn68S_JK7EQ?w1R;Cc%iEw5lAcD?#7zyM3Z~z8)-VljcL?asQg9wZtu9 zBR&y|F$p0K6Eem5WpIO7^iKpM7)6-e$%_I4qtJ+e4Fa4Ijc7bn0DRDd8Xm+UGo+$I zV3s=?swW9V(BmHUcz^@^FaXL6;~)uHNJAbHk%?5~A{iN-BsS8EH2)|@5++$mN-BdG z-Oxo6Bmfu^!R1n+4AVkDSt(Kaj%KM;B?&}Oya12@lChNKENNLwTiz0vxzyz@g_ZyV zB!HK}6y`9ASxjRd6Pd|W<}#VtOlLk5n$eWzG^trlYhDwZ+0^DXx!Fx`eiNMG6z4d} zSx$4F6P@W)=Q>q#3Rj&VBnN>ZOJG<}cHR@8&TGIv`PqOlE&!kb73e_YnNOh=w4er^ zq7j9tN*3?|dBS7@VaVt_71~jc3a9~2@n=g!P|}jFY5@>X=}KA3(u5|Y zpD~r`NJTPJo6?jaH=XHAL{L+m#?*@;d8tVP`VW8_bpa+&>i<$rFp{Dk6`&iC>QpyC z5|f_vAWU8A6A9YYqI%Jt4jsq|##&Z?oS-BYod`z{qE?Z(^&nx$V+X>J5V(%yt|ZB8 zLay4^3G`L39}w(bKU&yfhEymxbxBWG!dQ8(l%tMCNJ?8;S(Og;Ac#e5lr&2c&2l!e zBl)aILn{)mh6J!M9mr-k3jv!bmahzv>_27;)1U6ss-~StZ4-joe=OA>Th*;dHZYLl z`lG5N>FIJ20$kyiB(?vb>Qte7)s;}zvMn8|1GwAW34C_~-BpQqD-z!Ba+f6Mj06E^{i%vFIodT*o(Gxu!Q|ben0SCBG7;c-_7qy;Qv}+yF%9l4^`?3mdfA+^R}(~ zm9VR{s??i~WV%wluwgmuS((ZN!nsAr1Rxt*hAbchDOT}{SM1x-g4Q3fMTl$tL1UrV zxW=MgEsR&|)VdXvw=}l#kZl415hG-_A#Q*KnA~J1Gg-z50W3mkYtoYV*11Y`Du$hs z+#_dIslnBBi4#WWinLq|kFabD^SI#HMfSvsj=RT(w&I36` zp#Qv9@Rs+xGXQT|DRPh#oC+cOy=xdcKm@uT*dzvyG^UkXVFf3c!6A|q8fItHvi$tXkXtr^ZV4D!xx+OvOHAODrmjS)Hjyfs z8PaZ{y!#}xJ+8d--4YbD7~m;>bDsw?13L5By(#hY1oVvXJCDTA5hrxQDI!sev$Z7i ztmsQ7(14Aygufx@FLX0p@>=T`Ri$Qij8iS|l}Gv2uV(B5m`sC#SUV-P-fco~4FO%} z)Yq^5HA85OUF{A8-6HX`(JkxSqPy9pJ|_3nfpG1KEPbWe)%us$jAYMBpz2+vfdpW# zTig+B@eui&x>?Ww-;(d*1Z6x4j~n zbBY}RaKg9Bp8vpjsxlCz$~z?kX%#G~-TiV5?_0w{Z*|N`FJ+T1pxR@X_Sq$$XxA^g zx+d-UU%#zd(eD`5*d7SevyOB?`-At|9m&&MTH~xsUEJihIzzC2*{mNw-RqWevB5s| zX`4IgC!ummupH*+o;cNLwklS^-0ttEIU#LFE}6-n620G^<;*8^c}Pt027es0n=6@`R!SZ6foENab!X%G7TI zJg@XZaOOII1WS!%!pN4PuvJ2XB4B}!C1)a_YSqkYc%g3ZG^>9uF z8A8Rj?LQy@?7RvH&J9(bN~n^m!kh}Kny}>9?FsX({m#to{Nw#_Z}bqt&o0mJ_$>3n ziX_|#|MbrvE-wR>ZXndK4gEm^C@vu?FAm`_&gw7@OTyq9F9RCS4;e4T9B|I~kP!P2 z5Ft$u4bcx5(Gd5nBrXsRAu$cd@2Y68q%09YRL-WtZ`C$21V0g}07}-J4cpqx5_OIR zOJWOqE%zpZ_*BaHkj?jM5crJE7FX)nv~BpD@7SWm*nI1>s?5p~qWQEf>vHkzh;aDA zP27@C+LRCqw~h5&kl1{R8vjW`8d#`EUYL%mfTF1C%Nu7jg}E3)CFU z!4}K}bnYc8%+xsW^QH>~L9wuQswGemhA1)>i|xkbEyG~27FQ}3XE6JOu<=rgyNoRt zk#YDAVgY8-*x>9JeJo0rj~I6k8G~{sdD13kuqdg|+QbeTO$!C1&a;A!3*&Fsppq54 z@Wh&u2Z_oXu@NhgZ7Sg}@51p7{UHqffdc=53`fG9GLJ0tPYm0TBo+@4Squ@05%JV3 z<19`u>ntw!^5Ry|FaITK0%t-5m?|P4av}lbrG^b7)y*b1k|RBe*Q9bKB+xP|v&2dQ z$7~D>*H8CS5*B-p2IKK2?~=QGYw6mn&$6gB$~mtrI*G0%i|oe4G7UGREGID~GC(^U zt_?S&AuBF0CvP72@An8zJ^%0Ogu>6(lOE#{KHXFE?2DvIF2g9&B^DDhd+WsdGcpZo zGRscxFe)<-&lYnL0z7aRkqw}n0-#pv_e#?=Q4=WDi$ZnLv~V*wtIq4L?lhb2Hpi{% z{DJCv^9YqPKK~~x-~w(MsggOrGAd*A*;tHECgSw&rlbvt)e ztlDzV_gQp+u0Q;$7? z4mk;yYYod;Ryi4#O(zpz$+m1kH8~@eOIuYi2XLZN0-_Gh;%+rCAIf7J3YqM) zC9n<>Z~=EA6>>a5N@h>uWoOn+Ka8YmkEfbe=?2mexlvGs4Q0deB?%RC6_IoAk*7pr zUNzTI^EFbZZBpwdS-^JkyB-JK85v`K2~x4(`66WcPA@x zdzW}Ww@sB%=}5M4`(t*ata(#qcK>58{jm`Zv3Q4xKY@3$VwMZp^m@M+e8X3K^N9(E b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/icons.png deleted file mode 100644 index c015e3aac9a84ebad11b932e84722124772d9641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19694 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ÏmvOE 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 b`u_(2Nr-(&rSM diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/img-cracked.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/img-cracked.png deleted file mode 100644 index 3b1d38965486452bf9a13a913109299ec713c8f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loading.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/loading.gif deleted file mode 100644 index b713e27dfba708a01c380e7c731a13b52a34edfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/pagebreak.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/pagebreak.gif deleted file mode 100644 index 8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sortable.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sortable.png deleted file mode 100644 index 1bca649698e187a80e1b1951fde99ddea3d7b038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 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 BXOsW{ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/spacer.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/spacer.gif deleted file mode 100644 index 5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sparator_v.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/sparator_v.png deleted file mode 100644 index 8cf5662da8c36a446e1e08eb71b992c730ab8d15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/table-cell-align.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/table-cell-align.png deleted file mode 100644 index ddf42853ea5c00663e74d9195d1f1264ab684252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1847 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 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/toolbar_bg.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/toolbar_bg.png deleted file mode 100644 index 7ab685f4236ad543601b0d7dc43e429e041bee98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/unhighlighted.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/unhighlighted.gif deleted file mode 100644 index 7ad0b67ae634d41e76848ec0b6696e8ac7e06983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/upload.png b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/upload.png deleted file mode 100644 index 08d4d9268204a20ca343bf75784302cc706d2417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6608 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 O00001IobTth)ve1{+;xF-z$zX1$@cbk;N#jz zM8mU4YCupmEU?Nii0lQg^bRCan?Ab3%VAH658-8xBFJMB`IuzR@?X?_cxg~njWe8Z z7he1{t~NY@;sD2oqwB>InLWHP3|(&rFL;_%YXisG!f|)t`LI~xqj*wKLbXWp)f$eo z4#asOE4^bXVR1zDClZ^-`L@9YE{GEUM6w@>B$|*3C13A^6xxLq**_!Pdr{&MM+{D{ z56z@TzG*@hw6S^P4v136mt~*C)1y;z@#LIHDjO7zE0$NBVk(?tEAPD`x}r!4rSvo+ zGrN|Z-`M*gk?fXS+qo0;d0 zh<&hBzt>Fxc`eUN=*S8tip(N)4%c-Hsa$abS1kGZZD3dwRL~Y&OiQls$!Zy(aK#~| zjPP=1B(V$A*qhVABln1FxZ*mlSSnXYWQzzgJF1owUC)i7_7-#saE!r1=5SG$fWQ*I z?G_O^BB^|7ZhisN&MW7LKFbwbTU$SV{P_O;`{w56#>U3_`uf`1+Un}+%F2pDp;%g4 zT3lS5pP!e@<#Tg$GMVhlmoKxkvokX@)6>(Flao@ZbYfycB9V-bkB^RyibNuzP$&=x zMn*=4hK2?Q2l;$HkH;Gr80hQk>+S93a=9E1r@OnG&1QFYb~2ev27}Sj(b3-C-qzOE z+}zyQ*hr;PDHIBkNX*O2%g)YDPEJltOhlnjzdrQ8MQa@l0suN-^vmE^6Tt3mAau_$ zXbql@q{N)M&$25b1FG78WjFA2Q`{wpcH+plH-T+lc4H{-V^L{To}?sY^7t- zRp-#0EC|Fh>5nV9*osg354U2y3FFpwXQ!`Na;JKQ;uHrYmb=qU|MBr zTOt(Y=@VUlJq+6mQt^WJ9lIJTz?$6jvB@_0Ijg#xyHYhx6QE$9@Q;P`SNru{MQcx_ z>I9eqMm;}}tfJ*J&?Udq;ijL1AIs^TNj%ED8++(4bqQ3YK5><%~obS)3oEv z2`L9EwBilZbt=4c48b+h%ydj29TQf1;FclAt3p@D@Iv$C>k|Ryx={((b>+iEv*M}T zw2%>2(|!*aqioP7@6#WGj~%z23qkbWx? zq>K{ydFDHsgH&Ab#e8p|DBB+i&e7YjgH&Dp_Cc?zbGzF=vu-e#1^&&3UitP6Qvg=W z;+>M!e1J%3O7HX-hEcUA+~cC@8WAyj^bml>?&AT`HEEBQ}9Z=3X$i*Zty)I zU*Zj5^tvjIuB=l9Z9~T)&b;Eg=FK&TO>3g*yVOqt8d@&{JXvVbxz7~cYII$TQHvSS zgJ#LpO3a#6>HScB5@i5vKw}cnyiI*AUkCSPz7s6};*mIoCN(8C-gssBWz<}Twr?3} zMG(-KVyeCT&UjVicgg-NE@GN=DKAW@1zjD3zqggT>WPOqXK6a*HA(U%`Q-^?%QNdz M>|NJq=D?r-0Tclc1poj5 diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/word.gif b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/default/images/word.gif deleted file mode 100644 index 9ef5d09b7b30c4f3225f77788462e429cc494b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css deleted file mode 100644 index 9442189..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/autotypesetpicker.css +++ /dev/null @@ -1,26 +0,0 @@ -/*自动排版弹出菜单*/ -.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body { - font-size: 12px; - margin-bottom: 3px; - clear: both; -} -.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body tr:last-child td:last-child button { - border-radius: 3px; - border: 1px solid #ddd; - padding: 2px 8px; - background-color: #f3f3f3; -} -.edui-notadd .edui-autotypesetpicker-body table { - border-collapse: separate; - border-spacing: 2px; -} - -.edui-notadd .edui-autotypesetpicker-body td { - font-size: 12px; - word-wrap:break-word; -} - -.edui-notadd .edui-autotypesetpicker-body td input { - margin: 3px 3px 3px 4px; - *margin: 1px 0 0 0; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css deleted file mode 100644 index e29161b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/button.css +++ /dev/null @@ -1,96 +0,0 @@ -/*普通按钮样式及状态*/ -.edui-notadd .edui-toolbar .edui-button .edui-icon, -.edui-notadd .edui-toolbar .edui-menubutton .edui-icon, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon { - padding: 5px !important; - display: block; - height: 26px !important; - width: 26px !important; - line-height: 1 !important; -} - -.edui-notadd .edui-toolbar .edui-button .edui-icon::before, -.edui-notadd .edui-toolbar .edui-menubutton .edui-icon::before, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon::before { - display: none; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon::before, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon::before, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon::before { - display: block; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon svg, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon svg, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon svg { - display: none; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon::before, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon::before, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon::before { - display: block; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon svg, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon svg, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon svg { - display: none; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon::before, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon::before, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon::before { - display: block; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon svg, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon svg, -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon svg { - display: none; -} - -.edui-dialog-buttons .edui-icon svg { - display: none; -} - -.edui-notadd .edui-toolbar .edui-button .edui-icon { - color: #666; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon { - color: #fff; -} - -.edui-notadd .edui-toolbar .edui-button .edui-button-wrap { - position: relative; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { - background-color: #e5e5e5; - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { - background-color: #666666; - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { - background-color: #666666; - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon { - color: #fff; -} - -.edui-notadd .edui-toolbar .edui-state-disabled .edui-label { - color: #ccc; -} - -.edui-notadd .edui-toolbar .edui-state-disabled .edui-icon { - opacity: 0.3; - filter: alpha(opacity=30); -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css deleted file mode 100644 index 9c75123..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttonicon.css +++ /dev/null @@ -1,419 +0,0 @@ -/* toolbar icons */ -.edui-notadd .edui-for-undo .edui-icon { - /*background-position: -160px 0;*/ -} - -.edui-notadd .edui-for-redo .edui-icon { - /*background-position: -100px 0;*/ -} - -.edui-notadd .edui-for-bold .edui-icon { - /*background-position: 0 0;*/ -} - -.edui-notadd .edui-for-italic .edui-icon { - /*background-position: -60px 0;*/ -} - -.edui-notadd .edui-for-fontborder .edui-icon { - /*background-position:-160px -40px;*/ -} -.edui-notadd .edui-for-underline .edui-icon { - /*background-position: -140px 0;*/ -} - -.edui-notadd .edui-for-strikethrough .edui-icon { - /*background-position: -120px 0;*/ -} - -.edui-notadd .edui-for-subscript .edui-icon { - /*background-position: -600px 0;*/ -} - -.edui-notadd .edui-for-superscript .edui-icon { - /*background-position: -620px 0;*/ -} - -.edui-notadd .edui-for-blockquote .edui-icon { - /*background-position: -220px 0;*/ -} - -.edui-notadd .edui-for-forecolor .edui-icon { - /*background-position: -720px 0;*/ -} - -.edui-notadd .edui-for-backcolor .edui-icon { - /*background-position: -760px 0;*/ -} - -.edui-notadd .edui-for-inserttable .edui-icon { - /*background-position: -580px -20px;*/ -} - -.edui-notadd .edui-for-autotypeset .edui-icon { - /*background-position: -640px -40px;*/ -} - -.edui-notadd .edui-for-justifyleft .edui-icon { - /*background-position: -460px 0;*/ -} - -.edui-notadd .edui-for-justifycenter .edui-icon { - /*background-position: -420px 0;*/ -} - -.edui-notadd .edui-for-justifyright .edui-icon { - /*background-position: -480px 0;*/ -} - -.edui-notadd .edui-for-justifyjustify .edui-icon { - /*background-position: -440px 0;*/ -} - -.edui-notadd .edui-for-insertorderedlist .edui-icon { - /*background-position: -80px 0;*/ -} - -.edui-notadd .edui-for-insertunorderedlist .edui-icon { - /*background-position: -20px 0;*/ -} - -.edui-notadd .edui-for-lineheight .edui-icon { - /*background-position: -725px -40px;*/ -} - -.edui-notadd .edui-for-rowspacingbottom .edui-icon { - /*background-position: -745px -40px;*/ -} - -.edui-notadd .edui-for-rowspacingtop .edui-icon { - /*background-position: -765px -40px;*/ -} - -.edui-notadd .edui-for-horizontal .edui-icon { - /*background-position: -360px 0;*/ -} - -.edui-notadd .edui-for-link .edui-icon { - /*background-position: -500px 0;*/ -} - -.edui-notadd .edui-for-code .edui-icon { - /*background-position: -440px -40px;*/ -} - -.edui-notadd .edui-for-insertimage .edui-icon { - /*background-position: -726px -77px;*/ -} - -.edui-notadd .edui-for-insertframe .edui-icon { - /*background-position: -240px -40px;*/ -} - -.edui-notadd .edui-for-emoticon .edui-icon { - /*background-position: -60px -20px;*/ -} - -.edui-notadd .edui-for-spechars .edui-icon { - /*background-position: -240px 0;*/ -} - -.edui-notadd .edui-for-help .edui-icon { - /*background-position: -340px 0;*/ -} - -.edui-notadd .edui-for-print .edui-icon { - /*background-position: -440px -20px;*/ -} - -.edui-notadd .edui-for-preview .edui-icon { - /*background-position: -420px -20px;*/ -} - -.edui-notadd .edui-for-selectall .edui-icon { - /*background-position: -400px -20px;*/ -} - -.edui-notadd .edui-for-searchreplace .edui-icon { - /*background-position: -520px -20px;*/ -} - -.edui-notadd .edui-for-map .edui-icon { - /*background-position: -40px -40px;*/ -} - -.edui-notadd .edui-for-gmap .edui-icon { - /*background-position: -260px -40px;*/ -} - -.edui-notadd .edui-for-insertvideo .edui-icon { - /*background-position: -320px -20px;*/ -} - -.edui-notadd .edui-for-time .edui-icon { - /*background-position: -160px -20px;*/ -} - -.edui-notadd .edui-for-date .edui-icon { - /*background-position: -140px -20px;*/ -} - -.edui-notadd .edui-for-cut .edui-icon { - /*background-position: -680px 0;*/ -} - -.edui-notadd .edui-for-copy .edui-icon { - /*background-position: -700px 0;*/ -} - -.edui-notadd .edui-for-paste .edui-icon { - /*background-position: -560px 0;*/ -} - -.edui-notadd .edui-for-formatmatch .edui-icon { - /*background-position: -40px 0;*/ -} - -.edui-notadd .edui-for-pasteplain .edui-icon { - /*background-position: -360px -20px;*/ -} - -.edui-notadd .edui-for-directionalityltr .edui-icon { - /*background-position: -20px -20px;*/ -} - -.edui-notadd .edui-for-directionalityrtl .edui-icon { - /*background-position: -40px -20px;*/ -} - -.edui-notadd .edui-for-source .edui-icon { - /*background-position: -261px -0px;*/ -} - -.edui-notadd .edui-for-removeformat .edui-icon { - /*background-position: -580px 0;*/ -} - -.edui-notadd .edui-for-unlink .edui-icon { - /*background-position: -640px 0;*/ -} - -.edui-notadd .edui-for-touppercase .edui-icon { - /*background-position: -786px 0;*/ -} - -.edui-notadd .edui-for-tolowercase .edui-icon { - /*background-position: -806px 0;*/ -} - -.edui-notadd .edui-for-insertrow .edui-icon { - /*background-position: -478px -76px;*/ -} - -.edui-notadd .edui-for-insertrownext .edui-icon { - /*background-position: -498px -76px;*/ -} - -.edui-notadd .edui-for-insertcol .edui-icon { - /*background-position: -455px -76px;*/ -} - -.edui-notadd .edui-for-insertcolnext .edui-icon { - /*background-position: -429px -76px;*/ -} - -.edui-notadd .edui-for-mergeright .edui-icon { - /*background-position: -60px -40px;*/ -} - -.edui-notadd .edui-for-mergedown .edui-icon { - /*background-position: -80px -40px;*/ -} - -.edui-notadd .edui-for-splittorows .edui-icon { - /*background-position: -100px -40px;*/ -} - -.edui-notadd .edui-for-splittocols .edui-icon { - /*background-position: -120px -40px;*/ -} - -.edui-notadd .edui-for-insertparagraphbeforetable .edui-icon { - /*background-position: -140px -40px;*/ -} - -.edui-notadd .edui-for-deleterow .edui-icon { - /*background-position: -660px -20px;*/ -} - -.edui-notadd .edui-for-deletecol .edui-icon { - /*background-position: -640px -20px;*/ -} - -.edui-notadd .edui-for-splittocells .edui-icon { - /*background-position: -800px -20px;*/ -} - -.edui-notadd .edui-for-mergecells .edui-icon { - /*background-position: -760px -20px;*/ -} - -.edui-notadd .edui-for-deletetable .edui-icon { - /*background-position: -620px -20px;*/ -} - -.edui-notadd .edui-for-cleardoc .edui-icon { - /*background-position: -520px 0;*/ -} - -.edui-notadd .edui-for-fullscreen .edui-icon { - /*background-position: -100px -20px;*/ -} - -.edui-notadd .edui-for-anchor .edui-icon { - /*background-position: -200px 0;*/ -} - -.edui-notadd .edui-for-pagebreak .edui-icon { - /*background-position: -460px -40px;*/ -} - -.edui-notadd .edui-for-imagenone .edui-icon { - /*background-position: -480px -40px;*/ -} - -.edui-notadd .edui-for-imageleft .edui-icon { - /*background-position: -500px -40px;*/ -} - -.edui-notadd .edui-for-wordimage .edui-icon { - /*background-position: -660px -40px;*/ -} - -.edui-notadd .edui-for-imageright .edui-icon { - /*background-position: -520px -40px;*/ -} - -.edui-notadd .edui-for-imagecenter .edui-icon { - /*background-position: -540px -40px;*/ -} - -.edui-notadd .edui-for-indent .edui-icon { - /*background-position: -400px 0;*/ -} - -.edui-notadd .edui-for-outdent .edui-icon { - /*background-position: -540px 0;*/ -} - -.edui-notadd .edui-for-webapp .edui-icon { - /*background-position: -601px -40px*/ -} - -.edui-notadd .edui-for-table .edui-icon { - /*background-position: -580px -20px;*/ -} - -.edui-notadd .edui-for-edittable .edui-icon { - /*background-position: -420px -40px;*/ -} - -.edui-notadd .edui-for-template .edui-icon { - /*background-position: -339px -40px;*/ -} - -.edui-notadd .edui-for-delete .edui-icon { - /*background-position: -360px -40px;*/ -} - -.edui-notadd .edui-for-attachment .edui-icon { - /*background-position: -620px -40px;*/ -} - -.edui-notadd .edui-for-edittd .edui-icon { - /*background-position: -700px -40px;*/ -} - -.edui-notadd .edui-for-snapscreen .edui-icon { - /*background-position: -581px -40px*/ -} - -.edui-notadd .edui-for-scrawl .edui-icon { - /*background-position: -801px -41px*/ -} - -.edui-notadd .edui-for-background .edui-icon { - /*background-position: -680px -40px;*/ -} - -.edui-notadd .edui-for-music .edui-icon { - /*background-position: -18px -40px*/ -} - -.edui-notadd .edui-for-formula .edui-icon { - /*background-position: -200px -40px*/ -} - -.edui-notadd .edui-for-aligntd .edui-icon { - /*background-position: -236px -76px;*/ -} - -.edui-notadd .edui-for-insertparagraphtrue .edui-icon { - /*background-position: -625px -76px;*/ -} - -.edui-notadd .edui-for-insertparagraph .edui-icon { - /*background-position: -602px -76px;*/ -} - -.edui-notadd .edui-for-insertcaption .edui-icon { - /*background-position: -336px -76px;*/ -} - -.edui-notadd .edui-for-deletecaption .edui-icon { - /*background-position: -362px -76px;*/ -} - -.edui-notadd .edui-for-inserttitle .edui-icon { - /*background-position: -286px -76px;*/ -} - -.edui-notadd .edui-for-deletetitle .edui-icon { - /*background-position: -311px -76px;*/ -} - -.edui-notadd .edui-for-aligntable .edui-icon { - /*background-position: -440px 0;*/ -} - -.edui-notadd .edui-for-tablealignment-left .edui-icon { - /*background-position: -460px 0;*/ -} - -.edui-notadd .edui-for-tablealignment-center .edui-icon { - /*background-position: -420px 0;*/ -} - -.edui-notadd .edui-for-tablealignment-right .edui-icon { - /*background-position: -480px 0;*/ -} - -.edui-notadd .edui-for-drafts .edui-icon { - /*background-position: -560px 0;*/ -} - -.edui-notadd .edui-for-charts .edui-icon { - /*background: url( ../images/charts.png ) no-repeat 2px 3px!important;*/ -} - -.edui-notadd .edui-for-inserttitlecol .edui-icon { - /*background-position: -673px -76px;*/ -} - -.edui-notadd .edui-for-deletetitlecol .edui-icon { - /*background-position: -698px -76px;*/ -} - -.edui-notadd .edui-for-simpleupload .edui-icon { - /*background-position: -380px 0px;*/ -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css deleted file mode 100644 index c28c43b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/cellalignpicker.css +++ /dev/null @@ -1,68 +0,0 @@ -/*自动排版弹出菜单*/ -.edui-notadd .edui-cellalignpicker .edui-cellalignpicker-body { - width: 70px; - font-size: 12px; - cursor: default; -} - -.edui-notadd .edui-cellalignpicker-body table { - border-collapse: separate; - border-spacing: 0; -} -.edui-notadd .edui-cellalignpicker-body td{ - padding: 1px; -} -.edui-notadd .edui-cellalignpicker-body .edui-icon{ - height: 20px; - width: 20px; - padding: 1px; - color: #666; -} - -.edui-notadd .edui-cellalignpicker-body .edui-left{ - background-position: 0 0; -} - -.edui-notadd .edui-cellalignpicker-body .edui-left:before{ - content: '\e66c'; -} - -.edui-notadd .edui-cellalignpicker-body .edui-center:before{ - content: '\e66e'; -} - -.edui-notadd .edui-cellalignpicker-body .edui-right:before{ - content: '\e66d'; -} - -.edui-notadd .edui-cellalignpicker-body .edui-center{ - background-position: -25px 0; -} -.edui-notadd .edui-cellalignpicker-body .edui-right{ - background-position: -51px 0; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-left{ - background-position: -73px 0; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-center{ - background-position: -98px 0; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-right{ - background-position: -124px 0; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { - background-position: -146px 0; - background-color: #f1f4f5; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { - background-position: -245px 0; -} - -.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { - background-position: -271px 0; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css deleted file mode 100644 index f07f260..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorbutton.css +++ /dev/null @@ -1,9 +0,0 @@ -/*颜色按钮 */ -.edui-notadd .edui-toolbar .edui-colorbutton .edui-colorlump { - position: absolute; - overflow: hidden; - bottom: 5px; - left: 9px; - width: 18px; - height: 4px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css deleted file mode 100644 index 0e267d9..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/colorpicker.css +++ /dev/null @@ -1,120 +0,0 @@ -/* 颜色弹出菜单 */ -.edui-notadd .edui-colorpicker-topbar { - height: 27px; - width: 200px; -} - -.edui-notadd .edui-colorpicker-preview { - height: 20px; - border: 1px solid #ccc; - margin-left: 1px; - width: 128px; - float: left; - border-radius: 5px; -} - -.edui-notadd .edui-colorpicker-nocolor { - float: right; - margin-right: 1px; - font-size: 12px; - line-height: 12px; - height: 22px; - border: 1px solid #ccc; - padding: 3px 5px; - cursor: pointer; - border-radius: 5px; -} - -.edui-notadd .edui-colorpicker-tablefirstrow { - height: 30px; -} - -.edui-notadd .edui-colorpicker-colorcell { - width: 14px; - height: 14px; - display: block; - margin: 0; - cursor: pointer; -} - -.edui-notadd .edui-colorpicker-colorcell:hover { - width: 14px; - height: 14px; - margin: 0; -} -.edui-notadd .edui-colorpicker-advbtn{ - display: block; - text-align: center; - cursor: pointer; - height:20px; -} -.arrow_down{ - background: white url('../images/arrow_down.png') no-repeat center; -} -.arrow_up{ - background: white url('../images/arrow_up.png') no-repeat center; -} -/*高级的样式*/ -.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; - left: 14px; - top: 13px; - position: absolute; - background: red; - overflow: hidden; - cursor: crosshair; -} -.edui-colorpicker-cover{ - position: absolute; - top: 0; - left: 0; - width: 150px; - height: 150px; - background: url("../images/tangram-colorpicker.png") -160px -200px; -} -.edui-colorpicker-padDot{ - position: absolute; - top: 0; - left: 0; - width: 11px; - height: 11px; - overflow: hidden; - background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; - z-index: 1000; - -} -.edui-colorpicker-sliderMain { - position: absolute; - left: 171px; - top: 13px; - width: 19px; - height: 152px; - background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; - -} -.edui-colorpicker-slider { - width: 100%; - height: 100%; - cursor: pointer; -} -.edui-colorpicker-thumb{ - position: absolute; - top: 0; - cursor: pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid black; - background: white; - opacity: .8; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css deleted file mode 100644 index 67e6ab0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/combox.css +++ /dev/null @@ -1,72 +0,0 @@ -/*不可选中菜单按钮 */ -.edui-notadd .edui-toolbar .edui-combox-body .edui-button-body { - width: 60px; - font-size: 12px; - height: 20px; - line-height: 20px !important; - padding-left: 5px; - white-space: nowrap; - margin: 0 3px 0 0; -} - -.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow::after { - height: 25px; - line-height: 24px; - font-family:"edui-notadd" !important; - font-size: 26px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - content: "\e64f"; - /*padding: 10px 0;*/ - display: block; -} - -.edui-notadd .edui-toolbar .edui-combox .edui-combox-body { - border: 1px solid #CCC; - background-color: white; - border-radius: 2px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - margin: 0 10px; - height: 26px; - line-height: 26px; -} - -.edui-notadd .edui-toolbar .edui-combox-body .edui-splitborder { - display: none; -} - -.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow { - border-left: 1px solid #CCC; -} - -.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body { - background-color: #f3f3f3; - border: 1px solid #ccc; -} - -.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { - border-left: 1px solid #ccc; -} - -.edui-notadd .edui-toolbar .edui-state-checked .edui-combox-body { - background-color: #FFE69F; - border: 1px solid #DCAC6C; -} - -.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { - border-left: 1px solid #DCAC6C; -} - -.edui-toolbar .edui-state-disabled .edui-combox-body { - background-color: #F0F0EE; - opacity: 0.3; - filter: alpha(opacity = 30); -} - -.edui-toolbar .edui-state-opened .edui-combox-body { - background-color: white; - border: 1px solid gray; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css deleted file mode 100644 index 1cbb647..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/contextmenu.css +++ /dev/null @@ -1,47 +0,0 @@ -/*contextmenu*/ -.edui-notadd .edui-hassubmenu .edui-arrow { - height: 20px; - width: 20px; - float: right; -} - -.edui-notadd .edui-hassubmenu .edui-arrow::after { - font-family: "edui-notadd" !important; - font-size: 20px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - content: '\e66b'; - line-height: 1; - display: block; -} - -.edui-notadd .edui-menu-body .edui-menuitem { - padding: 5px 10px; -} - -.edui-notadd .edui-menuseparator { - margin: 2px 0; - height: 1px; - overflow: hidden; - display: none; -} - -.edui-notadd .edui-menuseparator-inner { - border-bottom: 1px solid #e2e3e3; - margin-left: 29px; - margin-right: 1px; -} - -.edui-notadd .edui-menu-body .edui-state-hover { - background-color: #f3f3f3; -} - -.edui-notadd .edui-menu-body .edui-for-tablesort { - padding-left: 25px; -} - -.edui-notadd .edui-menu-body .edui-for-borderBack { - padding-left: 25px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css deleted file mode 100644 index 333da63..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/dialog.css +++ /dev/null @@ -1,365 +0,0 @@ -/* 弹出对话框按钮和对话框大小 */ -.edui-notadd .edui-dialog { - z-index: 2000; - position: absolute; - -} - -.edui-dialog div{ - width:auto; -} - -.edui-notadd .edui-dialog-wrap { - margin-right: 6px; - margin-bottom: 6px; -} - -.edui-notadd .edui-dialog-fullscreen-flag { - margin-right: 0; - margin-bottom: 0; -} - -.edui-notadd .edui-dialog-body { - box-sizing: content-box; - position: relative; - padding:2px; - _zoom: 1; -} - -.edui-notadd .edui-dialog-fullscreen-flag .edui-dialog-body { - padding: 0; -} - -.edui-notadd .edui-dialog-shadow { - position: absolute; - z-index: -1; - left: 0; - top: 0; - width: 100%; - height: 100%; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.edui-notadd .edui-dialog-foot { - background-color: white; -} - -.edui-notadd .edui-dialog-titlebar { - height: 50px; - border-bottom: 2px solid #ccc; - position: relative; - cursor: move; -} -.edui-notadd .edui-dialog-caption { - font-weight: bold; - font-size: 16px; - line-height: 50px; - padding-left: 20px; - color: #444; -} - -.edui-notadd .edui-dialog-draghandle { - height: 50px; -} - -.edui-notadd .edui-dialog-closebutton { - position: absolute !important; - right: 20px; - top: 15px; -} - -.edui-notadd .edui-dialog-closebutton .edui-button-body { - height: 20px; - width: 20px; - cursor: pointer; - /*background: url("../images/icons-all.gif") no-repeat 0 -59px;*/ -} - -.edui-notadd .edui-dialog-closebutton .edui-state-hover .edui-button-body { - /*background: url("../images/icons-all.gif") no-repeat 0 -89px;*/ -} - -.edui-notadd .edui-dialog-foot { - position: relative; - height: 56px; - border-top: 2px solid #ccc; -} - -.edui-notadd .edui-dialog-buttons { - position: absolute; - right: 10px; - bottom: 10px; -} - -.edui-notadd .edui-dialog-buttons .edui-button { - margin-right: 10px; -} - -.edui-notadd .edui-dialog-buttons .edui-okbutton { - background-color: #3498db; - border-radius: 5px; - color: #fff; -} - -.edui-notadd .edui-dialog-buttons .edui-cancelbutton { - background-color: #f3f3f3; - border-radius: 5px; - color: #898989; -} - -.edui-notadd .edui-dialog-buttons .edui-button .edui-button-body { - height: 34px; - width: 94px; - font-size: 12px; - line-height: 34px; - text-align: center; - cursor: default; - border-radius: 5px; -} - - -.edui-notadd .edui-dialog iframe { - border: 0; - padding: 0; - margin: 0; - vertical-align: top; -} - -.edui-notadd .edui-dialog-modalmask { - opacity: 0.3; - filter: alpha(opacity = 30); - background-color: #000; - position: absolute; -} - -.edui-notadd .edui-dialog-dragmask { - position: absolute; - /*z-index: 2001;*/ - background-color: transparent; - cursor: move; -} - -.edui-notadd .edui-dialog-content { - position: relative; -} - -.edui-notadd .dialogcontmask { - cursor: move; - visibility: hidden; - display: block; - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - filter: alpha(opacity = 0); -} - -/*link-dialog*/ -.edui-notadd .edui-for-link .edui-dialog-content { - width: 420px; - height: 257px; - overflow: hidden; -} -.edui-dialog .edui-for-link .edui-dialog-body { - height: 368px !important; - width: 420px !important; -} - -/*background-dialog*/ -.edui-notadd .edui-for-background .edui-dialog-content { - width: 465px; - height: 287px; - overflow: hidden; -} -.edui-dialog .edui-for-background .edui-dialog-body { - height: 398px !important; - width: 465px !important; -} - -/*template-dialog*/ -.edui-notadd .edui-for-template .edui-dialog-content { - width: 682px; - height: 406px; - overflow: hidden; -} -.edui-dialog .edui-for-template .edui-dialog-body { - height: 516px !important; - width: 682px !important; -} - -/*scrawl-dialog*/ -.edui-notadd .edui-for-scrawl .edui-dialog-content { - width: 640px; - height: 435px; -} -.edui-dialog .edui-for-scrawl .edui-dialog-body { - height: 545px !important; - width: 640px !important; -} - -/*spechars-dialog*/ -.edui-notadd .edui-for-spechars .edui-dialog-content { - width: 620px; - height: 500px; - *width: 630px; - *height: 570px; -} - -/*image-dialog*/ -.edui-notadd .edui-for-insertimage .edui-dialog-content { - width: 641px; - height: 455px; - overflow: hidden; -} -/*webapp-dialog*/ -.edui-notadd .edui-for-webapp .edui-dialog-content { - width: 560px; - _width: 565px; - height: 450px; - overflow: hidden; -} - -/*image-insertframe*/ -.edui-notadd .edui-for-insertframe .edui-dialog-content { - width: 400px; - height: 255px; - overflow: hidden; -} -.edui-dialog .edui-for-insertframe .edui-dialog-body { - height: 365px !important; - width: 400px !important; -} - -/*wordImage-dialog*/ -.edui-notadd .edui-for-wordimage .edui-dialog-content { - width: 620px; - height: 380px; - overflow: hidden; -} - -/*attachment-dialog*/ -.edui-notadd .edui-for-attachment .edui-dialog-content { - width: 650px; - height: 400px; - overflow: hidden; -} - -/*map-dialog*/ -.edui-notadd .edui-for-map .edui-dialog-content { - width: 640px; - height: 455px; -} -.edui-dialog .edui-for-map .edui-dialog-body { - height: 562px !important; - width: 640px !important; -} - -/*gmap-dialog*/ -.edui-notadd .edui-for-gmap .edui-dialog-content { - width: 640px; - height: 452px; -} -.edui-dialog .edui-for-gmap .edui-dialog-body { - height: 563px !important; - width: 640px !important; -} - -/*video-dialog*/ -.edui-notadd .edui-for-insertvideo .edui-dialog-content { - width: 641px; - height: 450px; -} -.edui-dialog .edui-for-insertvideo .edui-dialog-body { - height: 560px !important; - width: 640px !important; -} - -/*anchor-dialog*/ -.edui-notadd .edui-for-anchor .edui-dialog-content { - width: 320px; - height: 60px; - overflow: hidden; -} - -/*searchreplace-dialog*/ -.edui-notadd .edui-for-searchreplace .edui-dialog-content { - width: 404px; - height: 310px; -} - -.edui-dialog .edui-for-searchreplace .edui-dialog-body { - height: 364px !important; - width: 404px !important; -} - -/*help-dialog*/ -.edui-notadd .edui-for-help .edui-dialog-content { - width: 400px; - height: 420px; -} - -/*edittable-dialog*/ -.edui-notadd .edui-for-edittable .edui-dialog-content { - width: 540px; - _width:590px; - height: 335px; -} - -/*edittip-dialog*/ -.edui-notadd .edui-for-edittip .edui-dialog-content { - width: 225px; - height: 60px; -} - -/*edittd-dialog*/ -.edui-notadd .edui-for-edittd .edui-dialog-content { - width: 240px; - height: 50px; -} -/*snapscreen-dialog*/ -.edui-notadd .edui-for-snapscreen .edui-dialog-content { - width: 400px; - height: 220px; -} - -/*music-dialog*/ -.edui-notadd .edui-for-music .edui-dialog-content { - width: 630px; - height: 449px; -} -.edui-dialog .edui-for-music .edui-dialog-body { - height: 560px !important; - width: 630px !important; -} - -.edui-dialog-body .edui-dialog-foot .edui-icon:before { - content: ''; -} - -.edui-dialog-body .edui-dialog-titlebar .edui-icon:before { - content: '\e654'; - font-size: 18px; - font-weight: bold; - color: #ccc; -} - -.edui-dialog .edui-dialog-fullscreen-flag .edui-dialog-content { - padding: 20px; -} - -.icon-delete:before { - content: '\e654'; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css deleted file mode 100644 index 152833b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/editor.css +++ /dev/null @@ -1,161 +0,0 @@ -/*UI工具栏、编辑区域、底部*/ -.edui-notadd .edui-editor { - border: 1px solid #e5e5e5; - background-color: white; - position: relative; - overflow: visible; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; -} - -.edui-notadd .edui-dialog .edui-dialog-body { - font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; -} - -.edui-editor div{ - width:auto; - height:auto; - line-height: 1 !important; -} -.edui-notadd .edui-editor-toolbarbox { - position: relative; - zoom: 1; - border-top-left-radius:2px; - border-top-right-radius:2px; -} - -.edui-notadd .edui-editor-toolbarboxouter { - border-bottom: 1px solid #e5e5e5; - background-color: #f3f3f3; -} - -.edui-notadd .edui-editor-toolbarboxinner { - /*padding: 2px;*/ -} - -.edui-notadd .edui-editor-iframeholder .view p { - overflow: hidden; -} - -.edui-notadd .edui-editor-iframeholder { - position: relative; -} - -.edui-notadd .edui-editor-bottomContainer { - overflow: hidden; - padding: 0 4px; - border-top: 1px solid #e5e5e5; -} - -.edui-notadd .edui-editor-bottomContainer table { - width: 100%; - height: 0; - overflow: hidden; - border-spacing: 0; -} - -.edui-notadd .edui-editor-bottomContainer td { - white-space: nowrap; - line-height: 20px; - font-size: 12px; - font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; -} - -.edui-notadd .edui-editor-wordcount { - text-align: right; - margin-right: 5px; - color: #aaa; -} -.edui-notadd .edui-editor-scale { - width: 12px; -} -.edui-notadd .edui-editor-scale .edui-editor-icon { - float: right; - width: 100%; - height: 12px; - margin-top: 10px; - background: url(../images/scale.png) no-repeat; - cursor: se-resize; -} -.edui-notadd .edui-editor-breadcrumb { - margin: 2px 0 0 3px; -} - -.edui-notadd .edui-editor-breadcrumb span { - cursor: pointer; - /*text-decoration: underline;*/ - color: blue; -} - -.edui-notadd .edui-toolbar .edui-for-fullscreen { - float: right; -} - -.edui-notadd .edui-bubble .edui-popup-content { - border: 1px solid #e5e5e5; - background-color: #f3f3f3; - padding: 10px; - font-size: 10pt; - font-family: "宋体"; -} - -.edui-notadd .edui-bubble .edui-shadow { - /*box-shadow: 1px 1px 3px #818181;*/ - /*-webkit-box-shadow: 2px 2px 3px #818181;*/ - /*-moz-box-shadow: 2px 2px 3px #818181;*/ - /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ -} - -.edui-notadd .edui-editor-toolbarmsg { - background-color: #FFF6D9; - border-bottom: 1px solid #ccc; - position: absolute; - bottom: -25px; - left: 0; - z-index: 1009; - width: 99.9%; -} - -.edui-notadd .edui-editor-toolbarmsg-upload { - font-size: 14px; - color: blue; - width: 100px; - height: 16px; - line-height: 16px; - cursor: pointer; - position: absolute; - top: 5px; - left: 350px; -} - -.edui-notadd .edui-editor-toolbarmsg-label { - font-size: 12px; - line-height: 16px; - padding: 4px; -} - -.edui-notadd .edui-editor-toolbarmsg-close { - float: right; - width: 20px; - height: 16px; - line-height: 16px; - cursor: pointer; - color: red; -} - -.edui-iconfont { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; -} - -#edui1_imagescale_cover { - -} -.edui-notadd .edui-editor-imagescale { - -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css deleted file mode 100644 index 69651ac..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/iconfont.css +++ /dev/null @@ -1,194 +0,0 @@ - -@font-face {font-family: "edui-notadd"; - src: url('../fonts/iconfont.eot?t=1544172107808'); /* IE9*/ - src: url('../fonts/iconfont.eot?t=1544172107808#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), - url('../fonts/iconfont.ttf?t=1544172107808') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ - url('../fonts/iconfont.svg?t=1544172107808#iconfont') format('svg'); /* iOS 4.1- */ -} - -.edui-notadd .edui-icon{ - font-family:"edui-notadd" !important; - font-size:16px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.edui-iconfont { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; -} - -.edui-for-insertparagraphtrue .edui-icon:before { content: "\e6c1"; } - -.edui-for-splittocells .edui-icon:before { content: "\e6c2"; } - -.edui-for-insertcol .edui-icon:before { content: "\e6c4"; } - -.edui-for-insertparagraph .edui-icon:before { content: "\e6c9"; } - -.edui-for-insertimage .edui-icon:before { content: "\e6ce"; } - -.edui-for-date .edui-icon:before { content: "\e6d1"; } - -.edui-for-previousstep .edui-icon:before { content: "\e6d2"; } - -.edui-for-nextstep .edui-icon:before { content: "\e6d5"; } - -.edui-for-brush .edui-icon:before { content: "\e6d7"; } - -.edui-for-fullscreen .edui-icon:before { content: "\e6d9"; } - -.edui-for-scaleboard .edui-icon:before { content: "\e6da"; } - -.edui-for-clearboard .edui-icon:before { content: "\e6db"; } - -.edui-for-background .edui-icon:before { content: "\e6dc"; } - -.edui-for-strikethrough .edui-icon:before { content: "\e6dd"; } - -.edui-for-spechars .edui-icon:before { content: "\e6de"; } - -.edui-for-italic .edui-icon:before { content: "\e6e0"; } - -.edui-for-insertorderedlist .edui-icon:before { content: "\e6e1"; } - -.edui-for-formatmatch .edui-icon:before { content: "\e6e2"; } - -.edui-for-insertunorderedlist .edui-icon:before { content: "\e6e3"; } - -.edui-for-underline .edui-icon:before { content: "\e6e4"; } - -.edui-for-anchor .edui-icon:before { content: "\e6e5"; } - -.edui-for-removeformat .edui-icon:before { content: "\e6e6"; } - -.edui-for-blockquote .edui-icon:before { content: "\e6e7"; } - -.edui-for-source .edui-icon:before { content: "\e6e8"; } - -.edui-for-copy .edui-icon:before { content: "\e6ea"; } - -.edui-for-horizontal .edui-icon:before { content: "\e6eb"; } - -.edui-for-help .edui-icon:before { content: "\e6ed"; } - -.edui-for-indent .edui-icon:before { content: "\e6ee"; } - -.edui-for-justifyjustify .edui-icon:before { content: "\e6ef"; } - -.edui-for-justifycenter .edui-icon:before { content: "\e6f0"; } - -.edui-for-justifyleft .edui-icon:before { content: "\e6f1"; } - -.edui-for-justifyright .edui-icon:before { content: "\e6f2"; } - -.edui-for-link .edui-icon:before { content: "\e6f3"; } - -.edui-for-cleardoc .edui-icon:before { content: "\e6f4"; } - -.edui-for-notadd-ueditor-59 .edui-icon:before { content: "\e6f6"; } - -.edui-for-drafts .edui-icon:before { content: "\e6f7"; } - -.edui-for-superscript .edui-icon:before { content: "\e6f9"; } - -.edui-for-subscript .edui-icon:before { content: "\e6fa"; } - -.edui-for-forecolor .edui-icon:before { content: "\e6fb"; } - -.edui-for-arrow .edui-icon:before { content: "\e6fc"; } - -.edui-for-backcolor .edui-icon:before { content: "\e6fd"; } - -.edui-for-touppercase .edui-icon:before { content: "\e6fe"; } - -.edui-for-directionalityltr .edui-icon:before { content: "\e6ff"; } - -.edui-for-tolowercase .edui-icon:before { content: "\e700"; } - -.edui-for-directionalityrtl .edui-icon:before { content: "\e701"; } - -.edui-for-insertvideo .edui-icon:before { content: "\e705"; } - -.edui-for-emotion .edui-icon:before { content: "\e706"; } - -.edui-for-pasteplain .edui-icon:before { content: "\e707"; } - -.edui-for-preview .edui-icon:before { content: "\e708"; } - -.edui-for-print .edui-icon:before { content: "\e70a"; } - -.edui-for-selectall .edui-icon:before { content: "\e70d"; } - -.edui-for-mergecells .edui-icon:before { content: "\e70e"; } - -.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } - -.edui-for-deletecol .edui-icon:before { content: "\e714"; } - -.edui-for-deleterow .edui-icon:before { content: "\e715"; } - -.edui-for-deletetable .edui-icon:before { content: "\e716"; } - -.edui-for-inserttable .edui-icon:before { content: "\e717"; } - -.edui-for-music .edui-icon:before { content: "\e719"; } - -.edui-for-attachment .edui-icon:before { content: "\e71c"; } - -.edui-for-mergedown .edui-icon:before { content: "\e71d"; } - -.edui-for-mergeright .edui-icon:before { content: "\e71e"; } - -.edui-for-splittorows .edui-icon:before { content: "\e71f"; } - -.edui-for-splittocols .edui-icon:before { content: "\e721"; } - -.edui-for-fontborder .edui-icon:before { content: "\e724"; } - -.edui-for-insertframe .edui-icon:before { content: "\e725"; } - -.edui-for-gmap .edui-icon:before { content: "\e726"; } - -.edui-for-template .edui-icon:before { content: "\e72a"; } - -.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e72c"; } - -.edui-for-time .edui-icon:before { content: "\e72e"; } - -.edui-for-pagebreak .edui-icon:before { content: "\e732"; } - -.edui-for-imagenone .edui-icon:before { content: "\e733"; } - -.edui-for-imageleft .edui-icon:before { content: "\e734"; } - -.edui-for-imageright .edui-icon:before { content: "\e735"; } - -.edui-for-imagecenter .edui-icon:before { content: "\e736"; } - -.edui-for-snapscreen .edui-icon:before { content: "\e738"; } - -.edui-for-autotypeset .edui-icon:before { content: "\e739"; } - -.edui-for-lineheight .edui-icon:before { content: "\e73b"; } - -.edui-for-wordimage .edui-icon:before { content: "\e73c"; } - -.edui-for-redo .edui-icon:before { content: "\e73d"; } - -.edui-for-rowspacingbottom .edui-icon:before { content: "\e73e"; } - -.edui-for-scrawl .edui-icon:before { content: "\e73f"; } - -.edui-for-rowspacingtop .edui-icon:before { content: "\e740"; } - -.edui-for-undo .edui-icon:before { content: "\e742"; } - -.edui-for-close .edui-icon:before { content: "\e745"; } - -.edui-for-map .edui-icon:before { content: "\e668"; } - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css deleted file mode 100644 index 038a3cf..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menu.css +++ /dev/null @@ -1,49 +0,0 @@ -/* 可选中按钮弹出菜单*/ -.edui-notadd .edui-menu { - z-index: 3000; -} - -.edui-notadd .edui-menu .edui-popup-content { - padding: 0; - overflow: hidden; -} - -.edui-notadd .edui-menu-body { - _width: 150px; - min-width: 170px; -} - -.edui-notadd .edui-menuitem-body { - font-size: 14px; - color: #666; -} - -.edui-notadd .edui-menuitem { - height: 30px; - cursor: default; - vertical-align: top; -} - -.edui-notadd .edui-menuitem .edui-icon { - line-height: 1.3; -} - -.edui-notadd .edui-menuitem .edui-label { - font-size: 12px; - line-height: 20px; - height: 20px; - padding-left: 10px; -} - -.edui-notadd .edui-state-checked .edui-menuitem-body { - background: url("../images/icons-all.gif") no-repeat 6px -205px; -} - -.edui-notadd .edui-state-disabled .edui-menuitem-label { - color: gray; -} - -.edui-notadd .edui-menu-body .edui-menuitem.edui-for-setbordervisible { - padding-left: 25px; -} - diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css deleted file mode 100644 index f1bdb3c..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/menubutton.css +++ /dev/null @@ -1,70 +0,0 @@ -/*可选中菜单按钮*/ -.edui-notadd .edui-list .edui-bordereraser { - display: none; -} - -.edui-notadd .edui-listitem { - white-space: nowrap; -} - -.edui-notadd .edui-list .edui-state-hover { - position: relative; - background-color: #f3f3f3; - padding: 0; -} - -.edui-notadd .edui-for-fontfamily .edui-listitem-label { - min-width: 130px; - _width: 120px; - font-size: 12px; - height: 22px; - line-height: 22px; - padding-left: 5px; -} -.edui-notadd .edui-for-insertcode .edui-listitem-label { - min-width: 120px; - _width: 120px; - font-size: 12px; - height: 22px; - line-height: 22px; - padding-left: 5px; -} -.edui-notadd .edui-for-underline .edui-listitem-label { - min-width: 120px; - _width: 120px; - padding: 3px 5px; - font-size: 12px; -} - -.edui-notadd .edui-for-fontsize .edui-listitem-label { - min-width: 120px; - _width: 120px; - padding: 3px 5px; - -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label { - min-width: 200px; - _width: 200px; - padding: 2px 5px; -} - -.edui-notadd .edui-for-rowspacingtop .edui-listitem-label, -.edui-notadd .edui-for-rowspacingbottom .edui-listitem-label { - min-width: 53px; - _width: 53px; - padding: 2px 5px; -} - -.edui-notadd .edui-for-lineheight .edui-listitem-label { - min-width: 53px; - _width: 53px; - padding: 2px 5px; -} - -.edui-notadd .edui-for-customstyle .edui-listitem-label { - min-width: 200px; - _width: 200px; - width: 200px !important; - padding: 2px 5px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css deleted file mode 100644 index 5fffbd0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/message.css +++ /dev/null @@ -1,66 +0,0 @@ -.edui-notadd .edui-editor-messageholder { - display: block; - width: 150px; - height: auto; - border: 0; - margin: 0; - padding: 0; - position: absolute; - top: 28px; - right: 3px; -} - -.edui-notadd .edui-message{ - min-height: 10px; - text-shadow: 0 1px 0 rgba(255,255,255,0.5); - padding: 0; - margin-bottom: 3px; - position: relative; -} -.edui-notadd .edui-message-body{ - border-radius: 3px; - padding: 8px 15px 8px 8px; - color: #c09853; - background-color: #fcf8e3; - border: 1px solid #fbeed5; -} -.edui-notadd .edui-message-type-info{ - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1 -} -.edui-notadd .edui-message-type-success{ - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6 -} -.edui-notadd .edui-message-type-danger, -.edui-notadd .edui-message-type-error{ - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7 -} -.edui-notadd .edui-message .edui-message-closer { - display: block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 0; - right: 0; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - float: right; - font-size: 20px; - font-weight: bold; - color: #999; - text-shadow: 0 1px 0 #fff; - font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; -} -.edui-notadd .edui-message .edui-message-content { - font-size: 10pt; - word-wrap: break-word; - word-break: normal; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css deleted file mode 100644 index 57829c2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/multiMenu.css +++ /dev/null @@ -1,29 +0,0 @@ -/*表情按钮及弹出菜单*/ -/*去除了表情的下拉箭头*/ -.edui-notadd .edui-for-emotion .edui-icon { - background-position: -60px -20px; -} -.edui-notadd .edui-for-emotion .edui-popup-content iframe -{ - width: 514px; - height: 380px; - overflow: hidden; -} -.edui-notadd .edui-for-emotion .edui-popup-content -{ - position: relative; - z-index: 555 -} - -.edui-notadd .edui-for-emotion .edui-splitborder { - display: none -} - -.edui-notadd .edui-for-emotion .edui-splitbutton-body .edui-arrow -{ - width: 0 -} -.edui-notadd .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder -{ - /*border-left: 1px solid transparent;*/ -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css deleted file mode 100644 index e0d66b2..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/neditor.css +++ /dev/null @@ -1,60 +0,0 @@ -/*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载 -*/ - -/*-------基础UI构建,必须加载-------*/ -@import "uibase.css"; -@import "toolbar.css"; -@import "editor.css"; - - -/*-------可选中菜单按钮,按需加载-------*/ - /*可选中菜单按钮--依赖splitbutton*/ -@import "menubutton.css"; - /*可选中菜单按钮-弹出菜单*/ -@import "menu.css"; - - -/*-------不可选中菜单按钮,按需加载-------*/ - /*不可选中菜单按钮--依赖splitbutton*/ -@import "combox.css"; - - -/*-------按钮类型,按需加载-------*/ - /*普通按钮*/ -@import "button.css"; - /*按钮icon*/ -@import "buttonicon.css"; -@import "buttoniconex.css"; - /*弹出菜单按钮-附加按钮*/ -@import "splitbutton.css"; - /*弹出菜单*/ -@import "popup.css"; - /*提示消息*/ -@import "message.css"; - - -/*-------独立按钮样式,按需加载-------*/ - /*弹出对话框样式*/ -@import "dialog.css"; - /*段落格式弹出菜单*/ -@import "paragraphpicker.css"; - /*表格弹出菜单*/ -@import "tablepicker.css"; - /*颜色弹出菜单*/ -@import "colorpicker.css"; - /*自动排版弹出菜单*/ -@import "autotypesetpicker.css"; - /*平均分布菜单*/ -@import "cellalignpicker.css"; - /*分隔线*/ -@import "separtor.css"; - /*颜色按钮--依赖splitbutton*/ -@import "colorbutton.css"; - /*表情按钮--依赖splitbutton*/ -@import "multiMenu.css"; - /*右键菜单*/ -@import "contextmenu.css"; - /*快捷菜单*/ -@import "shortcutmenu.css"; - /*粘贴提示*/ -@import "pastepicker.css"; \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css deleted file mode 100644 index 3f66871..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/paragraphpicker.css +++ /dev/null @@ -1,45 +0,0 @@ -/*段落弹出菜单*/ -.edui-notadd .edui-for-paragraph .edui-listitem-label { - font-family: Tahoma, Verdana, Arial, Helvetica; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-p { - font-size: 22px; - line-height: 27px; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h1 { - font-weight: bolder; - font-size: 32px; - line-height: 36px; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h2 { - font-weight: bolder; - font-size: 27px; - line-height: 29px; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h3 { - font-weight: bolder; - font-size: 19px; - line-height: 23px; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h4 { - font-weight: bolder; - font-size: 16px; - line-height: 19px -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h5 { - font-weight: bolder; - font-size: 13px; - line-height: 16px; -} - -.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h6 { - font-weight: bolder; - font-size: 12px; - line-height: 14px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css deleted file mode 100644 index 10e9c8e..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/pastepicker.css +++ /dev/null @@ -1,72 +0,0 @@ -/*粘贴弹出菜单*/ -.edui-notadd .edui-wordpastepop .edui-popup-content{ - border: none; - padding: 0; - width: 54px; - height: 21px; -} -.edui-notadd .edui-pasteicon { - width: 100%; - height: 100%; - background-image: url('../images/wordpaste.png'); - background-position: 0 0; -} - -.edui-notadd .edui-pasteicon.edui-state-opened { - background-position: 0 -34px; -} - -.edui-notadd .edui-pastecontainer { - position: relative; - visibility: hidden; - width: 97px; - background: #fff; - border: 1px solid #ccc; -} - -.edui-notadd .edui-pastecontainer .edui-title { - font-weight: bold; - background: #F8F8FF; - height: 25px; - line-height: 25px; - font-size: 12px; - padding-left: 5px; -} - -.edui-notadd .edui-pastecontainer .edui-button { - overflow: hidden; - margin: 3px 0; -} - -.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon, -.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon, -.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon{ - float: left; - cursor: pointer; - width: 29px; - height: 29px; - margin-left: 5px; - background-image: url('../images/wordpaste.png'); - background-repeat: no-repeat; -} -.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon { - margin-left: 0; - background-position: -109px 0; -} -.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon { - background-position: -148px 1px; -} - -.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon { - background-position: -72px 0; -} - -.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { - background-position: -109px -34px; -} -.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ - background-position: -148px -34px; -} -.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ - background-position: -72px -34px; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css deleted file mode 100644 index 41bce98..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/popup.css +++ /dev/null @@ -1,78 +0,0 @@ -/* 弹出菜单 */ -.edui-notadd .edui-popup { - z-index: 3000; - width:auto; - height:auto; - -} - -.edui-notadd .edui-popup .edui-shadow { - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.edui-notadd .edui-popup-content { - border:1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - padding: 10px; - background:#ffffff; -} - -.edui-notadd .edui-popup .edui-bordereraser { - background-color: white; - height: 3px; - display: none; -} - -.edui-notadd .edui-menu .edui-bordereraser { - height: 3px; -} - -.edui-notadd .edui-anchor-topleft .edui-bordereraser { - left: 1px; - top: -2px; -} - -.edui-notadd .edui-anchor-topright .edui-bordereraser { - right: 1px; - top: -2px; -} - -.edui-notadd .edui-anchor-bottomleft .edui-bordereraser { - left: 0; - bottom: -6px; - height: 7px; - border-left: 1px solid gray; - border-right: 1px solid gray; -} - -.edui-notadd .edui-anchor-bottomright .edui-bordereraser { - right: 0; - bottom: -6px; - height: 7px; - border-left: 1px solid gray; - border-right: 1px solid gray; -} - -.edui-popup div{ - width:auto; - height:auto; -} - -.edui-notadd .edui-bubble .edui-popup-body{ - width: 355px !important; - height: 40px !important; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css deleted file mode 100644 index f4ebb0b..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/separtor.css +++ /dev/null @@ -1,4 +0,0 @@ -/*分隔线*/ -.edui-notadd .edui-toolbar .edui-separator { - display: none; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css deleted file mode 100644 index 8dda16f..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/shortcutmenu.css +++ /dev/null @@ -1,9 +0,0 @@ -/*弹出菜单*/ -.edui-notadd .edui-shortcutmenu { - padding: 2px; - width: 190px; - height: 50px; - background-color: #fff; - border: 1px solid #ccc; - border-radius: 5px; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css deleted file mode 100644 index fe43e78..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/splitbutton.css +++ /dev/null @@ -1,94 +0,0 @@ -/*splitbutton*/ -.edui-notadd .edui-toolbar .edui-splitbutton-body .edui-arrow::after, -.edui-notadd .edui-toolbar .edui-menubutton-body .edui-arrow::after { - font-family:"edui-notadd" !important; - font-size:16px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - content: "\e64f"; - display: block; - position: relative; - right: 5px; -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-splitbutton-body, -.edui-notadd .edui-toolbar .edui-menubutton .edui-menubutton-body { - /*padding: 1px;*/ -} - -.edui-notadd .edui-toolbar .edui-splitborder { - height: 20px; -} - -.edui-notadd .edui-toolbar .edui-state-hover .edui-splitborder { - /*width: 1px;*/ - /*border-left: 0px solid #dcac6c;*/ -} - -.edui-notadd .edui-toolbar .edui-state-active .edui-splitborder { - /*width: 0;*/ - /*border-left: 1px solid gray;*/ -} - -.edui-notadd .edui-toolbar .edui-state-opened .edui-splitborder { - /*width: 1px;*/ - /*border: 0;*/ -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon { - color: #fff; -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { - background-color: #e5e5e5; - /*border: 1px solid #dcac6c;*/ - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { - background-color: #666; - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { - background-color: #666; - padding: 0; -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon { - color: #fff; -} - -.edui-notadd .edui-state-disabled .edui-arrow { - opacity: 0.3; - _filter: alpha(opacity = 30); -} - -.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, -.edui-notadd .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { - padding: 0; -} - -.edui-notadd .edui-for-insertorderedlist .edui-bordereraser, -.edui-notadd .edui-for-lineheight .edui-bordereraser, -.edui-notadd .edui-for-rowspacingtop .edui-bordereraser, -.edui-notadd .edui-for-rowspacingbottom .edui-bordereraser, -.edui-notadd .edui-for-insertunorderedlist .edui-bordereraser { - background-color: white; -} - -/* 解决嵌套导致的图标问题 */ -.edui-notadd .edui-for-insertorderedlist .edui-popup-body .edui-icon, -.edui-notadd .edui-for-lineheight .edui-popup-body .edui-icon, -.edui-notadd .edui-for-rowspacingtop .edui-popup-body .edui-icon, -.edui-notadd .edui-for-rowspacingbottom .edui-popup-body .edui-icon, -.edui-notadd .edui-for-insertunorderedlist .edui-popup-body .edui-icon { - background-image: none ; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css deleted file mode 100644 index 9f090f0..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/tablepicker.css +++ /dev/null @@ -1,41 +0,0 @@ -/* 表格弹出菜单 */ -.edui-notadd .edui-for-inserttable .edui-splitborder { - display: none -} -.edui-notadd .edui-for-inserttable .edui-splitbutton-body .edui-arrow { - width: 0 -} -.edui-notadd .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ - /*border-left: 1px solid transparent;*/ -} -.edui-notadd .edui-tablepicker .edui-infoarea { - height: 14px; - line-height: 14px; - font-size: 12px; - width: 220px; - margin-bottom: 3px; - clear: both; -} - -.edui-notadd .edui-tablepicker .edui-infoarea .edui-label { - float: left; -} - -.edui-notadd .edui-dialog-buttons .edui-label { - line-height: 34px; - font-size: 14px; -} - -.edui-notadd .edui-tablepicker .edui-infoarea .edui-clickable { - float: right; -} - -.edui-notadd .edui-tablepicker .edui-pickarea { - background: url("../images/unhighlighted.gif") repeat; - height: 220px; - width: 220px; -} - -.edui-notadd .edui-tablepicker .edui-pickarea .edui-overlay { - background: url("../images/highlighted.gif") repeat; -} diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css deleted file mode 100644 index d4d3817..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/toolbar.css +++ /dev/null @@ -1,17 +0,0 @@ -/* 工具栏 */ -.edui-notadd .edui-toolbar { - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - overflow: hidden; /*全屏下单独一行不占位*/ - zoom: 1; - width:auto; - height:auto; -} - -.edui-notadd .edui-toolbar .edui-button, -.edui-notadd .edui-toolbar .edui-splitbutton, -.edui-notadd .edui-toolbar .edui-menubutton, -.edui-notadd .edui-toolbar .edui-combox { - padding: 4px 0 !important; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css deleted file mode 100644 index b7ce608..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/uibase.css +++ /dev/null @@ -1,119 +0,0 @@ -/*基础UI构建 -*/ -/* common layer */ -.edui-notadd * { - box-sizing: border-box; -} -.edui-notadd .edui-box { - border: none; - padding: 0; - margin: 0; - overflow: hidden; -} - -.edui-notadd a.edui-box { - display: block; - text-decoration: none; - color: black; -} - -.edui-notadd a.edui-box:hover { - text-decoration: none; -} - -.edui-notadd a.edui-box:active { - text-decoration: none; -} - -.edui-notadd table.edui-box { - border-collapse: collapse; -} - -.edui-notadd ul.edui-box { - list-style-type: none; -} - -div.edui-box { - position: relative; - display: -moz-inline-box !important; - display: inline-block !important; - vertical-align: middle; -} - -.edui-notadd .edui-clearfix { - zoom: 1 -} - -.edui-notadd .edui-clearfix:after { - content: '\20'; - display: block; - clear: both; -} - - * html div.edui-box { - display: inline !important; -} - -*:first-child+html div.edui-box { - display: inline !important; -} - -/* control layout */ -.edui-notadd .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { - position: relative; -} - -.edui-notadd .edui-popup { - position: absolute; - -webkit-user-select: none; - -moz-user-select: none; -} - -.edui-notadd .edui-popup .edui-shadow { - position: absolute; - z-index: -1; -} - -.edui-notadd .edui-popup .edui-bordereraser { - position: absolute; - overflow: hidden; -} - -.edui-notadd .edui-tablepicker .edui-canvas { - position: relative; -} - -.edui-notadd .edui-tablepicker .edui-canvas .edui-overlay { - position: absolute; -} - -.edui-notadd .edui-dialog-modalmask, .edui-dialog-dragmask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.edui-notadd .edui-toolbar { - position: relative; -} - -/* - * default theme - */ -.edui-notadd .edui-label { - cursor: default; -} - -.edui-notadd span.edui-clickable { - color: #666; - cursor: pointer; - text-decoration: none; - padding-left: 5px; -} - -.edui-notadd span.edui-unclickable { - color: gray; - cursor: default; -} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.css similarity index 34% rename from web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css rename to web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.css index cc6812e..1cb76b0 100644 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/_css/buttoniconex.css +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.css @@ -1,272 +1,2356 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-notadd * { + box-sizing: border-box; +} +.edui-notadd .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} -@font-face {font-family: "edui-notadd"; - src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/ - src: url('../fonts/iconfont.eot?t=1544182120898#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), - url('../fonts/iconfont.ttf?t=1544182120898') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ - url('../fonts/iconfont.svg?t=1544182120898#edui-notadd') format('svg'); /* iOS 4.1- */ +.edui-notadd a.edui-box { + display: block; + text-decoration: none; + color: black; } -.edui-notadd .edui-icon{ - font-family:"edui-notadd" !important; - font-size:16px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.edui-notadd a.edui-box:hover { + text-decoration: none; } -.edui-iconfont { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; + +.edui-notadd a.edui-box:active { + text-decoration: none; } -.edui-for-close .edui-icon:before { content: "\e654"; } +.edui-notadd table.edui-box { + border-collapse: collapse; +} -.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } +.edui-notadd ul.edui-box { + list-style-type: none; +} -.edui-for-italic .edui-icon:before { content: "\e62d"; } +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: middle; +} -.edui-for-insertcaption .edui-icon:before { content: "\e657"; } +.edui-notadd .edui-clearfix { + zoom: 1 +} -.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; } +.edui-notadd .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} -.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; } + * html div.edui-box { + display: inline !important; +} -.edui-for-insertimage .edui-icon:before { content: "\e617"; } +*:first-child+html div.edui-box { + display: inline !important; +} -.edui-for-previousstep .edui-icon:before { content: "\e630"; } +/* control layout */ +.edui-notadd .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} -.edui-for-nextstep .edui-icon:before { content: "\e631"; } +.edui-notadd .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} -.edui-for-scaleboard .edui-icon:before { content: "\e632"; } +.edui-notadd .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} -.edui-for-brush .edui-icon:before { content: "\e633"; } +.edui-notadd .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} -.edui-for-background .edui-icon:before { content: "\e65d"; } +.edui-notadd .edui-tablepicker .edui-canvas { + position: relative; +} -.edui-for-strikethrough .edui-icon:before { content: "\e60c"; } +.edui-notadd .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} -.edui-for-spechars .edui-icon:before { content: "\e603"; } +.edui-notadd .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} -.edui-for-clearboard .edui-icon:before { content: "\e634"; } +.edui-notadd .edui-toolbar { + position: relative; +} -.edui-for-bold .edui-icon:before { content: "\e604"; } +/* + * default theme + */ +.edui-notadd .edui-label { + cursor: default; +} -.edui-for-fullscreen .edui-icon:before { content: "\e656"; } +.edui-notadd span.edui-clickable { + color: #666; + cursor: pointer; + text-decoration: none; + padding-left: 5px; +} -.edui-for-formatmatch .edui-icon:before { content: "\e60d"; } +.edui-notadd span.edui-unclickable { + color: gray; + cursor: default; +} +/* 工具栏 */ +.edui-notadd .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} -.edui-for-underline .edui-icon:before { content: "\e605"; } +.edui-notadd .edui-toolbar .edui-button, +.edui-notadd .edui-toolbar .edui-splitbutton, +.edui-notadd .edui-toolbar .edui-menubutton, +.edui-notadd .edui-toolbar .edui-combox { + padding: 4px 0 !important; +} +/*UI工具栏、编辑区域、底部*/ +.edui-notadd .edui-editor { + border: 1px solid #e5e5e5; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; +} -.edui-for-removeformat .edui-icon:before { content: "\e60e"; } +.edui-notadd .edui-dialog .edui-dialog-body { + font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", STXihei, STHeiti, Heiti, SimSun, sans-serif; +} -.edui-for-blockquote .edui-icon:before { content: "\e60f"; } +.edui-editor div{ + width:auto; + height:auto; + line-height: 1 !important; +} +.edui-notadd .edui-editor-toolbarbox { + position: relative; + zoom: 1; + border-top-left-radius:2px; + border-top-right-radius:2px; +} -.edui-for-anchor .edui-icon:before { content: "\e618"; } +.edui-notadd .edui-editor-toolbarboxouter { + border-bottom: 1px solid #e5e5e5; + background-color: #f3f3f3; +} -.edui-for-help .edui-icon:before { content: "\e619"; } +.edui-notadd .edui-editor-toolbarboxinner { + /*padding: 2px;*/ +} -.edui-for-horizontal .edui-icon:before { content: "\e638"; } +.edui-notadd .edui-editor-iframeholder .view p { + overflow: hidden; +} -.edui-for-simpleupload .edui-icon:before { content: "\e61a"; } +.edui-notadd .edui-editor-iframeholder { + position: relative; +} -.edui-for-indent .edui-icon:before { content: "\e61b"; } +.edui-notadd .edui-editor-bottomContainer { + overflow: hidden; + padding: 0 4px; + border-top: 1px solid #e5e5e5; +} -.edui-for-justifycenter .edui-icon:before { content: "\e61c"; } +.edui-notadd .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} -.edui-for-justifyleft .edui-icon:before { content: "\e61d"; } +.edui-notadd .edui-editor-bottomContainer td { + white-space: nowrap; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} -.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; } +.edui-notadd .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-notadd .edui-editor-scale { + width: 12px; +} +.edui-notadd .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-notadd .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} -.edui-for-justifyright .edui-icon:before { content: "\e61f"; } +.edui-notadd .edui-editor-breadcrumb span { + cursor: pointer; + /*text-decoration: underline;*/ + color: blue; +} -.edui-for-link .edui-icon:before { content: "\e620"; } +.edui-notadd .edui-toolbar .edui-for-fullscreen { + float: right; +} -.edui-for-cleardoc .edui-icon:before { content: "\e621"; } +.edui-notadd .edui-bubble .edui-popup-content { + border: 1px solid #e5e5e5; + background-color: #f3f3f3; + padding: 10px; + font-size: 10pt; + font-family: "宋体"; +} -.edui-for-drafts .edui-icon:before { content: "\e610"; } +.edui-notadd .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} -.edui-for-subscript .edui-icon:before { content: "\e611"; } +.edui-notadd .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} -.edui-for-unlink .edui-icon:before { content: "\e622"; } +.edui-notadd .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} -.edui-for-superscript .edui-icon:before { content: "\e612"; } +.edui-notadd .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} -.edui-for-forecolor .edui-icon:before { content: "\e63a"; } +.edui-notadd .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} -.edui-for-backcolor .edui-icon:before { content: "\e655"; } +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} -.edui-for-touppercase .edui-icon:before { content: "\e623"; } +#edui1_imagescale_cover { -.edui-for-tolowercase .edui-icon:before { content: "\e624"; } +} +.edui-notadd .edui-editor-imagescale { -.edui-for-insertvideo .edui-icon:before { content: "\e627"; } +} +/*可选中菜单按钮*/ +.edui-notadd .edui-list .edui-bordereraser { + display: none; +} -.edui-for-emotion .edui-icon:before { content: "\e606"; } +.edui-notadd .edui-listitem { + white-space: nowrap; +} -.edui-for-pasteplain .edui-icon:before { content: "\e613"; } +.edui-notadd .edui-list .edui-state-hover { + position: relative; + background-color: #f3f3f3; + padding: 0; +} -.edui-for-preview .edui-icon:before { content: "\e63b"; } +.edui-notadd .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-notadd .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-notadd .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} -.edui-for-print .edui-icon:before { content: "\e63c"; } +.edui-notadd .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; -.edui-for-selectall .edui-icon:before { content: "\e614"; } +} -.edui-for-mergecells .edui-icon:before { content: "\e63d"; } +.edui-notadd .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} -.edui-for-deletecol .edui-icon:before { content: "\e63e"; } +.edui-notadd .edui-for-rowspacingtop .edui-listitem-label, +.edui-notadd .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} -.edui-for-deleterow .edui-icon:before { content: "\e63f"; } +.edui-notadd .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} -.edui-for-attachment .edui-icon:before { content: "\e628"; } +.edui-notadd .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} +/* 可选中按钮弹出菜单*/ +.edui-notadd .edui-menu { + z-index: 3000; +} -.edui-for-music .edui-icon:before { content: "\e640"; } +.edui-notadd .edui-menu .edui-popup-content { + padding: 0; + overflow: hidden; +} -.edui-for-gmap .edui-icon:before { content: "\e629"; } +.edui-notadd .edui-menu-body { + _width: 150px; + min-width: 170px; +} -.edui-for-insertframe .edui-icon:before { content: "\e645"; } +.edui-notadd .edui-menuitem-body { + font-size: 14px; + color: #666; +} -.edui-for-pdfformat .edui-icon:before { content: "\e62f"; } +.edui-notadd .edui-menuitem { + height: 30px; + cursor: default; + vertical-align: top; +} -.edui-for-word .edui-icon:before { content: "\e646"; } +.edui-notadd .edui-menuitem .edui-icon { + line-height: 1.3; +} -.edui-for-excel .edui-icon:before { content: "\e647"; } +.edui-notadd .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} -.edui-for-time .edui-icon:before { content: "\e64a"; } +.edui-notadd .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} -.edui-for-snapscreen .edui-icon:before { content: "\e650"; } +.edui-notadd .edui-state-disabled .edui-menuitem-label { + color: gray; +} -.edui-for-wordimage .edui-icon:before { content: "\e652"; } +.edui-notadd .edui-menu-body .edui-menuitem.edui-for-setbordervisible { + padding-left: 25px; +} -.edui-for-edittd .edui-icon:before { content: "\e65a"; } -.edui-for-lineheight .edui-icon:before { content: "\e62a"; } +/*不可选中菜单按钮 */ +.edui-notadd .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px !important; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} -.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; } +.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow::after { + height: 25px; + line-height: 24px; + font-family:"edui-notadd" !important; + font-size: 26px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: "\e64f"; + /*padding: 10px 0;*/ + display: block; +} -.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; } +.edui-notadd .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + margin: 0 10px; + height: 26px; + line-height: 26px; +} -.edui-for-scrawl .edui-icon:before { content: "\e616"; } +.edui-notadd .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} -.edui-for-redo .edui-icon:before { content: "\e609"; } +.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} -.edui-for-undo .edui-icon:before { content: "\e600"; } +.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #f3f3f3; + border: 1px solid #ccc; +} -.edui-for-inserttitle .edui-icon:before { content: "\e65b"; } +.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #ccc; +} -.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; } +.edui-notadd .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} -.edui-for-aligntable .edui-icon:before { content: "\e662"; } +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} -.edui-for-table .edui-icon:before { content: "\e664"; } +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} -.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; } +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} +/*普通按钮样式及状态*/ +.edui-notadd .edui-toolbar .edui-button .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-icon, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon { + padding: 5px !important; + display: block; + height: 26px !important; + width: 26px !important; + line-height: 1 !important; +} -.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; } +.edui-notadd .edui-toolbar .edui-button .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon::before { + display: none; +} -.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon::before { + display: block; +} -.edui-for-paste .edui-icon:before { content: "\e667"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon svg { + display: none; +} -.edui-for-map .edui-icon:before { content: "\e668"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon::before { + display: block; +} -.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon svg { + display: none; +} -.edui-for-imagecenter .edui-icon:before { content: "\e602"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon::before, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon::before, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon::before { + display: block; +} -.edui-for-imagenone .edui-icon:before { content: "\e607"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon svg, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon svg, +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon svg { + display: none; +} -.edui-for-fontborder .edui-icon:before { content: "\e608"; } +.edui-dialog-buttons .edui-icon svg { + display: none; +} -.edui-for-edittable .edui-icon:before { content: "\e60a"; } +.edui-notadd .edui-toolbar .edui-button .edui-icon { + color: #666; +} -.edui-for-imageleft .edui-icon:before { content: "\e60b"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon { + color: #fff; +} -.edui-for-imageright .edui-icon:before { content: "\e615"; } +.edui-notadd .edui-toolbar .edui-button .edui-button-wrap { + position: relative; +} -.edui-for-insertcol .edui-icon:before { content: "\e625"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #e5e5e5; + padding: 0; +} -.edui-for-insertcolnext .edui-icon:before { content: "\e626"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #666666; + padding: 0; +} -.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #666666; + padding: 0; +} -.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; } +.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon { + color: #fff; +} -.edui-for-insertrow .edui-icon:before { content: "\e637"; } +.edui-notadd .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} -.edui-for-insertrownext .edui-icon:before { content: "\e639"; } +.edui-notadd .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity=30); +} -.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; } +/* toolbar icons */ +.edui-notadd .edui-for-undo .edui-icon { + /*background-position: -160px 0;*/ +} -.edui-for-mergeright .edui-icon:before { content: "\e642"; } +.edui-notadd .edui-for-redo .edui-icon { + /*background-position: -100px 0;*/ +} -.edui-for-mergedown .edui-icon:before { content: "\e643"; } +.edui-notadd .edui-for-bold .edui-icon { + /*background-position: 0 0;*/ +} -.edui-for-inserttable .edui-icon:before { content: "\e644"; } +.edui-notadd .edui-for-italic .edui-icon { + /*background-position: -60px 0;*/ +} -.edui-for-pagebreak .edui-icon:before { content: "\e648"; } +.edui-notadd .edui-for-fontborder .edui-icon { + /*background-position:-160px -40px;*/ +} +.edui-notadd .edui-for-underline .edui-icon { + /*background-position: -140px 0;*/ +} -.edui-for-source .edui-icon:before { content: "\e649"; } +.edui-notadd .edui-for-strikethrough .edui-icon { + /*background-position: -120px 0;*/ +} -.edui-for-splittorows .edui-icon:before { content: "\e64b"; } +.edui-notadd .edui-for-subscript .edui-icon { + /*background-position: -600px 0;*/ +} -.edui-for-splittocols .edui-icon:before { content: "\e64c"; } +.edui-notadd .edui-for-superscript .edui-icon { + /*background-position: -620px 0;*/ +} -.edui-for-splittocells .edui-icon:before { content: "\e64d"; } +.edui-notadd .edui-for-blockquote .edui-icon { + /*background-position: -220px 0;*/ +} -.edui-for-arrow .edui-icon:before { content: "\e64f"; } +.edui-notadd .edui-for-forecolor .edui-icon { + /*background-position: -720px 0;*/ +} -.edui-for-aligntd .edui-icon:before { content: "\e651"; } +.edui-notadd .edui-for-backcolor .edui-icon { + /*background-position: -760px 0;*/ +} -.edui-for-autotypeset .edui-icon:before { content: "\e653"; } +.edui-notadd .edui-for-inserttable .edui-icon { + /*background-position: -580px -20px;*/ +} -.edui-for-charts .edui-icon:before { content: "\e658"; } +.edui-notadd .edui-for-autotypeset .edui-icon { + /*background-position: -640px -40px;*/ +} -.edui-for-closeerror .edui-icon:before { content: "\e65c"; } +.edui-notadd .edui-for-justifyleft .edui-icon { + /*background-position: -460px 0;*/ +} -.edui-for-copy .edui-icon:before { content: "\e65f"; } +.edui-notadd .edui-for-justifycenter .edui-icon { + /*background-position: -420px 0;*/ +} -.edui-for-date .edui-icon:before { content: "\e661"; } +.edui-notadd .edui-for-justifyright .edui-icon { + /*background-position: -480px 0;*/ +} -.edui-for-deletetable .edui-icon:before { content: "\e669"; } +.edui-notadd .edui-for-justifyjustify .edui-icon { + /*background-position: -440px 0;*/ +} -.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; } +.edui-notadd .edui-for-insertorderedlist .edui-icon { + /*background-position: -80px 0;*/ +} -.edui-for-arrowright .edui-icon:before { content: "\e66b"; } +.edui-notadd .edui-for-insertunorderedlist .edui-icon { + /*background-position: -20px 0;*/ +} -.edui-for-tableleft .edui-icon:before { content: "\e66c"; } +.edui-notadd .edui-for-lineheight .edui-icon { + /*background-position: -725px -40px;*/ +} -.edui-for-tableright .edui-icon:before { content: "\e66d"; } +.edui-notadd .edui-for-rowspacingbottom .edui-icon { + /*background-position: -745px -40px;*/ +} -.edui-for-tablecenter .edui-icon:before { content: "\e66e"; } +.edui-notadd .edui-for-rowspacingtop .edui-icon { + /*background-position: -765px -40px;*/ +} -.edui-for-videoleft .edui-icon:before { content: "\e66f"; } +.edui-notadd .edui-for-horizontal .edui-icon { + /*background-position: -360px 0;*/ +} -.edui-for-videocenter .edui-icon:before { content: "\e670"; } +.edui-notadd .edui-for-link .edui-icon { + /*background-position: -500px 0;*/ +} -.edui-for-videonone .edui-icon:before { content: "\e671"; } +.edui-notadd .edui-for-code .edui-icon { + /*background-position: -440px -40px;*/ +} + +.edui-notadd .edui-for-insertimage .edui-icon { + /*background-position: -726px -77px;*/ +} + +.edui-notadd .edui-for-insertframe .edui-icon { + /*background-position: -240px -40px;*/ +} + +.edui-notadd .edui-for-emoticon .edui-icon { + /*background-position: -60px -20px;*/ +} + +.edui-notadd .edui-for-spechars .edui-icon { + /*background-position: -240px 0;*/ +} + +.edui-notadd .edui-for-help .edui-icon { + /*background-position: -340px 0;*/ +} + +.edui-notadd .edui-for-print .edui-icon { + /*background-position: -440px -20px;*/ +} + +.edui-notadd .edui-for-preview .edui-icon { + /*background-position: -420px -20px;*/ +} + +.edui-notadd .edui-for-selectall .edui-icon { + /*background-position: -400px -20px;*/ +} + +.edui-notadd .edui-for-searchreplace .edui-icon { + /*background-position: -520px -20px;*/ +} + +.edui-notadd .edui-for-map .edui-icon { + /*background-position: -40px -40px;*/ +} + +.edui-notadd .edui-for-gmap .edui-icon { + /*background-position: -260px -40px;*/ +} + +.edui-notadd .edui-for-insertvideo .edui-icon { + /*background-position: -320px -20px;*/ +} + +.edui-notadd .edui-for-time .edui-icon { + /*background-position: -160px -20px;*/ +} + +.edui-notadd .edui-for-date .edui-icon { + /*background-position: -140px -20px;*/ +} + +.edui-notadd .edui-for-cut .edui-icon { + /*background-position: -680px 0;*/ +} + +.edui-notadd .edui-for-copy .edui-icon { + /*background-position: -700px 0;*/ +} + +.edui-notadd .edui-for-paste .edui-icon { + /*background-position: -560px 0;*/ +} + +.edui-notadd .edui-for-formatmatch .edui-icon { + /*background-position: -40px 0;*/ +} + +.edui-notadd .edui-for-pasteplain .edui-icon { + /*background-position: -360px -20px;*/ +} + +.edui-notadd .edui-for-directionalityltr .edui-icon { + /*background-position: -20px -20px;*/ +} + +.edui-notadd .edui-for-directionalityrtl .edui-icon { + /*background-position: -40px -20px;*/ +} + +.edui-notadd .edui-for-source .edui-icon { + /*background-position: -261px -0px;*/ +} + +.edui-notadd .edui-for-removeformat .edui-icon { + /*background-position: -580px 0;*/ +} + +.edui-notadd .edui-for-unlink .edui-icon { + /*background-position: -640px 0;*/ +} + +.edui-notadd .edui-for-touppercase .edui-icon { + /*background-position: -786px 0;*/ +} + +.edui-notadd .edui-for-tolowercase .edui-icon { + /*background-position: -806px 0;*/ +} + +.edui-notadd .edui-for-insertrow .edui-icon { + /*background-position: -478px -76px;*/ +} + +.edui-notadd .edui-for-insertrownext .edui-icon { + /*background-position: -498px -76px;*/ +} + +.edui-notadd .edui-for-insertcol .edui-icon { + /*background-position: -455px -76px;*/ +} + +.edui-notadd .edui-for-insertcolnext .edui-icon { + /*background-position: -429px -76px;*/ +} + +.edui-notadd .edui-for-mergeright .edui-icon { + /*background-position: -60px -40px;*/ +} + +.edui-notadd .edui-for-mergedown .edui-icon { + /*background-position: -80px -40px;*/ +} + +.edui-notadd .edui-for-splittorows .edui-icon { + /*background-position: -100px -40px;*/ +} + +.edui-notadd .edui-for-splittocols .edui-icon { + /*background-position: -120px -40px;*/ +} + +.edui-notadd .edui-for-insertparagraphbeforetable .edui-icon { + /*background-position: -140px -40px;*/ +} + +.edui-notadd .edui-for-deleterow .edui-icon { + /*background-position: -660px -20px;*/ +} + +.edui-notadd .edui-for-deletecol .edui-icon { + /*background-position: -640px -20px;*/ +} + +.edui-notadd .edui-for-splittocells .edui-icon { + /*background-position: -800px -20px;*/ +} + +.edui-notadd .edui-for-mergecells .edui-icon { + /*background-position: -760px -20px;*/ +} + +.edui-notadd .edui-for-deletetable .edui-icon { + /*background-position: -620px -20px;*/ +} + +.edui-notadd .edui-for-cleardoc .edui-icon { + /*background-position: -520px 0;*/ +} + +.edui-notadd .edui-for-fullscreen .edui-icon { + /*background-position: -100px -20px;*/ +} + +.edui-notadd .edui-for-anchor .edui-icon { + /*background-position: -200px 0;*/ +} + +.edui-notadd .edui-for-pagebreak .edui-icon { + /*background-position: -460px -40px;*/ +} + +.edui-notadd .edui-for-imagenone .edui-icon { + /*background-position: -480px -40px;*/ +} + +.edui-notadd .edui-for-imageleft .edui-icon { + /*background-position: -500px -40px;*/ +} + +.edui-notadd .edui-for-wordimage .edui-icon { + /*background-position: -660px -40px;*/ +} + +.edui-notadd .edui-for-imageright .edui-icon { + /*background-position: -520px -40px;*/ +} + +.edui-notadd .edui-for-imagecenter .edui-icon { + /*background-position: -540px -40px;*/ +} + +.edui-notadd .edui-for-indent .edui-icon { + /*background-position: -400px 0;*/ +} + +.edui-notadd .edui-for-outdent .edui-icon { + /*background-position: -540px 0;*/ +} + +.edui-notadd .edui-for-webapp .edui-icon { + /*background-position: -601px -40px*/ +} + +.edui-notadd .edui-for-table .edui-icon { + /*background-position: -580px -20px;*/ +} + +.edui-notadd .edui-for-edittable .edui-icon { + /*background-position: -420px -40px;*/ +} + +.edui-notadd .edui-for-template .edui-icon { + /*background-position: -339px -40px;*/ +} + +.edui-notadd .edui-for-delete .edui-icon { + /*background-position: -360px -40px;*/ +} + +.edui-notadd .edui-for-attachment .edui-icon { + /*background-position: -620px -40px;*/ +} + +.edui-notadd .edui-for-edittd .edui-icon { + /*background-position: -700px -40px;*/ +} + +.edui-notadd .edui-for-snapscreen .edui-icon { + /*background-position: -581px -40px*/ +} + +.edui-notadd .edui-for-scrawl .edui-icon { + /*background-position: -801px -41px*/ +} + +.edui-notadd .edui-for-background .edui-icon { + /*background-position: -680px -40px;*/ +} + +.edui-notadd .edui-for-music .edui-icon { + /*background-position: -18px -40px*/ +} + +.edui-notadd .edui-for-formula .edui-icon { + /*background-position: -200px -40px*/ +} + +.edui-notadd .edui-for-aligntd .edui-icon { + /*background-position: -236px -76px;*/ +} + +.edui-notadd .edui-for-insertparagraphtrue .edui-icon { + /*background-position: -625px -76px;*/ +} + +.edui-notadd .edui-for-insertparagraph .edui-icon { + /*background-position: -602px -76px;*/ +} + +.edui-notadd .edui-for-insertcaption .edui-icon { + /*background-position: -336px -76px;*/ +} + +.edui-notadd .edui-for-deletecaption .edui-icon { + /*background-position: -362px -76px;*/ +} + +.edui-notadd .edui-for-inserttitle .edui-icon { + /*background-position: -286px -76px;*/ +} + +.edui-notadd .edui-for-deletetitle .edui-icon { + /*background-position: -311px -76px;*/ +} + +.edui-notadd .edui-for-aligntable .edui-icon { + /*background-position: -440px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-left .edui-icon { + /*background-position: -460px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-center .edui-icon { + /*background-position: -420px 0;*/ +} + +.edui-notadd .edui-for-tablealignment-right .edui-icon { + /*background-position: -480px 0;*/ +} + +.edui-notadd .edui-for-drafts .edui-icon { + /*background-position: -560px 0;*/ +} + +.edui-notadd .edui-for-charts .edui-icon { + /*background: url( ../images/charts.png ) no-repeat 2px 3px!important;*/ +} + +.edui-notadd .edui-for-inserttitlecol .edui-icon { + /*background-position: -673px -76px;*/ +} + +.edui-notadd .edui-for-deletetitlecol .edui-icon { + /*background-position: -698px -76px;*/ +} + +.edui-notadd .edui-for-simpleupload .edui-icon { + /*background-position: -380px 0px;*/ +} + +@font-face {font-family: "edui-notadd"; + src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/ + src: url('../fonts/iconfont.eot?t=1544182120898#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('../fonts/iconfont.ttf?t=1544182120898') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('../fonts/iconfont.svg?t=1544182120898#edui-notadd') format('svg'); /* iOS 4.1- */ +} + +.edui-notadd .edui-icon{ + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.edui-iconfont { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +.edui-for-close .edui-icon:before { content: "\e654"; } + +.edui-for-searchreplace .edui-icon:before { content: "\e70f"; } + +.edui-for-italic .edui-icon:before { content: "\e62d"; } + +.edui-for-insertcaption .edui-icon:before { content: "\e657"; } + +.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; } + +.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; } + +.edui-for-insertimage .edui-icon:before { content: "\e617"; } + +.edui-for-previousstep .edui-icon:before { content: "\e630"; } + +.edui-for-nextstep .edui-icon:before { content: "\e631"; } + +.edui-for-scaleboard .edui-icon:before { content: "\e632"; } + +.edui-for-brush .edui-icon:before { content: "\e633"; } + +.edui-for-background .edui-icon:before { content: "\e65d"; } + +.edui-for-strikethrough .edui-icon:before { content: "\e60c"; } + +.edui-for-spechars .edui-icon:before { content: "\e603"; } + +.edui-for-clearboard .edui-icon:before { content: "\e634"; } + +.edui-for-bold .edui-icon:before { content: "\e604"; } + +.edui-for-fullscreen .edui-icon:before { content: "\e656"; } + +.edui-for-formatmatch .edui-icon:before { content: "\e60d"; } + +.edui-for-underline .edui-icon:before { content: "\e605"; } + +.edui-for-removeformat .edui-icon:before { content: "\e60e"; } + +.edui-for-blockquote .edui-icon:before { content: "\e60f"; } + +.edui-for-anchor .edui-icon:before { content: "\e618"; } + +.edui-for-help .edui-icon:before { content: "\e619"; } + +.edui-for-horizontal .edui-icon:before { content: "\e638"; } + +.edui-for-simpleupload .edui-icon:before { content: "\e61a"; } + +.edui-for-indent .edui-icon:before { content: "\e61b"; } + +.edui-for-justifycenter .edui-icon:before { content: "\e61c"; } + +.edui-for-justifyleft .edui-icon:before { content: "\e61d"; } + +.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; } + +.edui-for-justifyright .edui-icon:before { content: "\e61f"; } + +.edui-for-link .edui-icon:before { content: "\e620"; } + +.edui-for-cleardoc .edui-icon:before { content: "\e621"; } + +.edui-for-drafts .edui-icon:before { content: "\e610"; } + +.edui-for-subscript .edui-icon:before { content: "\e611"; } + +.edui-for-unlink .edui-icon:before { content: "\e622"; } + +.edui-for-superscript .edui-icon:before { content: "\e612"; } + +.edui-for-forecolor .edui-icon:before { content: "\e63a"; } + +.edui-for-backcolor .edui-icon:before { content: "\e655"; } + +.edui-for-touppercase .edui-icon:before { content: "\e623"; } + +.edui-for-tolowercase .edui-icon:before { content: "\e624"; } + +.edui-for-insertvideo .edui-icon:before { content: "\e627"; } + +.edui-for-emotion .edui-icon:before { content: "\e606"; } + +.edui-for-pasteplain .edui-icon:before { content: "\e613"; } + +.edui-for-preview .edui-icon:before { content: "\e63b"; } + +.edui-for-print .edui-icon:before { content: "\e63c"; } + +.edui-for-selectall .edui-icon:before { content: "\e614"; } + +.edui-for-mergecells .edui-icon:before { content: "\e63d"; } + +.edui-for-deletecol .edui-icon:before { content: "\e63e"; } + +.edui-for-deleterow .edui-icon:before { content: "\e63f"; } + +.edui-for-attachment .edui-icon:before { content: "\e628"; } + +.edui-for-music .edui-icon:before { content: "\e640"; } + +.edui-for-gmap .edui-icon:before { content: "\e629"; } + +.edui-for-insertframe .edui-icon:before { content: "\e645"; } + +.edui-for-pdfformat .edui-icon:before { content: "\e62f"; } + +.edui-for-word .edui-icon:before { content: "\e646"; } + +.edui-for-excel .edui-icon:before { content: "\e647"; } + +.edui-for-time .edui-icon:before { content: "\e64a"; } + +.edui-for-snapscreen .edui-icon:before { content: "\e650"; } + +.edui-for-wordimage .edui-icon:before { content: "\e652"; } + +.edui-for-edittd .edui-icon:before { content: "\e65a"; } + +.edui-for-lineheight .edui-icon:before { content: "\e62a"; } + +.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; } + +.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; } + +.edui-for-scrawl .edui-icon:before { content: "\e616"; } + +.edui-for-redo .edui-icon:before { content: "\e609"; } + +.edui-for-undo .edui-icon:before { content: "\e600"; } + +.edui-for-inserttitle .edui-icon:before { content: "\e65b"; } + +.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; } + +.edui-for-aligntable .edui-icon:before { content: "\e662"; } + +.edui-for-table .edui-icon:before { content: "\e664"; } + +.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; } + +.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; } + +.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; } + +.edui-for-paste .edui-icon:before { content: "\e667"; } + +.edui-for-map .edui-icon:before { content: "\e668"; } + +.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; } + +.edui-for-imagecenter .edui-icon:before { content: "\e602"; } + +.edui-for-imagenone .edui-icon:before { content: "\e607"; } + +.edui-for-fontborder .edui-icon:before { content: "\e608"; } + +.edui-for-edittable .edui-icon:before { content: "\e60a"; } + +.edui-for-imageleft .edui-icon:before { content: "\e60b"; } + +.edui-for-imageright .edui-icon:before { content: "\e615"; } + +.edui-for-insertcol .edui-icon:before { content: "\e625"; } + +.edui-for-insertcolnext .edui-icon:before { content: "\e626"; } + +.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; } + +.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; } + +.edui-for-insertrow .edui-icon:before { content: "\e637"; } + +.edui-for-insertrownext .edui-icon:before { content: "\e639"; } + +.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; } + +.edui-for-mergeright .edui-icon:before { content: "\e642"; } + +.edui-for-mergedown .edui-icon:before { content: "\e643"; } + +.edui-for-inserttable .edui-icon:before { content: "\e644"; } + +.edui-for-pagebreak .edui-icon:before { content: "\e648"; } + +.edui-for-source .edui-icon:before { content: "\e649"; } + +.edui-for-splittorows .edui-icon:before { content: "\e64b"; } + +.edui-for-splittocols .edui-icon:before { content: "\e64c"; } + +.edui-for-splittocells .edui-icon:before { content: "\e64d"; } + +.edui-for-arrow .edui-icon:before { content: "\e64f"; } + +.edui-for-aligntd .edui-icon:before { content: "\e651"; } + +.edui-for-autotypeset .edui-icon:before { content: "\e653"; } + +.edui-for-charts .edui-icon:before { content: "\e658"; } + +.edui-for-closeerror .edui-icon:before { content: "\e65c"; } + +.edui-for-copy .edui-icon:before { content: "\e65f"; } + +.edui-for-date .edui-icon:before { content: "\e661"; } + +.edui-for-deletetable .edui-icon:before { content: "\e669"; } + +.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; } + +.edui-for-arrowright .edui-icon:before { content: "\e66b"; } + +.edui-for-tableleft .edui-icon:before { content: "\e66c"; } + +.edui-for-tableright .edui-icon:before { content: "\e66d"; } + +.edui-for-tablecenter .edui-icon:before { content: "\e66e"; } + +.edui-for-videoleft .edui-icon:before { content: "\e66f"; } + +.edui-for-videocenter .edui-icon:before { content: "\e670"; } + +.edui-for-videonone .edui-icon:before { content: "\e671"; } + +.edui-for-videoright .edui-icon:before { content: "\e672"; } + +.edui-for-template .edui-icon:before { content: "\e64e"; } + +.edui-for-addfile .edui-icon:before { content: "\e673"; } + +.edui-for-selected .edui-icon:before { content: "\e674"; } + +.edui-for-pickarea .edui-icon:before { content: "\e675"; } + +.edui-for-overlay .edui-icon:before { content: "\e676"; } + +.edui-for-preitem .edui-icon:before { content: "\e677"; } + +.edui-for-preitem1 .edui-icon:before { content: "\e678"; } + +.edui-for-preitem2 .edui-icon:before { content: "\e679"; } + +.edui-for-preitem3 .edui-icon:before { content: "\e67a"; } + +.edui-for-preitem4 .edui-icon:before { content: "\e67b"; } + + +/*splitbutton*/ +.edui-notadd .edui-toolbar .edui-splitbutton-body .edui-arrow::after, +.edui-notadd .edui-toolbar .edui-menubutton-body .edui-arrow::after { + font-family:"edui-notadd" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: "\e64f"; + display: block; + position: relative; + right: 5px; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-menubutton-body { + /*padding: 1px;*/ +} + +.edui-notadd .edui-toolbar .edui-splitborder { + height: 20px; +} + +.edui-notadd .edui-toolbar .edui-state-hover .edui-splitborder { + /*width: 1px;*/ + /*border-left: 0px solid #dcac6c;*/ +} + +.edui-notadd .edui-toolbar .edui-state-active .edui-splitborder { + /*width: 0;*/ + /*border-left: 1px solid gray;*/ +} + +.edui-notadd .edui-toolbar .edui-state-opened .edui-splitborder { + /*width: 1px;*/ + /*border: 0;*/ +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon { + color: #fff; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #e5e5e5; + /*border: 1px solid #dcac6c;*/ + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #666; + padding: 0; +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon { + color: #fff; +} + +.edui-notadd .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-notadd .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + padding: 0; +} + +.edui-notadd .edui-for-insertorderedlist .edui-bordereraser, +.edui-notadd .edui-for-lineheight .edui-bordereraser, +.edui-notadd .edui-for-rowspacingtop .edui-bordereraser, +.edui-notadd .edui-for-rowspacingbottom .edui-bordereraser, +.edui-notadd .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-notadd .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-notadd .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-notadd .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-notadd .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-notadd .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + background-image: none ; +} + +/* 弹出菜单 */ +.edui-notadd .edui-popup { + z-index: 3000; + width:auto; + height:auto; + +} + +.edui-notadd .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-notadd .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 10px; + background:#ffffff; +} + +.edui-notadd .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; + display: none; +} + +.edui-notadd .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-notadd .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-notadd .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-notadd .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-notadd .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} + +.edui-notadd .edui-bubble .edui-popup-body{ + width: 355px !important; + height: 40px !important; +} +.edui-notadd .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} -.edui-for-videoright .edui-icon:before { content: "\e672"; } +.edui-notadd .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.edui-notadd .edui-message-body{ + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} +.edui-notadd .edui-message-type-info{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.edui-notadd .edui-message-type-success{ + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.edui-notadd .edui-message-type-danger, +.edui-notadd .edui-message-type-error{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-notadd .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} +.edui-notadd .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} +/* 弹出对话框按钮和对话框大小 */ +.edui-notadd .edui-dialog { + z-index: 2000; + position: absolute; -.edui-for-template .edui-icon:before { content: "\e64e"; } +} -.edui-for-addfile .edui-icon:before { content: "\e673"; } +.edui-dialog div{ + width:auto; +} -.edui-for-selected .edui-icon:before { content: "\e674"; } +.edui-notadd .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} -.edui-for-pickarea .edui-icon:before { content: "\e675"; } +.edui-notadd .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} -.edui-for-overlay .edui-icon:before { content: "\e676"; } +.edui-notadd .edui-dialog-body { + box-sizing: content-box; + position: relative; + padding:2px; + _zoom: 1; +} -.edui-for-preitem .edui-icon:before { content: "\e677"; } +.edui-notadd .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} -.edui-for-preitem1 .edui-icon:before { content: "\e678"; } +.edui-notadd .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} -.edui-for-preitem2 .edui-icon:before { content: "\e679"; } +.edui-notadd .edui-dialog-foot { + background-color: white; +} -.edui-for-preitem3 .edui-icon:before { content: "\e67a"; } +.edui-notadd .edui-dialog-titlebar { + height: 50px; + border-bottom: 2px solid #ccc; + position: relative; + cursor: move; +} +.edui-notadd .edui-dialog-caption { + font-weight: bold; + font-size: 16px; + line-height: 50px; + padding-left: 20px; + color: #444; +} -.edui-for-preitem4 .edui-icon:before { content: "\e67b"; } +.edui-notadd .edui-dialog-draghandle { + height: 50px; +} + +.edui-notadd .edui-dialog-closebutton { + position: absolute !important; + right: 20px; + top: 15px; +} + +.edui-notadd .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + /*background: url("../images/icons-all.gif") no-repeat 0 -59px;*/ +} + +.edui-notadd .edui-dialog-closebutton .edui-state-hover .edui-button-body { + /*background: url("../images/icons-all.gif") no-repeat 0 -89px;*/ +} + +.edui-notadd .edui-dialog-foot { + position: relative; + height: 56px; + border-top: 2px solid #ccc; +} + +.edui-notadd .edui-dialog-buttons { + position: absolute; + right: 10px; + bottom: 10px; +} + +.edui-notadd .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-notadd .edui-dialog-buttons .edui-okbutton { + background-color: #3498db; + border-radius: 5px; + color: #fff; +} + +.edui-notadd .edui-dialog-buttons .edui-cancelbutton { + background-color: #f3f3f3; + border-radius: 5px; + color: #898989; +} + +.edui-notadd .edui-dialog-buttons .edui-button .edui-button-body { + height: 34px; + width: 94px; + font-size: 12px; + line-height: 34px; + text-align: center; + cursor: default; + border-radius: 5px; +} + + +.edui-notadd .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-notadd .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #000; + position: absolute; +} + +.edui-notadd .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-notadd .edui-dialog-content { + position: relative; +} + +.edui-notadd .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-notadd .edui-for-link .edui-dialog-content { + width: 420px; + height: 257px; + overflow: hidden; +} +.edui-dialog .edui-for-link .edui-dialog-body { + height: 368px !important; + width: 420px !important; +} + +/*background-dialog*/ +.edui-notadd .edui-for-background .edui-dialog-content { + width: 465px; + height: 287px; + overflow: hidden; +} +.edui-dialog .edui-for-background .edui-dialog-body { + height: 398px !important; + width: 465px !important; +} + +/*template-dialog*/ +.edui-notadd .edui-for-template .edui-dialog-content { + width: 682px; + height: 406px; + overflow: hidden; +} +.edui-dialog .edui-for-template .edui-dialog-body { + height: 516px !important; + width: 682px !important; +} + +/*scrawl-dialog*/ +.edui-notadd .edui-for-scrawl .edui-dialog-content { + width: 640px; + height: 435px; +} +.edui-dialog .edui-for-scrawl .edui-dialog-body { + height: 545px !important; + width: 640px !important; +} + +/*spechars-dialog*/ +.edui-notadd .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-notadd .edui-for-insertimage .edui-dialog-content { + width: 641px; + height: 455px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-notadd .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-notadd .edui-for-insertframe .edui-dialog-content { + width: 400px; + height: 255px; + overflow: hidden; +} +.edui-dialog .edui-for-insertframe .edui-dialog-body { + height: 365px !important; + width: 400px !important; +} + +/*wordImage-dialog*/ +.edui-notadd .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-notadd .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + +/*map-dialog*/ +.edui-notadd .edui-for-map .edui-dialog-content { + width: 640px; + height: 455px; +} +.edui-dialog .edui-for-map .edui-dialog-body { + height: 562px !important; + width: 640px !important; +} + +/*gmap-dialog*/ +.edui-notadd .edui-for-gmap .edui-dialog-content { + width: 640px; + height: 452px; +} +.edui-dialog .edui-for-gmap .edui-dialog-body { + height: 563px !important; + width: 640px !important; +} + +/*video-dialog*/ +.edui-notadd .edui-for-insertvideo .edui-dialog-content { + width: 641px; + height: 450px; +} +.edui-dialog .edui-for-insertvideo .edui-dialog-body { + height: 560px !important; + width: 640px !important; +} + +/*anchor-dialog*/ +.edui-notadd .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-notadd .edui-for-searchreplace .edui-dialog-content { + width: 404px; + height: 310px; +} + +.edui-dialog .edui-for-searchreplace .edui-dialog-body { + height: 364px !important; + width: 404px !important; +} + +/*help-dialog*/ +.edui-notadd .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-notadd .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-notadd .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-notadd .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-notadd .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-notadd .edui-for-music .edui-dialog-content { + width: 630px; + height: 449px; +} +.edui-dialog .edui-for-music .edui-dialog-body { + height: 560px !important; + width: 630px !important; +} + +.edui-dialog-body .edui-dialog-foot .edui-icon:before { + content: ''; +} + +.edui-dialog-body .edui-dialog-titlebar .edui-icon:before { + content: '\e654'; + font-size: 18px; + font-weight: bold; + color: #ccc; +} + +.edui-dialog .edui-dialog-fullscreen-flag .edui-dialog-content { + padding: 20px; +} + +.icon-delete:before { + content: '\e654'; +} + +/*段落弹出菜单*/ +.edui-notadd .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} +/* 表格弹出菜单 */ +.edui-notadd .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-notadd .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.edui-notadd .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + /*border-left: 1px solid transparent;*/ +} +.edui-notadd .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-notadd .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-notadd .edui-dialog-buttons .edui-label { + line-height: 34px; + font-size: 14px; +} + +.edui-notadd .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-notadd .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-notadd .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} + +/* 颜色弹出菜单 */ +.edui-notadd .edui-colorpicker-topbar { + height: 27px; + width: 200px; +} + +.edui-notadd .edui-colorpicker-preview { + height: 20px; + border: 1px solid #ccc; + margin-left: 1px; + width: 128px; + float: left; + border-radius: 5px; +} + +.edui-notadd .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 12px; + height: 22px; + border: 1px solid #ccc; + padding: 3px 5px; + cursor: pointer; + border-radius: 5px; +} + +.edui-notadd .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-notadd .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-notadd .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-notadd .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.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; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} +/*自动排版弹出菜单*/ +.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} +.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body tr:last-child td:last-child button { + border-radius: 3px; + border: 1px solid #ddd; + padding: 2px 8px; + background-color: #f3f3f3; +} +.edui-notadd .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-notadd .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-notadd .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} +/*自动排版弹出菜单*/ +.edui-notadd .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-notadd .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-notadd .edui-cellalignpicker-body td{ + padding: 1px; +} +.edui-notadd .edui-cellalignpicker-body .edui-icon{ + height: 20px; + width: 20px; + padding: 1px; + color: #666; +} + +.edui-notadd .edui-cellalignpicker-body .edui-left{ + background-position: 0 0; +} + +.edui-notadd .edui-cellalignpicker-body .edui-left:before{ + content: '\e66c'; +} + +.edui-notadd .edui-cellalignpicker-body .edui-center:before{ + content: '\e66e'; +} +.edui-notadd .edui-cellalignpicker-body .edui-right:before{ + content: '\e66d'; +} + +.edui-notadd .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-notadd .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-left{ + background-position: -73px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-center{ + background-position: -98px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} +/*分隔线*/ +.edui-notadd .edui-toolbar .edui-separator { + display: none; +} + +/*颜色按钮 */ +.edui-notadd .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 5px; + left: 9px; + width: 18px; + height: 4px; +} +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-notadd .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-notadd .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-notadd .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-notadd .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-notadd .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-notadd .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + /*border-left: 1px solid transparent;*/ +} +/*contextmenu*/ +.edui-notadd .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; +} + +.edui-notadd .edui-hassubmenu .edui-arrow::after { + font-family: "edui-notadd" !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: '\e66b'; + line-height: 1; + display: block; +} + +.edui-notadd .edui-menu-body .edui-menuitem { + padding: 5px 10px; +} + +.edui-notadd .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; + display: none; +} + +.edui-notadd .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-notadd .edui-menu-body .edui-state-hover { + background-color: #f3f3f3; +} + +.edui-notadd .edui-menu-body .edui-for-tablesort { + padding-left: 25px; +} + +.edui-notadd .edui-menu-body .edui-for-borderBack { + padding-left: 25px; +} +/*弹出菜单*/ +.edui-notadd .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} + +/*粘贴弹出菜单*/ +.edui-notadd .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-notadd .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-notadd .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-notadd .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-notadd .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-notadd .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon, +.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + background-position: -148px -34px; +} +.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.min.css b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.min.css new file mode 100644 index 0000000..c15c289 --- /dev/null +++ b/web/src/main/resources/static/plug-in/neditor/2.1.17/themes/notadd/css/neditor.min.css @@ -0,0 +1,8 @@ +/*! + * neditor + * version: 2.1.18 + * build: Wed May 22 2019 09:16:49 GMT+0000 (UTC) + */ + + +.edui-notadd *{box-sizing:border-box}.edui-notadd .edui-box{border:0;padding:0;margin:0;overflow:hidden}.edui-notadd a.edui-box{display:block;text-decoration:none;color:#000}.edui-notadd a.edui-box:hover{text-decoration:none}.edui-notadd a.edui-box:active{text-decoration:none}.edui-notadd table.edui-box{border-collapse:collapse}.edui-notadd ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:-moz-inline-box!important;display:inline-block!important;vertical-align:middle}.edui-notadd .edui-clearfix{zoom:1}.edui-notadd .edui-clearfix:after{content:'\20';display:block;clear:both}* html div.edui-box{display:inline!important}:first-child+html div.edui-box{display:inline!important}.edui-notadd .edui-button-body,.edui-splitbutton-body,.edui-menubutton-body,.edui-combox-body{position:relative}.edui-notadd .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-notadd .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-notadd .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-notadd .edui-tablepicker .edui-canvas{position:relative}.edui-notadd .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-notadd .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;left:0;top:0;width:100%;height:100%}.edui-notadd .edui-toolbar{position:relative}.edui-notadd .edui-label{cursor:default}.edui-notadd span.edui-clickable{color:#666;cursor:pointer;text-decoration:none;padding-left:5px}.edui-notadd span.edui-unclickable{color:gray;cursor:default}.edui-notadd .edui-toolbar{cursor:default;-webkit-user-select:none;-moz-user-select:none;overflow:hidden;zoom:1;width:auto;height:auto}.edui-notadd .edui-toolbar .edui-button,.edui-notadd .edui-toolbar .edui-splitbutton,.edui-notadd .edui-toolbar .edui-menubutton,.edui-notadd .edui-toolbar .edui-combox{padding:4px 0!important}.edui-notadd .edui-editor{border:1px solid #e5e5e5;background-color:#fff;position:relative;overflow:visible;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-family:"Helvetica Neue",Helvetica,Arial,"Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei",STXihei,STHeiti,Heiti,SimSun,sans-serif}.edui-notadd .edui-dialog .edui-dialog-body{font-family:"Helvetica Neue",Helvetica,Arial,"Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei",STXihei,STHeiti,Heiti,SimSun,sans-serif}.edui-editor div{width:auto;height:auto;line-height:1!important}.edui-notadd .edui-editor-toolbarbox{position:relative;zoom:1;border-top-left-radius:2px;border-top-right-radius:2px}.edui-notadd .edui-editor-toolbarboxouter{border-bottom:1px solid #e5e5e5;background-color:#f3f3f3}.edui-notadd .edui-editor-toolbarboxinner{}.edui-notadd .edui-editor-iframeholder .view p{overflow:hidden}.edui-notadd .edui-editor-iframeholder{position:relative}.edui-notadd .edui-editor-bottomContainer{overflow:hidden;padding:0 4px;border-top:1px solid #e5e5e5}.edui-notadd .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-notadd .edui-editor-bottomContainer td{white-space:nowrap;line-height:20px;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif}.edui-notadd .edui-editor-wordcount{text-align:right;margin-right:5px;color:#aaa}.edui-notadd .edui-editor-scale{width:12px}.edui-notadd .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;background:url(../images/scale.png) no-repeat;cursor:se-resize}.edui-notadd .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-notadd .edui-editor-breadcrumb span{cursor:pointer;color:#00f}.edui-notadd .edui-toolbar .edui-for-fullscreen{float:right}.edui-notadd .edui-bubble .edui-popup-content{border:1px solid #e5e5e5;background-color:#f3f3f3;padding:10px;font-size:10pt;font-family:"宋体"}.edui-notadd .edui-bubble .edui-shadow{}.edui-notadd .edui-editor-toolbarmsg{background-color:#FFF6D9;border-bottom:1px solid #ccc;position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%}.edui-notadd .edui-editor-toolbarmsg-upload{font-size:14px;color:#00f;width:100px;height:16px;line-height:16px;cursor:pointer;position:absolute;top:5px;left:350px}.edui-notadd .edui-editor-toolbarmsg-label{font-size:12px;line-height:16px;padding:4px}.edui-notadd .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;cursor:pointer;color:red}.edui-iconfont{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden}#edui1_imagescale_cover{}.edui-notadd .edui-editor-imagescale{}.edui-notadd .edui-list .edui-bordereraser{display:none}.edui-notadd .edui-listitem{white-space:nowrap}.edui-notadd .edui-list .edui-state-hover{position:relative;background-color:#f3f3f3;padding:0}.edui-notadd .edui-for-fontfamily .edui-listitem-label{min-width:130px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-notadd .edui-for-insertcode .edui-listitem-label{min-width:120px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-notadd .edui-for-underline .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px;font-size:12px}.edui-notadd .edui-for-fontsize .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px}.edui-notadd .edui-for-paragraph .edui-listitem-label{min-width:200px;_width:200px;padding:2px 5px}.edui-notadd .edui-for-rowspacingtop .edui-listitem-label,.edui-notadd .edui-for-rowspacingbottom .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-notadd .edui-for-lineheight .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-notadd .edui-for-customstyle .edui-listitem-label{min-width:200px;_width:200px;width:200px!important;padding:2px 5px}.edui-notadd .edui-menu{z-index:3000}.edui-notadd .edui-menu .edui-popup-content{padding:0;overflow:hidden}.edui-notadd .edui-menu-body{_width:150px;min-width:170px}.edui-notadd .edui-menuitem-body{font-size:14px;color:#666}.edui-notadd .edui-menuitem{height:30px;cursor:default;vertical-align:top}.edui-notadd .edui-menuitem .edui-icon{line-height:1.3}.edui-notadd .edui-menuitem .edui-label{font-size:12px;line-height:20px;height:20px;padding-left:10px}.edui-notadd .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-notadd .edui-state-disabled .edui-menuitem-label{color:gray}.edui-notadd .edui-menu-body .edui-menuitem.edui-for-setbordervisible{padding-left:25px}.edui-notadd .edui-toolbar .edui-combox-body .edui-button-body{width:60px;font-size:12px;height:20px;line-height:20px!important;padding-left:5px;white-space:nowrap;margin:0 3px 0 0}.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow::after{height:25px;line-height:24px;font-family:edui-notadd!important;font-size:26px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e64f";display:block}.edui-notadd .edui-toolbar .edui-combox .edui-combox-body{border:1px solid #CCC;background-color:#fff;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px;margin:0 10px;height:26px;line-height:26px}.edui-notadd .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-notadd .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #CCC}.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#f3f3f3;border:1px solid #ccc}.edui-notadd .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #ccc}.edui-notadd .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#FFE69F;border:1px solid #DCAC6C}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #DCAC6C}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#F0F0EE;opacity:.3;filter:alpha(opacity=30)}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-notadd .edui-toolbar .edui-button .edui-icon,.edui-notadd .edui-toolbar .edui-menubutton .edui-icon,.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon{padding:5px!important;display:block;height:26px!important;width:26px!important;line-height:1!important}.edui-notadd .edui-toolbar .edui-button .edui-icon::before,.edui-notadd .edui-toolbar .edui-menubutton .edui-icon::before,.edui-notadd .edui-toolbar .edui-splitbutton .edui-icon::before{display:none}.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon::before,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon::before,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon::before{display:block}.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-icon svg,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-icon svg,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-icon svg{display:none}.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon::before,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon::before,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon::before{display:block}.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon svg,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon svg,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon svg{display:none}.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon::before,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon::before,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon::before{display:block}.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon svg,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon svg,.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon svg{display:none}.edui-dialog-buttons .edui-icon svg{display:none}.edui-notadd .edui-toolbar .edui-button .edui-icon{color:#666}.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-icon{color:#fff}.edui-notadd .edui-toolbar .edui-button .edui-button-wrap{position:relative}.edui-notadd .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{background-color:#e5e5e5;padding:0}.edui-notadd .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{background-color:#666;padding:0}.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{background-color:#666;padding:0}.edui-notadd .edui-toolbar .edui-button .edui-state-active .edui-icon{color:#fff}.edui-notadd .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-notadd .edui-toolbar .edui-state-disabled .edui-icon{opacity:.3;filter:alpha(opacity=30)}.edui-notadd .edui-for-undo .edui-icon{}.edui-notadd .edui-for-redo .edui-icon{}.edui-notadd .edui-for-bold .edui-icon{}.edui-notadd .edui-for-italic .edui-icon{}.edui-notadd .edui-for-fontborder .edui-icon{}.edui-notadd .edui-for-underline .edui-icon{}.edui-notadd .edui-for-strikethrough .edui-icon{}.edui-notadd .edui-for-subscript .edui-icon{}.edui-notadd .edui-for-superscript .edui-icon{}.edui-notadd .edui-for-blockquote .edui-icon{}.edui-notadd .edui-for-forecolor .edui-icon{}.edui-notadd .edui-for-backcolor .edui-icon{}.edui-notadd .edui-for-inserttable .edui-icon{}.edui-notadd .edui-for-autotypeset .edui-icon{}.edui-notadd .edui-for-justifyleft .edui-icon{}.edui-notadd .edui-for-justifycenter .edui-icon{}.edui-notadd .edui-for-justifyright .edui-icon{}.edui-notadd .edui-for-justifyjustify .edui-icon{}.edui-notadd .edui-for-insertorderedlist .edui-icon{}.edui-notadd .edui-for-insertunorderedlist .edui-icon{}.edui-notadd .edui-for-lineheight .edui-icon{}.edui-notadd .edui-for-rowspacingbottom .edui-icon{}.edui-notadd .edui-for-rowspacingtop .edui-icon{}.edui-notadd .edui-for-horizontal .edui-icon{}.edui-notadd .edui-for-link .edui-icon{}.edui-notadd .edui-for-code .edui-icon{}.edui-notadd .edui-for-insertimage .edui-icon{}.edui-notadd .edui-for-insertframe .edui-icon{}.edui-notadd .edui-for-emoticon .edui-icon{}.edui-notadd .edui-for-spechars .edui-icon{}.edui-notadd .edui-for-help .edui-icon{}.edui-notadd .edui-for-print .edui-icon{}.edui-notadd .edui-for-preview .edui-icon{}.edui-notadd .edui-for-selectall .edui-icon{}.edui-notadd .edui-for-searchreplace .edui-icon{}.edui-notadd .edui-for-map .edui-icon{}.edui-notadd .edui-for-gmap .edui-icon{}.edui-notadd .edui-for-insertvideo .edui-icon{}.edui-notadd .edui-for-time .edui-icon{}.edui-notadd .edui-for-date .edui-icon{}.edui-notadd .edui-for-cut .edui-icon{}.edui-notadd .edui-for-copy .edui-icon{}.edui-notadd .edui-for-paste .edui-icon{}.edui-notadd .edui-for-formatmatch .edui-icon{}.edui-notadd .edui-for-pasteplain .edui-icon{}.edui-notadd .edui-for-directionalityltr .edui-icon{}.edui-notadd .edui-for-directionalityrtl .edui-icon{}.edui-notadd .edui-for-source .edui-icon{}.edui-notadd .edui-for-removeformat .edui-icon{}.edui-notadd .edui-for-unlink .edui-icon{}.edui-notadd .edui-for-touppercase .edui-icon{}.edui-notadd .edui-for-tolowercase .edui-icon{}.edui-notadd .edui-for-insertrow .edui-icon{}.edui-notadd .edui-for-insertrownext .edui-icon{}.edui-notadd .edui-for-insertcol .edui-icon{}.edui-notadd .edui-for-insertcolnext .edui-icon{}.edui-notadd .edui-for-mergeright .edui-icon{}.edui-notadd .edui-for-mergedown .edui-icon{}.edui-notadd .edui-for-splittorows .edui-icon{}.edui-notadd .edui-for-splittocols .edui-icon{}.edui-notadd .edui-for-insertparagraphbeforetable .edui-icon{}.edui-notadd .edui-for-deleterow .edui-icon{}.edui-notadd .edui-for-deletecol .edui-icon{}.edui-notadd .edui-for-splittocells .edui-icon{}.edui-notadd .edui-for-mergecells .edui-icon{}.edui-notadd .edui-for-deletetable .edui-icon{}.edui-notadd .edui-for-cleardoc .edui-icon{}.edui-notadd .edui-for-fullscreen .edui-icon{}.edui-notadd .edui-for-anchor .edui-icon{}.edui-notadd .edui-for-pagebreak .edui-icon{}.edui-notadd .edui-for-imagenone .edui-icon{}.edui-notadd .edui-for-imageleft .edui-icon{}.edui-notadd .edui-for-wordimage .edui-icon{}.edui-notadd .edui-for-imageright .edui-icon{}.edui-notadd .edui-for-imagecenter .edui-icon{}.edui-notadd .edui-for-indent .edui-icon{}.edui-notadd .edui-for-outdent .edui-icon{}.edui-notadd .edui-for-webapp .edui-icon{}.edui-notadd .edui-for-table .edui-icon{}.edui-notadd .edui-for-edittable .edui-icon{}.edui-notadd .edui-for-template .edui-icon{}.edui-notadd .edui-for-delete .edui-icon{}.edui-notadd .edui-for-attachment .edui-icon{}.edui-notadd .edui-for-edittd .edui-icon{}.edui-notadd .edui-for-snapscreen .edui-icon{}.edui-notadd .edui-for-scrawl .edui-icon{}.edui-notadd .edui-for-background .edui-icon{}.edui-notadd .edui-for-music .edui-icon{}.edui-notadd .edui-for-formula .edui-icon{}.edui-notadd .edui-for-aligntd .edui-icon{}.edui-notadd .edui-for-insertparagraphtrue .edui-icon{}.edui-notadd .edui-for-insertparagraph .edui-icon{}.edui-notadd .edui-for-insertcaption .edui-icon{}.edui-notadd .edui-for-deletecaption .edui-icon{}.edui-notadd .edui-for-inserttitle .edui-icon{}.edui-notadd .edui-for-deletetitle .edui-icon{}.edui-notadd .edui-for-aligntable .edui-icon{}.edui-notadd .edui-for-tablealignment-left .edui-icon{}.edui-notadd .edui-for-tablealignment-center .edui-icon{}.edui-notadd .edui-for-tablealignment-right .edui-icon{}.edui-notadd .edui-for-drafts .edui-icon{}.edui-notadd .edui-for-charts .edui-icon{}.edui-notadd .edui-for-inserttitlecol .edui-icon{}.edui-notadd .edui-for-deletetitlecol .edui-icon{}.edui-notadd .edui-for-simpleupload .edui-icon{}@font-face{font-family:edui-notadd;src:url(../fonts/iconfont.eot?t=1544182120898);src:url(../fonts/iconfont.eot?t=1544182120898#iefix) format('embedded-opentype'),url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),url(../fonts/iconfont.ttf?t=1544182120898) format('truetype'),url(../fonts/iconfont.svg?t=1544182120898#edui-notadd) format('svg')}.edui-notadd .edui-icon{font-family:edui-notadd!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.edui-iconfont{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden}.edui-for-close .edui-icon:before{content:"\e654"}.edui-for-searchreplace .edui-icon:before{content:"\e70f"}.edui-for-italic .edui-icon:before{content:"\e62d"}.edui-for-insertcaption .edui-icon:before{content:"\e657"}.edui-for-insertparagraph .edui-icon:before{content:"\e62e"}.edui-for-inserttitlecol .edui-icon:before{content:"\e659"}.edui-for-insertimage .edui-icon:before{content:"\e617"}.edui-for-previousstep .edui-icon:before{content:"\e630"}.edui-for-nextstep .edui-icon:before{content:"\e631"}.edui-for-scaleboard .edui-icon:before{content:"\e632"}.edui-for-brush .edui-icon:before{content:"\e633"}.edui-for-background .edui-icon:before{content:"\e65d"}.edui-for-strikethrough .edui-icon:before{content:"\e60c"}.edui-for-spechars .edui-icon:before{content:"\e603"}.edui-for-clearboard .edui-icon:before{content:"\e634"}.edui-for-bold .edui-icon:before{content:"\e604"}.edui-for-fullscreen .edui-icon:before{content:"\e656"}.edui-for-formatmatch .edui-icon:before{content:"\e60d"}.edui-for-underline .edui-icon:before{content:"\e605"}.edui-for-removeformat .edui-icon:before{content:"\e60e"}.edui-for-blockquote .edui-icon:before{content:"\e60f"}.edui-for-anchor .edui-icon:before{content:"\e618"}.edui-for-help .edui-icon:before{content:"\e619"}.edui-for-horizontal .edui-icon:before{content:"\e638"}.edui-for-simpleupload .edui-icon:before{content:"\e61a"}.edui-for-indent .edui-icon:before{content:"\e61b"}.edui-for-justifycenter .edui-icon:before{content:"\e61c"}.edui-for-justifyleft .edui-icon:before{content:"\e61d"}.edui-for-justifyjustify .edui-icon:before{content:"\e61e"}.edui-for-justifyright .edui-icon:before{content:"\e61f"}.edui-for-link .edui-icon:before{content:"\e620"}.edui-for-cleardoc .edui-icon:before{content:"\e621"}.edui-for-drafts .edui-icon:before{content:"\e610"}.edui-for-subscript .edui-icon:before{content:"\e611"}.edui-for-unlink .edui-icon:before{content:"\e622"}.edui-for-superscript .edui-icon:before{content:"\e612"}.edui-for-forecolor .edui-icon:before{content:"\e63a"}.edui-for-backcolor .edui-icon:before{content:"\e655"}.edui-for-touppercase .edui-icon:before{content:"\e623"}.edui-for-tolowercase .edui-icon:before{content:"\e624"}.edui-for-insertvideo .edui-icon:before{content:"\e627"}.edui-for-emotion .edui-icon:before{content:"\e606"}.edui-for-pasteplain .edui-icon:before{content:"\e613"}.edui-for-preview .edui-icon:before{content:"\e63b"}.edui-for-print .edui-icon:before{content:"\e63c"}.edui-for-selectall .edui-icon:before{content:"\e614"}.edui-for-mergecells .edui-icon:before{content:"\e63d"}.edui-for-deletecol .edui-icon:before{content:"\e63e"}.edui-for-deleterow .edui-icon:before{content:"\e63f"}.edui-for-attachment .edui-icon:before{content:"\e628"}.edui-for-music .edui-icon:before{content:"\e640"}.edui-for-gmap .edui-icon:before{content:"\e629"}.edui-for-insertframe .edui-icon:before{content:"\e645"}.edui-for-pdfformat .edui-icon:before{content:"\e62f"}.edui-for-word .edui-icon:before{content:"\e646"}.edui-for-excel .edui-icon:before{content:"\e647"}.edui-for-time .edui-icon:before{content:"\e64a"}.edui-for-snapscreen .edui-icon:before{content:"\e650"}.edui-for-wordimage .edui-icon:before{content:"\e652"}.edui-for-edittd .edui-icon:before{content:"\e65a"}.edui-for-lineheight .edui-icon:before{content:"\e62a"}.edui-for-rowspacingbottom .edui-icon:before{content:"\e62b"}.edui-for-rowspacingtop .edui-icon:before{content:"\e62c"}.edui-for-scrawl .edui-icon:before{content:"\e616"}.edui-for-redo .edui-icon:before{content:"\e609"}.edui-for-undo .edui-icon:before{content:"\e600"}.edui-for-inserttitle .edui-icon:before{content:"\e65b"}.edui-for-insertparagraphtrue .edui-icon:before{content:"\e660"}.edui-for-aligntable .edui-icon:before{content:"\e662"}.edui-for-table .edui-icon:before{content:"\e664"}.edui-for-tablealignment-left .edui-icon:before{content:"\e663"}.edui-for-tablealignment-center .edui-icon:before{content:"\e665"}.edui-for-tablealignment-right .edui-icon:before{content:"\e666"}.edui-for-paste .edui-icon:before{content:"\e667"}.edui-for-map .edui-icon:before{content:"\e668"}.edui-for-directionalityrtl .edui-icon:before{content:"\e601"}.edui-for-imagecenter .edui-icon:before{content:"\e602"}.edui-for-imagenone .edui-icon:before{content:"\e607"}.edui-for-fontborder .edui-icon:before{content:"\e608"}.edui-for-edittable .edui-icon:before{content:"\e60a"}.edui-for-imageleft .edui-icon:before{content:"\e60b"}.edui-for-imageright .edui-icon:before{content:"\e615"}.edui-for-insertcol .edui-icon:before{content:"\e625"}.edui-for-insertcolnext .edui-icon:before{content:"\e626"}.edui-for-insertorderedlist .edui-icon:before{content:"\e635"}.edui-for-insertparagraphbeforetable .edui-icon:before{content:"\e636"}.edui-for-insertrow .edui-icon:before{content:"\e637"}.edui-for-insertrownext .edui-icon:before{content:"\e639"}.edui-for-insertunorderedlist .edui-icon:before{content:"\e641"}.edui-for-mergeright .edui-icon:before{content:"\e642"}.edui-for-mergedown .edui-icon:before{content:"\e643"}.edui-for-inserttable .edui-icon:before{content:"\e644"}.edui-for-pagebreak .edui-icon:before{content:"\e648"}.edui-for-source .edui-icon:before{content:"\e649"}.edui-for-splittorows .edui-icon:before{content:"\e64b"}.edui-for-splittocols .edui-icon:before{content:"\e64c"}.edui-for-splittocells .edui-icon:before{content:"\e64d"}.edui-for-arrow .edui-icon:before{content:"\e64f"}.edui-for-aligntd .edui-icon:before{content:"\e651"}.edui-for-autotypeset .edui-icon:before{content:"\e653"}.edui-for-charts .edui-icon:before{content:"\e658"}.edui-for-closeerror .edui-icon:before{content:"\e65c"}.edui-for-copy .edui-icon:before{content:"\e65f"}.edui-for-date .edui-icon:before{content:"\e661"}.edui-for-deletetable .edui-icon:before{content:"\e669"}.edui-for-directionalityltr .edui-icon:before{content:"\e66a"}.edui-for-arrowright .edui-icon:before{content:"\e66b"}.edui-for-tableleft .edui-icon:before{content:"\e66c"}.edui-for-tableright .edui-icon:before{content:"\e66d"}.edui-for-tablecenter .edui-icon:before{content:"\e66e"}.edui-for-videoleft .edui-icon:before{content:"\e66f"}.edui-for-videocenter .edui-icon:before{content:"\e670"}.edui-for-videonone .edui-icon:before{content:"\e671"}.edui-for-videoright .edui-icon:before{content:"\e672"}.edui-for-template .edui-icon:before{content:"\e64e"}.edui-for-addfile .edui-icon:before{content:"\e673"}.edui-for-selected .edui-icon:before{content:"\e674"}.edui-for-pickarea .edui-icon:before{content:"\e675"}.edui-for-overlay .edui-icon:before{content:"\e676"}.edui-for-preitem .edui-icon:before{content:"\e677"}.edui-for-preitem1 .edui-icon:before{content:"\e678"}.edui-for-preitem2 .edui-icon:before{content:"\e679"}.edui-for-preitem3 .edui-icon:before{content:"\e67a"}.edui-for-preitem4 .edui-icon:before{content:"\e67b"}.edui-notadd .edui-toolbar .edui-splitbutton-body .edui-arrow::after,.edui-notadd .edui-toolbar .edui-menubutton-body .edui-arrow::after{font-family:edui-notadd!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e64f";display:block;position:relative;right:5px}.edui-notadd .edui-toolbar .edui-splitbutton .edui-splitbutton-body,.edui-notadd .edui-toolbar .edui-menubutton .edui-menubutton-body{}.edui-notadd .edui-toolbar .edui-splitborder{height:20px}.edui-notadd .edui-toolbar .edui-state-hover .edui-splitborder{}.edui-notadd .edui-toolbar .edui-state-active .edui-splitborder{}.edui-notadd .edui-toolbar .edui-state-opened .edui-splitborder{}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-icon,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-icon{color:#fff}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body{background-color:#e5e5e5;padding:0}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body{background-color:#666;padding:0}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body{background-color:#666;padding:0}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-active .edui-icon,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-active .edui-icon{color:#fff}.edui-notadd .edui-state-disabled .edui-arrow{opacity:.3;_filter:alpha(opacity=30)}.edui-notadd .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,.edui-notadd .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body{padding:0}.edui-notadd .edui-for-insertorderedlist .edui-bordereraser,.edui-notadd .edui-for-lineheight .edui-bordereraser,.edui-notadd .edui-for-rowspacingtop .edui-bordereraser,.edui-notadd .edui-for-rowspacingbottom .edui-bordereraser,.edui-notadd .edui-for-insertunorderedlist .edui-bordereraser{background-color:#fff}.edui-notadd .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-notadd .edui-for-lineheight .edui-popup-body .edui-icon,.edui-notadd .edui-for-rowspacingtop .edui-popup-body .edui-icon,.edui-notadd .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-notadd .edui-for-insertunorderedlist .edui-popup-body .edui-icon{background-image:none}.edui-notadd .edui-popup{z-index:3000;width:auto;height:auto}.edui-notadd .edui-popup .edui-shadow{left:0;top:0;width:100%;height:100%}.edui-notadd .edui-popup-content{border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 4px rgba(0,0,0,.2);-moz-box-shadow:0 3px 4px rgba(0,0,0,.2);box-shadow:0 3px 4px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;padding:10px;background:#fff}.edui-notadd .edui-popup .edui-bordereraser{background-color:#fff;height:3px;display:none}.edui-notadd .edui-menu .edui-bordereraser{height:3px}.edui-notadd .edui-anchor-topleft .edui-bordereraser{left:1px;top:-2px}.edui-notadd .edui-anchor-topright .edui-bordereraser{right:1px;top:-2px}.edui-notadd .edui-anchor-bottomleft .edui-bordereraser{left:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-notadd .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-notadd .edui-bubble .edui-popup-body{width:355px!important;height:40px!important}.edui-notadd .edui-editor-messageholder{display:block;width:150px;height:auto;border:0;margin:0;padding:0;position:absolute;top:28px;right:3px}.edui-notadd .edui-message{min-height:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);padding:0;margin-bottom:3px;position:relative}.edui-notadd .edui-message-body{border-radius:3px;padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5}.edui-notadd .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-notadd .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-notadd .edui-message-type-danger,.edui-notadd .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-notadd .edui-message .edui-message-closer{display:block;width:16px;height:16px;line-height:16px;position:absolute;top:0;right:0;padding:0;cursor:pointer;background:transparent;border:0;float:right;font-size:20px;font-weight:700;color:#999;text-shadow:0 1px 0 #fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.edui-notadd .edui-message .edui-message-content{font-size:10pt;word-wrap:break-word;word-break:normal}.edui-notadd .edui-dialog{z-index:2000;position:absolute}.edui-dialog div{width:auto}.edui-notadd .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-notadd .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-notadd .edui-dialog-body{box-sizing:content-box;position:relative;padding:2px;_zoom:1}.edui-notadd .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-notadd .edui-dialog-shadow{position:absolute;z-index:-1;left:0;top:0;width:100%;height:100%;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.edui-notadd .edui-dialog-foot{background-color:#fff}.edui-notadd .edui-dialog-titlebar{height:50px;border-bottom:2px solid #ccc;position:relative;cursor:move}.edui-notadd .edui-dialog-caption{font-weight:700;font-size:16px;line-height:50px;padding-left:20px;color:#444}.edui-notadd .edui-dialog-draghandle{height:50px}.edui-notadd .edui-dialog-closebutton{position:absolute!important;right:20px;top:15px}.edui-notadd .edui-dialog-closebutton .edui-button-body{height:20px;width:20px;cursor:pointer}.edui-notadd .edui-dialog-closebutton .edui-state-hover .edui-button-body{}.edui-notadd .edui-dialog-foot{position:relative;height:56px;border-top:2px solid #ccc}.edui-notadd .edui-dialog-buttons{position:absolute;right:10px;bottom:10px}.edui-notadd .edui-dialog-buttons .edui-button{margin-right:10px}.edui-notadd .edui-dialog-buttons .edui-okbutton{background-color:#3498db;border-radius:5px;color:#fff}.edui-notadd .edui-dialog-buttons .edui-cancelbutton{background-color:#f3f3f3;border-radius:5px;color:#898989}.edui-notadd .edui-dialog-buttons .edui-button .edui-button-body{height:34px;width:94px;font-size:12px;line-height:34px;text-align:center;cursor:default;border-radius:5px}.edui-notadd .edui-dialog iframe{border:0;padding:0;margin:0;vertical-align:top}.edui-notadd .edui-dialog-modalmask{opacity:.3;filter:alpha(opacity=30);background-color:#000;position:absolute}.edui-notadd .edui-dialog-dragmask{position:absolute;background-color:transparent;cursor:move}.edui-notadd .edui-dialog-content{position:relative}.edui-notadd .dialogcontmask{cursor:move;visibility:hidden;display:block;position:absolute;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}.edui-notadd .edui-for-link .edui-dialog-content{width:420px;height:257px;overflow:hidden}.edui-dialog .edui-for-link .edui-dialog-body{height:368px!important;width:420px!important}.edui-notadd .edui-for-background .edui-dialog-content{width:465px;height:287px;overflow:hidden}.edui-dialog .edui-for-background .edui-dialog-body{height:398px!important;width:465px!important}.edui-notadd .edui-for-template .edui-dialog-content{width:682px;height:406px;overflow:hidden}.edui-dialog .edui-for-template .edui-dialog-body{height:516px!important;width:682px!important}.edui-notadd .edui-for-scrawl .edui-dialog-content{width:640px;height:435px}.edui-dialog .edui-for-scrawl .edui-dialog-body{height:545px!important;width:640px!important}.edui-notadd .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-notadd .edui-for-insertimage .edui-dialog-content{width:641px;height:455px;overflow:hidden}.edui-notadd .edui-for-webapp .edui-dialog-content{width:560px;_width:565px;height:450px;overflow:hidden}.edui-notadd .edui-for-insertframe .edui-dialog-content{width:400px;height:255px;overflow:hidden}.edui-dialog .edui-for-insertframe .edui-dialog-body{height:365px!important;width:400px!important}.edui-notadd .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-notadd .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-notadd .edui-for-map .edui-dialog-content{width:640px;height:455px}.edui-dialog .edui-for-map .edui-dialog-body{height:562px!important;width:640px!important}.edui-notadd .edui-for-gmap .edui-dialog-content{width:640px;height:452px}.edui-dialog .edui-for-gmap .edui-dialog-body{height:563px!important;width:640px!important}.edui-notadd .edui-for-insertvideo .edui-dialog-content{width:641px;height:450px}.edui-dialog .edui-for-insertvideo .edui-dialog-body{height:560px!important;width:640px!important}.edui-notadd .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-notadd .edui-for-searchreplace .edui-dialog-content{width:404px;height:310px}.edui-dialog .edui-for-searchreplace .edui-dialog-body{height:364px!important;width:404px!important}.edui-notadd .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-notadd .edui-for-edittable .edui-dialog-content{width:540px;_width:590px;height:335px}.edui-notadd .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-notadd .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-notadd .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-notadd .edui-for-music .edui-dialog-content{width:630px;height:449px}.edui-dialog .edui-for-music .edui-dialog-body{height:560px!important;width:630px!important}.edui-dialog-body .edui-dialog-foot .edui-icon:before{content:''}.edui-dialog-body .edui-dialog-titlebar .edui-icon:before{content:'\e654';font-size:18px;font-weight:700;color:#ccc}.edui-dialog .edui-dialog-fullscreen-flag .edui-dialog-content{padding:20px}.icon-delete:before{content:'\e654'}.edui-notadd .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-weight:bolder;font-size:32px;line-height:36px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-weight:bolder;font-size:27px;line-height:29px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-weight:bolder;font-size:19px;line-height:23px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-weight:bolder;font-size:16px;line-height:19px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-weight:bolder;font-size:13px;line-height:16px}.edui-notadd .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-weight:bolder;font-size:12px;line-height:14px}.edui-notadd .edui-for-inserttable .edui-splitborder{display:none}.edui-notadd .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-notadd .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{}.edui-notadd .edui-tablepicker .edui-infoarea{height:14px;line-height:14px;font-size:12px;width:220px;margin-bottom:3px;clear:both}.edui-notadd .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-notadd .edui-dialog-buttons .edui-label{line-height:34px;font-size:14px}.edui-notadd .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-notadd .edui-tablepicker .edui-pickarea{background:url(../images/unhighlighted.gif) repeat;height:220px;width:220px}.edui-notadd .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-notadd .edui-colorpicker-topbar{height:27px;width:200px}.edui-notadd .edui-colorpicker-preview{height:20px;border:1px solid #ccc;margin-left:1px;width:128px;float:left;border-radius:5px}.edui-notadd .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:12px;height:22px;border:1px solid #ccc;padding:3px 5px;cursor:pointer;border-radius:5px}.edui-notadd .edui-colorpicker-tablefirstrow{height:30px}.edui-notadd .edui-colorpicker-colorcell{width:14px;height:14px;display:block;margin:0;cursor:pointer}.edui-notadd .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-notadd .edui-colorpicker-advbtn{display:block;text-align:center;cursor:pointer;height:20px}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.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;left:14px;top:13px;position:absolute;background:red;overflow:hidden;cursor:crosshair}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x;z-index:1000}.edui-colorpicker-sliderMain{position:absolute;left:171px;top:13px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body{font-size:12px;margin-bottom:3px;clear:both}.edui-notadd .edui-autotypesetpicker .edui-autotypesetpicker-body tr:last-child td:last-child button{border-radius:3px;border:1px solid #ddd;padding:2px 8px;background-color:#f3f3f3}.edui-notadd .edui-autotypesetpicker-body table{border-collapse:separate;border-spacing:2px}.edui-notadd .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-notadd .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0}.edui-notadd .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-notadd .edui-cellalignpicker-body table{border-collapse:separate;border-spacing:0}.edui-notadd .edui-cellalignpicker-body td{padding:1px}.edui-notadd .edui-cellalignpicker-body .edui-icon{height:20px;width:20px;padding:1px;color:#666}.edui-notadd .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-notadd .edui-cellalignpicker-body .edui-left:before{content:'\e66c'}.edui-notadd .edui-cellalignpicker-body .edui-center:before{content:'\e66e'}.edui-notadd .edui-cellalignpicker-body .edui-right:before{content:'\e66d'}.edui-notadd .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-notadd .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-notadd .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-position:-146px 0;background-color:#f1f4f5}.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-notadd .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-notadd .edui-toolbar .edui-separator{display:none}.edui-notadd .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;overflow:hidden;bottom:5px;left:9px;width:18px;height:4px}.edui-notadd .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-notadd .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-notadd .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-notadd .edui-for-emotion .edui-splitborder{display:none}.edui-notadd .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-notadd .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{}.edui-notadd .edui-hassubmenu .edui-arrow{height:20px;width:20px;float:right}.edui-notadd .edui-hassubmenu .edui-arrow::after{font-family:edui-notadd!important;font-size:20px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\e66b';line-height:1;display:block}.edui-notadd .edui-menu-body .edui-menuitem{padding:5px 10px}.edui-notadd .edui-menuseparator{margin:2px 0;height:1px;overflow:hidden;display:none}.edui-notadd .edui-menuseparator-inner{border-bottom:1px solid #e2e3e3;margin-left:29px;margin-right:1px}.edui-notadd .edui-menu-body .edui-state-hover{background-color:#f3f3f3}.edui-notadd .edui-menu-body .edui-for-tablesort{padding-left:25px}.edui-notadd .edui-menu-body .edui-for-borderBack{padding-left:25px}.edui-notadd .edui-shortcutmenu{padding:2px;width:190px;height:50px;background-color:#fff;border:1px solid #ccc;border-radius:5px}.edui-notadd .edui-wordpastepop .edui-popup-content{border:0;padding:0;width:54px;height:21px}.edui-notadd .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-notadd .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-notadd .edui-pastecontainer{position:relative;visibility:hidden;width:97px;background:#fff;border:1px solid #ccc}.edui-notadd .edui-pastecontainer .edui-title{font-weight:700;background:#F8F8FF;height:25px;line-height:25px;font-size:12px;padding-left:5px}.edui-notadd .edui-pastecontainer .edui-button{overflow:hidden;margin:3px 0}.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon,.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon,.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon{float:left;cursor:pointer;width:29px;height:29px;margin-left:5px;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-notadd .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-notadd .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-notadd .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-notadd .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px} \ No newline at end of file diff --git a/web/src/main/resources/static/plug-in/neditor/2.1.17/yarn.lock b/web/src/main/resources/static/plug-in/neditor/2.1.17/yarn.lock deleted file mode 100644 index e24abb6..0000000 --- a/web/src/main/resources/static/plug-in/neditor/2.1.17/yarn.lock +++ /dev/null @@ -1,1792 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -JSONStream@^1.0.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -add-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" - integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -"argparse@~ 0.1.11": - version "0.1.16" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" - integrity sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw= - dependencies: - underscore "~1.7.0" - underscore.string "~2.4.0" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -async@2.6.1, async@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - -async@~0.1.22: - version "0.1.22" - resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061" - integrity sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE= - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= - dependencies: - pako "~0.2.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -clean-css@~1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-1.1.7.tgz#601ef9cf7642b982cb33efc9488a6444c986686e" - integrity sha1-YB75z3ZCuYLLM+/JSIpkRMmGaG4= - dependencies: - commander "2.0.x" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -coffee-script@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" - integrity sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ= - -colors@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" - integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= - -commander@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" - integrity sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg= - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= - dependencies: - array-ify "^1.0.0" - dot-prop "^3.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -conventional-changelog-angular@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" - integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-atom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.0.tgz#cd6453469cfb8fc345af3391b92990251c95558b" - integrity sha512-ygwkwyTQYAm4S0tsDt+1yg8tHhRrv7qu9SOWPhNQlVrInFLsfKc0FActCA3de2ChknxpVPY2B53yhKvCAtkBCg== - dependencies: - q "^1.5.1" - -conventional-changelog-cli@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.0.5.tgz#37c2477ea43522a5f63e52ad977d8c9e1f863211" - integrity sha512-StqCVo10g194UhyLIhg+M/tTVu6YjGnON/IiQ9Ty/h+dgi9obYAkknwpmmgGJMQ3P3vNRljuZBupz0N2tpdxXg== - dependencies: - add-stream "^1.0.0" - conventional-changelog "^2.0.3" - lodash "^4.2.1" - meow "^4.0.0" - tempfile "^1.1.1" - -conventional-changelog-codemirror@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.0.tgz#bfb61ccabacdd3bf8425a5cbe92276c86c5a0c1e" - integrity sha512-pZt/YynJ5m8C9MGV5wkBuhM1eX+8a84fmNrdOylxg/lJV+lgtAiNhnpskNuixtf71iKVWSlEqMQ6z6CH7/Uo5A== - dependencies: - q "^1.5.1" - -conventional-changelog-core@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.1.0.tgz#96a81bb3301b4b2a3dc2851cc54c5fb674ac1942" - integrity sha512-bcZkcFXkqVgG2W8m/1wjlp2wn/BKDcrPgw3/mvSEQtzs8Pax8JbAPFpEQReHY92+EKNNXC67wLA8y2xcNx0rDA== - dependencies: - conventional-changelog-writer "^4.0.0" - conventional-commits-parser "^3.0.0" - dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "^2.0.0" - git-remote-origin-url "^2.0.0" - git-semver-tags "^2.0.0" - lodash "^4.2.1" - normalize-package-data "^2.3.5" - q "^1.5.1" - read-pkg "^1.1.0" - read-pkg-up "^1.0.1" - through2 "^2.0.0" - -conventional-changelog-ember@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.1.tgz#5a5595b9ed50a6daca4bd3508a47ffe4a1a7152f" - integrity sha512-Ym1xLi7YLGooLUpHCJhlXJW5V7u/g+hlYD/+HKt0KqG2qbiBi7e7/HO9aScXTEKUBGMm7m4C443R+eCWQI2ynA== - dependencies: - q "^1.5.1" - -conventional-changelog-eslint@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.0.tgz#cc5376cb29a622c1ade197e155bf054640c05cd3" - integrity sha512-Acn20v+13c+o1OAWKvc9sCCl73Nj2vOMyn+G82euiMZwgYNE9CcBkTnw/GKdBi9KiZMK9uy+SCQ/QyAEE+8vZA== - dependencies: - q "^1.5.1" - -conventional-changelog-express@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.0.tgz#d3d020118fbfce21a75e025ec097101e355a2361" - integrity sha512-2svPjeXCrjwwqnzu/f3qU5LWoLO0jmUIEbtbbSRXAAP9Ag+137b484eJsiRt9DPYXSVzog0Eoek3rvCzfHcphQ== - dependencies: - q "^1.5.1" - -conventional-changelog-jquery@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" - integrity sha1-Agg5cWLjhGmG5xJztsecW1+A9RA= - dependencies: - q "^1.4.1" - -conventional-changelog-jscs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" - integrity sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw= - dependencies: - q "^1.4.1" - -conventional-changelog-jshint@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.0.tgz#7a038330f485082e489f47f5d07539036949f87d" - integrity sha512-+4fCln755N0ZzRUEdcDWR5Due71Dsqkbov6K/UmVCnljZvhVh0/wpT4YROoSsAnhfZO8shyWDPFKm6EP20pLQg== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-preset-loader@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.1.tgz#d134734e0cc1b91b88b30586c5991f31442029f1" - integrity sha512-HiSfhXNzAzG9klIqJaA97MMiNBR4js+53g4Px0k7tgKeCNVXmrDrm+CY+nIqcmG5NVngEPf8rAr7iji1TWW7zg== - -conventional-changelog-writer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz#3ed983c8ef6a3aa51fe44e82c9c75e86f1b5aa42" - integrity sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg== - dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.0" - dateformat "^3.0.0" - handlebars "^4.0.2" - json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" - semver "^5.5.0" - split "^1.0.0" - through2 "^2.0.0" - -conventional-changelog@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-2.0.3.tgz#779cff582c0091d2b24574003eaa82ef5ddf653d" - integrity sha512-4bcII9cJHSKb2qi9e8qGF6aJHLf/AB0dokhyR+X6QILTMl77s4l163vK+reXhajvfOYbbHQvsrWybr5+PKZwNA== - dependencies: - conventional-changelog-angular "^1.6.6" - conventional-changelog-atom "^2.0.0" - conventional-changelog-codemirror "^2.0.0" - conventional-changelog-core "^3.1.0" - conventional-changelog-ember "^2.0.1" - conventional-changelog-eslint "^3.0.0" - conventional-changelog-express "^2.0.0" - conventional-changelog-jquery "^0.1.0" - conventional-changelog-jscs "^0.1.0" - conventional-changelog-jshint "^2.0.0" - conventional-changelog-preset-loader "^2.0.1" - -conventional-commits-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz#a0ce1d1ff7a1dd7fab36bee8e8256d348d135651" - integrity sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg== - dependencies: - is-subset "^0.1.1" - modify-values "^1.0.0" - -conventional-commits-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz#7f604549a50bd8f60443fbe515484b1c2f06a5c4" - integrity sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.0" - lodash "^4.2.1" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - trim-off-newlines "^1.0.0" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= - dependencies: - number-is-nan "^1.0.0" - -dateformat@1.0.2-1.2.3: - version "1.0.2-1.2.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.2-1.2.3.tgz#b0220c02de98617433b72851cf47de3df2cdbee9" - integrity sha1-sCIMAt6YYXQztyhRz0fePfLNvuk= - -dateformat@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= - dependencies: - is-obj "^1.0.0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= - dependencies: - is-arrayish "^0.2.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -"esprima@~ 1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= - -eventemitter2@~0.4.13: - version "0.4.14" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" - integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= - -exit@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -figures@^1.0.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= - -filenamify-url@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50" - integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A= - dependencies: - filenamify "^1.0.0" - humanize-url "^1.0.0" - -filenamify@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= - dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -findup-sync@~0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683" - integrity sha1-fz56l7gjksZTvwZYm9hRkOk8NoM= - dependencies: - glob "~3.2.9" - lodash "~2.4.1" - -findup-sync@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" - integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= - dependencies: - glob "~5.0.0" - -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= - dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" - through2 "^2.0.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -getobject@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c" - integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw= - -gh-pages@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-1.2.0.tgz#1acb92801078f7c038a167f447221d1496ccfbee" - integrity sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg== - dependencies: - async "2.6.1" - commander "2.15.1" - filenamify-url "^1.0.0" - fs-extra "^5.0.0" - globby "^6.1.0" - graceful-fs "4.1.11" - rimraf "^2.6.2" - -git-raw-commits@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== - dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.0.tgz#c218fd895bdf8e8e02f6bde555b2c3893ac73cd7" - integrity sha512-lSgFc3zQTul31nFje2Q8XdNcTOI6B4I3mJRPCgFzHQQLfxfqdWTYzdtCaynkK5Xmb2wQlSJoKolhXJ1VhKROnQ== - dependencies: - meow "^4.0.0" - semver "^5.5.0" - -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= - dependencies: - ini "^1.3.2" - -glob@^7.0.3, glob@^7.0.5: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -glob@~3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= - dependencies: - inherits "2" - minimatch "0.3" - -glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - -grunt-cli@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8" - integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg= - dependencies: - findup-sync "~0.3.0" - grunt-known-options "~1.1.0" - nopt "~3.0.6" - resolve "~1.1.0" - -grunt-contrib-clean@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz#f53dfdee0849b1c7b40e9ebbba69f48c4c6079c5" - integrity sha1-9T397ghJsce0Dp67umn0jExgecU= - dependencies: - rimraf "~2.2.1" - -grunt-contrib-concat@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-concat/-/grunt-contrib-concat-0.3.0.tgz#48fa0d4336d29b653ad8225a6bd6f856b4483e32" - integrity sha1-SPoNQzbSm2U62CJaa9b4VrRIPjI= - -grunt-contrib-copy@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz#f0753b40ae21bb706daefb0b299e03cdf5fa9d6e" - integrity sha1-8HU7QK4hu3BtrvsLKZ4DzfX6nW4= - -grunt-contrib-cssmin@~0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.6.2.tgz#2804dc0e81f98e8a54d61eee84a1d3fe1a3af8e2" - integrity sha1-KATcDoH5jopU1h7uhKHT/ho6+OI= - dependencies: - clean-css "~1.1.1" - grunt-lib-contrib "~0.6.0" - -grunt-contrib-uglify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-1.0.2.tgz#ae67a46f9153edd4cb11813a55eb69c70d7db2fb" - integrity sha1-rmekb5FT7dTLEYE6Vetpxw19svs= - dependencies: - chalk "^1.0.0" - lodash "^4.0.1" - maxmin "^1.1.0" - uglify-js "~2.6.2" - uri-path "^1.0.0" - -grunt-known-options@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149" - integrity sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk= - -grunt-legacy-log-utils@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz#c0706b9dd9064e116f36f23fe4e6b048672c0f7e" - integrity sha1-wHBrndkGThFvNvI/5OawSGcsD34= - dependencies: - colors "~0.6.2" - lodash "~2.4.1" - underscore.string "~2.3.3" - -grunt-legacy-log@~0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz#ec29426e803021af59029f87d2f9cd7335a05531" - integrity sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE= - dependencies: - colors "~0.6.2" - grunt-legacy-log-utils "~0.1.1" - hooker "~0.2.3" - lodash "~2.4.1" - underscore.string "~2.3.3" - -grunt-legacy-util@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz#93324884dbf7e37a9ff7c026dff451d94a9e554b" - integrity sha1-kzJIhNv343qf98Am3/RR2UqeVUs= - dependencies: - async "~0.1.22" - exit "~0.1.1" - getobject "~0.1.0" - hooker "~0.2.3" - lodash "~0.9.2" - underscore.string "~2.2.1" - which "~1.0.5" - -grunt-lib-contrib@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz#3f56adb7da06e814795ee2415b0ebe5fb8903ebb" - integrity sha1-P1att9oG6BR5XuJBWw6+X7iQPrs= - dependencies: - zlib-browserify "0.0.1" - -grunt-text-replace@~0.3.9: - version "0.3.12" - resolved "https://registry.yarnpkg.com/grunt-text-replace/-/grunt-text-replace-0.3.12.tgz#8bc10689a3e09b80f184d7dd4d42a3d609cf58a5" - integrity sha1-i8EGiaPgm4DxhNfdTUKj1gnPWKU= - -grunt-transcoding@~0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/grunt-transcoding/-/grunt-transcoding-0.1.3.tgz#f84b2df5c600a2ca91f9ab150198cd80c2b3a7f3" - integrity sha1-+Est9cYAosqR+asVAZjNgMKzp/M= - dependencies: - grunt "~0.4.1" - iconv-lite "~0.2.11" - -grunt@~0.4.1: - version "0.4.5" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-0.4.5.tgz#56937cd5194324adff6d207631832a9d6ba4e7f0" - integrity sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A= - dependencies: - async "~0.1.22" - coffee-script "~1.3.3" - colors "~0.6.2" - dateformat "1.0.2-1.2.3" - eventemitter2 "~0.4.13" - exit "~0.1.1" - findup-sync "~0.1.2" - getobject "~0.1.0" - glob "~3.1.21" - grunt-legacy-log "~0.1.0" - grunt-legacy-util "~0.2.0" - hooker "~0.2.3" - iconv-lite "~0.2.11" - js-yaml "~2.0.5" - lodash "~0.9.2" - minimatch "~0.2.12" - nopt "~1.0.10" - rimraf "~2.2.8" - underscore.string "~2.2.1" - which "~1.0.5" - -gzip-size@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-1.0.0.tgz#66cf8b101047227b95bace6ea1da0c177ed5c22f" - integrity sha1-Zs+LEBBHInuVus5uodoMF37Vwi8= - dependencies: - browserify-zlib "^0.1.4" - concat-stream "^1.4.1" - -handlebars@^4.0.2: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== - dependencies: - async "^2.5.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -hooker@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" - integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== - -humanize-url@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff" - integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8= - dependencies: - normalize-url "^1.0.0" - strip-url-auth "^1.0.0" - -iconv-lite@~0.2.11: - version "0.2.11" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" - integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - -inherits@2, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= - -is-text-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= - dependencies: - text-extensions "^1.0.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -js-yaml@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8" - integrity sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g= - dependencies: - argparse "~ 0.1.11" - esprima "~ 1.0.2" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.template@^4.0.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash@^4.0.1: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= - -lodash@^4.17.10, lodash@^4.2.1: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@~0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-0.9.2.tgz#8f3499c5245d346d682e5b0d3b40767e09f1a92c" - integrity sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw= - -lodash@~2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -maxmin@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61" - integrity sha1-cTZehKmd2Piz99X94vANHn9zvmE= - dependencies: - chalk "^1.0.0" - figures "^1.0.1" - gzip-size "^1.0.0" - pretty-bytes "^1.0.0" - -meow@^3.1.0, meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -"minimatch@2 || 3", minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@~0.2.11, minimatch@~0.2.12: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -modify-values@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-url@^1.0.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= - -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -pretty-bytes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" - integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= - dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - -q@^1.4.1, q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0, read-pkg@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@^2.1.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -resolve@~1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@~2.2.1, rimraf@~2.2.8: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - -"semver@2 || 3 || 4 || 5": - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -semver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= - -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -strip-url-auth@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae" - integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164= - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -tempfile@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" - integrity sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I= - dependencies: - os-tmpdir "^1.0.0" - uuid "^2.0.1" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -through2@^2.0.0, through2@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, "through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-off-newlines@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -uglify-js@^3.1.4: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== - dependencies: - commander "~2.17.1" - source-map "~0.6.1" - -uglify-js@~2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" - integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8= - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - -underscore.string@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" - integrity sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk= - -underscore.string@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" - integrity sha1-ccCL9rQosRM/N+ePo6Icgvcymw0= - -underscore.string@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" - integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs= - -underscore@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -uri-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32" - integrity sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI= - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -which@~1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" - integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8= - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -zlib-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/zlib-browserify/-/zlib-browserify-0.0.1.tgz#4fa6a45d00dbc15f318a4afa1d9afc0258e176cc" - integrity sha1-T6akXQDbwV8xikr6HZr8Aljhdsw= diff --git a/web/src/main/resources/templates/components/vue/vue-list.html b/web/src/main/resources/templates/components/vue/vue-list.html index cf334bf..790d065 100644 --- a/web/src/main/resources/templates/components/vue/vue-list.html +++ b/web/src/main/resources/templates/components/vue/vue-list.html @@ -37,13 +37,13 @@ - - - + + + - - + + -- Gitee From f921d88f8d1dcf1c17f33b2ec6eb68771b3fcfa6 Mon Sep 17 00:00:00 2001 From: jeesun Date: Fri, 24 May 2019 10:36:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?java8=E6=97=B6=E9=97=B4=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E8=A7=A3@JSONField(format=20=3D=20A?= =?UTF-8?q?ppConfig.DATE=5FPATTERN=5FDATETIME)=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/src/main/java/com/simon/model/AccountBind.java | 3 +++ common/src/main/java/com/simon/model/Authority.java | 2 ++ common/src/main/java/com/simon/model/Bill.java | 3 +++ common/src/main/java/com/simon/model/DictType.java | 2 ++ common/src/main/java/com/simon/model/DictTypeGroup.java | 2 ++ common/src/main/java/com/simon/model/FontAwesome.java | 2 ++ common/src/main/java/com/simon/model/LogLogin.java | 6 +++++- common/src/main/java/com/simon/model/NewsInfo.java | 4 ++++ common/src/main/java/com/simon/model/NewsTag.java | 2 ++ common/src/main/java/com/simon/model/NoticeMsg.java | 2 ++ common/src/main/java/com/simon/model/OauthUser.java | 4 ++++ common/src/main/java/com/simon/model/QrCode.java | 2 ++ common/src/main/java/com/simon/model/QuartzJob.java | 2 ++ common/src/main/java/com/simon/model/ResetPwdInfo.java | 3 +++ common/src/main/java/com/simon/model/SideMenu.java | 2 ++ common/src/main/java/com/simon/model/SideMenuAuthority.java | 2 ++ 16 files changed, 42 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/simon/model/AccountBind.java b/common/src/main/java/com/simon/model/AccountBind.java index 4f1543f..6f6f138 100644 --- a/common/src/main/java/com/simon/model/AccountBind.java +++ b/common/src/main/java/com/simon/model/AccountBind.java @@ -42,6 +42,7 @@ public class AccountBind implements Serializable{ @Column(name = "create_by") private Long createBy; + @JSONField(format = AppConfig.DATE_PATTERN_DATETIME) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE) @ApiModelProperty(value = "创建时间") @Column(name = "create_date") @@ -52,6 +53,7 @@ public class AccountBind implements Serializable{ @Column(name = "update_by") private Long updateBy; + @JSONField(format = AppConfig.DATE_PATTERN_DATETIME) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE) @ApiModelProperty(value = "更新时间") @Column(name = "update_date") @@ -82,6 +84,7 @@ public class AccountBind implements Serializable{ @Column(name = "is_bind") private Boolean isBind; + @JSONField(format = AppConfig.DATE_PATTERN_DATETIME) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE) @ApiModelProperty(value = "绑定过期时间") @Column(name = "overdue_time") diff --git a/common/src/main/java/com/simon/model/Authority.java b/common/src/main/java/com/simon/model/Authority.java index c9355a9..74d4589 100644 --- a/common/src/main/java/com/simon/model/Authority.java +++ b/common/src/main/java/com/simon/model/Authority.java @@ -41,6 +41,7 @@ public class Authority implements GrantedAuthority, Serializable, Comparable Date: Fri, 24 May 2019 10:45:21 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E5=88=A4=E6=96=AD=E6=98=AF=E5=B1=9E=E6=80=A7=E6=98=AF?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B=E6=97=B6=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E@JsonField=E6=B3=A8=E8=A7=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/simon/common/utils/DbUtil.java | 134 ++++++++++-------- 1 file changed, 75 insertions(+), 59 deletions(-) diff --git a/common/src/main/java/com/simon/common/utils/DbUtil.java b/common/src/main/java/com/simon/common/utils/DbUtil.java index 6c3a541..6d589be 100644 --- a/common/src/main/java/com/simon/common/utils/DbUtil.java +++ b/common/src/main/java/com/simon/common/utils/DbUtil.java @@ -21,13 +21,14 @@ import java.util.regex.Pattern; public class DbUtil { /** * 获取数据库连接 + * * @param driver * @param url * @param user * @param pwd * @return */ - public static Connection getConnection(String driver, String url, String user, String pwd){ + public static Connection getConnection(String driver, String url, String user, String pwd) { Connection con = null; //注册驱动 try { @@ -41,6 +42,7 @@ public class DbUtil { /** * 获取数据表个数 + * * @param driver * @param url * @param user @@ -48,7 +50,7 @@ public class DbUtil { * @return * @throws Exception */ - public static int getTableCount(String driver, String url, String user, String pwd) throws Exception{ + public static int getTableCount(String driver, String url, String user, String pwd) throws Exception { int tableCount = 0; Connection con = null; //注册驱动 @@ -70,19 +72,19 @@ public class DbUtil { ResultSet rs; //查询表标注 - if(dbType == DbType.MYSQL){ + if (dbType == DbType.MYSQL) { sql = "SELECT COUNT(*) FROM information_schema.TABLES WHERE table_schema='" + con.getCatalog() + "'"; - }else if(dbType == DbType.POSTGRESQL){ + } else if (dbType == DbType.POSTGRESQL) { sql = "SELECT COUNT(*) FROM pg_class C"; - }else if(dbType == DbType.ORACLE){ + } else if (dbType == DbType.ORACLE) { sql = "select COUNT(*) from all_tab_comments"; - }else{ + } else { throw new Exception("暂不支持其他数据库"); } ps = con.prepareStatement(sql); rs = ps.executeQuery(); - while (rs.next()){ + while (rs.next()) { tableCount = rs.getInt(1); } return tableCount; @@ -90,6 +92,7 @@ public class DbUtil { /** * 获取表信息 + * * @param driver * @param url * @param user @@ -97,12 +100,13 @@ public class DbUtil { * @return * @throws Exception */ - public static List getTables(String driver, String url, String user, String pwd) throws Exception{ + public static List getTables(String driver, String url, String user, String pwd) throws Exception { return getTables(driver, url, user, pwd, null, null); } /** * 根据条件查询表信息 + * * @param driver * @param url * @param user @@ -112,7 +116,7 @@ public class DbUtil { * @return * @throws Exception */ - public static List getTables(String driver, String url, String user, String pwd, String tableNameKey, String tableCommentKey) throws Exception{ + public static List getTables(String driver, String url, String user, String pwd, String tableNameKey, String tableCommentKey) throws Exception { List tableInfoList = new ArrayList<>(); Connection con = null; //注册驱动 @@ -134,36 +138,36 @@ public class DbUtil { ResultSet rs; //查询表标注 - if(dbType == DbType.MYSQL){ + if (dbType == DbType.MYSQL) { sql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema='" + con.getCatalog() + "'"; - }else if(dbType == DbType.POSTGRESQL){ + } else if (dbType == DbType.POSTGRESQL) { sql = "SELECT relname AS TABLE_NAME, CAST(obj_description(relfilenode, 'pg_class') AS VARCHAR) AS TABLE_COMMENT FROM pg_class C"; - }else if(dbType == DbType.ORACLE){ + } else if (dbType == DbType.ORACLE) { sql = "select TABLE_NAME,COMMENTS from all_tab_comments"; - }else{ + } else { throw new Exception("暂不支持其他数据库"); } - if(StringUtils.isNotEmpty(tableNameKey)){ - if(sql.contains("WHERE")){ + if (StringUtils.isNotEmpty(tableNameKey)) { + if (sql.contains("WHERE")) { sql += " AND TABLE_NAME LIKE '%" + tableNameKey + "%'"; - }else{ + } else { sql += " WHERE TABLE_NAME LIKE '%" + tableNameKey + "%'"; } } - if(StringUtils.isNotEmpty(tableCommentKey)){ - if(sql.contains("WHERE")){ + if (StringUtils.isNotEmpty(tableCommentKey)) { + if (sql.contains("WHERE")) { sql += " AND TABLE_COMMENT LIKE '%" + tableCommentKey + "%'"; - }else{ + } else { sql += " WHERE TABLE_COMMENT LIKE '%" + tableCommentKey + "%'"; } } ps = con.prepareStatement(sql); rs = ps.executeQuery(); - while (rs.next()){ + while (rs.next()) { String tableComment = rs.getString("TABLE_COMMENT"); String tableName = rs.getString("TABLE_NAME"); String entityName = tableName; - if (entityName.startsWith("t_")){ + if (entityName.startsWith("t_")) { entityName = entityName.substring(2); } entityName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, entityName.toLowerCase()); @@ -185,6 +189,7 @@ public class DbUtil { /** * 获取数据库类型 + * * @param connection * @return * @throws SQLException @@ -197,7 +202,7 @@ public class DbUtil { return 1; } else if (driverName.contains("postgresql")) { return 2; - }else if(driverName.contains("oracle")){ + } else if (driverName.contains("oracle")) { return 3; } return -1; @@ -205,6 +210,7 @@ public class DbUtil { /** * 获取表对应的实体属性,用于代码生成 + * * @param con * @param tableName * @param basePackage @@ -222,23 +228,23 @@ public class DbUtil { ResultSet rs; //查询表标注 - if(dbType == DbType.MYSQL){ + if (dbType == DbType.MYSQL) { sql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema='" + con.getCatalog() + "' AND TABLE_NAME='" + tableName + "'"; - }else if(dbType == DbType.POSTGRESQL){ + } else if (dbType == DbType.POSTGRESQL) { sql = "SELECT relname AS TABLE_NAME, CAST(obj_description(relfilenode, 'pg_class') AS VARCHAR) AS TABLE_COMMENT FROM pg_class C WHERE relname = '" + tableName + "'"; - }else if(dbType == DbType.ORACLE){ + } else if (dbType == DbType.ORACLE) { sql = "select TABLE_NAME,COMMENTS AS TABLE_COMMENT from all_tab_comments WHERE table_name='" + tableName.toUpperCase() + "'"; - }else{ + } else { throw new Exception("暂不支持其他数据库"); } ps = con.prepareStatement(sql); rs = ps.executeQuery(); - while (rs.next()){ + while (rs.next()) { String tableComment = rs.getString("TABLE_COMMENT"); - if(StringUtils.isEmpty(tableComment)){ + if (StringUtils.isEmpty(tableComment)) { tableComment = tableName; - }else{ - if(tableComment.contains("表")&&tableComment.lastIndexOf("表") == (tableComment.length() - 1)){ + } else { + if (tableComment.contains("表") && tableComment.lastIndexOf("表") == (tableComment.length() - 1)) { tableComment = tableComment.substring(0, tableComment.length() - 1); } } @@ -247,14 +253,14 @@ public class DbUtil { //查询表属性,格式化生成实体所需属性 - if(dbType == DbType.MYSQL){ + if (dbType == DbType.MYSQL) { //log.info(con.getCatalog()); sql = "SELECT table_name, column_name, column_comment, column_type, data_type, column_default, is_nullable " + "FROM INFORMATION_SCHEMA.COLUMNS " + "WHERE table_name = '" + tableName + "' AND table_schema = '" + con.getCatalog() + "'"; - }else if(dbType == DbType.POSTGRESQL){ + } else if (dbType == DbType.POSTGRESQL) { log.info(con.getCatalog()); sql = "SELECT delta.table_name, delta.column_name, alb.column_comment, alb.column_type, delta.data_type, delta.column_default, delta.is_nullable FROM information_schema.COLUMNS AS delta, ( SELECT C .relname AS table_name, A.attname AS column_name, col_description ( A.attrelid, A.attnum ) AS column_comment, format_type ( A.atttypid, A.atttypmod ) AS column_type, A.attnotnull AS NOTNULL FROM pg_class AS C, pg_attribute AS A WHERE C.relname = '" + tableName + "' AND A.attrelid = C.oid AND A.attnum > 0 ) AS alb WHERE table_schema = 'public' AND delta.TABLE_NAME = '" + tableName + "' AND delta.COLUMN_NAME = alb.column_name"; - }else if(dbType == DbType.ORACLE){ + } else if (dbType == DbType.ORACLE) { log.info(con.getCatalog()); sql = "SELECT\n" + "atc.table_name,\n" + @@ -269,7 +275,7 @@ public class DbUtil { "FULL JOIN ( SELECT column_name, COMMENTS FROM all_col_comments WHERE Table_Name = 'USERS' ) acc ON atc.column_name = acc.column_name \n" + "WHERE\n" + "atc.table_name = '" + tableName.toUpperCase() + "'"; - }else{ + } else { throw new Exception("暂不支持其他数据库"); } @@ -286,18 +292,18 @@ public class DbUtil { String comment = rs.getString("column_comment"); String isNullable = rs.getString("is_nullable"); - if(StringUtils.isEmpty(comment)){ + if (StringUtils.isEmpty(comment)) { comment = name; } String propertyType = null; - if(dbType == DbType.MYSQL){ + if (dbType == DbType.MYSQL) { propertyType = TypeTranslator.translateMySQL(columnType, dataType); - }else if(dbType == DbType.POSTGRESQL){ + } else if (dbType == DbType.POSTGRESQL) { propertyType = TypeTranslator.translatePostgreSQL(columnType, dataType); - }else if(dbType == DbType.ORACLE){ + } else if (dbType == DbType.ORACLE) { propertyType = TypeTranslator.translateOracle(columnType, dataType); - }else{ + } else { throw new Exception("暂不支持其他数据库"); } @@ -311,61 +317,71 @@ public class DbUtil { " @KeySql(genId = SnowflakeGenId.class)\n" + " @GeneratedValue(generator = \"sequenceId\")\n" + " @GenericGenerator(name = \"sequenceId\", strategy = \"" + CodeGenerator.BASE_PACKAGE + ".common.utils.snowflake.SequenceId\")"; - }else if("String".equalsIgnoreCase(propertyType)){ + } else if ("String".equalsIgnoreCase(propertyType)) { annotation = "@Id\n" + " @Column(name = \"id\")\n" + " @KeySql(genId = UUIdGenId.class)\n" + " @GeneratedValue(generator = \"uuid\")\n" + " @GenericGenerator(name = \"uuid\", strategy = \"" + CodeGenerator.BASE_PACKAGE + ".common.utils.UuidGenerator\")"; - }else if("Integer".equalsIgnoreCase(propertyType)){ + } else if ("Integer".equalsIgnoreCase(propertyType)) { annotation = "@Id\n" + " @Column(name = \"id\")\n" + " @GeneratedValue(strategy = GenerationType.IDENTITY)"; - }else{ + } else { annotation = "@Id\n" + " @Column(name = \"id\")\n" + " @GeneratedValue(strategy = GenerationType.IDENTITY)"; } - }else{ - if("Date".equalsIgnoreCase(propertyType)){ - annotation = "@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE)\n"; - }else if ("Long".equalsIgnoreCase(propertyType)) { + } else { + if ("Date".equalsIgnoreCase(propertyType)) { + annotation = "@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE)\n" + + " @JSONField(format = AppConfig.DATE_PATTERN_DATETIME)\n"; + } else if ("Long".equalsIgnoreCase(propertyType)) { //fastjson转换成map时,将Long转换成String,保证前端不丢失精度 annotation = "@JSONField(serializeUsing = ToStringSerializer.class)\n"; + } else if ("LocalDateTime".equalsIgnoreCase(propertyType)) { + annotation = "@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DATETIME, timezone = AppConfig.DATE_TIMEZONE)\n" + + " @JSONField(format = AppConfig.DATE_PATTERN_DATETIME)\n"; + } else if ("LocalDate".equalsIgnoreCase(propertyType)) { + annotation = "@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_DAY, timezone = AppConfig.DATE_TIMEZONE)\n" + + " @JSONField(format = AppConfig.DATE_PATTERN_DAY)\n"; + } else if ("LocalTime".equalsIgnoreCase(propertyType)) { + annotation = "@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = AppConfig.DATE_PATTERN_TIME, timezone = AppConfig.DATE_TIMEZONE)\n" + + " @JSONField(format = AppConfig.DATE_PATTERN_TIME)\n"; } - if(!"".equals(annotation)){ + if (!"".equals(annotation)) { annotation += " "; } annotation += "@ApiModelProperty(value = \"" + comment + "\")\n"; String charPattern = "char\\(\\d+\\)"; - if(Pattern.matches(charPattern, columnType)){ + if (Pattern.matches(charPattern, columnType)) { //MySQL char(4) - if("NO".equalsIgnoreCase(isNullable)){ + if ("NO".equalsIgnoreCase(isNullable)) { annotation += " @Column(name = \"" + name + "\", nullable = false, columnDefinition =\"" + columnType + "\")"; - }else{ + } else { annotation += " @Column(name = \"" + name + "\", columnDefinition =\"" + columnType + "\")"; } - }else if("text".equalsIgnoreCase(columnType)){ + } else if ("text".equalsIgnoreCase(columnType)) { //MySQL text - if("No".equalsIgnoreCase(isNullable)){ + if ("No".equalsIgnoreCase(isNullable)) { annotation += " @Column(name = \"" + name + "\", nullable = false, columnDefinition = \"TEXT\")"; - }else{ + } else { annotation += " @Column(name = \"" + name + "\", columnDefinition = \"TEXT\")"; } - }else if("longtext".equalsIgnoreCase(columnType)){ + } else if ("longtext".equalsIgnoreCase(columnType)) { //MySQL text - if("No".equalsIgnoreCase(isNullable)){ + if ("No".equalsIgnoreCase(isNullable)) { annotation += " @Column(name = \"" + name + "\", nullable = false, columnDefinition = \"LONGTEXT\")"; - }else{ + } else { annotation += " @Column(name = \"" + name + "\", columnDefinition = \"LONGTEXT\")"; } - }else{ - if("NO".equalsIgnoreCase(isNullable)){ + } else { + if ("NO".equalsIgnoreCase(isNullable)) { annotation += " @Column(name = \"" + name + "\", nullable = false)"; - }else{ + } else { annotation += " @Column(name = \"" + name + "\")"; } } -- Gitee